|
|
@@ -49,25 +49,25 @@ public:
|
|
|
/// Initialize from an external buffer
|
|
|
/// @remark The ownership of the buffer is external, and you must ensure it stays valid up to this object lifetime
|
|
|
/// @return true if the initialization succeed
|
|
|
- bool init(const uint8_t* buffer, uint32_t bufferSize, int32_t fontIndex, uint32_t pixelHeight );
|
|
|
+ bool init(const uint8_t* _buffer, uint32_t _bufferSize, int32_t _fontIndex, uint32_t _pixelHeight );
|
|
|
|
|
|
/// return the font descriptor of the current font
|
|
|
FontInfo getFontInfo();
|
|
|
|
|
|
/// raster a glyph as 8bit alpha to a memory buffer
|
|
|
/// update the GlyphInfo according to the raster strategy
|
|
|
- /// @ remark buffer min size: glyphInfo.width * glyphInfo * height * sizeof(char)
|
|
|
- bool bakeGlyphAlpha(CodePoint_t codePoint, GlyphInfo& outGlyphInfo, uint8_t* outBuffer);
|
|
|
+ /// @ remark buffer min size: glyphInfo.m_width * glyphInfo * height * sizeof(char)
|
|
|
+ bool bakeGlyphAlpha(CodePoint_t _codePoint, GlyphInfo& _outGlyphInfo, uint8_t* _outBuffer);
|
|
|
|
|
|
/// raster a glyph as 32bit subpixel rgba to a memory buffer
|
|
|
/// update the GlyphInfo according to the raster strategy
|
|
|
- /// @ remark buffer min size: glyphInfo.width * glyphInfo * height * sizeof(uint32_t)
|
|
|
- bool bakeGlyphSubpixel(CodePoint_t codePoint, GlyphInfo& outGlyphInfo, uint8_t* outBuffer);
|
|
|
+ /// @ remark buffer min size: glyphInfo.m_width * glyphInfo * height * sizeof(uint32_t)
|
|
|
+ bool bakeGlyphSubpixel(CodePoint_t _codePoint, GlyphInfo& _outGlyphInfo, uint8_t* _outBuffer);
|
|
|
|
|
|
/// raster a glyph as 8bit signed distance to a memory buffer
|
|
|
/// update the GlyphInfo according to the raster strategy
|
|
|
- /// @ remark buffer min size: glyphInfo.width * glyphInfo * height * sizeof(char)
|
|
|
- bool bakeGlyphDistance(CodePoint_t codePoint, GlyphInfo& outGlyphInfo, uint8_t* outBuffer);
|
|
|
+ /// @ remark buffer min size: glyphInfo.m_width * glyphInfo * height * sizeof(char)
|
|
|
+ bool bakeGlyphDistance(CodePoint_t _codePoint, GlyphInfo& _outGlyphInfo, uint8_t* _outBuffer);
|
|
|
private:
|
|
|
void* m_font;
|
|
|
};
|
|
|
@@ -75,8 +75,8 @@ private:
|
|
|
|
|
|
struct FTHolder
|
|
|
{
|
|
|
- FT_Library library;
|
|
|
- FT_Face face;
|
|
|
+ FT_Library m_library;
|
|
|
+ FT_Face m_face;
|
|
|
};
|
|
|
FontManager::TrueTypeFont::TrueTypeFont(): m_font(NULL)
|
|
|
{
|
|
|
@@ -87,36 +87,36 @@ FontManager::TrueTypeFont::~TrueTypeFont()
|
|
|
if(m_font!=NULL)
|
|
|
{
|
|
|
FTHolder* holder = (FTHolder*) m_font;
|
|
|
- FT_Done_Face( holder->face );
|
|
|
- FT_Done_FreeType( holder->library );
|
|
|
+ FT_Done_Face( holder->m_face );
|
|
|
+ FT_Done_FreeType( holder->m_library );
|
|
|
delete m_font;
|
|
|
m_font = NULL;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-bool FontManager::TrueTypeFont::init(const uint8_t* buffer, uint32_t bufferSize, int32_t fontIndex, uint32_t pixelHeight)
|
|
|
+bool FontManager::TrueTypeFont::init(const uint8_t* _buffer, uint32_t _bufferSize, int32_t _fontIndex, uint32_t _pixelHeight)
|
|
|
{
|
|
|
- assert((bufferSize > 256 && bufferSize < 100000000) && "TrueType buffer size is suspicious");
|
|
|
- assert((pixelHeight > 4 && pixelHeight < 128) && "TrueType buffer size is suspicious");
|
|
|
+ assert((_bufferSize > 256 && _bufferSize < 100000000) && "TrueType buffer size is suspicious");
|
|
|
+ assert((_pixelHeight > 4 && _pixelHeight < 128) && "TrueType buffer size is suspicious");
|
|
|
|
|
|
assert(m_font == NULL && "TrueTypeFont already initialized" );
|
|
|
|
|
|
FTHolder* holder = new FTHolder();
|
|
|
|
|
|
// Initialize Freetype library
|
|
|
- FT_Error error = FT_Init_FreeType( &holder->library );
|
|
|
+ FT_Error error = FT_Init_FreeType( &holder->m_library );
|
|
|
if( error)
|
|
|
{
|
|
|
delete holder;
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- error = FT_New_Memory_Face( holder->library, buffer, bufferSize, fontIndex, &holder->face );
|
|
|
+ error = FT_New_Memory_Face( holder->m_library, _buffer, _bufferSize, _fontIndex, &holder->m_face );
|
|
|
if ( error == FT_Err_Unknown_File_Format )
|
|
|
{
|
|
|
// the font file could be opened and read, but it appears
|
|
|
//that its font format is unsupported
|
|
|
- FT_Done_FreeType( holder->library );
|
|
|
+ FT_Done_FreeType( holder->m_library );
|
|
|
delete holder;
|
|
|
return false;
|
|
|
}
|
|
|
@@ -124,25 +124,25 @@ bool FontManager::TrueTypeFont::init(const uint8_t* buffer, uint32_t bufferSize,
|
|
|
{
|
|
|
// another error code means that the font file could not
|
|
|
// be opened or read, or simply that it is broken...
|
|
|
- FT_Done_FreeType( holder->library );
|
|
|
+ FT_Done_FreeType( holder->m_library );
|
|
|
delete holder;
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// Select unicode charmap
|
|
|
- error = FT_Select_Charmap( holder->face, FT_ENCODING_UNICODE );
|
|
|
+ error = FT_Select_Charmap( holder->m_face, FT_ENCODING_UNICODE );
|
|
|
if( error )
|
|
|
{
|
|
|
- FT_Done_Face( holder->face );
|
|
|
- FT_Done_FreeType( holder->library );
|
|
|
+ FT_Done_Face( holder->m_face );
|
|
|
+ FT_Done_FreeType( holder->m_library );
|
|
|
return false;
|
|
|
}
|
|
|
//set size in pixels
|
|
|
- error = FT_Set_Pixel_Sizes( holder->face, 0, pixelHeight );
|
|
|
+ error = FT_Set_Pixel_Sizes( holder->m_face, 0, _pixelHeight );
|
|
|
if( error )
|
|
|
{
|
|
|
- FT_Done_Face( holder->face );
|
|
|
- FT_Done_FreeType( holder->library );
|
|
|
+ FT_Done_Face( holder->m_face );
|
|
|
+ FT_Done_FreeType( holder->m_library );
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
@@ -155,31 +155,31 @@ FontInfo FontManager::TrueTypeFont::getFontInfo()
|
|
|
assert(m_font != NULL && "TrueTypeFont not initialized" );
|
|
|
FTHolder* holder = (FTHolder*) m_font;
|
|
|
|
|
|
- assert(FT_IS_SCALABLE (holder->face));
|
|
|
+ assert(FT_IS_SCALABLE (holder->m_face));
|
|
|
|
|
|
- FT_Size_Metrics metrics = holder->face->size->metrics;
|
|
|
+ FT_Size_Metrics metrics = holder->m_face->size->metrics;
|
|
|
|
|
|
//todo manage unscalable font
|
|
|
FontInfo outFontInfo;
|
|
|
- outFontInfo.scale = 1.0f;
|
|
|
- outFontInfo.ascender = metrics.ascender /64.0f;
|
|
|
- outFontInfo.descender = metrics.descender /64.0f;
|
|
|
- outFontInfo.lineGap = (metrics.height - metrics.ascender + metrics.descender) /64.0f;
|
|
|
+ outFontInfo.m_scale = 1.0f;
|
|
|
+ outFontInfo.m_ascender = metrics.ascender /64.0f;
|
|
|
+ outFontInfo.m_descender = metrics.descender /64.0f;
|
|
|
+ outFontInfo.m_lineGap = (metrics.height - metrics.ascender + metrics.descender) /64.0f;
|
|
|
|
|
|
- outFontInfo.underline_position = FT_MulFix(holder->face->underline_position, metrics.y_scale) /64.0f;
|
|
|
- outFontInfo.underline_thickness= FT_MulFix(holder->face->underline_thickness,metrics.y_scale) /64.0f;
|
|
|
+ outFontInfo.m_underline_position = FT_MulFix(holder->m_face->underline_position, metrics.y_scale) /64.0f;
|
|
|
+ outFontInfo.m_underline_thickness= FT_MulFix(holder->m_face->underline_thickness,metrics.y_scale) /64.0f;
|
|
|
return outFontInfo;
|
|
|
}
|
|
|
|
|
|
-bool FontManager::TrueTypeFont::bakeGlyphAlpha(CodePoint_t codePoint, GlyphInfo& glyphInfo, uint8_t* outBuffer)
|
|
|
+bool FontManager::TrueTypeFont::bakeGlyphAlpha(CodePoint_t _codePoint, GlyphInfo& _glyphInfo, uint8_t* _outBuffer)
|
|
|
{
|
|
|
assert(m_font != NULL && "TrueTypeFont not initialized" );
|
|
|
FTHolder* holder = (FTHolder*) m_font;
|
|
|
|
|
|
- glyphInfo.glyphIndex = FT_Get_Char_Index( holder->face, codePoint );
|
|
|
+ _glyphInfo.m_glyphIndex = FT_Get_Char_Index( holder->m_face, _codePoint );
|
|
|
|
|
|
- FT_GlyphSlot slot = holder->face->glyph;
|
|
|
- FT_Error error = FT_Load_Glyph( holder->face, glyphInfo.glyphIndex, FT_LOAD_DEFAULT );
|
|
|
+ FT_GlyphSlot slot = holder->m_face->glyph;
|
|
|
+ FT_Error error = FT_Load_Glyph( holder->m_face, _glyphInfo.m_glyphIndex, FT_LOAD_DEFAULT );
|
|
|
if(error) { return false; }
|
|
|
|
|
|
FT_Glyph glyph;
|
|
|
@@ -196,34 +196,34 @@ bool FontManager::TrueTypeFont::bakeGlyphAlpha(CodePoint_t codePoint, GlyphInfo&
|
|
|
int w = bitmap->bitmap.width;
|
|
|
int h = bitmap->bitmap.rows;
|
|
|
|
|
|
- glyphInfo.offset_x = (float) x;
|
|
|
- glyphInfo.offset_y = (float) y;
|
|
|
- glyphInfo.width = (float) w;
|
|
|
- glyphInfo.height = (float) h;
|
|
|
- glyphInfo.advance_x = (float)slot->advance.x /64.0f;
|
|
|
- glyphInfo.advance_y = (float)slot->advance.y /64.0f;
|
|
|
+ _glyphInfo.m_offset_x = (float) x;
|
|
|
+ _glyphInfo.m_offset_y = (float) y;
|
|
|
+ _glyphInfo.m_width = (float) w;
|
|
|
+ _glyphInfo.m_height = (float) h;
|
|
|
+ _glyphInfo.m_advance_x = (float)slot->advance.x /64.0f;
|
|
|
+ _glyphInfo.m_advance_y = (float)slot->advance.y /64.0f;
|
|
|
|
|
|
int charsize = 1;
|
|
|
int depth=1;
|
|
|
int stride = bitmap->bitmap.pitch;
|
|
|
for( int i=0; i<h; ++i )
|
|
|
{
|
|
|
- memcpy(outBuffer+(i*w) * charsize * depth,
|
|
|
+ memcpy(_outBuffer+(i*w) * charsize * depth,
|
|
|
bitmap->bitmap.buffer + (i*stride) * charsize, w * charsize * depth );
|
|
|
}
|
|
|
FT_Done_Glyph(glyph);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-bool FontManager::TrueTypeFont::bakeGlyphSubpixel(CodePoint_t codePoint, GlyphInfo& glyphInfo, uint8_t* outBuffer)
|
|
|
+bool FontManager::TrueTypeFont::bakeGlyphSubpixel(CodePoint_t _codePoint, GlyphInfo& _glyphInfo, uint8_t* _outBuffer)
|
|
|
{
|
|
|
assert(m_font != NULL && "TrueTypeFont not initialized" );
|
|
|
FTHolder* holder = (FTHolder*) m_font;
|
|
|
|
|
|
- glyphInfo.glyphIndex = FT_Get_Char_Index( holder->face, codePoint );
|
|
|
+ _glyphInfo.m_glyphIndex = FT_Get_Char_Index( holder->m_face, _codePoint );
|
|
|
|
|
|
- FT_GlyphSlot slot = holder->face->glyph;
|
|
|
- FT_Error error = FT_Load_Glyph( holder->face, glyphInfo.glyphIndex, FT_LOAD_DEFAULT );
|
|
|
+ FT_GlyphSlot slot = holder->m_face->glyph;
|
|
|
+ FT_Error error = FT_Load_Glyph( holder->m_face, _glyphInfo.m_glyphIndex, FT_LOAD_DEFAULT );
|
|
|
if(error) { return false; }
|
|
|
|
|
|
FT_Glyph glyph;
|
|
|
@@ -239,18 +239,18 @@ bool FontManager::TrueTypeFont::bakeGlyphSubpixel(CodePoint_t codePoint, GlyphIn
|
|
|
int w = bitmap->bitmap.width;
|
|
|
int h = bitmap->bitmap.rows;
|
|
|
|
|
|
- glyphInfo.offset_x = (float) x;
|
|
|
- glyphInfo.offset_y = (float) y;
|
|
|
- glyphInfo.width = (float) w;
|
|
|
- glyphInfo.height = (float) h;
|
|
|
- glyphInfo.advance_x = (float)slot->advance.x /64.0f;
|
|
|
- glyphInfo.advance_y = (float)slot->advance.y /64.0f;
|
|
|
+ _glyphInfo.m_offset_x = (float) x;
|
|
|
+ _glyphInfo.m_offset_y = (float) y;
|
|
|
+ _glyphInfo.m_width = (float) w;
|
|
|
+ _glyphInfo.m_height = (float) h;
|
|
|
+ _glyphInfo.m_advance_x = (float)slot->advance.x /64.0f;
|
|
|
+ _glyphInfo.m_advance_y = (float)slot->advance.y /64.0f;
|
|
|
int charsize = 1;
|
|
|
int depth=3;
|
|
|
int stride = bitmap->bitmap.pitch;
|
|
|
for( int i=0; i<h; ++i )
|
|
|
{
|
|
|
- memcpy(outBuffer+(i*w) * charsize * depth,
|
|
|
+ memcpy(_outBuffer+(i*w) * charsize * depth,
|
|
|
bitmap->bitmap.buffer + (i*stride) * charsize, w * charsize * depth );
|
|
|
}
|
|
|
FT_Done_Glyph(glyph);
|
|
|
@@ -335,18 +335,18 @@ void make_distance_map( unsigned char *img, unsigned char *outImg, unsigned int
|
|
|
}
|
|
|
|
|
|
|
|
|
-bool FontManager::TrueTypeFont::bakeGlyphDistance(CodePoint_t codePoint, GlyphInfo& glyphInfo, uint8_t* outBuffer)
|
|
|
+bool FontManager::TrueTypeFont::bakeGlyphDistance(CodePoint_t _codePoint, GlyphInfo& _glyphInfo, uint8_t* _outBuffer)
|
|
|
{
|
|
|
assert(m_font != NULL && "TrueTypeFont not initialized" );
|
|
|
FTHolder* holder = (FTHolder*) m_font;
|
|
|
|
|
|
- glyphInfo.glyphIndex = FT_Get_Char_Index( holder->face, codePoint );
|
|
|
+ _glyphInfo.m_glyphIndex = FT_Get_Char_Index( holder->m_face, _codePoint );
|
|
|
|
|
|
FT_Int32 loadMode = FT_LOAD_DEFAULT|FT_LOAD_NO_HINTING;
|
|
|
FT_Render_Mode renderMode = FT_RENDER_MODE_NORMAL;
|
|
|
|
|
|
- FT_GlyphSlot slot = holder->face->glyph;
|
|
|
- FT_Error error = FT_Load_Glyph( holder->face, glyphInfo.glyphIndex, loadMode );
|
|
|
+ FT_GlyphSlot slot = holder->m_face->glyph;
|
|
|
+ FT_Error error = FT_Load_Glyph( holder->m_face, _glyphInfo.m_glyphIndex, loadMode );
|
|
|
if(error) { return false; }
|
|
|
|
|
|
FT_Glyph glyph;
|
|
|
@@ -363,12 +363,12 @@ bool FontManager::TrueTypeFont::bakeGlyphDistance(CodePoint_t codePoint, GlyphIn
|
|
|
int w = bitmap->bitmap.width;
|
|
|
int h = bitmap->bitmap.rows;
|
|
|
|
|
|
- glyphInfo.offset_x = (float) x;
|
|
|
- glyphInfo.offset_y = (float) y;
|
|
|
- glyphInfo.width = (float) w;
|
|
|
- glyphInfo.height = (float) h;
|
|
|
- glyphInfo.advance_x = (float)slot->advance.x /64.0f;
|
|
|
- glyphInfo.advance_y = (float)slot->advance.y /64.0f;
|
|
|
+ _glyphInfo.m_offset_x = (float) x;
|
|
|
+ _glyphInfo.m_offset_y = (float) y;
|
|
|
+ _glyphInfo.m_width = (float) w;
|
|
|
+ _glyphInfo.m_height = (float) h;
|
|
|
+ _glyphInfo.m_advance_x = (float)slot->advance.x /64.0f;
|
|
|
+ _glyphInfo.m_advance_y = (float)slot->advance.y /64.0f;
|
|
|
|
|
|
int charsize = 1;
|
|
|
int depth=1;
|
|
|
@@ -377,7 +377,7 @@ bool FontManager::TrueTypeFont::bakeGlyphDistance(CodePoint_t codePoint, GlyphIn
|
|
|
for( int i=0; i<h; ++i )
|
|
|
{
|
|
|
|
|
|
- memcpy(outBuffer+(i*w) * charsize * depth,
|
|
|
+ memcpy(_outBuffer+(i*w) * charsize * depth,
|
|
|
bitmap->bitmap.buffer + (i*stride) * charsize, w * charsize * depth );
|
|
|
}
|
|
|
FT_Done_Glyph(glyph);
|
|
|
@@ -400,16 +400,16 @@ bool FontManager::TrueTypeFont::bakeGlyphDistance(CodePoint_t codePoint, GlyphIn
|
|
|
//copy the original buffer to the temp one
|
|
|
for(uint32_t i= dh; i< nh-dh; ++i)
|
|
|
{
|
|
|
- memcpy(alphaImg+i*nw+dw, outBuffer+(i-dh)*w, w);
|
|
|
+ memcpy(alphaImg+i*nw+dw, _outBuffer+(i-dh)*w, w);
|
|
|
}
|
|
|
|
|
|
- make_distance_map(alphaImg, outBuffer, nw, nh);
|
|
|
+ make_distance_map(alphaImg, _outBuffer, nw, nh);
|
|
|
free(alphaImg);
|
|
|
|
|
|
- glyphInfo.offset_x -= (float) dw;
|
|
|
- glyphInfo.offset_y -= (float) dh;
|
|
|
- glyphInfo.width = (float) nw ;
|
|
|
- glyphInfo.height = (float) nh;
|
|
|
+ _glyphInfo.m_offset_x -= (float) dw;
|
|
|
+ _glyphInfo.m_offset_y -= (float) dh;
|
|
|
+ _glyphInfo.m_width = (float) nw ;
|
|
|
+ _glyphInfo.m_height = (float) nh;
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
@@ -423,13 +423,13 @@ typedef stl::unordered_map<CodePoint_t, GlyphInfo> GlyphHash_t;
|
|
|
// cache font data
|
|
|
struct FontManager::CachedFont
|
|
|
{
|
|
|
- CachedFont(){ trueTypeFont = NULL; masterFontHandle.idx = -1; }
|
|
|
- FontInfo fontInfo;
|
|
|
- GlyphHash_t cachedGlyphs;
|
|
|
- FontManager::TrueTypeFont* trueTypeFont;
|
|
|
+ CachedFont(){ m_trueTypeFont = NULL; m_masterFontHandle.idx = -1; }
|
|
|
+ FontInfo m_fontInfo;
|
|
|
+ GlyphHash_t m_cachedGlyphs;
|
|
|
+ FontManager::TrueTypeFont* m_trueTypeFont;
|
|
|
// an handle to a master font in case of sub distance field font
|
|
|
- FontHandle masterFontHandle;
|
|
|
- int16_t __padding__;
|
|
|
+ FontHandle m_masterFontHandle;
|
|
|
+ int16_t m_padding;
|
|
|
};
|
|
|
|
|
|
|
|
|
@@ -439,16 +439,16 @@ const uint16_t MAX_OPENED_FILES = 64;
|
|
|
const uint16_t MAX_OPENED_FONT = 64;
|
|
|
const uint32_t MAX_FONT_BUFFER_SIZE = 512*512*4;
|
|
|
|
|
|
-FontManager::FontManager(Atlas* atlas):m_filesHandles(MAX_OPENED_FILES), m_fontHandles(MAX_OPENED_FONT)
|
|
|
+FontManager::FontManager(Atlas* _atlas):m_filesHandles(MAX_OPENED_FILES), m_fontHandles(MAX_OPENED_FONT)
|
|
|
{
|
|
|
- m_atlas = atlas;
|
|
|
+ m_atlas = _atlas;
|
|
|
m_ownAtlas = false;
|
|
|
init();
|
|
|
}
|
|
|
|
|
|
-FontManager::FontManager(uint32_t textureSideWidth):m_filesHandles(MAX_OPENED_FILES), m_fontHandles(MAX_OPENED_FONT)
|
|
|
+FontManager::FontManager(uint32_t _textureSideWidth):m_filesHandles(MAX_OPENED_FILES), m_fontHandles(MAX_OPENED_FONT)
|
|
|
{
|
|
|
- m_atlas = new Atlas(textureSideWidth);
|
|
|
+ m_atlas = new Atlas(_textureSideWidth);
|
|
|
m_ownAtlas = true;
|
|
|
init();
|
|
|
}
|
|
|
@@ -463,8 +463,8 @@ void FontManager::init()
|
|
|
uint8_t buffer[4*4*4];
|
|
|
memset( buffer, 255, 4 * 4 * 4);
|
|
|
|
|
|
- m_blackGlyph.width=3;
|
|
|
- m_blackGlyph.height=3;
|
|
|
+ m_blackGlyph.m_width=3;
|
|
|
+ m_blackGlyph.m_height=3;
|
|
|
assert( addBitmap(m_blackGlyph, buffer) );
|
|
|
//make sure the black glyph doesn't bleed
|
|
|
|
|
|
@@ -494,10 +494,10 @@ FontManager::~FontManager()
|
|
|
|
|
|
|
|
|
|
|
|
-TrueTypeHandle FontManager::loadTrueTypeFromFile(const char* fontPath)
|
|
|
+TrueTypeHandle FontManager::loadTrueTypeFromFile(const char* _fontPath)
|
|
|
{
|
|
|
FILE * pFile;
|
|
|
- pFile = fopen (fontPath, "rb");
|
|
|
+ pFile = fopen (_fontPath, "rb");
|
|
|
if (pFile==NULL)
|
|
|
{
|
|
|
TrueTypeHandle invalid = BGFX_INVALID_HANDLE;
|
|
|
@@ -544,34 +544,34 @@ TrueTypeHandle FontManager::loadTrueTypeFromFile(const char* fontPath)
|
|
|
return invalid;
|
|
|
}
|
|
|
|
|
|
-TrueTypeHandle FontManager::loadTrueTypeFromMemory(const uint8_t* buffer, uint32_t size)
|
|
|
+TrueTypeHandle FontManager::loadTrueTypeFromMemory(const uint8_t* _buffer, uint32_t _size)
|
|
|
{
|
|
|
uint16_t id = m_filesHandles.alloc();
|
|
|
assert(id != bx::HandleAlloc::invalid);
|
|
|
- m_cachedFiles[id].buffer = new uint8_t[size];
|
|
|
- m_cachedFiles[id].bufferSize = size;
|
|
|
- memcpy(m_cachedFiles[id].buffer, buffer, size);
|
|
|
+ m_cachedFiles[id].buffer = new uint8_t[_size];
|
|
|
+ m_cachedFiles[id].bufferSize = _size;
|
|
|
+ memcpy(m_cachedFiles[id].buffer, _buffer, _size);
|
|
|
|
|
|
//TODO validate font
|
|
|
TrueTypeHandle ret = {id};
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-void FontManager::unloadTrueType(TrueTypeHandle handle)
|
|
|
+void FontManager::unloadTrueType(TrueTypeHandle _handle)
|
|
|
{
|
|
|
- assert(bgfx::invalidHandle != handle.idx);
|
|
|
- delete m_cachedFiles[handle.idx].buffer;
|
|
|
- m_cachedFiles[handle.idx].bufferSize = 0;
|
|
|
- m_cachedFiles[handle.idx].buffer = NULL;
|
|
|
- m_filesHandles.free(handle.idx);
|
|
|
+ assert(bgfx::invalidHandle != _handle.idx);
|
|
|
+ delete m_cachedFiles[_handle.idx].buffer;
|
|
|
+ m_cachedFiles[_handle.idx].bufferSize = 0;
|
|
|
+ m_cachedFiles[_handle.idx].buffer = NULL;
|
|
|
+ m_filesHandles.free(_handle.idx);
|
|
|
}
|
|
|
|
|
|
-FontHandle FontManager::createFontByPixelSize(TrueTypeHandle handle, uint32_t typefaceIndex, uint32_t pixelSize, FontType fontType)
|
|
|
+FontHandle FontManager::createFontByPixelSize(TrueTypeHandle _tt_handle, uint32_t _typefaceIndex, uint32_t _pixelSize, FontType _fontType)
|
|
|
{
|
|
|
- assert(bgfx::invalidHandle != handle.idx);
|
|
|
+ assert(bgfx::invalidHandle != _tt_handle.idx);
|
|
|
|
|
|
TrueTypeFont* ttf = new TrueTypeFont();
|
|
|
- if(!ttf->init( m_cachedFiles[handle.idx].buffer, m_cachedFiles[handle.idx].bufferSize, typefaceIndex, pixelSize))
|
|
|
+ if(!ttf->init( m_cachedFiles[_tt_handle.idx].buffer, m_cachedFiles[_tt_handle.idx].bufferSize, _typefaceIndex, _pixelSize))
|
|
|
{
|
|
|
delete ttf;
|
|
|
FontHandle invalid = BGFX_INVALID_HANDLE;
|
|
|
@@ -581,12 +581,12 @@ FontHandle FontManager::createFontByPixelSize(TrueTypeHandle handle, uint32_t ty
|
|
|
uint16_t fontIdx = m_fontHandles.alloc();
|
|
|
assert(fontIdx != bx::HandleAlloc::invalid);
|
|
|
|
|
|
- m_cachedFonts[fontIdx].trueTypeFont = ttf;
|
|
|
- m_cachedFonts[fontIdx].fontInfo = ttf->getFontInfo();
|
|
|
- m_cachedFonts[fontIdx].fontInfo.fontType = fontType;
|
|
|
- m_cachedFonts[fontIdx].fontInfo.pixelSize = pixelSize;
|
|
|
- m_cachedFonts[fontIdx].cachedGlyphs.clear();
|
|
|
- m_cachedFonts[fontIdx].masterFontHandle.idx = -1;
|
|
|
+ m_cachedFonts[fontIdx].m_trueTypeFont = ttf;
|
|
|
+ m_cachedFonts[fontIdx].m_fontInfo = ttf->getFontInfo();
|
|
|
+ m_cachedFonts[fontIdx].m_fontInfo.m_fontType = _fontType;
|
|
|
+ m_cachedFonts[fontIdx].m_fontInfo.m_pixelSize = _pixelSize;
|
|
|
+ m_cachedFonts[fontIdx].m_cachedGlyphs.clear();
|
|
|
+ m_cachedFonts[fontIdx].m_masterFontHandle.idx = -1;
|
|
|
FontHandle ret = {fontIdx};
|
|
|
return ret;
|
|
|
}
|
|
|
@@ -595,24 +595,24 @@ FontHandle FontManager::createScaledFontToPixelSize(FontHandle _baseFontHandle,
|
|
|
{
|
|
|
assert(bgfx::invalidHandle != _baseFontHandle.idx);
|
|
|
CachedFont& font = m_cachedFonts[_baseFontHandle.idx];
|
|
|
- FontInfo& fontInfo = font.fontInfo;
|
|
|
+ FontInfo& fontInfo = font.m_fontInfo;
|
|
|
|
|
|
FontInfo newFontInfo = fontInfo;
|
|
|
- newFontInfo.pixelSize = _pixelSize;
|
|
|
- newFontInfo.scale = (float)_pixelSize / (float) fontInfo.pixelSize;
|
|
|
- newFontInfo.ascender = (newFontInfo.ascender * newFontInfo.scale);
|
|
|
- newFontInfo.descender = (newFontInfo.descender * newFontInfo.scale);
|
|
|
- newFontInfo.lineGap = (newFontInfo.lineGap * newFontInfo.scale);
|
|
|
- newFontInfo.underline_thickness = (newFontInfo.underline_thickness * newFontInfo.scale);
|
|
|
- newFontInfo.underline_position = (newFontInfo.underline_position * newFontInfo.scale);
|
|
|
+ newFontInfo.m_pixelSize = _pixelSize;
|
|
|
+ newFontInfo.m_scale = (float)_pixelSize / (float) fontInfo.m_pixelSize;
|
|
|
+ newFontInfo.m_ascender = (newFontInfo.m_ascender * newFontInfo.m_scale);
|
|
|
+ newFontInfo.m_descender = (newFontInfo.m_descender * newFontInfo.m_scale);
|
|
|
+ newFontInfo.m_lineGap = (newFontInfo.m_lineGap * newFontInfo.m_scale);
|
|
|
+ newFontInfo.m_underline_thickness = (newFontInfo.m_underline_thickness * newFontInfo.m_scale);
|
|
|
+ newFontInfo.m_underline_position = (newFontInfo.m_underline_position * newFontInfo.m_scale);
|
|
|
|
|
|
|
|
|
uint16_t fontIdx = m_fontHandles.alloc();
|
|
|
assert(fontIdx != bx::HandleAlloc::invalid);
|
|
|
- m_cachedFonts[fontIdx].cachedGlyphs.clear();
|
|
|
- m_cachedFonts[fontIdx].fontInfo = newFontInfo;
|
|
|
- m_cachedFonts[fontIdx].trueTypeFont = NULL;
|
|
|
- m_cachedFonts[fontIdx].masterFontHandle = _baseFontHandle;
|
|
|
+ m_cachedFonts[fontIdx].m_cachedGlyphs.clear();
|
|
|
+ m_cachedFonts[fontIdx].m_fontInfo = newFontInfo;
|
|
|
+ m_cachedFonts[fontIdx].m_trueTypeFont = NULL;
|
|
|
+ m_cachedFonts[fontIdx].m_masterFontHandle = _baseFontHandle;
|
|
|
FontHandle ret = {fontIdx};
|
|
|
return ret;
|
|
|
}
|
|
|
@@ -635,29 +635,29 @@ void FontManager::destroyFont(FontHandle _handle)
|
|
|
{
|
|
|
assert(bgfx::invalidHandle != _handle.idx);
|
|
|
|
|
|
- if(m_cachedFonts[_handle.idx].trueTypeFont != NULL)
|
|
|
+ if(m_cachedFonts[_handle.idx].m_trueTypeFont != NULL)
|
|
|
{
|
|
|
- delete m_cachedFonts[_handle.idx].trueTypeFont;
|
|
|
- m_cachedFonts[_handle.idx].trueTypeFont = NULL;
|
|
|
+ delete m_cachedFonts[_handle.idx].m_trueTypeFont;
|
|
|
+ m_cachedFonts[_handle.idx].m_trueTypeFont = NULL;
|
|
|
}
|
|
|
- m_cachedFonts[_handle.idx].cachedGlyphs.clear();
|
|
|
+ m_cachedFonts[_handle.idx].m_cachedGlyphs.clear();
|
|
|
m_fontHandles.free(_handle.idx);
|
|
|
}
|
|
|
|
|
|
-bool FontManager::preloadGlyph(FontHandle handle, const wchar_t* _string)
|
|
|
+bool FontManager::preloadGlyph(FontHandle _handle, const wchar_t* _string)
|
|
|
{
|
|
|
- assert(bgfx::invalidHandle != handle.idx);
|
|
|
- CachedFont& font = m_cachedFonts[handle.idx];
|
|
|
+ assert(bgfx::invalidHandle != _handle.idx);
|
|
|
+ CachedFont& font = m_cachedFonts[_handle.idx];
|
|
|
|
|
|
//if truetype present
|
|
|
- if(font.trueTypeFont != NULL)
|
|
|
+ if(font.m_trueTypeFont != NULL)
|
|
|
{
|
|
|
//parse string
|
|
|
for( size_t i=0, end = wcslen(_string) ; i < end; ++i )
|
|
|
{
|
|
|
//if glyph cached, continue
|
|
|
CodePoint_t codePoint = _string[i];
|
|
|
- if(!preloadGlyph(handle, codePoint))
|
|
|
+ if(!preloadGlyph(_handle, codePoint))
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
@@ -668,37 +668,37 @@ bool FontManager::preloadGlyph(FontHandle handle, const wchar_t* _string)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-bool FontManager::preloadGlyph(FontHandle handle, CodePoint_t codePoint)
|
|
|
+bool FontManager::preloadGlyph(FontHandle _handle, CodePoint_t _codePoint)
|
|
|
{
|
|
|
- assert(bgfx::invalidHandle != handle.idx);
|
|
|
- CachedFont& font = m_cachedFonts[handle.idx];
|
|
|
- FontInfo& fontInfo = font.fontInfo;
|
|
|
+ assert(bgfx::invalidHandle != _handle.idx);
|
|
|
+ CachedFont& font = m_cachedFonts[_handle.idx];
|
|
|
+ FontInfo& fontInfo = font.m_fontInfo;
|
|
|
//check if glyph not already present
|
|
|
- GlyphHash_t::iterator iter = font.cachedGlyphs.find(codePoint);
|
|
|
- if(iter != font.cachedGlyphs.end())
|
|
|
+ GlyphHash_t::iterator iter = font.m_cachedGlyphs.find(_codePoint);
|
|
|
+ if(iter != font.m_cachedGlyphs.end())
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
//if truetype present
|
|
|
- if(font.trueTypeFont != NULL)
|
|
|
+ if(font.m_trueTypeFont != NULL)
|
|
|
{
|
|
|
GlyphInfo glyphInfo;
|
|
|
|
|
|
//bake glyph as bitmap to buffer
|
|
|
- switch(font.fontInfo.fontType)
|
|
|
+ switch(font.m_fontInfo.m_fontType)
|
|
|
{
|
|
|
case FONT_TYPE_ALPHA:
|
|
|
- font.trueTypeFont->bakeGlyphAlpha(codePoint, glyphInfo, m_buffer);
|
|
|
+ font.m_trueTypeFont->bakeGlyphAlpha(_codePoint, glyphInfo, m_buffer);
|
|
|
break;
|
|
|
//case FONT_TYPE_LCD:
|
|
|
- //font.trueTypeFont->bakeGlyphSubpixel(codePoint, glyphInfo, m_buffer);
|
|
|
+ //font.m_trueTypeFont->bakeGlyphSubpixel(codePoint, glyphInfo, m_buffer);
|
|
|
//break;
|
|
|
case FONT_TYPE_DISTANCE:
|
|
|
- font.trueTypeFont->bakeGlyphDistance(codePoint, glyphInfo, m_buffer);
|
|
|
+ font.m_trueTypeFont->bakeGlyphDistance(_codePoint, glyphInfo, m_buffer);
|
|
|
break;
|
|
|
case FONT_TYPE_DISTANCE_SUBPIXEL:
|
|
|
- font.trueTypeFont->bakeGlyphDistance(codePoint, glyphInfo, m_buffer);
|
|
|
+ font.m_trueTypeFont->bakeGlyphDistance(_codePoint, glyphInfo, m_buffer);
|
|
|
break;
|
|
|
default:
|
|
|
assert(false && "TextureType not supported yet");
|
|
|
@@ -710,35 +710,35 @@ bool FontManager::preloadGlyph(FontHandle handle, CodePoint_t codePoint)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- glyphInfo.advance_x = (glyphInfo.advance_x * fontInfo.scale);
|
|
|
- glyphInfo.advance_y = (glyphInfo.advance_y * fontInfo.scale);
|
|
|
- glyphInfo.offset_x = (glyphInfo.offset_x * fontInfo.scale);
|
|
|
- glyphInfo.offset_y = (glyphInfo.offset_y * fontInfo.scale);
|
|
|
- glyphInfo.height = (glyphInfo.height * fontInfo.scale);
|
|
|
- glyphInfo.width = (glyphInfo.width * fontInfo.scale);
|
|
|
+ glyphInfo.m_advance_x = (glyphInfo.m_advance_x * fontInfo.m_scale);
|
|
|
+ glyphInfo.m_advance_y = (glyphInfo.m_advance_y * fontInfo.m_scale);
|
|
|
+ glyphInfo.m_offset_x = (glyphInfo.m_offset_x * fontInfo.m_scale);
|
|
|
+ glyphInfo.m_offset_y = (glyphInfo.m_offset_y * fontInfo.m_scale);
|
|
|
+ glyphInfo.m_height = (glyphInfo.m_height * fontInfo.m_scale);
|
|
|
+ glyphInfo.m_width = (glyphInfo.m_width * fontInfo.m_scale);
|
|
|
|
|
|
// store cached glyph
|
|
|
- font.cachedGlyphs[codePoint] = glyphInfo;
|
|
|
+ font.m_cachedGlyphs[_codePoint] = glyphInfo;
|
|
|
return true;
|
|
|
}else
|
|
|
{
|
|
|
//retrieve glyph from parent font if any
|
|
|
- if(font.masterFontHandle.idx != bgfx::invalidHandle)
|
|
|
+ if(font.m_masterFontHandle.idx != bgfx::invalidHandle)
|
|
|
{
|
|
|
- if(preloadGlyph(font.masterFontHandle, codePoint))
|
|
|
+ if(preloadGlyph(font.m_masterFontHandle, _codePoint))
|
|
|
{
|
|
|
GlyphInfo glyphInfo;
|
|
|
- getGlyphInfo(font.masterFontHandle, codePoint, glyphInfo);
|
|
|
+ getGlyphInfo(font.m_masterFontHandle, _codePoint, glyphInfo);
|
|
|
|
|
|
- glyphInfo.advance_x = (glyphInfo.advance_x * fontInfo.scale);
|
|
|
- glyphInfo.advance_y = (glyphInfo.advance_y * fontInfo.scale);
|
|
|
- glyphInfo.offset_x = (glyphInfo.offset_x * fontInfo.scale);
|
|
|
- glyphInfo.offset_y = (glyphInfo.offset_y * fontInfo.scale);
|
|
|
- glyphInfo.height = (glyphInfo.height * fontInfo.scale);
|
|
|
- glyphInfo.width = (glyphInfo.width * fontInfo.scale);
|
|
|
+ glyphInfo.m_advance_x = (glyphInfo.m_advance_x * fontInfo.m_scale);
|
|
|
+ glyphInfo.m_advance_y = (glyphInfo.m_advance_y * fontInfo.m_scale);
|
|
|
+ glyphInfo.m_offset_x = (glyphInfo.m_offset_x * fontInfo.m_scale);
|
|
|
+ glyphInfo.m_offset_y = (glyphInfo.m_offset_y * fontInfo.m_scale);
|
|
|
+ glyphInfo.m_height = (glyphInfo.m_height * fontInfo.m_scale);
|
|
|
+ glyphInfo.m_width = (glyphInfo.m_width * fontInfo.m_scale);
|
|
|
|
|
|
// store cached glyph
|
|
|
- font.cachedGlyphs[codePoint] = glyphInfo;
|
|
|
+ font.m_cachedGlyphs[_codePoint] = glyphInfo;
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
@@ -747,34 +747,34 @@ bool FontManager::preloadGlyph(FontHandle handle, CodePoint_t codePoint)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-const FontInfo& FontManager::getFontInfo(FontHandle handle)
|
|
|
+const FontInfo& FontManager::getFontInfo(FontHandle _handle)
|
|
|
{
|
|
|
- assert(handle.idx != bgfx::invalidHandle);
|
|
|
- return m_cachedFonts[handle.idx].fontInfo;
|
|
|
+ assert(_handle.idx != bgfx::invalidHandle);
|
|
|
+ return m_cachedFonts[_handle.idx].m_fontInfo;
|
|
|
}
|
|
|
|
|
|
-bool FontManager::getGlyphInfo(FontHandle fontHandle, CodePoint_t codePoint, GlyphInfo& outInfo)
|
|
|
+bool FontManager::getGlyphInfo(FontHandle _handle, CodePoint_t _codePoint, GlyphInfo& _outInfo)
|
|
|
{
|
|
|
- GlyphHash_t::iterator iter = m_cachedFonts[fontHandle.idx].cachedGlyphs.find(codePoint);
|
|
|
- if(iter == m_cachedFonts[fontHandle.idx].cachedGlyphs.end())
|
|
|
+ GlyphHash_t::iterator iter = m_cachedFonts[_handle.idx].m_cachedGlyphs.find(_codePoint);
|
|
|
+ if(iter == m_cachedFonts[_handle.idx].m_cachedGlyphs.end())
|
|
|
{
|
|
|
- if(preloadGlyph(fontHandle, codePoint))
|
|
|
+ if(preloadGlyph(_handle, _codePoint))
|
|
|
{
|
|
|
- iter = m_cachedFonts[fontHandle.idx].cachedGlyphs.find(codePoint);
|
|
|
+ iter = m_cachedFonts[_handle.idx].m_cachedGlyphs.find(_codePoint);
|
|
|
}else
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
- outInfo = iter->second;
|
|
|
+ _outInfo = iter->second;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
// ****************************************************************************
|
|
|
|
|
|
|
|
|
-bool FontManager::addBitmap(GlyphInfo& glyphInfo, const uint8_t* data)
|
|
|
+bool FontManager::addBitmap(GlyphInfo& _glyphInfo, const uint8_t* _data)
|
|
|
{
|
|
|
- glyphInfo.regionIndex = m_atlas->addRegion((uint16_t) ceil(glyphInfo.width),(uint16_t) ceil(glyphInfo.height), data, AtlasRegion::TYPE_GRAY);
|
|
|
+ _glyphInfo.m_regionIndex = m_atlas->addRegion((uint16_t) ceil(_glyphInfo.m_width),(uint16_t) ceil(_glyphInfo.m_height), _data, AtlasRegion::TYPE_GRAY);
|
|
|
return true;
|
|
|
}
|