| Index: core/fpdfapi/page/cpdf_image.cpp
|
| diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp
|
| index 29d10e1d6b3633738fc95f07bce9d63b4a6d3945..50768c50587bc51ad21108b337a1f14a3c9dec3e 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;
|
| }
|
|
|
|
|