summaryrefslogtreecommitdiff
path: root/core/fpdfapi/page/cpdf_image.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fpdfapi/page/cpdf_image.cpp')
-rw-r--r--core/fpdfapi/page/cpdf_image.cpp81
1 files changed, 41 insertions, 40 deletions
diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp
index 29d10e1d6b..50768c5058 100644
--- a/core/fpdfapi/page/cpdf_image.cpp
+++ b/core/fpdfapi/page/cpdf_image.cpp
@@ -15,6 +15,7 @@
#include "core/fpdfapi/page/cpdf_page.h"
#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_boolean.h"
+#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_document.h"
#include "core/fpdfapi/parser/cpdf_string.h"
#include "core/fpdfapi/render/cpdf_pagerendercache.h"
@@ -22,55 +23,55 @@
#include "core/fxcodec/fx_codec.h"
#include "core/fxge/fx_dib.h"
-CPDF_Image::CPDF_Image(CPDF_Document* pDoc)
- : CPDF_Image(pDoc, nullptr, false) {}
+CPDF_Image::CPDF_Image(CPDF_Document* pDoc) : m_pDocument(pDoc) {}
-CPDF_Image::CPDF_Image(CPDF_Document* pDoc, CPDF_Stream* pStream, bool bInline)
- : m_pDIBSource(nullptr),
- m_pMask(nullptr),
- m_MatteColor(0),
- m_pStream(pStream),
- m_bInline(bInline),
- m_pInlineDict(nullptr),
- m_Height(0),
- m_Width(0),
- m_bIsMask(false),
- m_bInterpolate(false),
- m_pDocument(pDoc),
- m_pOC(nullptr) {
- if (!pStream)
+CPDF_Image::CPDF_Image(CPDF_Document* pDoc, UniqueStream pStream)
+ : m_pDocument(pDoc),
+ m_pStream(pStream.get()),
+ m_pOwnedStream(std::move(pStream)) {
+ if (!m_pStream)
return;
- CPDF_Dictionary* pDict = pStream->GetDict();
- if (m_bInline)
- m_pInlineDict = ToDictionary(pDict->Clone());
-
- m_pOC = pDict->GetDictFor("OC");
- m_bIsMask =
- !pDict->KeyExist("ColorSpace") || pDict->GetIntegerFor("ImageMask");
- m_bInterpolate = !!pDict->GetIntegerFor("Interpolate");
- m_Height = pDict->GetIntegerFor("Height");
- m_Width = pDict->GetIntegerFor("Width");
+ m_pOwnedDict = ToDictionary(UniqueObject(m_pStream->GetDict()->Clone()));
+ m_pDict = m_pOwnedDict.get();
+ FinishInitialization();
}
-CPDF_Image::~CPDF_Image() {
- if (m_bInline) {
- if (m_pStream)
- m_pStream->Release();
- if (m_pInlineDict)
- m_pInlineDict->Release();
- }
+CPDF_Image::CPDF_Image(CPDF_Document* pDoc, uint32_t dwStreamObjNum)
+ : m_pDocument(pDoc),
+ m_pStream(ToStream(pDoc->GetIndirectObject(dwStreamObjNum))) {
+ if (!m_pStream)
+ return;
+
+ m_pDict = m_pStream->GetDict();
+ FinishInitialization();
}
-CPDF_Image* CPDF_Image::Clone() {
- if (!m_pStream->IsInline())
- return m_pDocument->GetPageData()->GetImage(m_pStream);
+CPDF_Image::~CPDF_Image() {}
- CPDF_Image* pImage =
- new CPDF_Image(m_pDocument, ToStream(m_pStream->Clone()), m_bInline);
- if (m_bInline)
- pImage->SetInlineDict(ToDictionary(m_pInlineDict->CloneDirectObject()));
+void CPDF_Image::FinishInitialization() {
+ m_pOC = m_pDict->GetDictFor("OC");
+ m_bIsMask =
+ !m_pDict->KeyExist("ColorSpace") || m_pDict->GetIntegerFor("ImageMask");
+ m_bInterpolate = !!m_pDict->GetIntegerFor("Interpolate");
+ m_Height = m_pDict->GetIntegerFor("Height");
+ m_Width = m_pDict->GetIntegerFor("Width");
+}
+CPDF_Image* CPDF_Image::Clone() {
+ CPDF_Image* pImage = new CPDF_Image(m_pDocument);
+ if (m_pOwnedStream) {
+ pImage->m_pOwnedStream = ToStream(UniqueObject(m_pOwnedStream->Clone()));
+ pImage->m_pStream = pImage->m_pOwnedStream.get();
+ } else {
+ pImage->m_pStream = m_pStream;
+ }
+ if (m_pOwnedDict) {
+ pImage->m_pOwnedDict = ToDictionary(UniqueObject(m_pOwnedDict->Clone()));
+ pImage->m_pDict = pImage->m_pOwnedDict.get();
+ } else {
+ pImage->m_pDict = m_pDict;
+ }
return pImage;
}