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/include/cpdf_font.h" | 7 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <vector> | 10 #include <vector> |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 uint32_t charcode = GetNextChar(pString, size, offset); | 292 uint32_t charcode = GetNextChar(pString, size, offset); |
293 width += GetCharWidthF(charcode); | 293 width += GetCharWidthF(charcode); |
294 } | 294 } |
295 return width; | 295 return width; |
296 } | 296 } |
297 | 297 |
298 CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc, | 298 CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc, |
299 const CFX_ByteStringC& name) { | 299 const CFX_ByteStringC& name) { |
300 CFX_ByteString fontname(name); | 300 CFX_ByteString fontname(name); |
301 int font_id = PDF_GetStandardFontName(&fontname); | 301 int font_id = PDF_GetStandardFontName(&fontname); |
302 if (font_id < 0) { | 302 if (font_id < 0) |
303 return nullptr; | 303 return nullptr; |
304 } | 304 |
305 CPDF_FontGlobals* pFontGlobals = | 305 CPDF_FontGlobals* pFontGlobals = |
306 CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); | 306 CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); |
307 CPDF_Font* pFont = pFontGlobals->Find(pDoc, font_id); | 307 CPDF_Font* pFont = pFontGlobals->Find(pDoc, font_id); |
308 if (pFont) { | 308 if (pFont) |
309 return pFont; | 309 return pFont; |
310 } | 310 |
311 CPDF_Dictionary* pDict = new CPDF_Dictionary; | 311 CPDF_Dictionary* pDict = new CPDF_Dictionary; |
312 pDict->SetNameFor("Type", "Font"); | 312 pDict->SetNameFor("Type", "Font"); |
313 pDict->SetNameFor("Subtype", "Type1"); | 313 pDict->SetNameFor("Subtype", "Type1"); |
314 pDict->SetNameFor("BaseFont", fontname); | 314 pDict->SetNameFor("BaseFont", fontname); |
315 pDict->SetNameFor("Encoding", "WinAnsiEncoding"); | 315 pDict->SetNameFor("Encoding", "WinAnsiEncoding"); |
316 pFont = CPDF_Font::CreateFontF(nullptr, pDict); | 316 return pFontGlobals->Set(pDoc, font_id, CPDF_Font::Create(nullptr, pDict)); |
317 pFontGlobals->Set(pDoc, font_id, pFont); | |
318 return pFont; | |
319 } | 317 } |
320 | 318 |
321 CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc, | 319 std::unique_ptr<CPDF_Font> CPDF_Font::Create(CPDF_Document* pDoc, |
322 CPDF_Dictionary* pFontDict) { | 320 CPDF_Dictionary* pFontDict) { |
323 CFX_ByteString type = pFontDict->GetStringFor("Subtype"); | 321 CFX_ByteString type = pFontDict->GetStringFor("Subtype"); |
324 std::unique_ptr<CPDF_Font> pFont; | 322 std::unique_ptr<CPDF_Font> pFont; |
325 if (type == "TrueType") { | 323 if (type == "TrueType") { |
326 CFX_ByteString tag = pFontDict->GetStringFor("BaseFont").Left(4); | 324 CFX_ByteString tag = pFontDict->GetStringFor("BaseFont").Left(4); |
327 for (size_t i = 0; i < FX_ArraySize(kChineseFontNames); ++i) { | 325 for (size_t i = 0; i < FX_ArraySize(kChineseFontNames); ++i) { |
328 if (tag == CFX_ByteString(kChineseFontNames[i], 4)) { | 326 if (tag == CFX_ByteString(kChineseFontNames[i], 4)) { |
329 CPDF_Dictionary* pFontDesc = pFontDict->GetDictFor("FontDescriptor"); | 327 CPDF_Dictionary* pFontDesc = pFontDict->GetDictFor("FontDescriptor"); |
330 if (!pFontDesc || !pFontDesc->KeyExist("FontFile2")) | 328 if (!pFontDesc || !pFontDesc->KeyExist("FontFile2")) |
331 pFont.reset(new CPDF_CIDFont); | 329 pFont.reset(new CPDF_CIDFont); |
332 break; | 330 break; |
333 } | 331 } |
334 } | 332 } |
335 if (!pFont) | 333 if (!pFont) |
336 pFont.reset(new CPDF_TrueTypeFont); | 334 pFont.reset(new CPDF_TrueTypeFont); |
337 } else if (type == "Type3") { | 335 } else if (type == "Type3") { |
338 pFont.reset(new CPDF_Type3Font); | 336 pFont.reset(new CPDF_Type3Font); |
339 } else if (type == "Type0") { | 337 } else if (type == "Type0") { |
340 pFont.reset(new CPDF_CIDFont); | 338 pFont.reset(new CPDF_CIDFont); |
341 } else { | 339 } else { |
342 pFont.reset(new CPDF_Type1Font); | 340 pFont.reset(new CPDF_Type1Font); |
343 } | 341 } |
344 pFont->m_pFontDict = pFontDict; | 342 pFont->m_pFontDict = pFontDict; |
345 pFont->m_pDocument = pDoc; | 343 pFont->m_pDocument = pDoc; |
346 pFont->m_BaseFont = pFontDict->GetStringFor("BaseFont"); | 344 pFont->m_BaseFont = pFontDict->GetStringFor("BaseFont"); |
347 return pFont->Load() ? pFont.release() : nullptr; | 345 return pFont->Load() ? std::move(pFont) : std::unique_ptr<CPDF_Font>(); |
348 } | 346 } |
349 | 347 |
350 uint32_t CPDF_Font::GetNextChar(const FX_CHAR* pString, | 348 uint32_t CPDF_Font::GetNextChar(const FX_CHAR* pString, |
351 int nStrLen, | 349 int nStrLen, |
352 int& offset) const { | 350 int& offset) const { |
353 if (offset < 0 || nStrLen < 1) { | 351 if (offset < 0 || nStrLen < 1) { |
354 return 0; | 352 return 0; |
355 } | 353 } |
356 uint8_t ch = offset < nStrLen ? pString[offset++] : pString[nStrLen - 1]; | 354 uint8_t ch = offset < nStrLen ? pString[offset++] : pString[nStrLen - 1]; |
357 return static_cast<uint32_t>(ch); | 355 return static_cast<uint32_t>(ch); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 if (fallbackFont < 0 || | 466 if (fallbackFont < 0 || |
469 fallbackFont >= pdfium::CollectionSize<int>(m_FontFallbacks)) { | 467 fallbackFont >= pdfium::CollectionSize<int>(m_FontFallbacks)) { |
470 return -1; | 468 return -1; |
471 } | 469 } |
472 int glyph = | 470 int glyph = |
473 FXFT_Get_Char_Index(m_FontFallbacks[fallbackFont]->GetFace(), charcode); | 471 FXFT_Get_Char_Index(m_FontFallbacks[fallbackFont]->GetFace(), charcode); |
474 if (glyph == 0 || glyph == 0xffff) | 472 if (glyph == 0 || glyph == 0xffff) |
475 return -1; | 473 return -1; |
476 return glyph; | 474 return glyph; |
477 } | 475 } |
OLD | NEW |