| 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 "core/fxge/include/fx_font.h" | 7 #include "core/fxge/include/fx_font.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" | 9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
| 10 #include "core/fxge/ge/fx_text_int.h" |
| 10 #include "core/fxge/include/cfx_fontmgr.h" | 11 #include "core/fxge/include/cfx_fontmgr.h" |
| 11 #include "core/fxge/ge/fx_text_int.h" | |
| 12 #include "core/fxge/include/cfx_gemodule.h" | 12 #include "core/fxge/include/cfx_gemodule.h" |
| 13 #include "core/fxge/include/fx_freetype.h" | 13 #include "core/fxge/include/fx_freetype.h" |
| 14 | 14 |
| 15 #define EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em) | 15 #define EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em) |
| 16 | 16 |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 #ifdef PDF_ENABLE_XFA | 19 #ifdef PDF_ENABLE_XFA |
| 20 const uint32_t g_EncodingID[] = { | |
| 21 FXFM_ENCODING_MS_SYMBOL, FXFM_ENCODING_UNICODE, | |
| 22 FXFM_ENCODING_MS_SJIS, FXFM_ENCODING_MS_GB2312, | |
| 23 FXFM_ENCODING_MS_BIG5, FXFM_ENCODING_MS_WANSUNG, | |
| 24 FXFM_ENCODING_MS_JOHAB, FXFM_ENCODING_ADOBE_STANDARD, | |
| 25 FXFM_ENCODING_ADOBE_EXPERT, FXFM_ENCODING_ADOBE_CUSTOM, | |
| 26 FXFM_ENCODING_ADOBE_LATIN_1, FXFM_ENCODING_OLD_LATIN_2, | |
| 27 FXFM_ENCODING_APPLE_ROMAN, | |
| 28 }; | |
| 29 | |
| 30 CFX_UnicodeEncodingEx* _FXFM_CreateFontEncoding(CFX_Font* pFont, | |
| 31 uint32_t nEncodingID) { | |
| 32 if (FXFT_Select_Charmap(pFont->GetFace(), nEncodingID)) | |
| 33 return nullptr; | |
| 34 return new CFX_UnicodeEncodingEx(pFont, nEncodingID); | |
| 35 } | |
| 36 | 20 |
| 37 unsigned long FTStreamRead(FXFT_Stream stream, | 21 unsigned long FTStreamRead(FXFT_Stream stream, |
| 38 unsigned long offset, | 22 unsigned long offset, |
| 39 unsigned char* buffer, | 23 unsigned char* buffer, |
| 40 unsigned long count) { | 24 unsigned long count) { |
| 41 if (count == 0) | 25 if (count == 0) |
| 42 return 0; | 26 return 0; |
| 43 | 27 |
| 44 IFX_FileRead* pFile = static_cast<IFX_FileRead*>(stream->descriptor.pointer); | 28 IFX_FileRead* pFile = static_cast<IFX_FileRead*>(stream->descriptor.pointer); |
| 45 return pFile->ReadBlock(buffer, offset, count) ? count : 0; | 29 return pFile->ReadBlock(buffer, offset, count) ? count : 0; |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 FXFT_Get_Face_UnderLinePosition(m_Face)); | 406 FXFT_Get_Face_UnderLinePosition(m_Face)); |
| 423 } | 407 } |
| 424 | 408 |
| 425 int CFX_Font::GetULthickness() const { | 409 int CFX_Font::GetULthickness() const { |
| 426 if (!m_Face) | 410 if (!m_Face) |
| 427 return 0; | 411 return 0; |
| 428 | 412 |
| 429 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), | 413 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
| 430 FXFT_Get_Face_UnderLineThickness(m_Face)); | 414 FXFT_Get_Face_UnderLineThickness(m_Face)); |
| 431 } | 415 } |
| 432 | |
| 433 CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont) : m_pFont(pFont) {} | |
| 434 | |
| 435 CFX_UnicodeEncoding::~CFX_UnicodeEncoding() {} | |
| 436 | |
| 437 uint32_t CFX_UnicodeEncoding::GlyphFromCharCode(uint32_t charcode) { | |
| 438 FXFT_Face face = m_pFont->GetFace(); | |
| 439 if (!face) | |
| 440 return charcode; | |
| 441 | |
| 442 if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) | |
| 443 return FXFT_Get_Char_Index(face, charcode); | |
| 444 | |
| 445 if (m_pFont->GetSubstFont() && | |
| 446 m_pFont->GetSubstFont()->m_Charset == FXFONT_SYMBOL_CHARSET) { | |
| 447 uint32_t index = 0; | |
| 448 if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) | |
| 449 index = FXFT_Get_Char_Index(face, charcode); | |
| 450 if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) | |
| 451 return FXFT_Get_Char_Index(face, charcode); | |
| 452 } | |
| 453 return charcode; | |
| 454 } | |
| 455 | |
| 456 #ifdef PDF_ENABLE_XFA | |
| 457 CFX_UnicodeEncodingEx::CFX_UnicodeEncodingEx(CFX_Font* pFont, | |
| 458 uint32_t EncodingID) | |
| 459 : CFX_UnicodeEncoding(pFont), m_nEncodingID(EncodingID) {} | |
| 460 | |
| 461 CFX_UnicodeEncodingEx::~CFX_UnicodeEncodingEx() {} | |
| 462 | |
| 463 uint32_t CFX_UnicodeEncodingEx::GlyphFromCharCode(uint32_t charcode) { | |
| 464 FXFT_Face face = m_pFont->GetFace(); | |
| 465 FT_UInt nIndex = FXFT_Get_Char_Index(face, charcode); | |
| 466 if (nIndex > 0) { | |
| 467 return nIndex; | |
| 468 } | |
| 469 int nmaps = FXFT_Get_Face_CharmapCount(face); | |
| 470 int m = 0; | |
| 471 while (m < nmaps) { | |
| 472 uint32_t nEncodingID = | |
| 473 FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[m++]); | |
| 474 if (m_nEncodingID == nEncodingID) { | |
| 475 continue; | |
| 476 } | |
| 477 int error = FXFT_Select_Charmap(face, nEncodingID); | |
| 478 if (error) { | |
| 479 continue; | |
| 480 } | |
| 481 nIndex = FXFT_Get_Char_Index(face, charcode); | |
| 482 if (nIndex > 0) { | |
| 483 m_nEncodingID = nEncodingID; | |
| 484 return nIndex; | |
| 485 } | |
| 486 } | |
| 487 FXFT_Select_Charmap(face, m_nEncodingID); | |
| 488 return 0; | |
| 489 } | |
| 490 | |
| 491 uint32_t CFX_UnicodeEncodingEx::CharCodeFromUnicode(FX_WCHAR Unicode) const { | |
| 492 if (m_nEncodingID == FXFM_ENCODING_UNICODE || | |
| 493 m_nEncodingID == FXFM_ENCODING_MS_SYMBOL) { | |
| 494 return Unicode; | |
| 495 } | |
| 496 FXFT_Face face = m_pFont->GetFace(); | |
| 497 int nmaps = FXFT_Get_Face_CharmapCount(face); | |
| 498 for (int i = 0; i < nmaps; i++) { | |
| 499 int nEncodingID = | |
| 500 FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]); | |
| 501 if (nEncodingID == FXFM_ENCODING_UNICODE || | |
| 502 nEncodingID == FXFM_ENCODING_MS_SYMBOL) { | |
| 503 return Unicode; | |
| 504 } | |
| 505 } | |
| 506 return CPDF_Font::kInvalidCharCode; | |
| 507 } | |
| 508 | |
| 509 CFX_UnicodeEncodingEx* FX_CreateFontEncodingEx(CFX_Font* pFont, | |
| 510 uint32_t nEncodingID) { | |
| 511 if (!pFont || !pFont->GetFace()) | |
| 512 return nullptr; | |
| 513 | |
| 514 if (nEncodingID != FXFM_ENCODING_NONE) | |
| 515 return _FXFM_CreateFontEncoding(pFont, nEncodingID); | |
| 516 | |
| 517 for (size_t i = 0; i < FX_ArraySize(g_EncodingID); ++i) { | |
| 518 CFX_UnicodeEncodingEx* pFontEncoding = | |
| 519 _FXFM_CreateFontEncoding(pFont, g_EncodingID[i]); | |
| 520 if (pFontEncoding) { | |
| 521 return pFontEncoding; | |
| 522 } | |
| 523 } | |
| 524 return nullptr; | |
| 525 } | |
| 526 #endif // PDF_ENABLE_XFA | |
| OLD | NEW |