1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #include "core/fpdfapi/render/cpdf_imageloader.h"
8 
9 #include "core/fpdfapi/page/cpdf_dib.h"
10 #include "core/fpdfapi/page/cpdf_image.h"
11 #include "core/fpdfapi/page/cpdf_imageobject.h"
12 #include "core/fpdfapi/page/cpdf_transferfunc.h"
13 #include "core/fpdfapi/render/cpdf_imagecacheentry.h"
14 #include "core/fpdfapi/render/cpdf_pagerendercache.h"
15 #include "core/fpdfapi/render/cpdf_rendercontext.h"
16 #include "core/fpdfapi/render/cpdf_renderstatus.h"
17 #include "core/fxge/dib/cfx_dibitmap.h"
18 
19 CPDF_ImageLoader::CPDF_ImageLoader() = default;
20 
21 CPDF_ImageLoader::~CPDF_ImageLoader() = default;
22 
Start(CPDF_ImageObject * pImage,const CPDF_RenderStatus * pRenderStatus,bool bStdCS)23 bool CPDF_ImageLoader::Start(CPDF_ImageObject* pImage,
24                              const CPDF_RenderStatus* pRenderStatus,
25                              bool bStdCS) {
26   m_pCache = pRenderStatus->GetContext()->GetPageCache();
27   m_pImageObject = pImage;
28   bool ret;
29   if (m_pCache) {
30     ret = m_pCache->StartGetCachedBitmap(m_pImageObject->GetImage(),
31                                          pRenderStatus, bStdCS);
32   } else {
33     ret = m_pImageObject->GetImage()->StartLoadDIBBase(
34         pRenderStatus->GetFormResource(), pRenderStatus->GetPageResource(),
35         bStdCS, pRenderStatus->GetGroupFamily(), pRenderStatus->GetLoadMask());
36   }
37   if (!ret)
38     HandleFailure();
39   return ret;
40 }
41 
Continue(PauseIndicatorIface * pPause,CPDF_RenderStatus * pRenderStatus)42 bool CPDF_ImageLoader::Continue(PauseIndicatorIface* pPause,
43                                 CPDF_RenderStatus* pRenderStatus) {
44   bool ret = m_pCache ? m_pCache->Continue(pPause, pRenderStatus)
45                       : m_pImageObject->GetImage()->Continue(pPause);
46   if (!ret)
47     HandleFailure();
48   return ret;
49 }
50 
TranslateImage(const RetainPtr<CPDF_TransferFunc> & pTransferFunc)51 RetainPtr<CFX_DIBBase> CPDF_ImageLoader::TranslateImage(
52     const RetainPtr<CPDF_TransferFunc>& pTransferFunc) {
53   ASSERT(pTransferFunc);
54   ASSERT(!pTransferFunc->GetIdentity());
55 
56   m_pBitmap = pTransferFunc->TranslateImage(m_pBitmap);
57   if (m_bCached && m_pMask)
58     m_pMask = m_pMask->Clone(nullptr);
59   m_bCached = false;
60   return m_pBitmap;
61 }
62 
HandleFailure()63 void CPDF_ImageLoader::HandleFailure() {
64   if (m_pCache) {
65     CPDF_ImageCacheEntry* entry = m_pCache->GetCurImageCacheEntry();
66     m_bCached = true;
67     m_pBitmap = entry->DetachBitmap();
68     m_pMask = entry->DetachMask();
69     m_MatteColor = entry->m_MatteColor;
70     return;
71   }
72   RetainPtr<CPDF_Image> pImage = m_pImageObject->GetImage();
73   m_bCached = false;
74   m_pBitmap = pImage->DetachBitmap();
75   m_pMask = pImage->DetachMask();
76   m_MatteColor = pImage->m_MatteColor;
77 }
78