diff options
Diffstat (limited to 'core/src/fpdfapi/fpdf_font')
-rw-r--r-- | core/src/fpdfapi/fpdf_font/fpdf_font.cpp | 74 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp | 56 |
2 files changed, 49 insertions, 81 deletions
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp index fb601e7113..411f77254b 100644 --- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp +++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp @@ -306,8 +306,7 @@ void CPDF_Font::CheckFontMetrics() { } else { FX_BOOL bFirst = TRUE; for (int i = 0; i < 256; i++) { - FX_RECT rect; - GetCharBBox(i, rect); + FX_RECT rect = GetCharBBox(i); if (rect.left == rect.right) { continue; } @@ -332,19 +331,10 @@ void CPDF_Font::CheckFontMetrics() { } } if (m_Ascent == 0 && m_Descent == 0) { - FX_RECT rect; - GetCharBBox('A', rect); - if (rect.bottom == rect.top) { - m_Ascent = m_FontBBox.top; - } else { - m_Ascent = rect.top; - } - GetCharBBox('g', rect); - if (rect.bottom == rect.top) { - m_Descent = m_FontBBox.bottom; - } else { - m_Descent = rect.bottom; - } + FX_RECT rect = GetCharBBox('A'); + m_Ascent = rect.bottom == rect.top ? m_FontBBox.top : rect.top; + rect = GetCharBBox('g'); + m_Descent = rect.bottom == rect.top ? m_FontBBox.bottom : rect.bottom; } } @@ -743,13 +733,11 @@ FX_BOOL CPDF_Font::IsStandardFont() const { return TRUE; } -CPDF_SimpleFont::CPDF_SimpleFont() { - FXSYS_memset(m_CharBBox, 0xff, sizeof m_CharBBox); +CPDF_SimpleFont::CPDF_SimpleFont() + : m_pCharNames(nullptr), m_BaseEncoding(PDFFONT_ENCODING_BUILTIN) { FXSYS_memset(m_CharWidth, 0xff, sizeof m_CharWidth); FXSYS_memset(m_GlyphIndex, 0xff, sizeof m_GlyphIndex); FXSYS_memset(m_ExtGID, 0xff, sizeof m_ExtGID); - m_pCharNames = NULL; - m_BaseEncoding = PDFFONT_ENCODING_BUILTIN; } CPDF_SimpleFont::~CPDF_SimpleFont() { @@ -795,21 +783,23 @@ void CPDF_SimpleFont::LoadCharMetrics(int charcode) { if (err) { return; } - m_CharBBox[charcode].Left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face); - m_CharBBox[charcode].Right = TT2PDF( - FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), face); - m_CharBBox[charcode].Top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face); - m_CharBBox[charcode].Bottom = TT2PDF( - FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), face); + m_CharBBox[charcode] = FX_SMALL_RECT( + TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face), + TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face), + TT2PDF(FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), + face), + TT2PDF(FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), + face)); + if (m_bUseFontWidth) { int TT_Width = TT2PDF(FXFT_Get_Glyph_HoriAdvance(face), face); if (m_CharWidth[charcode] == 0xffff) { m_CharWidth[charcode] = TT_Width; } else if (TT_Width && !IsEmbedded()) { - m_CharBBox[charcode].Right = - m_CharBBox[charcode].Right * m_CharWidth[charcode] / TT_Width; - m_CharBBox[charcode].Left = - m_CharBBox[charcode].Left * m_CharWidth[charcode] / TT_Width; + m_CharBBox[charcode].right = + m_CharBBox[charcode].right * m_CharWidth[charcode] / TT_Width; + m_CharBBox[charcode].left = + m_CharBBox[charcode].left * m_CharWidth[charcode] / TT_Width; } } } @@ -827,17 +817,14 @@ int CPDF_SimpleFont::GetCharWidthF(FX_DWORD charcode, int level) { return (int16_t)m_CharWidth[charcode]; } -void CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { - if (charcode > 0xff) { +FX_RECT CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, int level) { + if (charcode > 0xff) charcode = 0; - } - if (m_CharBBox[charcode].Left == (int16_t)0xffff) { + + if (m_CharBBox[charcode].left == FX_SMALL_RECT::kInvalid) LoadCharMetrics(charcode); - } - rect.left = m_CharBBox[charcode].Left; - rect.right = m_CharBBox[charcode].Right; - rect.bottom = m_CharBBox[charcode].Bottom; - rect.top = m_CharBBox[charcode].Top; + + return FX_RECT(m_CharBBox[charcode]); } const FX_CHAR* GetAdobeCharName(int iBaseEncoding, @@ -1704,16 +1691,9 @@ int CPDF_Type3Font::GetCharWidthF(FX_DWORD charcode, int level) { return pChar ? pChar->m_Width : 0; } -void CPDF_Type3Font::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { +FX_RECT CPDF_Type3Font::GetCharBBox(FX_DWORD charcode, int level) { const CPDF_Type3Char* pChar = LoadChar(charcode, level); - if (!pChar) { - rect.left = 0; - rect.right = 0; - rect.top = 0; - rect.bottom = 0; - return; - } - rect = pChar->m_BBox; + return pChar ? pChar->m_BBox : FX_RECT(); } CPDF_Type3Char::CPDF_Type3Char(CPDF_Form* pForm) diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp index de6ed1b9b5..1a78b1f93c 100644 --- a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp +++ b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp @@ -1057,7 +1057,6 @@ CPDF_CIDFont::CPDF_CIDFont() m_pAnsiWidths(nullptr), m_bAdobeCourierStd(FALSE), m_pTTGSUBTable(nullptr) { - FXSYS_memset(m_CharBBox, 0xff, 256 * sizeof(FX_SMALL_RECT)); } CPDF_CIDFont::~CPDF_CIDFont() { @@ -1299,19 +1298,15 @@ FX_BOOL CPDF_CIDFont::Load() { return TRUE; } -void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { - if (charcode < 256 && m_CharBBox[charcode].Right != -1) { - rect.bottom = m_CharBBox[charcode].Bottom; - rect.left = m_CharBBox[charcode].Left; - rect.right = m_CharBBox[charcode].Right; - rect.top = m_CharBBox[charcode].Top; - return; - } +FX_RECT CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, int level) { + if (charcode < 256 && m_CharBBox[charcode].right != FX_SMALL_RECT::kInvalid) + return FX_RECT(m_CharBBox[charcode]); + + FX_RECT rect; FX_BOOL bVert = FALSE; int glyph_index = GlyphFromCharCode(charcode, &bVert); FXFT_Face face = m_Font.GetFace(); if (face) { - rect.left = rect.bottom = rect.right = rect.top = 0; if (FXFT_Is_Face_Tricky(face)) { int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); @@ -1324,15 +1319,12 @@ void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem; int pixel_size_y = ((FXFT_Face)face)->size->metrics.y_ppem; if (pixel_size_x == 0 || pixel_size_y == 0) { - rect.left = cbox.xMin; - rect.right = cbox.xMax; - rect.top = cbox.yMax; - rect.bottom = cbox.yMin; + rect = FX_RECT(cbox.xMin, cbox.yMax, cbox.xMax, cbox.yMin); } else { - rect.left = cbox.xMin * 1000 / pixel_size_x; - rect.right = cbox.xMax * 1000 / pixel_size_x; - rect.top = cbox.yMax * 1000 / pixel_size_y; - rect.bottom = cbox.yMin * 1000 / pixel_size_y; + rect = FX_RECT(cbox.xMin * 1000 / pixel_size_x, + cbox.yMax * 1000 / pixel_size_y, + cbox.xMax * 1000 / pixel_size_x, + cbox.yMin * 1000 / pixel_size_y); } if (rect.top > FXFT_Get_Face_Ascender(face)) { rect.top = FXFT_Get_Face_Ascender(face); @@ -1346,19 +1338,17 @@ void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { } else { int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_SCALE); if (err == 0) { - rect.left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face); - rect.right = TT2PDF( - FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), - face); - rect.top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face); + rect = FX_RECT(TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face), + TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face), + TT2PDF(FXFT_Get_Glyph_HoriBearingX(face) + + FXFT_Get_Glyph_Width(face), + face), + TT2PDF(FXFT_Get_Glyph_HoriBearingY(face) - + FXFT_Get_Glyph_Height(face), + face)); rect.top += rect.top / 64; - rect.bottom = TT2PDF( - FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), - face); } } - } else { - rect = FX_RECT(0, 0, 0, 0); } if (!m_pFontFile && m_Charset == CIDSET_JAPAN1) { FX_WORD CID = CIDFromCharCode(charcode); @@ -1375,12 +1365,10 @@ void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { rect = rect_f.GetOutterRect(); } } - if (charcode < 256) { - m_CharBBox[charcode].Bottom = (short)rect.bottom; - m_CharBBox[charcode].Left = (short)rect.left; - m_CharBBox[charcode].Right = (short)rect.right; - m_CharBBox[charcode].Top = (short)rect.top; - } + if (charcode < 256) + m_CharBBox[charcode] = rect.ToSmallRect(); + + return rect; } int CPDF_CIDFont::GetCharWidthF(FX_DWORD charcode, int level) { if (m_pAnsiWidths && charcode < 0x80) { |