Chromium Code Reviews| 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/fpdfapi/font/font_int.h" | 7 #include "core/fpdfapi/font/font_int.h" |
| 8 | 8 |
| 9 #include <memory> | |
| 10 #include <utility> | |
| 11 | |
| 9 #include "core/fpdfapi/cmaps/cmap_int.h" | 12 #include "core/fpdfapi/cmaps/cmap_int.h" |
| 10 #include "core/fpdfapi/cpdf_modulemgr.h" | 13 #include "core/fpdfapi/cpdf_modulemgr.h" |
| 11 #include "core/fpdfapi/font/ttgsubtable.h" | 14 #include "core/fpdfapi/font/ttgsubtable.h" |
| 12 #include "core/fpdfapi/page/cpdf_pagemodule.h" | 15 #include "core/fpdfapi/page/cpdf_pagemodule.h" |
| 13 #include "core/fpdfapi/parser/cpdf_array.h" | 16 #include "core/fpdfapi/parser/cpdf_array.h" |
| 14 #include "core/fpdfapi/parser/cpdf_dictionary.h" | 17 #include "core/fpdfapi/parser/cpdf_dictionary.h" |
| 15 #include "core/fpdfapi/parser/cpdf_simple_parser.h" | 18 #include "core/fpdfapi/parser/cpdf_simple_parser.h" |
| 16 #include "core/fxcrt/fx_ext.h" | 19 #include "core/fxcrt/fx_ext.h" |
| 17 #include "core/fxge/fx_freetype.h" | 20 #include "core/fxge/fx_freetype.h" |
| 18 #include "third_party/base/stl_util.h" | 21 #include "third_party/base/stl_util.h" |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 271 --iSeg; | 274 --iSeg; |
| 272 } | 275 } |
| 273 --size; | 276 --size; |
| 274 ++offset; | 277 ++offset; |
| 275 } | 278 } |
| 276 return 1; | 279 return 1; |
| 277 } | 280 } |
| 278 | 281 |
| 279 } // namespace | 282 } // namespace |
| 280 | 283 |
| 281 CPDF_CMapManager::CPDF_CMapManager() { | 284 CPDF_CMapManager::CPDF_CMapManager() {} |
| 282 FXSYS_memset(m_CID2UnicodeMaps, 0, sizeof m_CID2UnicodeMaps); | 285 |
| 286 CPDF_CMapManager::~CPDF_CMapManager() {} | |
| 287 | |
| 288 CFX_MaybeOwned<CPDF_CMap> CPDF_CMapManager::GetPredefinedCMap( | |
| 289 const CFX_ByteString& name, | |
| 290 bool bPromptCJK) { | |
| 291 auto it = m_CMaps.find(name); | |
| 292 if (it != m_CMaps.end()) | |
| 293 return CFX_MaybeOwned<CPDF_CMap>(it->second.get()); // Unowned. | |
| 294 | |
| 295 std::unique_ptr<CPDF_CMap> pCMap = LoadPredefinedCMap(name, bPromptCJK); | |
| 296 if (name.IsEmpty()) | |
| 297 return CFX_MaybeOwned<CPDF_CMap>(std::move(pCMap)); // Owned. | |
| 298 | |
| 299 CPDF_CMap* pUnowned = pCMap.get(); | |
| 300 m_CMaps[name] = std::move(pCMap); | |
| 301 return CFX_MaybeOwned<CPDF_CMap>(pUnowned); // Unowned. | |
| 283 } | 302 } |
| 284 CPDF_CMapManager::~CPDF_CMapManager() { | 303 |
| 285 for (const auto& pair : m_CMaps) { | 304 std::unique_ptr<CPDF_CMap> CPDF_CMapManager::LoadPredefinedCMap( |
| 286 delete pair.second; | 305 const CFX_ByteString& name, |
| 287 } | 306 bool bPromptCJK) { |
| 288 m_CMaps.clear(); | 307 auto pCMap = pdfium::MakeUnique<CPDF_CMap>(); |
| 289 for (size_t i = 0; i < FX_ArraySize(m_CID2UnicodeMaps); ++i) { | |
| 290 delete m_CID2UnicodeMaps[i]; | |
| 291 } | |
| 292 } | |
| 293 CPDF_CMap* CPDF_CMapManager::GetPredefinedCMap(const CFX_ByteString& name, | |
| 294 bool bPromptCJK) { | |
| 295 auto it = m_CMaps.find(name); | |
| 296 if (it != m_CMaps.end()) { | |
| 297 return it->second; | |
| 298 } | |
| 299 CPDF_CMap* pCMap = LoadPredefinedCMap(name, bPromptCJK); | |
| 300 if (!name.IsEmpty()) { | |
|
Tom Sepez
2017/01/18 23:16:25
note: leak here if name is empty and we don't stic
| |
| 301 m_CMaps[name] = pCMap; | |
| 302 } | |
| 303 return pCMap; | |
| 304 } | |
| 305 CPDF_CMap* CPDF_CMapManager::LoadPredefinedCMap(const CFX_ByteString& name, | |
| 306 bool bPromptCJK) { | |
| 307 CPDF_CMap* pCMap = new CPDF_CMap; | |
| 308 const FX_CHAR* pname = name.c_str(); | 308 const FX_CHAR* pname = name.c_str(); |
| 309 if (*pname == '/') { | 309 if (*pname == '/') |
| 310 pname++; | 310 pname++; |
| 311 } | 311 |
| 312 pCMap->LoadPredefined(this, pname, bPromptCJK); | 312 pCMap->LoadPredefined(this, pname, bPromptCJK); |
| 313 return pCMap; | 313 return pCMap; |
| 314 } | 314 } |
| 315 | 315 |
| 316 CPDF_CID2UnicodeMap* CPDF_CMapManager::GetCID2UnicodeMap(CIDSet charset, | 316 CPDF_CID2UnicodeMap* CPDF_CMapManager::GetCID2UnicodeMap(CIDSet charset, |
| 317 bool bPromptCJK) { | 317 bool bPromptCJK) { |
| 318 if (!m_CID2UnicodeMaps[charset]) | 318 if (!m_CID2UnicodeMaps[charset]) |
| 319 m_CID2UnicodeMaps[charset] = LoadCID2UnicodeMap(charset, bPromptCJK); | 319 m_CID2UnicodeMaps[charset] = LoadCID2UnicodeMap(charset, bPromptCJK); |
| 320 return m_CID2UnicodeMaps[charset]; | 320 |
| 321 return m_CID2UnicodeMaps[charset].get(); | |
| 321 } | 322 } |
| 322 CPDF_CID2UnicodeMap* CPDF_CMapManager::LoadCID2UnicodeMap(CIDSet charset, | 323 |
| 323 bool bPromptCJK) { | 324 std::unique_ptr<CPDF_CID2UnicodeMap> CPDF_CMapManager::LoadCID2UnicodeMap( |
| 324 CPDF_CID2UnicodeMap* pMap = new CPDF_CID2UnicodeMap(); | 325 CIDSet charset, |
| 326 bool bPromptCJK) { | |
| 327 auto pMap = pdfium::MakeUnique<CPDF_CID2UnicodeMap>(); | |
| 325 pMap->Load(this, charset, bPromptCJK); | 328 pMap->Load(this, charset, bPromptCJK); |
| 326 return pMap; | 329 return pMap; |
| 327 } | 330 } |
| 328 | 331 |
| 329 CPDF_CMapParser::CPDF_CMapParser() | 332 CPDF_CMapParser::CPDF_CMapParser() |
| 330 : m_pCMap(nullptr), m_Status(0), m_CodeSeq(0) {} | 333 : m_pCMap(nullptr), m_Status(0), m_CodeSeq(0) {} |
| 331 | 334 |
| 332 CPDF_CMapParser::~CPDF_CMapParser() {} | 335 CPDF_CMapParser::~CPDF_CMapParser() {} |
| 333 | 336 |
| 334 void CPDF_CMapParser::Initialize(CPDF_CMap* pCMap) { | 337 void CPDF_CMapParser::Initialize(CPDF_CMap* pCMap) { |
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 774 m_EmbeddedCount = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count; | 777 m_EmbeddedCount = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count; |
| 775 } | 778 } |
| 776 | 779 |
| 777 CIDSet CharsetFromOrdering(const CFX_ByteStringC& ordering) { | 780 CIDSet CharsetFromOrdering(const CFX_ByteStringC& ordering) { |
| 778 for (size_t charset = 1; charset < FX_ArraySize(g_CharsetNames); ++charset) { | 781 for (size_t charset = 1; charset < FX_ArraySize(g_CharsetNames); ++charset) { |
| 779 if (ordering == g_CharsetNames[charset]) | 782 if (ordering == g_CharsetNames[charset]) |
| 780 return CIDSetFromSizeT(charset); | 783 return CIDSetFromSizeT(charset); |
| 781 } | 784 } |
| 782 return CIDSET_UNKNOWN; | 785 return CIDSET_UNKNOWN; |
| 783 } | 786 } |
| OLD | NEW |