OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/fpdfapi/fpdf_font/cpdf_simplefont.h" | 7 #include "core/fpdfapi/fpdf_font/cpdf_simplefont.h" |
8 | 8 |
9 #include "core/fpdfapi/fpdf_font/font_int.h" | 9 #include "core/fpdfapi/fpdf_font/font_int.h" |
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
11 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" | 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" |
12 #include "core/fxge/include/fx_freetype.h" | 12 #include "core/fxge/include/fx_freetype.h" |
13 | 13 |
14 CPDF_SimpleFont::CPDF_SimpleFont() | 14 CPDF_SimpleFont::CPDF_SimpleFont() : m_BaseEncoding(PDFFONT_ENCODING_BUILTIN) { |
15 : m_pCharNames(nullptr), m_BaseEncoding(PDFFONT_ENCODING_BUILTIN) { | |
16 FXSYS_memset(m_CharWidth, 0xff, sizeof(m_CharWidth)); | 15 FXSYS_memset(m_CharWidth, 0xff, sizeof(m_CharWidth)); |
17 FXSYS_memset(m_GlyphIndex, 0xff, sizeof(m_GlyphIndex)); | 16 FXSYS_memset(m_GlyphIndex, 0xff, sizeof(m_GlyphIndex)); |
18 FXSYS_memset(m_ExtGID, 0xff, sizeof(m_ExtGID)); | 17 FXSYS_memset(m_ExtGID, 0xff, sizeof(m_ExtGID)); |
19 } | 18 } |
20 | 19 |
21 CPDF_SimpleFont::~CPDF_SimpleFont() { | 20 CPDF_SimpleFont::~CPDF_SimpleFont() {} |
22 delete[] m_pCharNames; | |
23 } | |
24 | 21 |
25 int CPDF_SimpleFont::GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) { | 22 int CPDF_SimpleFont::GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) { |
26 if (pVertGlyph) | 23 if (pVertGlyph) |
27 *pVertGlyph = false; | 24 *pVertGlyph = false; |
28 | 25 |
29 if (charcode > 0xff) | 26 if (charcode > 0xff) |
30 return -1; | 27 return -1; |
31 | 28 |
32 int index = m_GlyphIndex[(uint8_t)charcode]; | 29 int index = m_GlyphIndex[(uint8_t)charcode]; |
33 return index != 0xffff ? index : -1; | 30 return index != 0xffff ? index : -1; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 if (m_BaseFont.GetLength() > 8 && m_BaseFont[7] == '+') { | 129 if (m_BaseFont.GetLength() > 8 && m_BaseFont[7] == '+') { |
133 m_BaseFont = m_BaseFont.Mid(8); | 130 m_BaseFont = m_BaseFont.Mid(8); |
134 } | 131 } |
135 } else { | 132 } else { |
136 LoadSubstFont(); | 133 LoadSubstFont(); |
137 } | 134 } |
138 if (!(m_Flags & PDFFONT_SYMBOLIC)) { | 135 if (!(m_Flags & PDFFONT_SYMBOLIC)) { |
139 m_BaseEncoding = PDFFONT_ENCODING_STANDARD; | 136 m_BaseEncoding = PDFFONT_ENCODING_STANDARD; |
140 } | 137 } |
141 CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectBy("Encoding"); | 138 CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectBy("Encoding"); |
142 LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, !!m_pFontFile, | 139 LoadPDFEncoding(pEncoding, m_BaseEncoding, &m_CharNames, !!m_pFontFile, |
143 m_Font.IsTTFont()); | 140 m_Font.IsTTFont()); |
144 LoadGlyphMap(); | 141 LoadGlyphMap(); |
145 delete[] m_pCharNames; | 142 m_CharNames.clear(); |
146 m_pCharNames = nullptr; | |
147 if (!m_Font.GetFace()) | 143 if (!m_Font.GetFace()) |
148 return TRUE; | 144 return TRUE; |
149 | 145 |
150 if (m_Flags & PDFFONT_ALLCAP) { | 146 if (m_Flags & PDFFONT_ALLCAP) { |
151 unsigned char lowercases[] = {'a', 'z', 0xe0, 0xf6, 0xf8, 0xfd}; | 147 unsigned char kLowercases[][2] = {{'a', 'z'}, {0xe0, 0xf6}, {0xf8, 0xfd}}; |
152 for (size_t range = 0; range < sizeof lowercases / 2; range++) { | 148 for (size_t range = 0; range < FX_ArraySize(kLowercases); ++range) { |
153 for (int i = lowercases[range * 2]; i <= lowercases[range * 2 + 1]; i++) { | 149 const auto& lower = kLowercases[range]; |
154 if (m_GlyphIndex[i] != 0xffff && m_pFontFile) { | 150 for (int i = lower[0]; i <= lower[1]; ++i) { |
| 151 if (m_GlyphIndex[i] != 0xffff && m_pFontFile) |
155 continue; | 152 continue; |
156 } | 153 |
157 m_GlyphIndex[i] = m_GlyphIndex[i - 32]; | 154 int j = i - 32; |
158 if (m_CharWidth[i - 32]) { | 155 m_GlyphIndex[i] = m_GlyphIndex[j]; |
159 m_CharWidth[i] = m_CharWidth[i - 32]; | 156 if (m_CharWidth[j]) { |
160 m_CharBBox[i] = m_CharBBox[i - 32]; | 157 m_CharWidth[i] = m_CharWidth[j]; |
| 158 m_CharBBox[i] = m_CharBBox[j]; |
161 } | 159 } |
162 } | 160 } |
163 } | 161 } |
164 } | 162 } |
165 CheckFontMetrics(); | 163 CheckFontMetrics(); |
166 return TRUE; | 164 return TRUE; |
167 } | 165 } |
168 | 166 |
169 void CPDF_SimpleFont::LoadSubstFont() { | 167 void CPDF_SimpleFont::LoadSubstFont() { |
170 if (!m_bUseFontWidth && !(m_Flags & PDFFONT_FIXEDPITCH)) { | 168 if (!m_bUseFontWidth && !(m_Flags & PDFFONT_FIXEDPITCH)) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 return CFX_WideString(); | 201 return CFX_WideString(); |
204 return ret; | 202 return ret; |
205 } | 203 } |
206 | 204 |
207 uint32_t CPDF_SimpleFont::CharCodeFromUnicode(FX_WCHAR unicode) const { | 205 uint32_t CPDF_SimpleFont::CharCodeFromUnicode(FX_WCHAR unicode) const { |
208 uint32_t ret = CPDF_Font::CharCodeFromUnicode(unicode); | 206 uint32_t ret = CPDF_Font::CharCodeFromUnicode(unicode); |
209 if (ret) | 207 if (ret) |
210 return ret; | 208 return ret; |
211 return m_Encoding.CharCodeFromUnicode(unicode); | 209 return m_Encoding.CharCodeFromUnicode(unicode); |
212 } | 210 } |
OLD | NEW |