121 lines
3.1 KiB
C
121 lines
3.1 KiB
C
#ifndef GS_FONT_H
|
|
|
|
struct codepoint_bitmap
|
|
{
|
|
s32 XOffset, YOffset;
|
|
s32 Width, Height;
|
|
s32 BitmapX, BitmapY;
|
|
v2 UVMin, UVMax;
|
|
};
|
|
|
|
struct bitmap_font
|
|
{
|
|
char* Name;
|
|
s32 PixelHeight;
|
|
s32 Ascent;
|
|
s32 Descent;
|
|
s32 Leading;
|
|
s32 MaxCharWidth;
|
|
|
|
u32 CodepointDictionarySize;
|
|
u32 CodepointDictionaryCount;
|
|
char* CodepointKeys;
|
|
codepoint_bitmap* CodepointValues;
|
|
|
|
u8* BitmapMemory;
|
|
u32 BitmapWidth;
|
|
u32 BitmapHeight;
|
|
u32 BitmapBytesPerPixel;
|
|
u32 BitmapStride;
|
|
s32 BitmapTextureHandle;
|
|
};
|
|
|
|
internal bitmap_font
|
|
InitializeTextFont (s32 CodepointCount, u8* CodepointMemory, s32 CodepointMemorySize)
|
|
{
|
|
bitmap_font Result = {};
|
|
|
|
Result.CodepointDictionarySize = CodepointCount;
|
|
Result.CodepointDictionaryCount = 0;
|
|
Assert(CodepointMemorySize >= (sizeof(char) + sizeof(codepoint_bitmap)) * CodepointCount);
|
|
Result.CodepointKeys = (char*)CodepointMemory;
|
|
Result.CodepointValues = (codepoint_bitmap*)(CodepointMemory + (sizeof(char) * CodepointCount));
|
|
}
|
|
|
|
#define GLYPH_SKIRT 1
|
|
internal void
|
|
GetNextCodepointOffset (bitmap_font* Font, u32* X, u32* Y)
|
|
{
|
|
s32 LastCodepointIndex = Font->CodepointDictionaryCount - 1;
|
|
if (LastCodepointIndex >= 0)
|
|
{
|
|
codepoint_bitmap BitmapInfo = Font->CodepointValues[LastCodepointIndex];
|
|
|
|
u32 TempX = BitmapInfo.BitmapX + BitmapInfo.Width + GLYPH_SKIRT;
|
|
u32 TempY = BitmapInfo.BitmapY;
|
|
if (TempX + Font->MaxCharWidth > Font->BitmapWidth)
|
|
{
|
|
TempX = 0;
|
|
TempY += BitmapInfo.Height + GLYPH_SKIRT;
|
|
}
|
|
|
|
Assert(TempX >= 0 && TempX < (u32)Font->BitmapWidth);
|
|
Assert(TempY >= 0 && TempY < (u32)Font->BitmapHeight);
|
|
|
|
*X = TempX;
|
|
*Y = TempY;
|
|
}
|
|
else
|
|
{
|
|
*X = 0;
|
|
*Y = 0;
|
|
}
|
|
}
|
|
|
|
internal void
|
|
AddCodepointToFont (bitmap_font* Font, char Codepoint,
|
|
s32 XOffset, s32 YOffset, s32 Width, s32 Height,
|
|
s32 BitmapX, s32 BitmapY)
|
|
{
|
|
Assert(Font->CodepointDictionaryCount < Font->CodepointDictionarySize);
|
|
|
|
char* Key = Font->CodepointKeys + Font->CodepointDictionaryCount;
|
|
codepoint_bitmap* Value = Font->CodepointValues + Font->CodepointDictionaryCount;
|
|
Font->CodepointDictionaryCount++;
|
|
|
|
*Key = Codepoint;
|
|
Value->XOffset = XOffset;
|
|
Value->YOffset = YOffset;
|
|
Value->Width = Width;
|
|
Value->Height = Height;
|
|
Value->BitmapX = BitmapX;
|
|
Value->BitmapY = BitmapY;
|
|
Value->UVMin = v2{(r32)BitmapX / (r32)Font->BitmapWidth, (r32)BitmapY / (r32)Font->BitmapHeight};
|
|
Value->UVMax =
|
|
Value->UVMin + v2{(r32)Width / (r32)Font->BitmapWidth, (r32)Height / (r32)Font->BitmapHeight};
|
|
}
|
|
|
|
internal s32
|
|
GetIndexForCodepoint (bitmap_font Font, char Codepoint)
|
|
{
|
|
s32 Result = -1;
|
|
for (u32 i = 0; i < Font.CodepointDictionaryCount; i++)
|
|
{
|
|
if (Font.CodepointKeys[i] == Codepoint)
|
|
{
|
|
Result = i;
|
|
break;
|
|
}
|
|
}
|
|
return Result;
|
|
}
|
|
|
|
inline s32
|
|
NewLineYOffset (bitmap_font Font)
|
|
{
|
|
s32 Result = Font.Ascent + Font.Descent;
|
|
return Result;
|
|
}
|
|
|
|
#define GS_FONT_H
|
|
#endif |