summaryrefslogtreecommitdiff
path: root/core/src/fpdfapi/fpdf_font
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/fpdfapi/fpdf_font')
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font.cpp74
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp56
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) {