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 <algorithm> | 9 #include <algorithm> |
10 #include <set> | 10 #include <set> |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 | 207 |
208 auto it = m_FontMap.find(pFontDict); | 208 auto it = m_FontMap.find(pFontDict); |
209 if (it == m_FontMap.end()) | 209 if (it == m_FontMap.end()) |
210 return; | 210 return; |
211 | 211 |
212 CPDF_CountedFont* pFontData = it->second; | 212 CPDF_CountedFont* pFontData = it->second; |
213 if (!pFontData->get()) | 213 if (!pFontData->get()) |
214 return; | 214 return; |
215 | 215 |
216 pFontData->RemoveRef(); | 216 pFontData->RemoveRef(); |
217 if (pFontData->use_count() > 1) | 217 if (pFontData->use_count() != 0) |
218 return; | 218 return; |
219 | 219 |
220 // We have font data only in m_FontMap cache. Clean it. | |
221 pFontData->clear(); | 220 pFontData->clear(); |
222 } | 221 } |
223 | 222 |
224 CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace( | 223 CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace( |
225 CPDF_Object* pCSObj, | 224 CPDF_Object* pCSObj, |
226 const CPDF_Dictionary* pResources) { | 225 const CPDF_Dictionary* pResources) { |
227 std::set<CPDF_Object*> visited; | 226 std::set<CPDF_Object*> visited; |
228 return GetColorSpaceImpl(pCSObj, pResources, &visited); | 227 return GetColorSpaceImpl(pCSObj, pResources, &visited); |
229 } | 228 } |
230 | 229 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 | 323 |
325 auto it = m_ColorSpaceMap.find(pColorSpace); | 324 auto it = m_ColorSpaceMap.find(pColorSpace); |
326 if (it == m_ColorSpaceMap.end()) | 325 if (it == m_ColorSpaceMap.end()) |
327 return; | 326 return; |
328 | 327 |
329 CPDF_CountedColorSpace* pCountedColorSpace = it->second; | 328 CPDF_CountedColorSpace* pCountedColorSpace = it->second; |
330 if (!pCountedColorSpace->get()) | 329 if (!pCountedColorSpace->get()) |
331 return; | 330 return; |
332 | 331 |
333 pCountedColorSpace->RemoveRef(); | 332 pCountedColorSpace->RemoveRef(); |
334 if (pCountedColorSpace->use_count() > 1) | 333 if (pCountedColorSpace->use_count() != 0) |
335 return; | 334 return; |
336 | 335 |
337 // We have item only in m_ColorSpaceMap cache. Clean it. | |
338 pCountedColorSpace->get()->ReleaseCS(); | 336 pCountedColorSpace->get()->ReleaseCS(); |
339 pCountedColorSpace->reset(nullptr); | 337 pCountedColorSpace->reset(nullptr); |
340 } | 338 } |
341 | 339 |
342 CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, | 340 CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, |
343 FX_BOOL bShading, | 341 FX_BOOL bShading, |
344 const CFX_Matrix& matrix) { | 342 const CFX_Matrix& matrix) { |
345 if (!pPatternObj) | 343 if (!pPatternObj) |
346 return nullptr; | 344 return nullptr; |
347 | 345 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 | 384 |
387 auto it = m_PatternMap.find(pPatternObj); | 385 auto it = m_PatternMap.find(pPatternObj); |
388 if (it == m_PatternMap.end()) | 386 if (it == m_PatternMap.end()) |
389 return; | 387 return; |
390 | 388 |
391 CPDF_CountedPattern* pPattern = it->second; | 389 CPDF_CountedPattern* pPattern = it->second; |
392 if (!pPattern->get()) | 390 if (!pPattern->get()) |
393 return; | 391 return; |
394 | 392 |
395 pPattern->RemoveRef(); | 393 pPattern->RemoveRef(); |
396 if (pPattern->use_count() > 1) | 394 if (pPattern->use_count() != 0) |
397 return; | 395 return; |
398 | 396 |
399 // We have item only in m_PatternMap cache. Clean it. | |
400 pPattern->clear(); | 397 pPattern->clear(); |
401 } | 398 } |
402 | 399 |
403 CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream) { | 400 CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream) { |
404 if (!pImageStream) | 401 if (!pImageStream) |
405 return nullptr; | 402 return nullptr; |
406 | 403 |
407 const uint32_t dwImageObjNum = pImageStream->GetObjNum(); | 404 const uint32_t dwImageObjNum = pImageStream->GetObjNum(); |
408 auto it = m_ImageMap.find(dwImageObjNum); | 405 auto it = m_ImageMap.find(dwImageObjNum); |
409 if (it != m_ImageMap.end()) | 406 if (it != m_ImageMap.end()) |
(...skipping 15 matching lines...) Expand all Loading... |
425 | 422 |
426 auto it = m_ImageMap.find(dwObjNum); | 423 auto it = m_ImageMap.find(dwObjNum); |
427 if (it == m_ImageMap.end()) | 424 if (it == m_ImageMap.end()) |
428 return; | 425 return; |
429 | 426 |
430 CPDF_CountedImage* pCountedImage = it->second; | 427 CPDF_CountedImage* pCountedImage = it->second; |
431 if (!pCountedImage) | 428 if (!pCountedImage) |
432 return; | 429 return; |
433 | 430 |
434 pCountedImage->RemoveRef(); | 431 pCountedImage->RemoveRef(); |
435 if (pCountedImage->use_count() > 1) | 432 if (pCountedImage->use_count() != 0) |
436 return; | 433 return; |
437 | 434 |
438 // We have item only in m_ImageMap cache. Clean it. | |
439 delete pCountedImage->get(); | 435 delete pCountedImage->get(); |
440 delete pCountedImage; | 436 delete pCountedImage; |
441 m_ImageMap.erase(it); | 437 m_ImageMap.erase(it); |
442 } | 438 } |
443 | 439 |
444 CPDF_IccProfile* CPDF_DocPageData::GetIccProfile( | 440 CPDF_IccProfile* CPDF_DocPageData::GetIccProfile( |
445 CPDF_Stream* pIccProfileStream) { | 441 CPDF_Stream* pIccProfileStream) { |
446 if (!pIccProfileStream) | 442 if (!pIccProfileStream) |
447 return nullptr; | 443 return nullptr; |
448 | 444 |
449 auto it = m_IccProfileMap.find(pIccProfileStream); | 445 auto it = m_IccProfileMap.find(pIccProfileStream); |
450 if (it != m_IccProfileMap.end()) | 446 if (it != m_IccProfileMap.end()) |
451 return it->second->AddRef(); | 447 return it->second->AddRef(); |
452 | 448 |
453 CPDF_StreamAcc stream; | 449 CPDF_StreamAcc stream; |
454 stream.LoadAllData(pIccProfileStream, FALSE); | 450 stream.LoadAllData(pIccProfileStream, FALSE); |
455 uint8_t digest[20]; | 451 uint8_t digest[20]; |
456 CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); | 452 CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); |
457 CFX_ByteString bsDigest(digest, 20); | 453 CFX_ByteString bsDigest(digest, 20); |
458 auto hash_it = m_HashProfileMap.find(bsDigest); | 454 auto hash_it = m_HashProfileMap.find(bsDigest); |
459 if (hash_it != m_HashProfileMap.end()) { | 455 if (hash_it != m_HashProfileMap.end()) { |
460 auto it_copied_stream = m_IccProfileMap.find(hash_it->second); | 456 auto it_copied_stream = m_IccProfileMap.find(hash_it->second); |
461 if (it_copied_stream != m_IccProfileMap.end()) | 457 return it_copied_stream->second->AddRef(); |
462 return it_copied_stream->second->AddRef(); | |
463 } | 458 } |
464 CPDF_IccProfile* pProfile = | 459 CPDF_IccProfile* pProfile = |
465 new CPDF_IccProfile(stream.GetData(), stream.GetSize()); | 460 new CPDF_IccProfile(stream.GetData(), stream.GetSize()); |
466 CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile(pProfile); | 461 CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile(pProfile); |
467 m_IccProfileMap[pIccProfileStream] = ipData; | 462 m_IccProfileMap[pIccProfileStream] = ipData; |
468 m_HashProfileMap[bsDigest] = pIccProfileStream; | 463 m_HashProfileMap[bsDigest] = pIccProfileStream; |
469 return ipData->AddRef(); | 464 return ipData->AddRef(); |
470 } | 465 } |
471 | 466 |
472 void CPDF_DocPageData::ReleaseIccProfile(const CPDF_IccProfile* pIccProfile) { | 467 void CPDF_DocPageData::ReleaseIccProfile(const CPDF_IccProfile* pIccProfile) { |
473 ASSERT(pIccProfile); | 468 ASSERT(pIccProfile); |
474 | 469 |
475 for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end(); ++it) { | 470 for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end(); ++it) { |
476 CPDF_CountedIccProfile* profile = it->second; | 471 CPDF_CountedIccProfile* profile = it->second; |
477 if (profile->get() != pIccProfile) | 472 if (profile->get() != pIccProfile) |
478 continue; | 473 continue; |
479 | 474 |
480 profile->RemoveRef(); | 475 profile->RemoveRef(); |
481 if (profile->use_count() == 1) { | 476 if (profile->use_count() == 0) { |
482 // We have item only in m_IccProfileMap cache. Clean it. | |
483 delete profile->get(); | 477 delete profile->get(); |
484 delete profile; | 478 delete profile; |
485 m_IccProfileMap.erase(it); | 479 m_IccProfileMap.erase(it); |
486 return; | 480 return; |
487 } | 481 } |
488 } | 482 } |
489 } | 483 } |
490 | 484 |
491 CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc( | 485 CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc( |
492 CPDF_Stream* pFontStream) { | 486 CPDF_Stream* pFontStream) { |
(...skipping 24 matching lines...) Expand all Loading... |
517 | 511 |
518 auto it = m_FontFileMap.find(pFontStream); | 512 auto it = m_FontFileMap.find(pFontStream); |
519 if (it == m_FontFileMap.end()) | 513 if (it == m_FontFileMap.end()) |
520 return; | 514 return; |
521 | 515 |
522 CPDF_CountedStreamAcc* pCountedStream = it->second; | 516 CPDF_CountedStreamAcc* pCountedStream = it->second; |
523 if (!pCountedStream) | 517 if (!pCountedStream) |
524 return; | 518 return; |
525 | 519 |
526 pCountedStream->RemoveRef(); | 520 pCountedStream->RemoveRef(); |
527 if (pCountedStream->use_count() > 1) | 521 if (pCountedStream->use_count() != 0) |
528 return; | 522 return; |
529 | 523 |
530 // We have item only in m_FontFileMap cache. Clean it. | |
531 delete pCountedStream->get(); | 524 delete pCountedStream->get(); |
532 delete pCountedStream; | 525 delete pCountedStream; |
533 m_FontFileMap.erase(it); | 526 m_FontFileMap.erase(it); |
534 } | 527 } |
535 | 528 |
536 CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr( | 529 CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr( |
537 CPDF_Object* pCSObj) const { | 530 CPDF_Object* pCSObj) const { |
538 if (!pCSObj) | 531 if (!pCSObj) |
539 return nullptr; | 532 return nullptr; |
540 | 533 |
541 auto it = m_ColorSpaceMap.find(pCSObj); | 534 auto it = m_ColorSpaceMap.find(pCSObj); |
542 return it != m_ColorSpaceMap.end() ? it->second : nullptr; | 535 return it != m_ColorSpaceMap.end() ? it->second : nullptr; |
543 } | 536 } |
544 | 537 |
545 CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr( | 538 CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr( |
546 CPDF_Object* pPatternObj) const { | 539 CPDF_Object* pPatternObj) const { |
547 if (!pPatternObj) | 540 if (!pPatternObj) |
548 return nullptr; | 541 return nullptr; |
549 | 542 |
550 auto it = m_PatternMap.find(pPatternObj); | 543 auto it = m_PatternMap.find(pPatternObj); |
551 return it != m_PatternMap.end() ? it->second : nullptr; | 544 return it != m_PatternMap.end() ? it->second : nullptr; |
552 } | 545 } |
OLD | NEW |