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/fpdf_page/pageint.h" | 7 #include "core/fpdfapi/fpdf_page/pageint.h" |
| 8 | 8 |
| 9 #include "core/fdrm/crypto/include/fx_crypt.h" | 9 #include "core/fdrm/crypto/include/fx_crypt.h" |
| 10 #include "core/fpdfapi/fpdf_font/cpdf_type1font.h" | 10 #include "core/fpdfapi/fpdf_font/cpdf_type1font.h" |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 207 if (!pFontDict) | 207 if (!pFontDict) |
| 208 return; | 208 return; |
| 209 | 209 |
| 210 auto it = m_FontMap.find(pFontDict); | 210 auto it = m_FontMap.find(pFontDict); |
| 211 if (it == m_FontMap.end()) | 211 if (it == m_FontMap.end()) |
| 212 return; | 212 return; |
| 213 | 213 |
| 214 CPDF_CountedFont* fontData = it->second; | 214 CPDF_CountedFont* fontData = it->second; |
| 215 if (fontData->get()) { | 215 if (fontData->get()) { |
| 216 fontData->RemoveRef(); | 216 fontData->RemoveRef(); |
| 217 if (fontData->use_count() == 0) { | 217 if (fontData->use_count() == 1) { |
| 218 // We have font data only in m_FontMap cache. Clean it. | |
| 218 fontData->clear(); | 219 fontData->clear(); |
| 219 } | 220 } |
| 220 } | 221 } |
| 221 } | 222 } |
| 222 | 223 |
| 223 CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace( | 224 CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace( |
| 224 CPDF_Object* pCSObj, | 225 CPDF_Object* pCSObj, |
| 225 const CPDF_Dictionary* pResources) { | 226 const CPDF_Dictionary* pResources) { |
| 226 std::set<CPDF_Object*> visited; | 227 std::set<CPDF_Object*> visited; |
| 227 return GetColorSpaceImpl(pCSObj, pResources, &visited); | 228 return GetColorSpaceImpl(pCSObj, pResources, &visited); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 321 if (!pColorSpace) | 322 if (!pColorSpace) |
| 322 return; | 323 return; |
| 323 | 324 |
| 324 auto it = m_ColorSpaceMap.find(pColorSpace); | 325 auto it = m_ColorSpaceMap.find(pColorSpace); |
| 325 if (it == m_ColorSpaceMap.end()) | 326 if (it == m_ColorSpaceMap.end()) |
| 326 return; | 327 return; |
| 327 | 328 |
| 328 CPDF_CountedColorSpace* csData = it->second; | 329 CPDF_CountedColorSpace* csData = it->second; |
| 329 if (csData->get()) { | 330 if (csData->get()) { |
| 330 csData->RemoveRef(); | 331 csData->RemoveRef(); |
| 331 if (csData->use_count() == 0) { | 332 if (csData->use_count() == 1) { |
| 333 // We have item only in m_ColorSpaceMap cache. Clean it. | |
| 332 csData->get()->ReleaseCS(); | 334 csData->get()->ReleaseCS(); |
| 333 csData->reset(nullptr); | 335 csData->reset(nullptr); |
| 334 } | 336 } |
| 335 } | 337 } |
| 336 } | 338 } |
| 337 | 339 |
| 338 CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, | 340 CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, |
| 339 FX_BOOL bShading, | 341 FX_BOOL bShading, |
| 340 const CFX_Matrix& matrix) { | 342 const CFX_Matrix& matrix) { |
| 341 if (!pPatternObj) | 343 if (!pPatternObj) |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 380 if (!pPatternObj) | 382 if (!pPatternObj) |
| 381 return; | 383 return; |
| 382 | 384 |
| 383 auto it = m_PatternMap.find(pPatternObj); | 385 auto it = m_PatternMap.find(pPatternObj); |
| 384 if (it == m_PatternMap.end()) | 386 if (it == m_PatternMap.end()) |
| 385 return; | 387 return; |
| 386 | 388 |
| 387 CPDF_CountedPattern* ptData = it->second; | 389 CPDF_CountedPattern* ptData = it->second; |
| 388 if (ptData->get()) { | 390 if (ptData->get()) { |
| 389 ptData->RemoveRef(); | 391 ptData->RemoveRef(); |
| 390 if (ptData->use_count() == 0) { | 392 if (ptData->use_count() == 1) { |
| 393 // We have item only in m_PatternMap cache. Clean it. | |
| 391 ptData->clear(); | 394 ptData->clear(); |
| 392 } | 395 } |
| 393 } | 396 } |
| 394 } | 397 } |
| 395 | 398 |
| 396 CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream) { | 399 CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream) { |
| 397 if (!pImageStream) | 400 if (!pImageStream) |
| 398 return nullptr; | 401 return nullptr; |
| 399 | 402 |
| 400 const uint32_t dwImageObjNum = pImageStream->GetObjNum(); | 403 const uint32_t dwImageObjNum = pImageStream->GetObjNum(); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 417 | 420 |
| 418 auto it = m_ImageMap.find(pImageStream->GetObjNum()); | 421 auto it = m_ImageMap.find(pImageStream->GetObjNum()); |
| 419 if (it == m_ImageMap.end()) | 422 if (it == m_ImageMap.end()) |
| 420 return; | 423 return; |
| 421 | 424 |
| 422 CPDF_CountedImage* image = it->second; | 425 CPDF_CountedImage* image = it->second; |
| 423 if (!image) | 426 if (!image) |
| 424 return; | 427 return; |
| 425 | 428 |
| 426 image->RemoveRef(); | 429 image->RemoveRef(); |
| 427 if (image->use_count() == 0) { | 430 if (image->use_count() == 1) { |
| 431 // We have item only in m_ImageMap cache. Clean it. | |
| 428 delete image->get(); | 432 delete image->get(); |
| 429 delete image; | 433 delete image; |
| 430 m_ImageMap.erase(it); | 434 m_ImageMap.erase(it); |
| 431 } | 435 } |
| 432 } | 436 } |
| 433 | 437 |
| 434 CPDF_IccProfile* CPDF_DocPageData::GetIccProfile( | 438 CPDF_IccProfile* CPDF_DocPageData::GetIccProfile( |
| 435 CPDF_Stream* pIccProfileStream) { | 439 CPDF_Stream* pIccProfileStream) { |
| 436 if (!pIccProfileStream) | 440 if (!pIccProfileStream) |
| 437 return nullptr; | 441 return nullptr; |
| 438 | 442 |
| 439 auto it = m_IccProfileMap.find(pIccProfileStream); | 443 auto it = m_IccProfileMap.find(pIccProfileStream); |
| 440 if (it != m_IccProfileMap.end()) { | 444 if (it != m_IccProfileMap.end()) { |
| 441 return it->second->AddRef(); | 445 return it->second->AddRef(); |
| 442 } | 446 } |
| 443 | 447 |
| 444 CPDF_StreamAcc stream; | 448 CPDF_StreamAcc stream; |
| 445 stream.LoadAllData(pIccProfileStream, FALSE); | 449 stream.LoadAllData(pIccProfileStream, FALSE); |
| 446 uint8_t digest[20]; | 450 uint8_t digest[20]; |
| 447 CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); | 451 CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); |
| 448 CFX_ByteString bsDigest(digest, 20); | 452 CFX_ByteString bsDigest(digest, 20); |
| 449 auto hash_it = m_HashProfileMap.find(bsDigest); | 453 auto hash_it = m_HashProfileMap.find(bsDigest); |
| 450 if (hash_it != m_HashProfileMap.end()) { | 454 if (hash_it != m_HashProfileMap.end()) { |
| 451 auto it_copied_stream = m_IccProfileMap.find(hash_it->second); | 455 auto it_copied_stream = m_IccProfileMap.find(hash_it->second); |
| 452 return it_copied_stream->second->AddRef(); | 456 if (it_copied_stream != m_IccProfileMap.end()) |
|
dsinclair
2016/07/18 20:13:48
Should we be removing the entry from IccProfileMap
snake
2016/07/19 18:55:14
No, To remove it, we should walk within full m_Icc
| |
| 457 return it_copied_stream->second->AddRef(); | |
| 453 } | 458 } |
| 454 CPDF_IccProfile* pProfile = | 459 CPDF_IccProfile* pProfile = |
| 455 new CPDF_IccProfile(stream.GetData(), stream.GetSize()); | 460 new CPDF_IccProfile(stream.GetData(), stream.GetSize()); |
| 456 CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile(pProfile); | 461 CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile(pProfile); |
| 457 m_IccProfileMap[pIccProfileStream] = ipData; | 462 m_IccProfileMap[pIccProfileStream] = ipData; |
| 458 m_HashProfileMap[bsDigest] = pIccProfileStream; | 463 m_HashProfileMap[bsDigest] = pIccProfileStream; |
| 459 return ipData->AddRef(); | 464 return ipData->AddRef(); |
| 460 } | 465 } |
| 461 | 466 |
| 462 void CPDF_DocPageData::ReleaseIccProfile(CPDF_IccProfile* pIccProfile) { | 467 void CPDF_DocPageData::ReleaseIccProfile(CPDF_IccProfile* pIccProfile) { |
| 463 ASSERT(pIccProfile); | 468 ASSERT(pIccProfile); |
| 464 | 469 |
| 465 for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end(); ++it) { | 470 for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end(); ++it) { |
| 466 CPDF_CountedIccProfile* profile = it->second; | 471 CPDF_CountedIccProfile* profile = it->second; |
| 467 if (profile->get() != pIccProfile) | 472 if (profile->get() != pIccProfile) |
| 468 continue; | 473 continue; |
| 469 | 474 |
| 470 profile->RemoveRef(); | 475 profile->RemoveRef(); |
| 471 if (profile->use_count() == 0) { | 476 if (profile->use_count() == 1) { |
| 477 // We have item only in m_IccProfileMap cache. Clean it. | |
| 472 delete profile->get(); | 478 delete profile->get(); |
| 473 delete profile; | 479 delete profile; |
| 474 m_IccProfileMap.erase(it); | 480 m_IccProfileMap.erase(it); |
| 475 return; | 481 return; |
| 476 } | 482 } |
| 477 } | 483 } |
| 478 } | 484 } |
| 479 | 485 |
| 480 CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc( | 486 CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc( |
| 481 CPDF_Stream* pFontStream) { | 487 CPDF_Stream* pFontStream) { |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 507 | 513 |
| 508 auto it = m_FontFileMap.find(pFontStream); | 514 auto it = m_FontFileMap.find(pFontStream); |
| 509 if (it == m_FontFileMap.end()) | 515 if (it == m_FontFileMap.end()) |
| 510 return; | 516 return; |
| 511 | 517 |
| 512 CPDF_CountedStreamAcc* findData = it->second; | 518 CPDF_CountedStreamAcc* findData = it->second; |
| 513 if (!findData) | 519 if (!findData) |
| 514 return; | 520 return; |
| 515 | 521 |
| 516 findData->RemoveRef(); | 522 findData->RemoveRef(); |
| 517 if (findData->use_count() == 0 || bForce) { | 523 if (findData->use_count() == 1 || bForce) { |
| 524 // We have item only in m_FontFileMap cache. Clean it. | |
| 518 delete findData->get(); | 525 delete findData->get(); |
| 519 delete findData; | 526 delete findData; |
| 520 m_FontFileMap.erase(it); | 527 m_FontFileMap.erase(it); |
| 521 } | 528 } |
| 522 } | 529 } |
| 523 | 530 |
| 524 CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr( | 531 CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr( |
| 525 CPDF_Object* pCSObj) const { | 532 CPDF_Object* pCSObj) const { |
| 526 if (!pCSObj) | 533 if (!pCSObj) |
| 527 return nullptr; | 534 return nullptr; |
| 528 | 535 |
| 529 auto it = m_ColorSpaceMap.find(pCSObj); | 536 auto it = m_ColorSpaceMap.find(pCSObj); |
| 530 return it != m_ColorSpaceMap.end() ? it->second : nullptr; | 537 return it != m_ColorSpaceMap.end() ? it->second : nullptr; |
| 531 } | 538 } |
| 532 | 539 |
| 533 CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr( | 540 CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr( |
| 534 CPDF_Object* pPatternObj) const { | 541 CPDF_Object* pPatternObj) const { |
| 535 if (!pPatternObj) | 542 if (!pPatternObj) |
| 536 return nullptr; | 543 return nullptr; |
| 537 | 544 |
| 538 auto it = m_PatternMap.find(pPatternObj); | 545 auto it = m_PatternMap.find(pPatternObj); |
| 539 return it != m_PatternMap.end() ? it->second : nullptr; | 546 return it != m_PatternMap.end() ? it->second : nullptr; |
| 540 } | 547 } |
| OLD | NEW |