| 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/render/cpdf_imageloader.h" | 7 #include "core/fpdfapi/render/cpdf_imageloader.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/page/cpdf_image.h" | 9 #include "core/fpdfapi/page/cpdf_image.h" |
| 10 #include "core/fpdfapi/page/cpdf_imageobject.h" | 10 #include "core/fpdfapi/page/cpdf_imageobject.h" |
| 11 #include "core/fpdfapi/render/cpdf_pagerendercache.h" | 11 #include "core/fpdfapi/render/cpdf_pagerendercache.h" |
| 12 #include "core/fpdfapi/render/cpdf_renderstatus.h" | 12 #include "core/fpdfapi/render/cpdf_renderstatus.h" |
| 13 #include "core/fpdfapi/render/render_int.h" | 13 #include "core/fpdfapi/render/render_int.h" |
| 14 #include "core/fxcrt/fx_basic.h" | 14 #include "core/fxcrt/fx_basic.h" |
| 15 | 15 |
| 16 class CPDF_ImageLoaderHandle { | 16 CPDF_ImageLoader::CPDF_ImageLoader() |
| 17 public: | 17 : m_pBitmap(nullptr), |
| 18 CPDF_ImageLoaderHandle(); | 18 m_pMask(nullptr), |
| 19 ~CPDF_ImageLoaderHandle(); | 19 m_MatteColor(0), |
| 20 m_bCached(false), |
| 21 m_nDownsampleWidth(0), |
| 22 m_nDownsampleHeight(0), |
| 23 m_pCache(nullptr), |
| 24 m_pImage(nullptr) {} |
| 20 | 25 |
| 21 bool Start(CPDF_ImageLoader* pImageLoader, | 26 CPDF_ImageLoader::~CPDF_ImageLoader() { |
| 22 const CPDF_ImageObject* pImage, | 27 if (!m_bCached) { |
| 23 CPDF_PageRenderCache* pCache, | 28 delete m_pBitmap; |
| 24 bool bStdCS, | 29 delete m_pMask; |
| 25 uint32_t GroupFamily, | 30 } |
| 26 bool bLoadMask, | |
| 27 CPDF_RenderStatus* pRenderStatus, | |
| 28 int32_t nDownsampleWidth, | |
| 29 int32_t nDownsampleHeight); | |
| 30 bool Continue(IFX_Pause* pPause); | |
| 31 | |
| 32 private: | |
| 33 void HandleFailure(); | |
| 34 | |
| 35 CPDF_ImageLoader* m_pImageLoader; | |
| 36 CPDF_PageRenderCache* m_pCache; | |
| 37 CPDF_ImageObject* m_pImage; | |
| 38 int32_t m_nDownsampleWidth; | |
| 39 int32_t m_nDownsampleHeight; | |
| 40 }; | |
| 41 | |
| 42 CPDF_ImageLoaderHandle::CPDF_ImageLoaderHandle() { | |
| 43 m_pImageLoader = nullptr; | |
| 44 m_pCache = nullptr; | |
| 45 m_pImage = nullptr; | |
| 46 } | 31 } |
| 47 | 32 |
| 48 CPDF_ImageLoaderHandle::~CPDF_ImageLoaderHandle() {} | 33 bool CPDF_ImageLoader::Start(const CPDF_ImageObject* pImage, |
| 49 | 34 CPDF_PageRenderCache* pCache, |
| 50 bool CPDF_ImageLoaderHandle::Start(CPDF_ImageLoader* pImageLoader, | 35 bool bStdCS, |
| 51 const CPDF_ImageObject* pImage, | 36 uint32_t GroupFamily, |
| 52 CPDF_PageRenderCache* pCache, | 37 bool bLoadMask, |
| 53 bool bStdCS, | 38 CPDF_RenderStatus* pRenderStatus, |
| 54 uint32_t GroupFamily, | 39 int32_t nDownsampleWidth, |
| 55 bool bLoadMask, | 40 int32_t nDownsampleHeight) { |
| 56 CPDF_RenderStatus* pRenderStatus, | 41 m_nDownsampleWidth = nDownsampleWidth; |
| 57 int32_t nDownsampleWidth, | 42 m_nDownsampleHeight = nDownsampleHeight; |
| 58 int32_t nDownsampleHeight) { | |
| 59 m_pImageLoader = pImageLoader; | |
| 60 m_pCache = pCache; | 43 m_pCache = pCache; |
| 61 m_pImage = const_cast<CPDF_ImageObject*>(pImage); | 44 m_pImage = const_cast<CPDF_ImageObject*>(pImage); |
| 62 m_nDownsampleWidth = nDownsampleWidth; | |
| 63 m_nDownsampleHeight = nDownsampleHeight; | |
| 64 bool ret; | 45 bool ret; |
| 65 if (pCache) { | 46 if (pCache) { |
| 66 ret = pCache->StartGetCachedBitmap( | 47 ret = pCache->StartGetCachedBitmap( |
| 67 m_pImage->GetImage()->GetStream(), bStdCS, GroupFamily, bLoadMask, | 48 m_pImage->GetImage()->GetStream(), bStdCS, GroupFamily, bLoadMask, |
| 68 pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight); | 49 pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight); |
| 69 } else { | 50 } else { |
| 70 ret = m_pImage->GetImage()->StartLoadDIBSource( | 51 ret = m_pImage->GetImage()->StartLoadDIBSource( |
| 71 pRenderStatus->m_pFormResource, pRenderStatus->m_pPageResource, bStdCS, | 52 pRenderStatus->m_pFormResource, pRenderStatus->m_pPageResource, bStdCS, |
| 72 GroupFamily, bLoadMask); | 53 GroupFamily, bLoadMask); |
| 73 } | 54 } |
| 74 if (!ret) | 55 if (!ret) |
| 75 HandleFailure(); | 56 HandleFailure(); |
| 76 return ret; | 57 return ret; |
| 77 } | 58 } |
| 78 | 59 |
| 79 bool CPDF_ImageLoaderHandle::Continue(IFX_Pause* pPause) { | 60 bool CPDF_ImageLoader::Continue(IFX_Pause* pPause) { |
| 80 bool ret = m_pCache ? m_pCache->Continue(pPause) | 61 bool ret = m_pCache ? m_pCache->Continue(pPause) |
| 81 : m_pImage->GetImage()->Continue(pPause); | 62 : m_pImage->GetImage()->Continue(pPause); |
| 82 if (!ret) | 63 if (!ret) |
| 83 HandleFailure(); | 64 HandleFailure(); |
| 84 return ret; | 65 return ret; |
| 85 } | 66 } |
| 86 | 67 |
| 87 void CPDF_ImageLoaderHandle::HandleFailure() { | 68 void CPDF_ImageLoader::HandleFailure() { |
| 88 if (m_pCache) { | 69 if (m_pCache) { |
| 89 CPDF_ImageCacheEntry* entry = m_pCache->GetCurImageCacheEntry(); | 70 CPDF_ImageCacheEntry* entry = m_pCache->GetCurImageCacheEntry(); |
| 90 m_pImageLoader->m_bCached = true; | 71 m_bCached = true; |
| 91 m_pImageLoader->m_pBitmap = entry->DetachBitmap(); | 72 m_pBitmap = entry->DetachBitmap(); |
| 92 m_pImageLoader->m_pMask = entry->DetachMask(); | 73 m_pMask = entry->DetachMask(); |
| 93 m_pImageLoader->m_MatteColor = entry->m_MatteColor; | 74 m_MatteColor = entry->m_MatteColor; |
| 94 return; | 75 return; |
| 95 } | 76 } |
| 96 CPDF_Image* pImage = m_pImage->GetImage(); | 77 CPDF_Image* pImage = m_pImage->GetImage(); |
| 97 m_pImageLoader->m_bCached = false; | 78 m_bCached = false; |
| 98 m_pImageLoader->m_pBitmap = pImage->DetachBitmap(); | 79 m_pBitmap = pImage->DetachBitmap(); |
| 99 m_pImageLoader->m_pMask = pImage->DetachMask(); | 80 m_pMask = pImage->DetachMask(); |
| 100 m_pImageLoader->m_MatteColor = pImage->m_MatteColor; | 81 m_MatteColor = pImage->m_MatteColor; |
| 101 } | 82 } |
| 102 | |
| 103 CPDF_ImageLoader::CPDF_ImageLoader() | |
| 104 : m_pBitmap(nullptr), | |
| 105 m_pMask(nullptr), | |
| 106 m_MatteColor(0), | |
| 107 m_bCached(false), | |
| 108 m_nDownsampleWidth(0), | |
| 109 m_nDownsampleHeight(0) {} | |
| 110 | |
| 111 CPDF_ImageLoader::~CPDF_ImageLoader() { | |
| 112 if (!m_bCached) { | |
| 113 delete m_pBitmap; | |
| 114 delete m_pMask; | |
| 115 } | |
| 116 } | |
| 117 | |
| 118 bool CPDF_ImageLoader::Start(const CPDF_ImageObject* pImage, | |
| 119 CPDF_PageRenderCache* pCache, | |
| 120 bool bStdCS, | |
| 121 uint32_t GroupFamily, | |
| 122 bool bLoadMask, | |
| 123 CPDF_RenderStatus* pRenderStatus, | |
| 124 int32_t nDownsampleWidth, | |
| 125 int32_t nDownsampleHeight) { | |
| 126 m_nDownsampleWidth = nDownsampleWidth; | |
| 127 m_nDownsampleHeight = nDownsampleHeight; | |
| 128 m_pLoadHandle.reset(new CPDF_ImageLoaderHandle); | |
| 129 return m_pLoadHandle->Start(this, pImage, pCache, bStdCS, GroupFamily, | |
| 130 bLoadMask, pRenderStatus, m_nDownsampleWidth, | |
| 131 m_nDownsampleHeight); | |
| 132 } | |
| 133 | |
| 134 bool CPDF_ImageLoader::Continue(IFX_Pause* pPause) { | |
| 135 return m_pLoadHandle->Continue(pPause); | |
| 136 } | |
| OLD | NEW |