summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fpdfapi/render/cpdf_dibsource.cpp32
-rw-r--r--core/fpdfapi/render/cpdf_dibsource.h2
2 files changed, 16 insertions, 18 deletions
diff --git a/core/fpdfapi/render/cpdf_dibsource.cpp b/core/fpdfapi/render/cpdf_dibsource.cpp
index 1a35826232..1233992f72 100644
--- a/core/fpdfapi/render/cpdf_dibsource.cpp
+++ b/core/fpdfapi/render/cpdf_dibsource.cpp
@@ -460,7 +460,7 @@ int CPDF_DIBSource::CreateDecoder() {
return 0;
if (decoder == "JPXDecode") {
- LoadJpxBitmap();
+ m_pCachedBitmap = LoadJpxBitmap();
return m_pCachedBitmap ? 1 : 0;
}
if (decoder == "JBIG2Decode") {
@@ -580,25 +580,25 @@ bool CPDF_DIBSource::CreateDCTDecoder(const uint8_t* src_data,
return true;
}
-void CPDF_DIBSource::LoadJpxBitmap() {
+RetainPtr<CFX_DIBitmap> CPDF_DIBSource::LoadJpxBitmap() {
CCodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule();
auto context = pdfium::MakeUnique<JpxBitMapContext>(pJpxModule);
context->set_decoder(pJpxModule->CreateDecoder(
m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace));
if (!context->decoder())
- return;
+ return nullptr;
uint32_t width = 0;
uint32_t height = 0;
uint32_t components = 0;
pJpxModule->GetImageInfo(context->decoder(), &width, &height, &components);
if (static_cast<int>(width) < m_Width || static_cast<int>(height) < m_Height)
- return;
+ return nullptr;
bool bSwapRGB = false;
if (m_pColorSpace) {
if (components != m_pColorSpace->CountComponents())
- return;
+ return nullptr;
if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) {
bSwapRGB = true;
@@ -625,12 +625,11 @@ void CPDF_DIBSource::LoadJpxBitmap() {
format = FXDIB_Rgb;
}
- m_pCachedBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
- if (!m_pCachedBitmap->Create(width, height, format)) {
- m_pCachedBitmap.Reset();
- return;
- }
- m_pCachedBitmap->Clear(0xFFFFFFFF);
+ auto pCachedBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
+ if (!pCachedBitmap->Create(width, height, format))
+ return nullptr;
+
+ pCachedBitmap->Clear(0xFFFFFFFF);
std::vector<uint8_t> output_offsets(components);
for (uint32_t i = 0; i < components; ++i)
output_offsets[i] = i;
@@ -638,17 +637,15 @@ void CPDF_DIBSource::LoadJpxBitmap() {
output_offsets[0] = 2;
output_offsets[2] = 0;
}
- if (!pJpxModule->Decode(context->decoder(), m_pCachedBitmap->GetBuffer(),
- m_pCachedBitmap->GetPitch(), output_offsets)) {
- m_pCachedBitmap.Reset();
- return;
+ if (!pJpxModule->Decode(context->decoder(), pCachedBitmap->GetBuffer(),
+ pCachedBitmap->GetPitch(), output_offsets)) {
+ return nullptr;
}
if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED &&
m_bpc < 8) {
int scale = 8 - m_bpc;
for (uint32_t row = 0; row < height; ++row) {
- uint8_t* scanline =
- const_cast<uint8_t*>(m_pCachedBitmap->GetScanline(row));
+ uint8_t* scanline = const_cast<uint8_t*>(pCachedBitmap->GetScanline(row));
for (uint32_t col = 0; col < width; ++col) {
*scanline = (*scanline) >> scale;
++scanline;
@@ -656,6 +653,7 @@ void CPDF_DIBSource::LoadJpxBitmap() {
}
}
m_bpc = 8;
+ return pCachedBitmap;
}
int CPDF_DIBSource::StartLoadMask() {
diff --git a/core/fpdfapi/render/cpdf_dibsource.h b/core/fpdfapi/render/cpdf_dibsource.h
index dce5a535c4..931fdc4fc8 100644
--- a/core/fpdfapi/render/cpdf_dibsource.h
+++ b/core/fpdfapi/render/cpdf_dibsource.h
@@ -86,7 +86,7 @@ class CPDF_DIBSource : public CFX_DIBSource {
bool LoadColorInfo(const CPDF_Dictionary* pFormResources,
const CPDF_Dictionary* pPageResources);
DIB_COMP_DATA* GetDecodeAndMaskArray(bool* bDefaultDecode, bool* bColorKey);
- void LoadJpxBitmap();
+ RetainPtr<CFX_DIBitmap> LoadJpxBitmap();
void LoadPalette();
int CreateDecoder();
bool CreateDCTDecoder(const uint8_t* src_data,