Index: core/src/fpdfapi/fpdf_font/fpdf_font.cpp |
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp |
index fb601e71131289bbec21611e5474f0c580dc528b..411f77254bc393fb74fde9e6c3d857b71df8a859 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) |