FXFT_Face CFGAS_FontMgr::LoadFace(IFX_SeekableReadStream* pFontStream, int32_t iFaceIndex) { if (!pFontStream) return nullptr; CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); pFontMgr->InitFTLibrary(); FXFT_Library library = pFontMgr->GetFTLibrary(); if (!library) return nullptr; FXFT_Stream ftStream = FX_Alloc(FXFT_StreamRec, 1); FXSYS_memset(ftStream, 0, sizeof(FXFT_StreamRec)); ftStream->base = nullptr; ftStream->descriptor.pointer = pFontStream; ftStream->pos = 0; ftStream->size = static_cast<unsigned long>(pFontStream->GetSize()); ftStream->read = _ftStreamRead; ftStream->close = _ftStreamClose; FXFT_Open_Args ftArgs; FXSYS_memset(&ftArgs, 0, sizeof(FXFT_Open_Args)); ftArgs.flags |= FT_OPEN_STREAM; ftArgs.stream = ftStream; FXFT_Face pFace = nullptr; if (FXFT_Open_Face(library, &ftArgs, iFaceIndex, &pFace)) { FX_Free(ftStream); return nullptr; } FXFT_Set_Pixel_Sizes(pFace, 0, 64); return pFace; }
FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index) { CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc; if (!pFontDesc) { return NULL; } pFontDesc->m_Type = 1; pFontDesc->m_SingleFace.m_pFace = NULL; pFontDesc->m_SingleFace.m_bBold = weight; pFontDesc->m_SingleFace.m_bItalic = bItalic; pFontDesc->m_pFontData = pData; pFontDesc->m_RefCount = 1; FXFT_Library library; if (m_FTLibrary == NULL) { FXFT_Init_FreeType(&m_FTLibrary); } library = m_FTLibrary; int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &pFontDesc->m_SingleFace.m_pFace); if (ret) { delete pFontDesc; return NULL; } ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64); if (ret) { delete pFontDesc; return NULL; } CFX_ByteString key(face_name); key += ','; key += CFX_ByteString::FormatInteger(weight); key += bItalic ? 'I' : 'N'; m_FaceMap.SetAt(key, pFontDesc); return pFontDesc->m_SingleFace.m_pFace; }
FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox) { if (m_Face == NULL) { return FALSE; } if (FXFT_Is_Face_Tricky(m_Face)) { int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72); if (error) { return FALSE; } error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); if (error) { return FALSE; } FXFT_BBox cbox; FT_Glyph glyph; error = FXFT_Get_Glyph(((FXFT_Face)m_Face)->glyph, &glyph); if (error) { return FALSE; } FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox); int pixel_size_x = ((FXFT_Face)m_Face)->size->metrics.x_ppem, pixel_size_y = ((FXFT_Face)m_Face)->size->metrics.y_ppem; if (pixel_size_x == 0 || pixel_size_y == 0) { bbox.left = cbox.xMin; bbox.right = cbox.xMax; bbox.top = cbox.yMax; bbox.bottom = cbox.yMin; } else { bbox.left = cbox.xMin * 1000 / pixel_size_x; bbox.right = cbox.xMax * 1000 / pixel_size_x; bbox.top = cbox.yMax * 1000 / pixel_size_y; bbox.bottom = cbox.yMin * 1000 / pixel_size_y; } if (bbox.top > FXFT_Get_Face_Ascender(m_Face)) { bbox.top = FXFT_Get_Face_Ascender(m_Face); } if (bbox.bottom < FXFT_Get_Face_Descender(m_Face)) { bbox.bottom = FXFT_Get_Face_Descender(m_Face); } FT_Done_Glyph(glyph); return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0; } if (FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) { return FALSE; } int em = FXFT_Get_Face_UnitsPerEM(m_Face); if (em == 0) { bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face); bbox.bottom = FXFT_Get_Glyph_HoriBearingY(m_Face); bbox.top = bbox.bottom - FXFT_Get_Glyph_Height(m_Face); bbox.right = bbox.left + FXFT_Get_Glyph_Width(m_Face); } else { bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face) * 1000 / em; bbox.top = (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * 1000 / em; bbox.right = (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * 1000 / em; bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em; } return TRUE; }
FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, int weight, FX_BOOL bItalic, uint8_t* pData, uint32_t size, int face_index) { CTTFontDesc* pFontDesc = new CTTFontDesc; pFontDesc->m_Type = 1; pFontDesc->m_SingleFace.m_pFace = nullptr; pFontDesc->m_SingleFace.m_bBold = weight; pFontDesc->m_SingleFace.m_bItalic = bItalic; pFontDesc->m_pFontData = pData; pFontDesc->m_RefCount = 1; InitFTLibrary(); FXFT_Library library = m_FTLibrary; int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &pFontDesc->m_SingleFace.m_pFace); if (ret) { delete pFontDesc; return nullptr; } ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64); if (ret) { delete pFontDesc; return nullptr; } m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = pFontDesc; return pFontDesc->m_SingleFace.m_pFace; }
FXFT_Face CFPF_SkiaFontMgr::GetFontFace(IFX_FileRead *pFileRead, FX_INT32 iFaceIndex) { if (!pFileRead) { return NULL; } if (pFileRead->GetSize() == 0) { return NULL; } if (iFaceIndex < 0) { return NULL; } FXFT_StreamRec streamRec; FXSYS_memset32(&streamRec, 0, sizeof(FXFT_StreamRec)); streamRec.size = pFileRead->GetSize(); streamRec.descriptor.pointer = pFileRead; streamRec.read = FPF_SkiaStream_Read; streamRec.close = FPF_SkiaStream_Close; FXFT_Open_Args args; args.flags = FT_OPEN_STREAM; args.stream = &streamRec; FXFT_Face face; if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) { return NULL; } FXFT_Set_Pixel_Sizes(face, 0, 64); return face; }
FXFT_Face CFX_FontMgr::GetFileFace(const FX_CHAR* filename, int face_index) { InitFTLibrary(); FXFT_Library library = m_FTLibrary; FXFT_Face face = nullptr; if (FXFT_New_Face(library, filename, face_index, &face)) return nullptr; return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; }
FXFT_Face CFX_FontMgr::GetFixedFace(const uint8_t* pData, uint32_t size, int face_index) { InitFTLibrary(); FXFT_Library library = m_FTLibrary; FXFT_Face face = nullptr; if (FXFT_New_Memory_Face(library, pData, size, face_index, &face)) return nullptr; return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; }
FX_BOOL CFPF_SkiaFont::GetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox) { if (!m_Face) { return FALSE; } if (FXFT_Is_Face_Tricky(m_Face)) { if (FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72)) { return FALSE; } if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) { FXFT_Set_Pixel_Sizes(m_Face, 0, 64); return FALSE; } FXFT_Glyph glyph; if (FXFT_Get_Glyph(m_Face->glyph, &glyph)) { FXFT_Set_Pixel_Sizes(m_Face, 0, 64); return FALSE; } FXFT_BBox cbox; FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox); FX_INT32 x_ppem = m_Face->size->metrics.x_ppem; FX_INT32 y_ppem = m_Face->size->metrics.y_ppem; rtBBox.left = FPF_EM_ADJUST(x_ppem, cbox.xMin); rtBBox.right = FPF_EM_ADJUST(x_ppem, cbox.xMax); rtBBox.top = FPF_EM_ADJUST(y_ppem, cbox.yMax); rtBBox.bottom = FPF_EM_ADJUST(y_ppem, cbox.yMin); rtBBox.top = FX_MIN(rtBBox.top, GetAscent()); rtBBox.bottom = FX_MAX(rtBBox.bottom, GetDescent()); FXFT_Done_Glyph(glyph); return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0; } if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) { return FALSE; } rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingX(m_Face)); rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingY(m_Face)); rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)); rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)); return TRUE; }
FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile) { m_bEmbedded = FALSE; FXFT_Library library; if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) { FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary); } library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary; FXFT_Stream stream = NULL; if (!_LoadFile(library, &m_Face, pFile, &stream)) { return FALSE; } m_pOwnedStream = stream; FXFT_Set_Pixel_Sizes(m_Face, 0, 64); return TRUE; }
FXFT_Face CFX_FontMgr::GetFileFace(FX_LPCSTR filename, int face_index) { FXFT_Library library; if (m_FTLibrary == NULL) { FXFT_Init_FreeType(&m_FTLibrary); } library = m_FTLibrary; FXFT_Face face = NULL; int ret = FXFT_New_Face(library, filename, face_index, &face); if (ret) { return NULL; } ret = FXFT_Set_Pixel_Sizes(face, 64, 64); if (ret) { return NULL; } return face; }
FXFT_Face CFX_FontMgr::GetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index) { FXFT_Library library; if (m_FTLibrary == NULL) { FXFT_Init_FreeType(&m_FTLibrary); } library = m_FTLibrary; FXFT_Face face = NULL; int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &face); if (ret) { return NULL; } ret = FXFT_Set_Pixel_Sizes(face, 64, 64); if (ret) { return NULL; } return face; }
FXFT_Face CFPF_SkiaFontMgr::GetFontFace(FX_BSTR bsFile, FX_INT32 iFaceIndex ) { if (bsFile.IsEmpty()) { return NULL; } if (iFaceIndex < 0) { return NULL; } FXFT_Open_Args args; args.flags = FT_OPEN_PATHNAME; args.pathname = (FT_String*)bsFile.GetCStr(); FXFT_Face face; if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) { return FALSE; } FXFT_Set_Pixel_Sizes(face, 0, 64); return face; }
static FXFT_Face FT_LoadFont(FX_LPBYTE pData, int size) { FXFT_Library library; if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) { FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary); } library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary; FXFT_Face face; int error = FXFT_New_Memory_Face(library, pData, size, 0, &face); if (error) { return NULL; } error = FXFT_Set_Pixel_Sizes(face, 64, 64); if (error) { return NULL; } return face; }
FXFT_Face CFPF_SkiaFontMgr::GetFontFace(const CFX_ByteStringC& bsFile, int32_t iFaceIndex) { if (bsFile.IsEmpty()) { return nullptr; } if (iFaceIndex < 0) { return nullptr; } FXFT_Open_Args args; args.flags = FT_OPEN_PATHNAME; args.pathname = const_cast<FT_String*>(bsFile.c_str()); FXFT_Face face; if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) { return FALSE; } FXFT_Set_Pixel_Sizes(face, 0, 64); return face; }
FXFT_Face CFPF_SkiaFontMgr::GetFontFace(FX_LPCBYTE pBuffer, size_t szBuffer, FX_INT32 iFaceIndex ) { if (!pBuffer || szBuffer < 1) { return NULL; } if (iFaceIndex < 0) { return NULL; } FXFT_Open_Args args; args.flags = FT_OPEN_MEMORY; args.memory_base = pBuffer; args.memory_size = szBuffer; FXFT_Face face; if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) { return FALSE; } FXFT_Set_Pixel_Sizes(face, 0, 64); return face; }
FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile, int nFaceIndex, int* pFaceCount) { m_bEmbedded = FALSE; CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); pFontMgr->InitFTLibrary(); FXFT_Library library = pFontMgr->GetFTLibrary(); FXFT_Stream stream = nullptr; if (!_LoadFile(library, &m_Face, pFile, &stream, nFaceIndex)) return FALSE; if (pFaceCount) *pFaceCount = (int)m_Face->num_faces; m_pOwnedStream = stream; FXFT_Set_Pixel_Sizes(m_Face, 0, 64); return TRUE; }
FXFT_Face CFPF_SkiaFontMgr::GetFontFace(const uint8_t* pBuffer, size_t szBuffer, int32_t iFaceIndex) { if (!pBuffer || szBuffer < 1) { return nullptr; } if (iFaceIndex < 0) { return nullptr; } FXFT_Open_Args args; args.flags = FT_OPEN_MEMORY; args.memory_base = pBuffer; args.memory_size = szBuffer; FXFT_Face face; if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) { return FALSE; } FXFT_Set_Pixel_Sizes(face, 0, 64); return face; }