OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 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 "../../../include/fxge/fx_ge.h" | 7 #include "../../../include/fxge/fx_ge.h" |
8 #include "../../../include/fxge/fx_freetype.h" | 8 #include "../../../include/fxge/fx_freetype.h" |
9 #include "text_int.h" | 9 #include "text_int.h" |
10 | 10 |
(...skipping 16 matching lines...) Expand all Loading... |
27 FXFM_ENCODING_ADOBE_STANDARD, | 27 FXFM_ENCODING_ADOBE_STANDARD, |
28 FXFM_ENCODING_ADOBE_EXPERT, | 28 FXFM_ENCODING_ADOBE_EXPERT, |
29 FXFM_ENCODING_ADOBE_CUSTOM, | 29 FXFM_ENCODING_ADOBE_CUSTOM, |
30 FXFM_ENCODING_ADOBE_LATIN_1, | 30 FXFM_ENCODING_ADOBE_LATIN_1, |
31 FXFM_ENCODING_OLD_LATIN_2, | 31 FXFM_ENCODING_OLD_LATIN_2, |
32 FXFM_ENCODING_APPLE_ROMAN, | 32 FXFM_ENCODING_APPLE_ROMAN, |
33 }; | 33 }; |
34 | 34 |
35 CFX_UnicodeEncodingEx* _FXFM_CreateFontEncoding(CFX_Font* pFont, | 35 CFX_UnicodeEncodingEx* _FXFM_CreateFontEncoding(CFX_Font* pFont, |
36 FX_DWORD nEncodingID) { | 36 FX_DWORD nEncodingID) { |
37 if (FXFT_Select_Charmap(pFont->m_Face, nEncodingID)) | 37 if (FXFT_Select_Charmap(pFont->GetFace(), nEncodingID)) |
38 return nullptr; | 38 return nullptr; |
39 return new CFX_UnicodeEncodingEx(pFont, nEncodingID); | 39 return new CFX_UnicodeEncodingEx(pFont, nEncodingID); |
40 } | 40 } |
41 | 41 |
42 FXFT_Face FT_LoadFont(const uint8_t* pData, int size) { | 42 FXFT_Face FT_LoadFont(const uint8_t* pData, int size) { |
43 return CFX_GEModule::Get()->GetFontMgr()->GetFixedFace(pData, size, 0); | 43 return CFX_GEModule::Get()->GetFontMgr()->GetFixedFace(pData, size, 0); |
44 } | 44 } |
45 | 45 |
46 } // namespace | 46 } // namespace |
47 | 47 |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 | 226 |
227 FX_BOOL CFX_Font::LoadEmbedded(const uint8_t* data, FX_DWORD size) { | 227 FX_BOOL CFX_Font::LoadEmbedded(const uint8_t* data, FX_DWORD size) { |
228 m_pFontDataAllocation = FX_Alloc(uint8_t, size); | 228 m_pFontDataAllocation = FX_Alloc(uint8_t, size); |
229 FXSYS_memcpy(m_pFontDataAllocation, data, size); | 229 FXSYS_memcpy(m_pFontDataAllocation, data, size); |
230 m_Face = FT_LoadFont(m_pFontDataAllocation, size); | 230 m_Face = FT_LoadFont(m_pFontDataAllocation, size); |
231 m_pFontData = m_pFontDataAllocation; | 231 m_pFontData = m_pFontDataAllocation; |
232 m_bEmbedded = TRUE; | 232 m_bEmbedded = TRUE; |
233 m_dwSize = size; | 233 m_dwSize = size; |
234 return m_Face != NULL; | 234 return m_Face != NULL; |
235 } | 235 } |
236 FX_BOOL CFX_Font::IsTTFont() { | 236 FX_BOOL CFX_Font::IsTTFont() const { |
237 if (m_Face == NULL) { | 237 if (m_Face == NULL) { |
238 return FALSE; | 238 return FALSE; |
239 } | 239 } |
240 return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT; | 240 return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT; |
241 } | 241 } |
242 int CFX_Font::GetAscent() const { | 242 int CFX_Font::GetAscent() const { |
243 if (m_Face == NULL) { | 243 if (m_Face == NULL) { |
244 return 0; | 244 return 0; |
245 } | 245 } |
246 int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), | 246 int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 bbox.top = | 314 bbox.top = |
315 (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * | 315 (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * |
316 1000 / em; | 316 1000 / em; |
317 bbox.right = | 317 bbox.right = |
318 (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * | 318 (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * |
319 1000 / em; | 319 1000 / em; |
320 bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em; | 320 bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em; |
321 } | 321 } |
322 return TRUE; | 322 return TRUE; |
323 } | 323 } |
324 FX_BOOL CFX_Font::IsItalic() { | 324 FX_BOOL CFX_Font::IsItalic() const { |
325 if (m_Face == NULL) { | 325 if (m_Face == NULL) { |
326 return FALSE; | 326 return FALSE; |
327 } | 327 } |
328 FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC; | 328 FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC; |
329 if (!ret) { | 329 if (!ret) { |
330 CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face)); | 330 CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face)); |
331 str.MakeLower(); | 331 str.MakeLower(); |
332 if (str.Find("italic") != -1) { | 332 if (str.Find("italic") != -1) { |
333 ret = TRUE; | 333 ret = TRUE; |
334 } | 334 } |
335 } | 335 } |
336 return ret; | 336 return ret; |
337 } | 337 } |
338 FX_BOOL CFX_Font::IsBold() { | 338 FX_BOOL CFX_Font::IsBold() const { |
339 if (m_Face == NULL) { | 339 if (m_Face == NULL) { |
340 return FALSE; | 340 return FALSE; |
341 } | 341 } |
342 return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD; | 342 return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD; |
343 } | 343 } |
344 FX_BOOL CFX_Font::IsFixedWidth() { | 344 FX_BOOL CFX_Font::IsFixedWidth() const { |
345 if (m_Face == NULL) { | 345 if (m_Face == NULL) { |
346 return FALSE; | 346 return FALSE; |
347 } | 347 } |
348 return FXFT_Is_Face_fixedwidth(m_Face); | 348 return FXFT_Is_Face_fixedwidth(m_Face); |
349 } | 349 } |
350 CFX_WideString CFX_Font::GetPsName() const { | 350 CFX_WideString CFX_Font::GetPsName() const { |
351 if (m_Face == NULL) { | 351 if (m_Face == NULL) { |
352 return CFX_WideString(); | 352 return CFX_WideString(); |
353 } | 353 } |
354 CFX_WideString psName = | 354 CFX_WideString psName = |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 bbox.top = FXFT_Get_Face_yMin(m_Face); | 396 bbox.top = FXFT_Get_Face_yMin(m_Face); |
397 bbox.right = FXFT_Get_Face_xMax(m_Face); | 397 bbox.right = FXFT_Get_Face_xMax(m_Face); |
398 } else { | 398 } else { |
399 bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em; | 399 bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em; |
400 bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em; | 400 bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em; |
401 bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em; | 401 bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em; |
402 bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em; | 402 bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em; |
403 } | 403 } |
404 return TRUE; | 404 return TRUE; |
405 } | 405 } |
406 int CFX_Font::GetHeight() { | 406 int CFX_Font::GetHeight() const { |
407 if (m_Face == NULL) { | 407 if (m_Face == NULL) { |
408 return 0; | 408 return 0; |
409 } | 409 } |
410 int height = | 410 int height = |
411 EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face)); | 411 EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face)); |
412 return height; | 412 return height; |
413 } | 413 } |
414 int CFX_Font::GetMaxAdvanceWidth() { | 414 int CFX_Font::GetMaxAdvanceWidth() const { |
415 if (m_Face == NULL) { | 415 if (m_Face == NULL) { |
416 return 0; | 416 return 0; |
417 } | 417 } |
418 int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), | 418 int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
419 FXFT_Get_Face_MaxAdvanceWidth(m_Face)); | 419 FXFT_Get_Face_MaxAdvanceWidth(m_Face)); |
420 return width; | 420 return width; |
421 } | 421 } |
422 int CFX_Font::GetULPos() { | 422 int CFX_Font::GetULPos() const { |
423 if (m_Face == NULL) { | 423 if (m_Face == NULL) { |
424 return 0; | 424 return 0; |
425 } | 425 } |
426 int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), | 426 int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
427 FXFT_Get_Face_UnderLinePosition(m_Face)); | 427 FXFT_Get_Face_UnderLinePosition(m_Face)); |
428 return pos; | 428 return pos; |
429 } | 429 } |
430 int CFX_Font::GetULthickness() { | 430 int CFX_Font::GetULthickness() const { |
431 if (m_Face == NULL) { | 431 if (m_Face == NULL) { |
432 return 0; | 432 return 0; |
433 } | 433 } |
434 int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), | 434 int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
435 FXFT_Get_Face_UnderLineThickness(m_Face)); | 435 FXFT_Get_Face_UnderLineThickness(m_Face)); |
436 return thickness; | 436 return thickness; |
437 } | 437 } |
438 | 438 |
439 CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont) : m_pFont(pFont) { | 439 CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont) : m_pFont(pFont) { |
440 } | 440 } |
441 | 441 |
442 CFX_UnicodeEncoding::~CFX_UnicodeEncoding() { | 442 CFX_UnicodeEncoding::~CFX_UnicodeEncoding() { |
443 } | 443 } |
444 | 444 |
445 FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode) { | 445 FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode) { |
446 FXFT_Face face = m_pFont->GetFace(); | 446 FXFT_Face face = m_pFont->GetFace(); |
447 if (!face) | 447 if (!face) |
448 return charcode; | 448 return charcode; |
449 | 449 |
450 if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) | 450 if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) |
451 return FXFT_Get_Char_Index(face, charcode); | 451 return FXFT_Get_Char_Index(face, charcode); |
452 | 452 |
453 if (m_pFont->m_pSubstFont && m_pFont->m_pSubstFont->m_Charset == 2) { | 453 if (m_pFont->GetSubstFont() && m_pFont->GetSubstFont()->m_Charset == 2) { |
454 FX_DWORD index = 0; | 454 FX_DWORD index = 0; |
455 if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) | 455 if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) |
456 index = FXFT_Get_Char_Index(face, charcode); | 456 index = FXFT_Get_Char_Index(face, charcode); |
457 if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) | 457 if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) |
458 return FXFT_Get_Char_Index(face, charcode); | 458 return FXFT_Get_Char_Index(face, charcode); |
459 } | 459 } |
460 return charcode; | 460 return charcode; |
461 } | 461 } |
462 | 462 |
463 CFX_UnicodeEncodingEx::CFX_UnicodeEncodingEx(CFX_Font* pFont, | 463 CFX_UnicodeEncodingEx::CFX_UnicodeEncodingEx(CFX_Font* pFont, |
(...skipping 30 matching lines...) Expand all Loading... |
494 } | 494 } |
495 FXFT_Select_Charmap(face, m_nEncodingID); | 495 FXFT_Select_Charmap(face, m_nEncodingID); |
496 return 0; | 496 return 0; |
497 } | 497 } |
498 | 498 |
499 FX_DWORD CFX_UnicodeEncodingEx::CharCodeFromUnicode(FX_WCHAR Unicode) const { | 499 FX_DWORD CFX_UnicodeEncodingEx::CharCodeFromUnicode(FX_WCHAR Unicode) const { |
500 if (m_nEncodingID == FXFM_ENCODING_UNICODE || | 500 if (m_nEncodingID == FXFM_ENCODING_UNICODE || |
501 m_nEncodingID == FXFM_ENCODING_MS_SYMBOL) { | 501 m_nEncodingID == FXFM_ENCODING_MS_SYMBOL) { |
502 return Unicode; | 502 return Unicode; |
503 } | 503 } |
504 FXFT_Face face = m_pFont->m_Face; | 504 FXFT_Face face = m_pFont->GetFace(); |
505 int nmaps = FXFT_Get_Face_CharmapCount(face); | 505 int nmaps = FXFT_Get_Face_CharmapCount(face); |
506 for (int i = 0; i < nmaps; i++) { | 506 for (int i = 0; i < nmaps; i++) { |
507 int nEncodingID = | 507 int nEncodingID = |
508 FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]); | 508 FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]); |
509 if (nEncodingID == FXFM_ENCODING_UNICODE || | 509 if (nEncodingID == FXFM_ENCODING_UNICODE || |
510 nEncodingID == FXFM_ENCODING_MS_SYMBOL) { | 510 nEncodingID == FXFM_ENCODING_MS_SYMBOL) { |
511 return Unicode; | 511 return Unicode; |
512 } | 512 } |
513 } | 513 } |
514 return -1; | 514 return -1; |
515 } | 515 } |
516 | 516 |
517 CFX_UnicodeEncodingEx* FX_CreateFontEncodingEx(CFX_Font* pFont, | 517 CFX_UnicodeEncodingEx* FX_CreateFontEncodingEx(CFX_Font* pFont, |
518 FX_DWORD nEncodingID) { | 518 FX_DWORD nEncodingID) { |
519 if (!pFont || !pFont->m_Face) | 519 if (!pFont || !pFont->GetFace()) |
520 return nullptr; | 520 return nullptr; |
521 | 521 |
522 if (nEncodingID != FXFM_ENCODING_NONE) | 522 if (nEncodingID != FXFM_ENCODING_NONE) |
523 return _FXFM_CreateFontEncoding(pFont, nEncodingID); | 523 return _FXFM_CreateFontEncoding(pFont, nEncodingID); |
524 | 524 |
525 for (size_t i = 0; i < FX_ArraySize(g_EncodingID); ++i) { | 525 for (size_t i = 0; i < FX_ArraySize(g_EncodingID); ++i) { |
526 CFX_UnicodeEncodingEx* pFontEncoding = | 526 CFX_UnicodeEncodingEx* pFontEncoding = |
527 _FXFM_CreateFontEncoding(pFont, g_EncodingID[i]); | 527 _FXFM_CreateFontEncoding(pFont, g_EncodingID[i]); |
528 if (pFontEncoding) { | 528 if (pFontEncoding) { |
529 return pFontEncoding; | 529 return pFontEncoding; |
530 } | 530 } |
531 } | 531 } |
532 return NULL; | 532 return NULL; |
533 } | 533 } |
OLD | NEW |