Chromium Code Reviews| Index: core/fpdfapi/fpdf_page/cpdf_image.cpp |
| diff --git a/core/fpdfapi/fpdf_page/cpdf_image.cpp b/core/fpdfapi/fpdf_page/cpdf_image.cpp |
| index 63e006fc06054935d2762479897fe97d1faa918e..af361eb9f6e47bccf0a14a2b35c605125eab37ce 100644 |
| --- a/core/fpdfapi/fpdf_page/cpdf_image.cpp |
| +++ b/core/fpdfapi/fpdf_page/cpdf_image.cpp |
| @@ -6,6 +6,10 @@ |
| #include "core/fpdfapi/fpdf_page/include/cpdf_image.h" |
| +#include <algorithm> |
| +#include <memory> |
| +#include <vector> |
| + |
| #include "core/fpdfapi/fpdf_page/include/cpdf_page.h" |
| #include "core/fpdfapi/fpdf_page/pageint.h" |
| #include "core/fpdfapi/fpdf_parser/cpdf_boolean.h" |
| @@ -19,14 +23,35 @@ |
| #include "core/fxge/include/fx_dib.h" |
| CPDF_Image::CPDF_Image(CPDF_Document* pDoc) |
| + : CPDF_Image(pDoc, nullptr, false) {} |
| + |
| +CPDF_Image::CPDF_Image(CPDF_Document* pDoc, CPDF_Stream* pStream, bool bInline) |
| : m_pDIBSource(nullptr), |
| m_pMask(nullptr), |
| m_MatteColor(0), |
| - m_pStream(nullptr), |
| - m_bInline(FALSE), |
| + 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) {} |
| + m_pOC(nullptr) { |
| + if (!pStream) |
| + return; |
| + |
| + CPDF_Dictionary* pDict = pStream->GetDict(); |
| + if (m_bInline) |
| + m_pInlineDict = ToDictionary(pDict->Clone()); |
| + |
| + m_pOC = pDict->GetDictBy("OC"); |
| + m_bIsMask = |
| + !pDict->KeyExist("ColorSpace") || pDict->GetIntegerBy("ImageMask"); |
| + m_bInterpolate = !!pDict->GetIntegerBy("Interpolate"); |
| + m_Height = pDict->GetIntegerBy("Height"); |
| + m_Width = pDict->GetIntegerBy("Width"); |
| +} |
| CPDF_Image::~CPDF_Image() { |
| if (m_bInline) { |
| @@ -37,43 +62,18 @@ CPDF_Image::~CPDF_Image() { |
| } |
| } |
| -void CPDF_Image::Release() { |
| - if (m_bInline || (m_pStream && m_pStream->GetObjNum() == 0)) |
| - delete this; |
| -} |
| - |
| CPDF_Image* CPDF_Image::Clone() { |
| if (m_pStream->GetObjNum()) |
| return m_pDocument->GetPageData()->GetImage(m_pStream); |
| - CPDF_Image* pImage = new CPDF_Image(m_pDocument); |
| - pImage->LoadImageF(ToStream(m_pStream->Clone()), m_bInline); |
| + CPDF_Image* pImage = |
| + new CPDF_Image(m_pDocument, ToStream(m_pStream->Clone()), m_bInline); |
| if (m_bInline) |
| pImage->SetInlineDict(ToDictionary(m_pInlineDict->Clone(TRUE))); |
| return pImage; |
| } |
| -FX_BOOL CPDF_Image::LoadImageF(CPDF_Stream* pStream, FX_BOOL bInline) { |
|
Lei Zhang
2016/08/06 07:39:48
Made into a ctor.
|
| - m_pStream = pStream; |
| - if (m_bInline && m_pInlineDict) { |
| - m_pInlineDict->Release(); |
| - m_pInlineDict = nullptr; |
| - } |
| - m_bInline = bInline; |
| - CPDF_Dictionary* pDict = pStream->GetDict(); |
| - if (m_bInline) { |
| - m_pInlineDict = ToDictionary(pDict->Clone()); |
| - } |
| - m_pOC = pDict->GetDictBy("OC"); |
| - m_bIsMask = |
| - !pDict->KeyExist("ColorSpace") || pDict->GetIntegerBy("ImageMask"); |
| - m_bInterpolate = pDict->GetIntegerBy("Interpolate"); |
| - m_Height = pDict->GetIntegerBy("Height"); |
| - m_Width = pDict->GetIntegerBy("Width"); |
| - return TRUE; |
| -} |
| - |
| CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, uint32_t size) { |
| int32_t width; |
| int32_t height; |
| @@ -120,36 +120,23 @@ CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, uint32_t size) { |
| return pDict; |
| } |
| -void CPDF_Image::SetJpegImage(uint8_t* pData, uint32_t size) { |
|
Lei Zhang
2016/08/06 07:39:48
Dead code.
|
| - CPDF_Dictionary* pDict = InitJPEG(pData, size); |
| - if (!pDict) { |
| - return; |
| - } |
| - m_pStream->InitStream(pData, size, pDict); |
| -} |
| - |
| void CPDF_Image::SetJpegImage(IFX_FileRead* pFile) { |
| uint32_t size = (uint32_t)pFile->GetSize(); |
| - if (!size) { |
| + if (!size) |
| return; |
| - } |
| - uint32_t dwEstimateSize = size; |
| - if (dwEstimateSize > 8192) { |
| - dwEstimateSize = 8192; |
| - } |
| - uint8_t* pData = FX_Alloc(uint8_t, dwEstimateSize); |
| - pFile->ReadBlock(pData, 0, dwEstimateSize); |
| - CPDF_Dictionary* pDict = InitJPEG(pData, dwEstimateSize); |
| - FX_Free(pData); |
| + |
| + uint32_t dwEstimateSize = std::min(size, 8192U); |
| + std::vector<uint8_t> data(dwEstimateSize); |
| + pFile->ReadBlock(data.data(), 0, dwEstimateSize); |
| + CPDF_Dictionary* pDict = InitJPEG(data.data(), dwEstimateSize); |
| if (!pDict && size > dwEstimateSize) { |
| - pData = FX_Alloc(uint8_t, size); |
| - pFile->ReadBlock(pData, 0, size); |
| - pDict = InitJPEG(pData, size); |
| - FX_Free(pData); |
| + data.resize(size); |
| + pFile->ReadBlock(data.data(), 0, size); |
| + pDict = InitJPEG(data.data(), size); |
| } |
| - if (!pDict) { |
| + if (!pDict) |
| return; |
| - } |
| + |
| m_pStream->InitStreamFromFile(pFile, pDict); |
| } |