Add CPDF_ImageObject::GetImage().

And use it where appropriate.

Review-Url: https://codereview.chromium.org/2224623002
diff --git a/core/fpdfapi/fpdf_edit/cpdf_pagecontentgenerator.cpp b/core/fpdfapi/fpdf_edit/cpdf_pagecontentgenerator.cpp
index 0b87e75..a85591c 100644
--- a/core/fpdfapi/fpdf_edit/cpdf_pagecontentgenerator.cpp
+++ b/core/fpdfapi/fpdf_edit/cpdf_pagecontentgenerator.cpp
@@ -58,6 +58,7 @@
   m_pDocument->AddIndirectObject(pStream);
   pPageDict->SetAtReference("Contents", m_pDocument, pStream->GetObjNum());
 }
+
 CFX_ByteString CPDF_PageContentGenerator::RealizeResource(
     CPDF_Object* pResourceObj,
     const CFX_ByteString& bsType) {
@@ -84,6 +85,7 @@
   pResList->SetAtReference(name, m_pDocument, pResourceObj->GetObjNum());
   return name;
 }
+
 void CPDF_PageContentGenerator::ProcessImage(CFX_ByteTextBuf& buf,
                                              CPDF_ImageObject* pImageObj) {
   if ((pImageObj->m_Matrix.a == 0 && pImageObj->m_Matrix.b == 0) ||
@@ -91,13 +93,13 @@
     return;
   }
   buf << "q " << pImageObj->m_Matrix << " cm ";
-  if (!pImageObj->m_pImage->IsInline()) {
-    CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();
+  CPDF_Image* pImage = pImageObj->GetImage();
+  if (!pImage->IsInline()) {
+    CPDF_Stream* pStream = pImage->GetStream();
     uint32_t dwSavedObjNum = pStream->GetObjNum();
     CFX_ByteString name = RealizeResource(pStream, "XObject");
     if (dwSavedObjNum == 0) {
-      if (pImageObj->m_pImage)
-        pImageObj->m_pImage->Release();
+      pImage->Release();
       pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pStream);
     }
     buf << "/" << PDF_NameEncode(name) << " Do Q\n";
diff --git a/core/fpdfapi/fpdf_font/cpdf_type3char.cpp b/core/fpdfapi/fpdf_font/cpdf_type3char.cpp
index 9bfda99..b80a4cc 100644
--- a/core/fpdfapi/fpdf_font/cpdf_type3char.cpp
+++ b/core/fpdfapi/fpdf_font/cpdf_type3char.cpp
@@ -31,7 +31,7 @@
 
   m_ImageMatrix = pPageObj->AsImage()->m_Matrix;
   std::unique_ptr<CFX_DIBSource> pSource(
-      pPageObj->AsImage()->m_pImage->LoadDIBSource());
+      pPageObj->AsImage()->GetImage()->LoadDIBSource());
   if (pSource)
     m_pBitmap.reset(pSource->Clone());
   m_pForm.reset();
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index 5a77ba7..e20fe44 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -743,7 +743,7 @@
   if (type == "Image") {
     CPDF_ImageObject* pObj = AddImage(pXObject, nullptr, false);
     m_LastImageName = name;
-    m_pLastImage = pObj->m_pImage;
+    m_pLastImage = pObj->GetImage();
     if (!m_pObjectHolder->HasImageMask())
       m_pObjectHolder->SetHasImageMask(m_pLastImage->IsMask());
   } else if (type == "Form") {
@@ -792,7 +792,7 @@
     pImageObj->m_pImage = new CPDF_Image(m_pDocument);
     pImageObj->m_pImage->LoadImageF(pStream, bInline);
   }
-  SetGraphicStates(pImageObj.get(), pImageObj->m_pImage->IsMask(), FALSE,
+  SetGraphicStates(pImageObj.get(), pImageObj->GetImage()->IsMask(), FALSE,
                    FALSE);
   pImageObj->m_Matrix = ImageMatrix;
   pImageObj->CalcBoundingBox();
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_imageobject.h b/core/fpdfapi/fpdf_page/include/cpdf_imageobject.h
index 1128d12..b2bffa7 100644
--- a/core/fpdfapi/fpdf_page/include/cpdf_imageobject.h
+++ b/core/fpdfapi/fpdf_page/include/cpdf_imageobject.h
@@ -26,6 +26,7 @@
   const CPDF_ImageObject* AsImage() const override;
 
   void CalcBoundingBox();
+  CPDF_Image* GetImage() const { return m_pImage; }
 
   CPDF_Image* m_pImage;
   CFX_Matrix m_Matrix;
diff --git a/core/fpdfapi/fpdf_render/fpdf_render.cpp b/core/fpdfapi/fpdf_render/fpdf_render.cpp
index ef208b5..f4e1414 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -6,6 +6,8 @@
 
 #include "core/fpdfapi/fpdf_render/render_int.h"
 
+#include <memory>
+
 #include "core/fpdfapi/fpdf_font/cpdf_type3char.h"
 #include "core/fpdfapi/fpdf_font/cpdf_type3font.h"
 #include "core/fpdfapi/fpdf_page/cpdf_colorstatedata.h"
@@ -686,7 +688,7 @@
       pGeneralState ? ToDictionary(pGeneralState->m_pSoftMask) : nullptr;
   if (pSMaskDict) {
     if (pPageObj->IsImage() &&
-        pPageObj->AsImage()->m_pImage->GetDict()->KeyExist("SMask")) {
+        pPageObj->AsImage()->GetImage()->GetDict()->KeyExist("SMask")) {
       pSMaskDict = nullptr;
     }
   }
@@ -721,11 +723,12 @@
       pPage = m_pContext->GetPageCache()->GetPage();
       pDocument = pPage->m_pDocument;
     } else {
-      pDocument = pPageObj->AsImage()->m_pImage->GetDocument();
+      pDocument = pPageObj->AsImage()->GetImage()->GetDocument();
     }
     CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : nullptr;
     CPDF_Object* pCSObj = pPageObj->AsImage()
-                              ->m_pImage->GetStream()
+                              ->GetImage()
+                              ->GetStream()
                               ->GetDict()
                               ->GetDirectObjectBy("ColorSpace");
     CPDF_ColorSpace* pColorSpace =
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/fpdfapi/fpdf_render/fpdf_render_image.cpp
index fc0321b..f4f82a1 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_image.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_image.cpp
@@ -6,6 +6,7 @@
 
 #include "core/fpdfapi/fpdf_render/render_int.h"
 
+#include <memory>
 #include <utility>
 #include <vector>
 
@@ -442,7 +443,7 @@
   }
   if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) {
     CPDF_Object* pFilters =
-        m_pImageObject->m_pImage->GetStream()->GetDict()->GetDirectObjectBy(
+        m_pImageObject->GetImage()->GetStream()->GetDict()->GetDirectObjectBy(
             "Filter");
     if (pFilters) {
       if (pFilters->IsName()) {
@@ -463,7 +464,7 @@
   }
   if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) {
     m_Flags |= FXDIB_NOSMOOTH;
-  } else if (m_pImageObject->m_pImage->IsInterpol()) {
+  } else if (m_pImageObject->GetImage()->IsInterpol()) {
     m_Flags |= FXDIB_INTERPOL;
   }
   if (m_Loader.m_pMask) {
@@ -482,11 +483,11 @@
       pPage = m_pRenderStatus->m_pContext->GetPageCache()->GetPage();
       pDocument = pPage->m_pDocument;
     } else {
-      pDocument = m_pImageObject->m_pImage->GetDocument();
+      pDocument = m_pImageObject->GetImage()->GetDocument();
     }
     CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : nullptr;
     CPDF_Object* pCSObj =
-        m_pImageObject->m_pImage->GetStream()->GetDict()->GetDirectObjectBy(
+        m_pImageObject->GetImage()->GetStream()->GetDict()->GetDirectObjectBy(
             "ColorSpace");
     CPDF_ColorSpace* pColorSpace =
         pDocument->LoadColorSpace(pCSObj, pPageResources);
@@ -512,7 +513,7 @@
   m_pImageObject = pObj->AsImage();
   m_BlendType = blendType;
   m_pObj2Device = pObj2Device;
-  CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC();
+  CPDF_Dictionary* pOC = m_pImageObject->GetImage()->GetOC();
   if (pOC && m_pRenderStatus->m_Options.m_pOCContext &&
       !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) {
     return FALSE;
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
index 3edfe58..2fe6730 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
@@ -28,11 +28,11 @@
   ASSERT(nbits == 1 || nbits == 2 || nbits == 4 || nbits == 8 || nbits == 16);
   ASSERT((bitpos & (nbits - 1)) == 0);
   unsigned int byte = pData[bitpos / 8];
-  if (nbits == 8) {
+  if (nbits == 8)
     return byte;
-  } else if (nbits == 16) {
+
+  if (nbits == 16)
     return byte * 256 + pData[bitpos / 8 + 1];
-  }
 
   return (byte >> (8 - nbits - (bitpos % 8))) & ((1 << nbits) - 1);
 }
@@ -1492,55 +1492,43 @@
   m_nDownsampleHeight = nDownsampleHeight;
   FX_BOOL ret;
   if (pCache) {
-    ret = pCache->StartGetCachedBitmap(pImage->m_pImage->GetStream(), bStdCS,
-                                       GroupFamily, bLoadMask, pRenderStatus,
-                                       m_nDownsampleWidth, m_nDownsampleHeight);
-    if (!ret) {
-      m_pImageLoader->m_bCached = TRUE;
-      m_pImageLoader->m_pBitmap =
-          pCache->GetCurImageCacheEntry()->DetachBitmap();
-      m_pImageLoader->m_pMask = pCache->GetCurImageCacheEntry()->DetachMask();
-      m_pImageLoader->m_MatteColor =
-          pCache->GetCurImageCacheEntry()->m_MatteColor;
-    }
+    ret = pCache->StartGetCachedBitmap(
+        m_pImage->GetImage()->GetStream(), bStdCS, GroupFamily, bLoadMask,
+        pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);
   } else {
-    ret = pImage->m_pImage->StartLoadDIBSource(pRenderStatus->m_pFormResource,
-                                               pRenderStatus->m_pPageResource,
-                                               bStdCS, GroupFamily, bLoadMask);
-    if (!ret) {
-      m_pImageLoader->m_bCached = FALSE;
-      m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();
-      m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();
-      m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;
-    }
+    ret = m_pImage->GetImage()->StartLoadDIBSource(
+        pRenderStatus->m_pFormResource, pRenderStatus->m_pPageResource, bStdCS,
+        GroupFamily, bLoadMask);
   }
+  if (!ret)
+    HandleFailure();
   return ret;
 }
 
 FX_BOOL CPDF_ImageLoaderHandle::Continue(IFX_Pause* pPause) {
-  FX_BOOL ret;
-  if (m_pCache) {
-    ret = m_pCache->Continue(pPause);
-    if (!ret) {
-      m_pImageLoader->m_bCached = TRUE;
-      m_pImageLoader->m_pBitmap =
-          m_pCache->GetCurImageCacheEntry()->DetachBitmap();
-      m_pImageLoader->m_pMask = m_pCache->GetCurImageCacheEntry()->DetachMask();
-      m_pImageLoader->m_MatteColor =
-          m_pCache->GetCurImageCacheEntry()->m_MatteColor;
-    }
-  } else {
-    ret = m_pImage->m_pImage->Continue(pPause);
-    if (!ret) {
-      m_pImageLoader->m_bCached = FALSE;
-      m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();
-      m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();
-      m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;
-    }
-  }
+  FX_BOOL ret = m_pCache ? m_pCache->Continue(pPause)
+                         : m_pImage->GetImage()->Continue(pPause);
+  if (!ret)
+    HandleFailure();
   return ret;
 }
 
+void CPDF_ImageLoaderHandle::HandleFailure() {
+  if (m_pCache) {
+    CPDF_ImageCacheEntry* entry = m_pCache->GetCurImageCacheEntry();
+    m_pImageLoader->m_bCached = TRUE;
+    m_pImageLoader->m_pBitmap = entry->DetachBitmap();
+    m_pImageLoader->m_pMask = entry->DetachMask();
+    m_pImageLoader->m_MatteColor = entry->m_MatteColor;
+  } else {
+    CPDF_Image* pImage = m_pImage->GetImage();
+    m_pImageLoader->m_bCached = FALSE;
+    m_pImageLoader->m_pBitmap = pImage->DetachBitmap();
+    m_pImageLoader->m_pMask = pImage->DetachMask();
+    m_pImageLoader->m_MatteColor = pImage->m_MatteColor;
+  }
+}
+
 FX_BOOL CPDF_ImageLoader::Start(
     const CPDF_ImageObject* pImage,
     CPDF_PageRenderCache* pCache,
diff --git a/core/fpdfapi/fpdf_render/render_int.h b/core/fpdfapi/fpdf_render/render_int.h
index 4494b8c..e3e1a8a 100644
--- a/core/fpdfapi/fpdf_render/render_int.h
+++ b/core/fpdfapi/fpdf_render/render_int.h
@@ -102,7 +102,7 @@
 
 class CPDF_DocRenderData {
  public:
-  CPDF_DocRenderData(CPDF_Document* pPDFDoc = nullptr);
+  explicit CPDF_DocRenderData(CPDF_Document* pPDFDoc);
   ~CPDF_DocRenderData();
   CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont);
   CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObj);
@@ -313,6 +313,7 @@
   int32_t m_nDownsampleWidth;
   int32_t m_nDownsampleHeight;
 };
+
 class CPDF_ImageLoaderHandle {
  public:
   CPDF_ImageLoaderHandle();
@@ -330,6 +331,8 @@
   FX_BOOL Continue(IFX_Pause* pPause);
 
  protected:
+  void HandleFailure();
+
   CPDF_ImageLoader* m_pImageLoader;
   CPDF_PageRenderCache* m_pCache;
   CPDF_ImageObject* m_pImage;
diff --git a/fpdfsdk/fpdfeditimg.cpp b/fpdfsdk/fpdfeditimg.cpp
index b2c2577..cd28301 100644
--- a/fpdfsdk/fpdfeditimg.cpp
+++ b/fpdfsdk/fpdfeditimg.cpp
@@ -37,9 +37,9 @@
   for (int index = 0; index < nCount; index++) {
     CPDF_Page* pPage = CPDFPageFromFPDFPage(pages[index]);
     if (pPage)
-      pImgObj->m_pImage->ResetCache(pPage, nullptr);
+      pImgObj->GetImage()->ResetCache(pPage, nullptr);
   }
-  pImgObj->m_pImage->SetJpegImage(pFile);
+  pImgObj->GetImage()->SetJpegImage(pFile);
 
   return TRUE;
 }
@@ -77,9 +77,9 @@
   for (int index = 0; index < nCount; index++) {
     CPDF_Page* pPage = CPDFPageFromFPDFPage(pages[index]);
     if (pPage)
-      pImgObj->m_pImage->ResetCache(pPage, nullptr);
+      pImgObj->GetImage()->ResetCache(pPage, nullptr);
   }
-  pImgObj->m_pImage->SetImage(reinterpret_cast<CFX_DIBitmap*>(bitmap), FALSE);
+  pImgObj->GetImage()->SetImage(reinterpret_cast<CFX_DIBitmap*>(bitmap), FALSE);
   pImgObj->CalcBoundingBox();
   return TRUE;
 }