diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/fxge/fx_font.h | 14 | ||||
-rw-r--r-- | core/fxge/ge/cfx_font.cpp | 102 | ||||
-rw-r--r-- | core/fxge/ge/cfx_renderdevice.cpp | 2 |
3 files changed, 36 insertions, 82 deletions
diff --git a/core/fxge/fx_font.h b/core/fxge/fx_font.h index 946c713418..5ef1a7d65e 100644 --- a/core/fxge/fx_font.h +++ b/core/fxge/fx_font.h @@ -100,8 +100,7 @@ class CFX_Font { #ifdef PDF_ENABLE_XFA bool LoadFile(const CFX_RetainPtr<IFX_SeekableReadStream>& pFile, - int nFaceIndex = 0, - int* pFaceCount = nullptr); + int nFaceIndex); bool LoadClone(const CFX_Font* pFont); void SetFace(FXFT_Face face); @@ -135,10 +134,6 @@ class CFX_Font { CFX_ByteString GetFaceName() const; bool IsTTFont() const; bool GetBBox(FX_RECT& bbox); - int GetHeight() const; - int GetULPos() const; - int GetULthickness() const; - int GetMaxAdvanceWidth() const; bool IsEmbedded() const { return m_bEmbedded; } uint8_t* GetSubData() const { return m_pGsubData; } void SetSubData(uint8_t* data) { m_pGsubData = data; } @@ -165,8 +160,7 @@ class CFX_Font { private: friend class CFX_FaceCache; - CFX_PathData* LoadGlyphPathImpl(uint32_t glyph_index, - int dest_width = 0) const; + CFX_PathData* LoadGlyphPathImpl(uint32_t glyph_index, int dest_width) const; CFX_FaceCache* GetFaceCache() const; void ReleasePlatformResource(); void DeleteFace(); @@ -231,8 +225,8 @@ class FXTEXT_GLYPHPOS { FX_RECT FXGE_GetGlyphsBBox(const std::vector<FXTEXT_GLYPHPOS>& glyphs, int anti_alias, - float retinaScaleX = 1.0f, - float retinaScaleY = 1.0f); + float retinaScaleX, + float retinaScaleY); CFX_ByteString GetNameFromTT(const uint8_t* name_table, uint32_t name_table_size, diff --git a/core/fxge/ge/cfx_font.cpp b/core/fxge/ge/cfx_font.cpp index 1a45fd3f5b..229ede7894 100644 --- a/core/fxge/ge/cfx_font.cpp +++ b/core/fxge/ge/cfx_font.cpp @@ -46,13 +46,7 @@ unsigned long FTStreamRead(FXFT_Stream stream, IFX_SeekableReadStream* pFile = static_cast<IFX_SeekableReadStream*>(stream->descriptor.pointer); - if (!pFile) - return 0; - - if (!pFile->ReadBlock(buffer, offset, count)) - return 0; - - return count; + return pFile && pFile->ReadBlock(buffer, offset, count) ? count : 0; } void FTStreamClose(FXFT_Stream stream) {} @@ -103,7 +97,7 @@ void Outline_CheckEmptyContour(OUTLINE_PARAMS* param) { } int Outline_MoveTo(const FXFT_Vector* to, void* user) { - OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user; + OUTLINE_PARAMS* param = static_cast<OUTLINE_PARAMS*>(user); Outline_CheckEmptyContour(param); @@ -118,7 +112,7 @@ int Outline_MoveTo(const FXFT_Vector* to, void* user) { } int Outline_LineTo(const FXFT_Vector* to, void* user) { - OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user; + OUTLINE_PARAMS* param = static_cast<OUTLINE_PARAMS*>(user); param->m_pPath->AppendPoint( CFX_PointF(to->x / param->m_CoordUnit, to->y / param->m_CoordUnit), @@ -132,7 +126,7 @@ int Outline_LineTo(const FXFT_Vector* to, void* user) { int Outline_ConicTo(const FXFT_Vector* control, const FXFT_Vector* to, void* user) { - OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user; + OUTLINE_PARAMS* param = static_cast<OUTLINE_PARAMS*>(user); param->m_pPath->AppendPoint( CFX_PointF((param->m_CurX + (control->x - param->m_CurX) * 2 / 3) / @@ -159,7 +153,7 @@ int Outline_CubicTo(const FXFT_Vector* control1, const FXFT_Vector* control2, const FXFT_Vector* to, void* user) { - OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user; + OUTLINE_PARAMS* param = static_cast<OUTLINE_PARAMS*>(user); param->m_pPath->AppendPoint(CFX_PointF(control1->x / param->m_CoordUnit, control1->y / param->m_CoordUnit), @@ -289,11 +283,10 @@ CFX_Font::~CFX_Font() { void CFX_Font::DeleteFace() { ClearFaceCache(); - if (m_bEmbedded) { + if (m_bEmbedded) FXFT_Done_Face(m_Face); - } else { + else CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face); - } m_Face = nullptr; } @@ -318,8 +311,7 @@ void CFX_Font::LoadSubst(const CFX_ByteString& face_name, #ifdef PDF_ENABLE_XFA bool CFX_Font::LoadFile(const CFX_RetainPtr<IFX_SeekableReadStream>& pFile, - int nFaceIndex, - int* pFaceCount) { + int nFaceIndex) { m_bEmbedded = false; CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); @@ -330,8 +322,6 @@ bool CFX_Font::LoadFile(const CFX_RetainPtr<IFX_SeekableReadStream>& pFile, if (!LoadFileImp(library, &m_Face, pFile, nFaceIndex, &stream)) return false; - if (pFaceCount) - *pFaceCount = (int)m_Face->num_faces; m_pOwnedStream = stream.release(); FXFT_Set_Pixel_Sizes(m_Face, 0, 64); return true; @@ -348,6 +338,7 @@ int CFX_Font::GetGlyphWidth(uint32_t glyph_index) { FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); if (err) return 0; + int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face)); return width; @@ -364,14 +355,13 @@ bool CFX_Font::LoadEmbedded(const uint8_t* data, uint32_t size) { } bool CFX_Font::IsTTFont() const { - if (!m_Face) - return false; - return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT; + return m_Face && FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT; } int CFX_Font::GetAscent() const { if (!m_Face) return 0; + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face)); } @@ -379,6 +369,7 @@ int CFX_Font::GetAscent() const { int CFX_Font::GetDescent() const { if (!m_Face) return 0; + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face)); } @@ -391,18 +382,21 @@ bool CFX_Font::GetGlyphBBox(uint32_t glyph_index, FX_RECT& bbox) { 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); + error = FXFT_Get_Glyph(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; + int pixel_size_x = m_Face->size->metrics.x_ppem, + pixel_size_y = m_Face->size->metrics.y_ppem; if (pixel_size_x == 0 || pixel_size_y == 0) { bbox.left = cbox.xMin; bbox.right = cbox.xMax; @@ -414,10 +408,10 @@ bool CFX_Font::GetGlyphBBox(uint32_t glyph_index, FX_RECT& bbox) { 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); + bbox.top = std::min(bbox.top, + static_cast<int32_t>(FXFT_Get_Face_Ascender(m_Face))); + bbox.bottom = std::max( + bbox.bottom, static_cast<int32_t>(FXFT_Get_Face_Descender(m_Face))); FT_Done_Glyph(glyph); return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0; } @@ -448,24 +442,20 @@ bool CFX_Font::GetGlyphBBox(uint32_t glyph_index, FX_RECT& bbox) { bool CFX_Font::IsItalic() const { if (!m_Face) return false; - if (FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC) return true; + CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face)); str.MakeLower(); return str.Find("italic") != -1; } bool CFX_Font::IsBold() const { - if (!m_Face) - return false; - return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD; + return m_Face && FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD; } bool CFX_Font::IsFixedWidth() const { - if (!m_Face) - return false; - return FXFT_Is_Face_fixedwidth(m_Face) != 0; + return m_Face && FXFT_Is_Face_fixedwidth(m_Face) != 0; } CFX_ByteString CFX_Font::GetPsName() const { @@ -483,6 +473,7 @@ CFX_ByteString CFX_Font::GetFamilyName() const { return CFX_ByteString(); if (m_Face) return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face)); + return m_pSubstFont->m_Family; } @@ -490,9 +481,8 @@ CFX_ByteString CFX_Font::GetFaceName() const { if (!m_Face && !m_pSubstFont) return CFX_ByteString(); if (m_Face) { - CFX_ByteString facename; CFX_ByteString style = CFX_ByteString(FXFT_Get_Face_Style_Name(m_Face)); - facename = GetFamilyName(); + CFX_ByteString facename = GetFamilyName(); if (facename.IsEmpty()) facename = "Untitled"; if (!style.IsEmpty() && style != "Regular") @@ -505,6 +495,7 @@ CFX_ByteString CFX_Font::GetFaceName() const { bool CFX_Font::GetBBox(FX_RECT& bbox) { if (!m_Face) return false; + int em = FXFT_Get_Face_UnitsPerEM(m_Face); if (em == 0) { bbox.left = FXFT_Get_Face_xMin(m_Face); @@ -520,22 +511,6 @@ bool CFX_Font::GetBBox(FX_RECT& bbox) { return true; } -int CFX_Font::GetHeight() const { - if (!m_Face) - return 0; - - return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), - FXFT_Get_Face_Height(m_Face)); -} - -int CFX_Font::GetMaxAdvanceWidth() const { - if (!m_Face) - return 0; - - return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), - FXFT_Get_Face_MaxAdvanceWidth(m_Face)); -} - CFX_FaceCache* CFX_Font::GetFaceCache() const { if (!m_FaceCache) m_FaceCache = CFX_GEModule::Get()->GetFontCache()->GetCachedFace(this); @@ -550,22 +525,6 @@ void CFX_Font::ClearFaceCache() { CFX_GEModule::Get()->GetFontCache()->ReleaseCachedFace(this); } -int CFX_Font::GetULPos() const { - if (!m_Face) - return 0; - - return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), - FXFT_Get_Face_UnderLinePosition(m_Face)); -} - -int CFX_Font::GetULthickness() const { - if (!m_Face) - return 0; - - return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), - FXFT_Get_Face_UnderLineThickness(m_Face)); -} - void CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight) const { @@ -573,11 +532,13 @@ void CFX_Font::AdjustMMParams(int glyph_index, FXFT_Get_MM_Var(m_Face, &pMasters); if (!pMasters) return; + long coords[2]; if (weight == 0) coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536; else coords[0] = weight; + if (dest_width == 0) { coords[1] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 1)) / 65536; } else { @@ -630,9 +591,8 @@ CFX_PathData* CFX_Font::LoadGlyphPathImpl(uint32_t glyph_index, else ft_matrix.xy -= ft_matrix.xx * skew / 100; } - if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) { + if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight); - } } ScopedFontTransform scoped_transform(m_Face, &ft_matrix); int load_flags = FXFT_LOAD_NO_BITMAP; diff --git a/core/fxge/ge/cfx_renderdevice.cpp b/core/fxge/ge/cfx_renderdevice.cpp index 3949837982..f9153d1cdb 100644 --- a/core/fxge/ge/cfx_renderdevice.cpp +++ b/core/fxge/ge/cfx_renderdevice.cpp @@ -961,7 +961,7 @@ bool CFX_RenderDevice::DrawNormalText(int nChars, if (anti_alias < FXFT_RENDER_MODE_LCD && glyphs.size() > 1) AdjustGlyphSpace(&glyphs); - FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(glyphs, anti_alias); + FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(glyphs, anti_alias, 1.0f, 1.0f); if (scale_x > 1 && scale_y > 1) { bmp_rect1.left--; bmp_rect1.top--; |