Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(315)

Side by Side Diff: core/fpdfapi/font/cpdf_type1font.cpp

Issue 2412483006: Reduce code duplication in CPDF_Type1Font::LoadGlyphMap (Closed)
Patch Set: Fix Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/fpdfapi/font/cpdf_type1font.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/font/cpdf_type1font.h" 7 #include "core/fpdfapi/font/cpdf_type1font.h"
8 8
9 #include "core/fpdfapi/font/font_int.h" 9 #include "core/fpdfapi/font/font_int.h"
10 #include "core/fpdfapi/parser/cpdf_dictionary.h" 10 #include "core/fpdfapi/parser/cpdf_dictionary.h"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) { 133 if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) {
134 if (FT_UseTTCharmap(m_Font.GetFace(), 3, 0)) { 134 if (FT_UseTTCharmap(m_Font.GetFace(), 3, 0)) {
135 bool bGotOne = false; 135 bool bGotOne = false;
136 for (int charcode = 0; charcode < 256; charcode++) { 136 for (int charcode = 0; charcode < 256; charcode++) {
137 const uint8_t prefix[4] = {0x00, 0xf0, 0xf1, 0xf2}; 137 const uint8_t prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
138 for (int j = 0; j < 4; j++) { 138 for (int j = 0; j < 4; j++) {
139 uint16_t unicode = prefix[j] * 256 + charcode; 139 uint16_t unicode = prefix[j] * 256 + charcode;
140 m_GlyphIndex[charcode] = 140 m_GlyphIndex[charcode] =
141 FXFT_Get_Char_Index(m_Font.GetFace(), unicode); 141 FXFT_Get_Char_Index(m_Font.GetFace(), unicode);
142 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 142 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
143 FX_CHAR name_glyph[256]; 143 CalcExtGID(charcode);
144 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
145 name_glyph, 256);
146 name_glyph[255] = 0;
147 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
148 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
149 kCFAllocatorNull);
150 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
151 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
152 if (name_ct) {
153 CFRelease(name_ct);
154 }
155 #endif 144 #endif
156 if (m_GlyphIndex[charcode]) { 145 if (m_GlyphIndex[charcode]) {
157 bGotOne = true; 146 bGotOne = true;
158 break; 147 break;
159 } 148 }
160 } 149 }
161 } 150 }
162 if (bGotOne) { 151 if (bGotOne) {
163 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 152 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
164 if (!bCoreText) 153 if (!bCoreText)
165 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256); 154 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256);
166 #endif 155 #endif
167 return; 156 return;
168 } 157 }
169 } 158 }
170 FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE); 159 FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE);
171 if (m_BaseEncoding == 0) { 160 if (m_BaseEncoding == 0) {
172 m_BaseEncoding = PDFFONT_ENCODING_STANDARD; 161 m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
173 } 162 }
174 for (int charcode = 0; charcode < 256; charcode++) { 163 for (int charcode = 0; charcode < 256; charcode++) {
175 const FX_CHAR* name = 164 const FX_CHAR* name =
176 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode); 165 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
177 if (!name) 166 if (!name)
178 continue; 167 continue;
179 168
180 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); 169 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
181 m_GlyphIndex[charcode] = FXFT_Get_Char_Index( 170 m_GlyphIndex[charcode] = FXFT_Get_Char_Index(
182 m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]); 171 m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]);
183 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 172 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
184 FX_CHAR name_glyph[256]; 173 CalcExtGID(charcode);
185 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], name_glyph,
186 256);
187 name_glyph[255] = 0;
188 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
189 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
190 kCFAllocatorNull);
191 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
192 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
193 if (name_ct) {
194 CFRelease(name_ct);
195 }
196 #endif 174 #endif
197 if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, ".notdef") == 0) { 175 if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, ".notdef") == 0) {
198 m_Encoding.m_Unicodes[charcode] = 0x20; 176 m_Encoding.m_Unicodes[charcode] = 0x20;
199 m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 0x20); 177 m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 0x20);
200 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 178 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
201 FX_CHAR name_glyph[256]; 179 CalcExtGID(charcode);
202 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
203 name_glyph, 256);
204 name_glyph[255] = 0;
205 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
206 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
207 kCFAllocatorNull);
208 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
209 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
210 if (name_ct) {
211 CFRelease(name_ct);
212 }
213 #endif 180 #endif
214 } 181 }
215 } 182 }
216 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 183 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
217 if (!bCoreText) 184 if (!bCoreText)
218 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256); 185 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256);
219 #endif 186 #endif
220 return; 187 return;
221 } 188 }
222 FT_UseType1Charmap(m_Font.GetFace()); 189 FT_UseType1Charmap(m_Font.GetFace());
223 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 190 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
224 if (bCoreText) { 191 if (bCoreText) {
225 if (m_Flags & PDFFONT_SYMBOLIC) { 192 if (m_Flags & PDFFONT_SYMBOLIC) {
226 for (int charcode = 0; charcode < 256; charcode++) { 193 for (int charcode = 0; charcode < 256; charcode++) {
227 const FX_CHAR* name = 194 const FX_CHAR* name =
228 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode); 195 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
229 if (name) { 196 if (name) {
230 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); 197 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
231 m_GlyphIndex[charcode] = 198 m_GlyphIndex[charcode] =
232 FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); 199 FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
233 CFStringRef name_ct = CFStringCreateWithCStringNoCopy( 200 SetExtGID(name, charcode);
234 kCFAllocatorDefault, name, kCFStringEncodingASCII,
235 kCFAllocatorNull);
236 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
237 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
238 if (name_ct) {
239 CFRelease(name_ct);
240 }
241 } else { 201 } else {
242 m_GlyphIndex[charcode] = 202 m_GlyphIndex[charcode] =
243 FXFT_Get_Char_Index(m_Font.GetFace(), charcode); 203 FXFT_Get_Char_Index(m_Font.GetFace(), charcode);
244 FX_WCHAR unicode = 0; 204 FX_WCHAR unicode = 0;
245 if (m_GlyphIndex[charcode]) { 205 if (m_GlyphIndex[charcode]) {
246 unicode = 206 unicode =
247 FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode); 207 FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);
248 } 208 }
249 FX_CHAR name_glyph[256]; 209 FX_CHAR name_glyph[256];
250 FXSYS_memset(name_glyph, 0, sizeof(name_glyph)); 210 FXSYS_memset(name_glyph, 0, sizeof(name_glyph));
251 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], 211 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
252 name_glyph, 256); 212 name_glyph, 256);
253 name_glyph[255] = 0; 213 name_glyph[255] = 0;
254 if (unicode == 0 && name_glyph[0] != 0) { 214 if (unicode == 0 && name_glyph[0] != 0) {
255 unicode = PDF_UnicodeFromAdobeName(name_glyph); 215 unicode = PDF_UnicodeFromAdobeName(name_glyph);
256 } 216 }
257 m_Encoding.m_Unicodes[charcode] = unicode; 217 m_Encoding.m_Unicodes[charcode] = unicode;
258 CFStringRef name_ct = CFStringCreateWithCStringNoCopy( 218 SetExtGID(name_glyph, charcode);
259 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
260 kCFAllocatorNull);
261 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
262 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
263 if (name_ct) {
264 CFRelease(name_ct);
265 }
266 } 219 }
267 } 220 }
268 return; 221 return;
269 } 222 }
270 bool bUnicode = false; 223 bool bUnicode = false;
271 if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) { 224 if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) {
272 bUnicode = true; 225 bUnicode = true;
273 } 226 }
274 for (int charcode = 0; charcode < 256; charcode++) { 227 for (int charcode = 0; charcode < 256; charcode++) {
275 const FX_CHAR* name = 228 const FX_CHAR* name =
276 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode); 229 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
277 if (!name) { 230 if (!name) {
278 continue; 231 continue;
279 } 232 }
280 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); 233 m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
281 const FX_CHAR* pStrUnicode = GlyphNameRemap(name); 234 const FX_CHAR* pStrUnicode = GlyphNameRemap(name);
282 if (pStrUnicode && 235 if (pStrUnicode &&
283 0 == FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name)) { 236 0 == FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name)) {
284 name = pStrUnicode; 237 name = pStrUnicode;
285 } 238 }
286 m_GlyphIndex[charcode] = 239 m_GlyphIndex[charcode] =
287 FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); 240 FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name);
288 CFStringRef name_ct = CFStringCreateWithCStringNoCopy( 241 SetExtGID(name, charcode);
289 kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
290 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
291 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
292 if (name_ct) {
293 CFRelease(name_ct);
294 }
295 if (m_GlyphIndex[charcode] == 0) { 242 if (m_GlyphIndex[charcode] == 0) {
296 if (FXSYS_strcmp(name, ".notdef") != 0 && 243 if (FXSYS_strcmp(name, ".notdef") != 0 &&
297 FXSYS_strcmp(name, "space") != 0) { 244 FXSYS_strcmp(name, "space") != 0) {
298 m_GlyphIndex[charcode] = FXFT_Get_Char_Index( 245 m_GlyphIndex[charcode] = FXFT_Get_Char_Index(
299 m_Font.GetFace(), 246 m_Font.GetFace(),
300 bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode); 247 bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
301 FX_CHAR name_glyph[256]; 248 CalcExtGID(charcode);
302 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
303 name_glyph, 256);
304 name_glyph[255] = 0;
305 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
306 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
307 kCFAllocatorNull);
308 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
309 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
310 if (name_ct) {
311 CFRelease(name_ct);
312 }
313 } else { 249 } else {
314 m_Encoding.m_Unicodes[charcode] = 0x20; 250 m_Encoding.m_Unicodes[charcode] = 0x20;
315 m_GlyphIndex[charcode] = 251 m_GlyphIndex[charcode] =
316 bUnicode ? FXFT_Get_Char_Index(m_Font.GetFace(), 0x20) : 0xffff; 252 bUnicode ? FXFT_Get_Char_Index(m_Font.GetFace(), 0x20) : 0xffff;
317 FX_CHAR name_glyph[256]; 253 CalcExtGID(charcode);
318 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode],
319 name_glyph, 256);
320 name_glyph[255] = 0;
321 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
322 kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII,
323 kCFAllocatorNull);
324 m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName(
325 (CGFontRef)m_Font.GetPlatformFont(), name_ct);
326 if (name_ct) {
327 CFRelease(name_ct);
328 }
329 } 254 }
330 } 255 }
331 } 256 }
332 return; 257 return;
333 } 258 }
334 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 259 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
335 if (m_Flags & PDFFONT_SYMBOLIC) { 260 if (m_Flags & PDFFONT_SYMBOLIC) {
336 for (int charcode = 0; charcode < 256; charcode++) { 261 for (int charcode = 0; charcode < 256; charcode++) {
337 const FX_CHAR* name = 262 const FX_CHAR* name =
338 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode); 263 GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 m_Encoding.m_Unicodes[charcode] = 0x20; 314 m_Encoding.m_Unicodes[charcode] = 0x20;
390 m_GlyphIndex[charcode] = 0xffff; 315 m_GlyphIndex[charcode] = 0xffff;
391 } 316 }
392 } 317 }
393 } 318 }
394 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 319 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
395 if (!bCoreText) 320 if (!bCoreText)
396 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256); 321 FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256);
397 #endif 322 #endif
398 } 323 }
324
325 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
326 void CPDF_Type1Font::SetExtGID(const FX_CHAR* name, int charcode) {
327 CFStringRef name_ct = CFStringCreateWithCStringNoCopy(
328 kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
329 m_ExtGID[charcode] =
330 CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.GetPlatformFont(), name_ct);
331 if (name_ct)
332 CFRelease(name_ct);
333 }
334
335 void CPDF_Type1Font::CalcExtGID(int charcode) {
336 FX_CHAR name_glyph[256];
337 FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], name_glyph,
338 256);
339 name_glyph[255] = 0;
340 SetExtGID(name_glyph, charcode);
341 }
342 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
OLDNEW
« no previous file with comments | « core/fpdfapi/font/cpdf_type1font.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698