Update C sources and add new functions
This commit is contained in:
parent
9784968948
commit
7874621942
24 changed files with 2149 additions and 1316 deletions
159
raylib/text.c
159
raylib/text.c
|
@ -1,5 +1,3 @@
|
|||
// +build !js
|
||||
|
||||
/**********************************************************************************************
|
||||
*
|
||||
* raylib.text - Basic functions to load SpriteFonts and draw Text
|
||||
|
@ -19,7 +17,7 @@
|
|||
*
|
||||
* LICENSE: zlib/libpng
|
||||
*
|
||||
* Copyright (c) 2014-2017 Ramon Santamaria (@raysan5)
|
||||
* Copyright (c) 2014-2018 Ramon Santamaria (@raysan5)
|
||||
*
|
||||
* This software is provided "as-is", without any express or implied warranty. In no event
|
||||
* will the authors be held liable for any damages arising from the use of this software.
|
||||
|
@ -68,8 +66,8 @@
|
|||
//----------------------------------------------------------------------------------
|
||||
// Defines and Macros
|
||||
//----------------------------------------------------------------------------------
|
||||
#define MAX_FORMATTEXT_LENGTH 64
|
||||
#define MAX_SUBTEXT_LENGTH 64
|
||||
#define MAX_FORMATTEXT_LENGTH 256
|
||||
#define MAX_SUBTEXT_LENGTH 256
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Types and Structures Definition
|
||||
|
@ -92,11 +90,9 @@ static SpriteFont defaultFont; // Default font provided by raylib
|
|||
//----------------------------------------------------------------------------------
|
||||
// Module specific Functions Declaration
|
||||
//----------------------------------------------------------------------------------
|
||||
static int GetCharIndex(SpriteFont font, int letter);
|
||||
|
||||
static SpriteFont LoadImageFont(Image image, Color key, int firstChar); // Load a Image font file (XNA style)
|
||||
#if defined(SUPPORT_FILEFORMAT_FNT)
|
||||
static SpriteFont LoadBMFont(const char *fileName); // Load a BMFont file (AngelCode font file)
|
||||
static SpriteFont LoadBMFont(const char *fileName); // Load a BMFont file (AngelCode font file)
|
||||
#endif
|
||||
#if defined(SUPPORT_FILEFORMAT_TTF)
|
||||
static SpriteFont LoadTTF(const char *fileName, int fontSize, int charsCount, int *fontChars); // Load spritefont from TTF data
|
||||
|
@ -290,40 +286,14 @@ SpriteFont LoadSpriteFont(const char *fileName)
|
|||
|
||||
SpriteFont spriteFont = { 0 };
|
||||
|
||||
// Check file extension
|
||||
if (IsFileExtension(fileName, ".rres"))
|
||||
{
|
||||
// TODO: Read multiple resource blocks from file (RRES_FONT_IMAGE, RRES_FONT_CHARDATA)
|
||||
RRES rres = LoadResource(fileName, 0);
|
||||
|
||||
// Load sprite font texture
|
||||
if (rres[0].type == RRES_TYPE_FONT_IMAGE)
|
||||
{
|
||||
// NOTE: Parameters for RRES_FONT_IMAGE type are: width, height, format, mipmaps
|
||||
Image image = LoadImagePro(rres[0].data, rres[0].param1, rres[0].param2, rres[0].param3);
|
||||
spriteFont.texture = LoadTextureFromImage(image);
|
||||
UnloadImage(image);
|
||||
}
|
||||
|
||||
// Load sprite characters data
|
||||
if (rres[1].type == RRES_TYPE_FONT_CHARDATA)
|
||||
{
|
||||
// NOTE: Parameters for RRES_FONT_CHARDATA type are: fontSize, charsCount
|
||||
spriteFont.baseSize = rres[1].param1;
|
||||
spriteFont.charsCount = rres[1].param2;
|
||||
spriteFont.chars = rres[1].data;
|
||||
}
|
||||
|
||||
// TODO: Do not free rres.data memory (chars info data!)
|
||||
//UnloadResource(rres[0]);
|
||||
}
|
||||
#if defined(SUPPORT_FILEFORMAT_TTF)
|
||||
else if (IsFileExtension(fileName, ".ttf")) spriteFont = LoadSpriteFontEx(fileName, DEFAULT_TTF_FONTSIZE, 0, NULL);
|
||||
if (IsFileExtension(fileName, ".ttf")) spriteFont = LoadSpriteFontEx(fileName, DEFAULT_TTF_FONTSIZE, 0, NULL);
|
||||
else
|
||||
#endif
|
||||
#if defined(SUPPORT_FILEFORMAT_FNT)
|
||||
else if (IsFileExtension(fileName, ".fnt")) spriteFont = LoadBMFont(fileName);
|
||||
#endif
|
||||
if (IsFileExtension(fileName, ".fnt")) spriteFont = LoadBMFont(fileName);
|
||||
else
|
||||
#endif
|
||||
{
|
||||
Image image = LoadImage(fileName);
|
||||
if (image.data != NULL) spriteFont = LoadImageFont(image, MAGENTA, DEFAULT_FIRST_CHAR);
|
||||
|
@ -346,21 +316,20 @@ SpriteFont LoadSpriteFont(const char *fileName)
|
|||
SpriteFont LoadSpriteFontEx(const char *fileName, int fontSize, int charsCount, int *fontChars)
|
||||
{
|
||||
SpriteFont spriteFont = { 0 };
|
||||
int totalChars = 95; // Default charset [32..126]
|
||||
|
||||
#if defined(SUPPORT_FILEFORMAT_TTF)
|
||||
if (IsFileExtension(fileName, ".ttf"))
|
||||
{
|
||||
if ((fontChars == NULL) || (charsCount == 0))
|
||||
if (charsCount != 0) totalChars = charsCount;
|
||||
|
||||
if (fontChars == NULL)
|
||||
{
|
||||
int totalChars = 95; // Default charset [32..126]
|
||||
|
||||
int *defaultFontChars = (int *)malloc(totalChars*sizeof(int));
|
||||
|
||||
for (int i = 0; i < totalChars; i++) defaultFontChars[i] = i + 32; // Default first character: SPACE[32]
|
||||
|
||||
spriteFont = LoadTTF(fileName, fontSize, totalChars, defaultFontChars);
|
||||
fontChars = (int *)malloc(totalChars*sizeof(int));
|
||||
for (int i = 0; i < totalChars; i++) fontChars[i] = i + 32; // Default first character: SPACE[32]
|
||||
}
|
||||
else spriteFont = LoadTTF(fileName, fontSize, charsCount, fontChars);
|
||||
|
||||
spriteFont = LoadTTF(fileName, fontSize, totalChars, fontChars);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -374,13 +343,13 @@ SpriteFont LoadSpriteFontEx(const char *fileName, int fontSize, int charsCount,
|
|||
}
|
||||
|
||||
// Unload SpriteFont from GPU memory (VRAM)
|
||||
void UnloadSpriteFont(SpriteFont spriteFont)
|
||||
void UnloadSpriteFont(SpriteFont font)
|
||||
{
|
||||
// NOTE: Make sure spriteFont is not default font (fallback)
|
||||
if (spriteFont.texture.id != GetDefaultFont().texture.id)
|
||||
if (font.texture.id != GetDefaultFont().texture.id)
|
||||
{
|
||||
UnloadTexture(spriteFont.texture);
|
||||
free(spriteFont.chars);
|
||||
UnloadTexture(font.texture);
|
||||
free(font.chars);
|
||||
|
||||
TraceLog(LOG_DEBUG, "Unloaded sprite font data");
|
||||
}
|
||||
|
@ -406,7 +375,7 @@ void DrawText(const char *text, int posX, int posY, int fontSize, Color color)
|
|||
|
||||
// Draw text using SpriteFont
|
||||
// NOTE: chars spacing is NOT proportional to fontSize
|
||||
void DrawTextEx(SpriteFont spriteFont, const char *text, Vector2 position, float fontSize, int spacing, Color tint)
|
||||
void DrawTextEx(SpriteFont font, const char *text, Vector2 position, float fontSize, int spacing, Color tint)
|
||||
{
|
||||
int length = strlen(text);
|
||||
int textOffsetX = 0; // Offset between characters
|
||||
|
@ -416,7 +385,7 @@ void DrawTextEx(SpriteFont spriteFont, const char *text, Vector2 position, float
|
|||
unsigned char letter; // Current character
|
||||
int index; // Index position in sprite font
|
||||
|
||||
scaleFactor = fontSize/spriteFont.baseSize;
|
||||
scaleFactor = fontSize/font.baseSize;
|
||||
|
||||
// NOTE: Some ugly hacks are made to support Latin-1 Extended characters directly
|
||||
// written in C code files (codified by default as UTF-8)
|
||||
|
@ -426,7 +395,7 @@ void DrawTextEx(SpriteFont spriteFont, const char *text, Vector2 position, float
|
|||
if ((unsigned char)text[i] == '\n')
|
||||
{
|
||||
// NOTE: Fixed line spacing of 1.5 lines
|
||||
textOffsetY += (int)((spriteFont.baseSize + spriteFont.baseSize/2)*scaleFactor);
|
||||
textOffsetY += (int)((font.baseSize + font.baseSize/2)*scaleFactor);
|
||||
textOffsetX = 0;
|
||||
}
|
||||
else
|
||||
|
@ -435,26 +404,29 @@ void DrawTextEx(SpriteFont spriteFont, const char *text, Vector2 position, float
|
|||
{
|
||||
// Support UTF-8 encoded values from [0xc2 0x80] -> [0xc2 0xbf](¿)
|
||||
letter = (unsigned char)text[i + 1];
|
||||
index = GetCharIndex(spriteFont, (int)letter);
|
||||
index = GetGlyphIndex(font, (int)letter);
|
||||
i++;
|
||||
}
|
||||
else if ((unsigned char)text[i] == 0xc3) // UTF-8 encoding identification HACK!
|
||||
{
|
||||
// Support UTF-8 encoded values from [0xc3 0x80](À) -> [0xc3 0xbf](ÿ)
|
||||
letter = (unsigned char)text[i + 1];
|
||||
index = GetCharIndex(spriteFont, (int)letter + 64);
|
||||
index = GetGlyphIndex(font, (int)letter + 64);
|
||||
i++;
|
||||
}
|
||||
else index = GetCharIndex(spriteFont, (unsigned char)text[i]);
|
||||
else index = GetGlyphIndex(font, (unsigned char)text[i]);
|
||||
|
||||
if ((unsigned char)text[i] != ' ')
|
||||
{
|
||||
DrawTexturePro(font.texture, font.chars[index].rec,
|
||||
(Rectangle){ position.x + textOffsetX + font.chars[index].offsetX*scaleFactor,
|
||||
position.y + textOffsetY + font.chars[index].offsetY*scaleFactor,
|
||||
font.chars[index].rec.width*scaleFactor,
|
||||
font.chars[index].rec.height*scaleFactor }, (Vector2){ 0, 0 }, 0.0f, tint);
|
||||
}
|
||||
|
||||
DrawTexturePro(spriteFont.texture, spriteFont.chars[index].rec,
|
||||
(Rectangle){ position.x + textOffsetX + spriteFont.chars[index].offsetX*scaleFactor,
|
||||
position.y + textOffsetY + spriteFont.chars[index].offsetY*scaleFactor,
|
||||
spriteFont.chars[index].rec.width*scaleFactor,
|
||||
spriteFont.chars[index].rec.height*scaleFactor }, (Vector2){ 0, 0 }, 0.0f, tint);
|
||||
|
||||
if (spriteFont.chars[index].advanceX == 0) textOffsetX += (int)(spriteFont.chars[index].rec.width*scaleFactor + spacing);
|
||||
else textOffsetX += (int)(spriteFont.chars[index].advanceX*scaleFactor + spacing);
|
||||
if (font.chars[index].advanceX == 0) textOffsetX += (int)(font.chars[index].rec.width*scaleFactor + spacing);
|
||||
else textOffsetX += (int)(font.chars[index].advanceX*scaleFactor + spacing);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -516,7 +488,7 @@ int MeasureText(const char *text, int fontSize)
|
|||
}
|
||||
|
||||
// Measure string size for SpriteFont
|
||||
Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, float fontSize, int spacing)
|
||||
Vector2 MeasureTextEx(SpriteFont font, const char *text, float fontSize, int spacing)
|
||||
{
|
||||
int len = strlen(text);
|
||||
int tempLen = 0; // Used to count longer text line num chars
|
||||
|
@ -525,8 +497,8 @@ Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, float fontSize, i
|
|||
float textWidth = 0;
|
||||
float tempTextWidth = 0; // Used to count longer text line width
|
||||
|
||||
float textHeight = (float)spriteFont.baseSize;
|
||||
float scaleFactor = fontSize/(float)spriteFont.baseSize;
|
||||
float textHeight = (float)font.baseSize;
|
||||
float scaleFactor = fontSize/(float)font.baseSize;
|
||||
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
|
@ -534,17 +506,17 @@ Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, float fontSize, i
|
|||
|
||||
if (text[i] != '\n')
|
||||
{
|
||||
int index = GetCharIndex(spriteFont, (int)text[i]);
|
||||
int index = GetGlyphIndex(font, (int)text[i]);
|
||||
|
||||
if (spriteFont.chars[index].advanceX != 0) textWidth += spriteFont.chars[index].advanceX;
|
||||
else textWidth += (spriteFont.chars[index].rec.width + spriteFont.chars[index].offsetX);
|
||||
if (font.chars[index].advanceX != 0) textWidth += font.chars[index].advanceX;
|
||||
else textWidth += (font.chars[index].rec.width + font.chars[index].offsetX);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (tempTextWidth < textWidth) tempTextWidth = textWidth;
|
||||
lenCounter = 0;
|
||||
textWidth = 0;
|
||||
textHeight += ((float)spriteFont.baseSize*1.5f); // NOTE: Fixed line spacing of 1.5 lines
|
||||
textHeight += ((float)font.baseSize*1.5f); // NOTE: Fixed line spacing of 1.5 lines
|
||||
}
|
||||
|
||||
if (tempLen < lenCounter) tempLen = lenCounter;
|
||||
|
@ -559,6 +531,28 @@ Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, float fontSize, i
|
|||
return vec;
|
||||
}
|
||||
|
||||
// Returns index position for a unicode character on spritefont
|
||||
int GetGlyphIndex(SpriteFont font, int character)
|
||||
{
|
||||
#define UNORDERED_CHARSET
|
||||
#if defined(UNORDERED_CHARSET)
|
||||
int index = 0;
|
||||
|
||||
for (int i = 0; i < font.charsCount; i++)
|
||||
{
|
||||
if (font.chars[i].value == character)
|
||||
{
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return index;
|
||||
#else
|
||||
return (character - 32);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Shows current FPS on top-left corner
|
||||
// NOTE: Uses default font
|
||||
void DrawFPS(int posX, int posY)
|
||||
|
@ -585,27 +579,6 @@ void DrawFPS(int posX, int posY)
|
|||
// Module specific Functions Definition
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
static int GetCharIndex(SpriteFont font, int letter)
|
||||
{
|
||||
#define UNORDERED_CHARSET
|
||||
#if defined(UNORDERED_CHARSET)
|
||||
int index = 0;
|
||||
|
||||
for (int i = 0; i < font.charsCount; i++)
|
||||
{
|
||||
if (font.chars[i].value == letter)
|
||||
{
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return index;
|
||||
#else
|
||||
return (letter - 32);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Load an Image font file (XNA style)
|
||||
static SpriteFont LoadImageFont(Image image, Color key, int firstChar)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue