 Chromium Code Reviews
 Chromium Code Reviews Issue 2248463002:
  Get rid of FX_SMALL_RECT.  (Closed) 
  Base URL: https://pdfium.googlesource.com/pdfium@fontclean
    
  
    Issue 2248463002:
  Get rid of FX_SMALL_RECT.  (Closed) 
  Base URL: https://pdfium.googlesource.com/pdfium@fontclean| 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_cidfont.h" | 7 #include "core/fpdfapi/fpdf_font/cpdf_cidfont.h" | 
| 8 | 8 | 
| 9 #include <algorithm> | 9 #include <algorithm> | 
| 10 #include <vector> | 10 #include <vector> | 
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 default: | 182 default: | 
| 183 encoding = FXFT_ENCODING_UNICODE; | 183 encoding = FXFT_ENCODING_UNICODE; | 
| 184 } | 184 } | 
| 185 int err = FXFT_Select_Charmap(face, encoding); | 185 int err = FXFT_Select_Charmap(face, encoding); | 
| 186 if (err) | 186 if (err) | 
| 187 err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE); | 187 err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE); | 
| 188 if (err && FXFT_Get_Face_Charmaps(face)) | 188 if (err && FXFT_Get_Face_Charmaps(face)) | 
| 189 FXFT_Set_Charmap(face, *FXFT_Get_Face_Charmaps(face)); | 189 FXFT_Set_Charmap(face, *FXFT_Get_Face_Charmaps(face)); | 
| 190 } | 190 } | 
| 191 | 191 | 
| 192 bool IsMetricForCID(const uint32_t* pEntry, uint16_t CID) { | |
| 193 return pEntry[0] <= CID && pEntry[1] >= CID; | |
| 194 } | |
| 195 | |
| 192 } // namespace | 196 } // namespace | 
| 193 | 197 | 
| 194 CPDF_CIDFont::CPDF_CIDFont() | 198 CPDF_CIDFont::CPDF_CIDFont() | 
| 195 : m_pCMap(nullptr), | 199 : m_pCMap(nullptr), | 
| 196 m_pCID2UnicodeMap(nullptr), | 200 m_pCID2UnicodeMap(nullptr), | 
| 197 m_bCIDIsGID(FALSE), | 201 m_bCIDIsGID(false), | 
| 198 m_bAnsiWidthsFixed(false), | 202 m_bAnsiWidthsFixed(false), | 
| 199 m_bAdobeCourierStd(FALSE) {} | 203 m_bAdobeCourierStd(false) { | 
| 204 for (size_t i = 0; i < FX_ArraySize(m_CharBBox); ++i) { | |
| 205 m_CharBBox[i] = FX_RECT(-1, -1, -1, -1); | |
| 206 } | |
| 207 } | |
| 200 | 208 | 
| 201 CPDF_CIDFont::~CPDF_CIDFont() {} | 209 CPDF_CIDFont::~CPDF_CIDFont() {} | 
| 202 | 210 | 
| 203 bool CPDF_CIDFont::IsCIDFont() const { | 211 bool CPDF_CIDFont::IsCIDFont() const { | 
| 204 return true; | 212 return true; | 
| 205 } | 213 } | 
| 206 | 214 | 
| 207 const CPDF_CIDFont* CPDF_CIDFont::AsCIDFont() const { | 215 const CPDF_CIDFont* CPDF_CIDFont::AsCIDFont() const { | 
| 208 return this; | 216 return this; | 
| 209 } | 217 } | 
| 210 | 218 | 
| 211 CPDF_CIDFont* CPDF_CIDFont::AsCIDFont() { | 219 CPDF_CIDFont* CPDF_CIDFont::AsCIDFont() { | 
| 212 return this; | 220 return this; | 
| 213 } | 221 } | 
| 214 | 222 | 
| 215 uint16_t CPDF_CIDFont::CIDFromCharCode(uint32_t charcode) const { | 223 uint16_t CPDF_CIDFont::CIDFromCharCode(uint32_t charcode) const { | 
| 216 if (!m_pCMap) { | 224 return m_pCMap ? m_pCMap->CIDFromCharCode(charcode) : (uint16_t)charcode; | 
| 
dsinclair
2016/08/15 12:48:03
static_cast
 
Lei Zhang
2016/08/15 17:05:35
Done.
 | |
| 217 return (uint16_t)charcode; | |
| 218 } | |
| 219 return m_pCMap->CIDFromCharCode(charcode); | |
| 220 } | 225 } | 
| 221 | 226 | 
| 222 FX_BOOL CPDF_CIDFont::IsVertWriting() const { | 227 FX_BOOL CPDF_CIDFont::IsVertWriting() const { | 
| 223 return m_pCMap ? m_pCMap->IsVertWriting() : FALSE; | 228 return m_pCMap && m_pCMap->IsVertWriting(); | 
| 224 } | 229 } | 
| 225 | 230 | 
| 226 CFX_WideString CPDF_CIDFont::UnicodeFromCharCode(uint32_t charcode) const { | 231 CFX_WideString CPDF_CIDFont::UnicodeFromCharCode(uint32_t charcode) const { | 
| 227 CFX_WideString str = CPDF_Font::UnicodeFromCharCode(charcode); | 232 CFX_WideString str = CPDF_Font::UnicodeFromCharCode(charcode); | 
| 228 if (!str.IsEmpty()) | 233 if (!str.IsEmpty()) | 
| 229 return str; | 234 return str; | 
| 230 FX_WCHAR ret = GetUnicodeFromCharCode(charcode); | 235 FX_WCHAR ret = GetUnicodeFromCharCode(charcode); | 
| 231 return ret ? ret : CFX_WideString(); | 236 return ret ? ret : CFX_WideString(); | 
| 232 } | 237 } | 
| 233 | 238 | 
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 329 CPDF_Dictionary* pCIDFontDict = pFonts->GetDictAt(0); | 334 CPDF_Dictionary* pCIDFontDict = pFonts->GetDictAt(0); | 
| 330 if (!pCIDFontDict) | 335 if (!pCIDFontDict) | 
| 331 return FALSE; | 336 return FALSE; | 
| 332 | 337 | 
| 333 m_BaseFont = pCIDFontDict->GetStringBy("BaseFont"); | 338 m_BaseFont = pCIDFontDict->GetStringBy("BaseFont"); | 
| 334 if ((m_BaseFont.Compare("CourierStd") == 0 || | 339 if ((m_BaseFont.Compare("CourierStd") == 0 || | 
| 335 m_BaseFont.Compare("CourierStd-Bold") == 0 || | 340 m_BaseFont.Compare("CourierStd-Bold") == 0 || | 
| 336 m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || | 341 m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || | 
| 337 m_BaseFont.Compare("CourierStd-Oblique") == 0) && | 342 m_BaseFont.Compare("CourierStd-Oblique") == 0) && | 
| 338 !IsEmbedded()) { | 343 !IsEmbedded()) { | 
| 339 m_bAdobeCourierStd = TRUE; | 344 m_bAdobeCourierStd = true; | 
| 340 } | 345 } | 
| 341 CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDictBy("FontDescriptor"); | 346 CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDictBy("FontDescriptor"); | 
| 342 if (pFontDesc) | 347 if (pFontDesc) | 
| 343 LoadFontDescriptor(pFontDesc); | 348 LoadFontDescriptor(pFontDesc); | 
| 344 | 349 | 
| 345 CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectBy("Encoding"); | 350 CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectBy("Encoding"); | 
| 346 if (!pEncoding) | 351 if (!pEncoding) | 
| 347 return FALSE; | 352 return FALSE; | 
| 348 | 353 | 
| 349 CFX_ByteString subtype = pCIDFontDict->GetStringBy("Subtype"); | 354 CFX_ByteString subtype = pCIDFontDict->GetStringBy("Subtype"); | 
| 350 m_bType1 = (subtype == "CIDFontType0"); | 355 m_bType1 = (subtype == "CIDFontType0"); | 
| 351 | 356 | 
| 352 CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; | 357 CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; | 
| 353 if (pEncoding->IsName()) { | 358 if (pEncoding->IsName()) { | 
| 354 CFX_ByteString cmap = pEncoding->GetString(); | 359 CFX_ByteString cmap = pEncoding->GetString(); | 
| 355 bool bPromptCJK = m_pFontFile && m_bType1; | 360 bool bPromptCJK = m_pFontFile && m_bType1; | 
| 356 m_pCMap = manager.GetPredefinedCMap(cmap, bPromptCJK); | 361 m_pCMap = manager.GetPredefinedCMap(cmap, bPromptCJK); | 
| 362 if (!m_pCMap) | |
| 363 return FALSE; | |
| 357 } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { | 364 } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { | 
| 358 m_pCMap = new CPDF_CMap; | 365 m_pCMap = new CPDF_CMap; | 
| 359 m_pAllocatedCMap.reset(m_pCMap); | 366 m_pAllocatedCMap.reset(m_pCMap); | 
| 360 CPDF_StreamAcc acc; | 367 CPDF_StreamAcc acc; | 
| 361 acc.LoadAllData(pStream, FALSE); | 368 acc.LoadAllData(pStream, FALSE); | 
| 362 m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize()); | 369 m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize()); | 
| 363 } else { | 370 } else { | 
| 364 return FALSE; | 371 return FALSE; | 
| 365 } | 372 } | 
| 366 if (!m_pCMap) | |
| 367 return FALSE; | |
| 368 | 373 | 
| 369 m_Charset = m_pCMap->m_Charset; | 374 m_Charset = m_pCMap->m_Charset; | 
| 370 if (m_Charset == CIDSET_UNKNOWN) { | 375 if (m_Charset == CIDSET_UNKNOWN) { | 
| 371 CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDictBy("CIDSystemInfo"); | 376 CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDictBy("CIDSystemInfo"); | 
| 372 if (pCIDInfo) { | 377 if (pCIDInfo) { | 
| 373 m_Charset = | 378 m_Charset = | 
| 374 CharsetFromOrdering(pCIDInfo->GetStringBy("Ordering").AsStringC()); | 379 CharsetFromOrdering(pCIDInfo->GetStringBy("Ordering").AsStringC()); | 
| 375 } | 380 } | 
| 376 } | 381 } | 
| 377 if (m_Charset != CIDSET_UNKNOWN) { | 382 if (m_Charset != CIDSET_UNKNOWN) { | 
| (...skipping 16 matching lines...) Expand all Loading... | |
| 394 | 399 | 
| 395 if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) { | 400 if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) { | 
| 396 CPDF_Object* pmap = pCIDFontDict->GetDirectObjectBy("CIDToGIDMap"); | 401 CPDF_Object* pmap = pCIDFontDict->GetDirectObjectBy("CIDToGIDMap"); | 
| 397 if (pmap) { | 402 if (pmap) { | 
| 398 if (CPDF_Stream* pStream = pmap->AsStream()) { | 403 if (CPDF_Stream* pStream = pmap->AsStream()) { | 
| 399 m_pStreamAcc.reset(new CPDF_StreamAcc); | 404 m_pStreamAcc.reset(new CPDF_StreamAcc); | 
| 400 m_pStreamAcc->LoadAllData(pStream, FALSE); | 405 m_pStreamAcc->LoadAllData(pStream, FALSE); | 
| 401 } else if (pmap->GetString() == "Identity") { | 406 } else if (pmap->GetString() == "Identity") { | 
| 402 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ | 407 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ | 
| 403 if (m_pFontFile) { | 408 if (m_pFontFile) { | 
| 404 m_bCIDIsGID = TRUE; | 409 m_bCIDIsGID = true; | 
| 405 } | 410 } | 
| 406 #else | 411 #else | 
| 407 m_bCIDIsGID = TRUE; | 412 m_bCIDIsGID = true; | 
| 408 #endif | 413 #endif | 
| 409 } | 414 } | 
| 410 } | 415 } | 
| 411 } | 416 } | 
| 412 | 417 | 
| 413 CheckFontMetrics(); | 418 CheckFontMetrics(); | 
| 414 if (IsVertWriting()) { | 419 if (IsVertWriting()) { | 
| 415 pWidthArray = pCIDFontDict->GetArrayBy("W2"); | 420 pWidthArray = pCIDFontDict->GetArrayBy("W2"); | 
| 416 if (pWidthArray) { | 421 if (pWidthArray) { | 
| 417 LoadMetricsArray(pWidthArray, m_VertMetrics, 3); | 422 LoadMetricsArray(pWidthArray, m_VertMetrics, 3); | 
| 418 } | 423 } | 
| 419 CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayBy("DW2"); | 424 CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayBy("DW2"); | 
| 420 if (pDefaultArray) { | 425 if (pDefaultArray) { | 
| 421 m_DefaultVY = pDefaultArray->GetIntegerAt(0); | 426 m_DefaultVY = pDefaultArray->GetIntegerAt(0); | 
| 422 m_DefaultW1 = pDefaultArray->GetIntegerAt(1); | 427 m_DefaultW1 = pDefaultArray->GetIntegerAt(1); | 
| 423 } else { | 428 } else { | 
| 424 m_DefaultVY = 880; | 429 m_DefaultVY = 880; | 
| 425 m_DefaultW1 = -1000; | 430 m_DefaultW1 = -1000; | 
| 426 } | 431 } | 
| 427 } | 432 } | 
| 428 return TRUE; | 433 return TRUE; | 
| 429 } | 434 } | 
| 430 | 435 | 
| 431 FX_RECT CPDF_CIDFont::GetCharBBox(uint32_t charcode, int level) { | 436 FX_RECT CPDF_CIDFont::GetCharBBox(uint32_t charcode, int level) { | 
| 432 if (charcode < 256 && m_CharBBox[charcode].right != FX_SMALL_RECT::kInvalid) | 437 if (charcode < 256 && m_CharBBox[charcode].right != -1) | 
| 433 return FX_RECT(m_CharBBox[charcode]); | 438 return m_CharBBox[charcode]; | 
| 434 | 439 | 
| 435 FX_RECT rect; | 440 FX_RECT rect; | 
| 436 bool bVert = false; | 441 bool bVert = false; | 
| 437 int glyph_index = GlyphFromCharCode(charcode, &bVert); | 442 int glyph_index = GlyphFromCharCode(charcode, &bVert); | 
| 438 FXFT_Face face = m_Font.GetFace(); | 443 FXFT_Face face = m_Font.GetFace(); | 
| 439 if (face) { | 444 if (face) { | 
| 440 if (FXFT_Is_Face_Tricky(face)) { | 445 if (FXFT_Is_Face_Tricky(face)) { | 
| 441 int err = FXFT_Load_Glyph(face, glyph_index, | 446 int err = FXFT_Load_Glyph(face, glyph_index, | 
| 442 FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); | 447 FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); | 
| 443 if (!err) { | 448 if (!err) { | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 489 CIDTransformToFloat(pTransform[2]), | 494 CIDTransformToFloat(pTransform[2]), | 
| 490 CIDTransformToFloat(pTransform[3]), | 495 CIDTransformToFloat(pTransform[3]), | 
| 491 CIDTransformToFloat(pTransform[4]) * 1000, | 496 CIDTransformToFloat(pTransform[4]) * 1000, | 
| 492 CIDTransformToFloat(pTransform[5]) * 1000); | 497 CIDTransformToFloat(pTransform[5]) * 1000); | 
| 493 CFX_FloatRect rect_f(rect); | 498 CFX_FloatRect rect_f(rect); | 
| 494 rect_f.Transform(&matrix); | 499 rect_f.Transform(&matrix); | 
| 495 rect = rect_f.GetOuterRect(); | 500 rect = rect_f.GetOuterRect(); | 
| 496 } | 501 } | 
| 497 } | 502 } | 
| 498 if (charcode < 256) | 503 if (charcode < 256) | 
| 499 m_CharBBox[charcode] = rect.ToSmallRect(); | 504 m_CharBBox[charcode] = rect; | 
| 500 | 505 | 
| 501 return rect; | 506 return rect; | 
| 502 } | 507 } | 
| 508 | |
| 503 int CPDF_CIDFont::GetCharWidthF(uint32_t charcode, int level) { | 509 int CPDF_CIDFont::GetCharWidthF(uint32_t charcode, int level) { | 
| 504 if (charcode < 0x80 && m_bAnsiWidthsFixed) | 510 if (charcode < 0x80 && m_bAnsiWidthsFixed) | 
| 505 return charcode >= 32 && charcode < 127 ? 500 : 0; | 511 return charcode >= 32 && charcode < 127 ? 500 : 0; | 
| 506 | 512 | 
| 507 uint16_t cid = CIDFromCharCode(charcode); | 513 uint16_t cid = CIDFromCharCode(charcode); | 
| 508 int size = m_WidthList.GetSize(); | 514 int size = m_WidthList.GetSize(); | 
| 509 uint32_t* list = m_WidthList.GetData(); | 515 const uint32_t* pList = m_WidthList.GetData(); | 
| 510 for (int i = 0; i < size; i += 3) { | 516 for (int i = 0; i < size; i += 3) { | 
| 511 if (cid >= list[i] && cid <= list[i + 1]) { | 517 const uint32_t* pEntry = pList + i; | 
| 512 return (int)list[i + 2]; | 518 if (IsMetricForCID(pEntry, cid)) | 
| 513 } | 519 return static_cast<int>(pEntry[2]); | 
| 514 } | 520 } | 
| 515 return m_DefaultWidth; | 521 return m_DefaultWidth; | 
| 516 } | 522 } | 
| 523 | |
| 517 short CPDF_CIDFont::GetVertWidth(uint16_t CID) const { | 524 short CPDF_CIDFont::GetVertWidth(uint16_t CID) const { | 
| 518 uint32_t vertsize = m_VertMetrics.GetSize() / 5; | 525 uint32_t vertsize = m_VertMetrics.GetSize() / 5; | 
| 519 if (vertsize == 0) { | 526 if (vertsize) { | 
| 520 return m_DefaultW1; | 527 const uint32_t* pTable = m_VertMetrics.GetData(); | 
| 528 for (uint32_t i = 0; i < vertsize; i++) { | |
| 529 const uint32_t* pEntry = pTable + (i * 5); | |
| 530 if (IsMetricForCID(pEntry, CID)) | |
| 531 return static_cast<short>(pEntry[2]); | |
| 532 } | |
| 521 } | 533 } | 
| 522 const uint32_t* pTable = m_VertMetrics.GetData(); | |
| 523 for (uint32_t i = 0; i < vertsize; i++) | |
| 524 if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) { | |
| 525 return (short)(int)pTable[i * 5 + 2]; | |
| 526 } | |
| 527 return m_DefaultW1; | 534 return m_DefaultW1; | 
| 528 } | 535 } | 
| 536 | |
| 529 void CPDF_CIDFont::GetVertOrigin(uint16_t CID, short& vx, short& vy) const { | 537 void CPDF_CIDFont::GetVertOrigin(uint16_t CID, short& vx, short& vy) const { | 
| 530 uint32_t vertsize = m_VertMetrics.GetSize() / 5; | 538 uint32_t vertsize = m_VertMetrics.GetSize() / 5; | 
| 531 if (vertsize) { | 539 if (vertsize) { | 
| 532 const uint32_t* pTable = m_VertMetrics.GetData(); | 540 const uint32_t* pTable = m_VertMetrics.GetData(); | 
| 533 for (uint32_t i = 0; i < vertsize; i++) | 541 for (uint32_t i = 0; i < vertsize; i++) { | 
| 534 if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) { | 542 const uint32_t* pEntry = pTable + (i * 5); | 
| 535 vx = (short)(int)pTable[i * 5 + 3]; | 543 if (IsMetricForCID(pEntry, CID)) { | 
| 536 vy = (short)(int)pTable[i * 5 + 4]; | 544 vx = static_cast<short>(pEntry[3]); | 
| 545 vy = static_cast<short>(pEntry[4]); | |
| 537 return; | 546 return; | 
| 538 } | 547 } | 
| 548 } | |
| 539 } | 549 } | 
| 540 uint32_t dwWidth = m_DefaultWidth; | 550 uint32_t dwWidth = m_DefaultWidth; | 
| 541 int size = m_WidthList.GetSize(); | 551 int size = m_WidthList.GetSize(); | 
| 542 const uint32_t* list = m_WidthList.GetData(); | 552 const uint32_t* pList = m_WidthList.GetData(); | 
| 543 for (int i = 0; i < size; i += 3) { | 553 for (int i = 0; i < size; i += 3) { | 
| 544 if (CID >= list[i] && CID <= list[i + 1]) { | 554 const uint32_t* pEntry = pList + i; | 
| 545 dwWidth = (uint16_t)list[i + 2]; | 555 if (IsMetricForCID(pEntry, CID)) { | 
| 556 dwWidth = pEntry[2]; | |
| 546 break; | 557 break; | 
| 547 } | 558 } | 
| 548 } | 559 } | 
| 549 vx = (short)dwWidth / 2; | 560 vx = (short)dwWidth / 2; | 
| 
dsinclair
2016/08/15 12:48:03
static_cast
 
Lei Zhang
2016/08/15 17:05:35
Done.
 | |
| 550 vy = (short)m_DefaultVY; | 561 vy = m_DefaultVY; | 
| 551 } | 562 } | 
| 552 | 563 | 
| 553 int CPDF_CIDFont::GetGlyphIndex(uint32_t unicode, bool* pVertGlyph) { | 564 int CPDF_CIDFont::GetGlyphIndex(uint32_t unicode, bool* pVertGlyph) { | 
| 554 if (pVertGlyph) | 565 if (pVertGlyph) | 
| 555 *pVertGlyph = false; | 566 *pVertGlyph = false; | 
| 556 | 567 | 
| 557 FXFT_Face face = m_Font.GetFace(); | 568 FXFT_Face face = m_Font.GetFace(); | 
| 558 int index = FXFT_Get_Char_Index(face, unicode); | 569 int index = FXFT_Get_Char_Index(face, unicode); | 
| 559 if (unicode == 0x2502) | 570 if (unicode == 0x2502) | 
| 560 return index; | 571 return index; | 
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 813 return (ch < 128 ? ch : ch - 255) * (1.0f / 127); | 824 return (ch < 128 ? ch : ch - 255) * (1.0f / 127); | 
| 814 } | 825 } | 
| 815 | 826 | 
| 816 void CPDF_CIDFont::LoadGB2312() { | 827 void CPDF_CIDFont::LoadGB2312() { | 
| 817 m_BaseFont = m_pFontDict->GetStringBy("BaseFont"); | 828 m_BaseFont = m_pFontDict->GetStringBy("BaseFont"); | 
| 818 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictBy("FontDescriptor"); | 829 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictBy("FontDescriptor"); | 
| 819 if (pFontDesc) | 830 if (pFontDesc) | 
| 820 LoadFontDescriptor(pFontDesc); | 831 LoadFontDescriptor(pFontDesc); | 
| 821 | 832 | 
| 822 m_Charset = CIDSET_GB1; | 833 m_Charset = CIDSET_GB1; | 
| 823 m_bType1 = FALSE; | 834 m_bType1 = false; | 
| 824 CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; | 835 CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; | 
| 825 m_pCMap = manager.GetPredefinedCMap("GBK-EUC-H", FALSE); | 836 m_pCMap = manager.GetPredefinedCMap("GBK-EUC-H", FALSE); | 
| 826 m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, FALSE); | 837 m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, FALSE); | 
| 827 if (!IsEmbedded()) | 838 if (!IsEmbedded()) | 
| 828 LoadSubstFont(); | 839 LoadSubstFont(); | 
| 829 | 840 | 
| 830 CheckFontMetrics(); | 841 CheckFontMetrics(); | 
| 831 m_DefaultWidth = 1000; | 842 m_DefaultWidth = 1000; | 
| 832 m_bAnsiWidthsFixed = true; | 843 m_bAnsiWidthsFixed = true; | 
| 833 } | 844 } | 
| 834 | 845 | 
| 835 const uint8_t* CPDF_CIDFont::GetCIDTransform(uint16_t CID) const { | 846 const uint8_t* CPDF_CIDFont::GetCIDTransform(uint16_t CID) const { | 
| 836 if (m_Charset != CIDSET_JAPAN1 || m_pFontFile) | 847 if (m_Charset != CIDSET_JAPAN1 || m_pFontFile) | 
| 837 return nullptr; | 848 return nullptr; | 
| 838 | 849 | 
| 839 const auto* pEnd = g_Japan1_VertCIDs + FX_ArraySize(g_Japan1_VertCIDs); | 850 const auto* pEnd = g_Japan1_VertCIDs + FX_ArraySize(g_Japan1_VertCIDs); | 
| 840 const auto* pTransform = std::lower_bound( | 851 const auto* pTransform = std::lower_bound( | 
| 841 g_Japan1_VertCIDs, pEnd, CID, | 852 g_Japan1_VertCIDs, pEnd, CID, | 
| 842 [](const CIDTransform& entry, uint16_t cid) { return entry.cid < cid; }); | 853 [](const CIDTransform& entry, uint16_t cid) { return entry.cid < cid; }); | 
| 843 return pTransform < pEnd && CID == pTransform->cid ? &pTransform->a : nullptr; | 854 return pTransform < pEnd && CID == pTransform->cid ? &pTransform->a : nullptr; | 
| 844 } | 855 } | 
| OLD | NEW |