| Index: core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
|
| index 977abe1b7bb2de1b29def8e8fb488ca70c879629..f75453557d80a8791816182249fe8461068c2416 100644
|
| --- a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
|
| +++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
|
| @@ -62,17 +62,17 @@ FX_SAFE_DWORD CalculatePitch32(int bpp, int width) {
|
| class JpxBitMapContext {
|
| public:
|
| explicit JpxBitMapContext(ICodec_JpxModule* jpx_module)
|
| - : jpx_module_(jpx_module), ctx_(nullptr), output_offsets_(nullptr) {}
|
| + : jpx_module_(jpx_module), decoder_(nullptr), output_offsets_(nullptr) {}
|
|
|
| ~JpxBitMapContext() {
|
| FX_Free(output_offsets_);
|
| - jpx_module_->DestroyDecoder(ctx_);
|
| + jpx_module_->DestroyDecoder(decoder_);
|
| }
|
|
|
| - // Takes ownership of |ctx|.
|
| - void set_context(void* ctx) { ctx_ = ctx; }
|
| + // Takes ownership of |decoder|.
|
| + void set_decoder(CJPX_Decoder* decoder) { decoder_ = decoder; }
|
|
|
| - void* context() { return ctx_; }
|
| + CJPX_Decoder* decoder() { return decoder_; }
|
|
|
| // Takes ownership of |output_offsets|.
|
| void set_output_offsets(unsigned char* output_offsets) {
|
| @@ -83,7 +83,7 @@ class JpxBitMapContext {
|
|
|
| private:
|
| ICodec_JpxModule* jpx_module_; // Weak pointer.
|
| - void* ctx_; // Decoder context, owned.
|
| + CJPX_Decoder* decoder_; // Decoder, owned.
|
| unsigned char* output_offsets_; // Output offsets for decoding, owned.
|
|
|
| // Disallow evil constructors
|
| @@ -698,74 +698,64 @@ void CPDF_DIBSource::LoadJpxBitmap() {
|
|
|
| nonstd::unique_ptr<JpxBitMapContext> context(
|
| new JpxBitMapContext(pJpxModule));
|
| - context->set_context(pJpxModule->CreateDecoder(m_pStreamAcc->GetData(),
|
| + context->set_decoder(pJpxModule->CreateDecoder(m_pStreamAcc->GetData(),
|
| m_pStreamAcc->GetSize(),
|
| m_pColorSpace != nullptr));
|
| - if (!context->context())
|
| + if (!context->decoder())
|
| return;
|
|
|
| FX_DWORD width = 0;
|
| FX_DWORD height = 0;
|
| - FX_DWORD codestream_nComps = 0;
|
| - FX_DWORD image_nComps = 0;
|
| - pJpxModule->GetImageInfo(context->context(), width, height, codestream_nComps,
|
| - image_nComps);
|
| + FX_DWORD components = 0;
|
| + pJpxModule->GetImageInfo(context->decoder(), &width, &height, &components);
|
| if ((int)width < m_Width || (int)height < m_Height)
|
| return;
|
|
|
| - int output_nComps;
|
| - FX_BOOL bTranslateColor;
|
| FX_BOOL bSwapRGB = FALSE;
|
| if (m_pColorSpace) {
|
| - if (codestream_nComps != (FX_DWORD)m_pColorSpace->CountComponents())
|
| + if (components != (FX_DWORD)m_pColorSpace->CountComponents())
|
| return;
|
| - output_nComps = codestream_nComps;
|
| - bTranslateColor = FALSE;
|
| +
|
| if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) {
|
| bSwapRGB = TRUE;
|
| m_pColorSpace = nullptr;
|
| }
|
| } else {
|
| - bTranslateColor = TRUE;
|
| - if (image_nComps) {
|
| - output_nComps = image_nComps;
|
| - } else {
|
| - output_nComps = codestream_nComps;
|
| - }
|
| - if (output_nComps == 3) {
|
| + if (components == 3) {
|
| bSwapRGB = TRUE;
|
| - } else if (output_nComps == 4) {
|
| + } else if (components == 4) {
|
| m_pColorSpace = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
|
| - bTranslateColor = FALSE;
|
| }
|
| - m_nComponents = output_nComps;
|
| + m_nComponents = components;
|
| }
|
| +
|
| FXDIB_Format format;
|
| - if (output_nComps == 1) {
|
| + if (components == 1) {
|
| format = FXDIB_8bppRgb;
|
| - } else if (output_nComps <= 3) {
|
| + } else if (components <= 3) {
|
| format = FXDIB_Rgb;
|
| - } else if (output_nComps == 4) {
|
| + } else if (components == 4) {
|
| format = FXDIB_Rgb32;
|
| } else {
|
| - width = (width * output_nComps + 2) / 3;
|
| + width = (width * components + 2) / 3;
|
| format = FXDIB_Rgb;
|
| }
|
| +
|
| m_pCachedBitmap.reset(new CFX_DIBitmap);
|
| if (!m_pCachedBitmap->Create(width, height, format)) {
|
| m_pCachedBitmap.reset();
|
| return;
|
| }
|
| m_pCachedBitmap->Clear(0xFFFFFFFF);
|
| - context->set_output_offsets(FX_Alloc(uint8_t, output_nComps));
|
| - for (int i = 0; i < output_nComps; ++i)
|
| + context->set_output_offsets(FX_Alloc(uint8_t, components));
|
| + for (int i = 0; i < components; ++i)
|
| context->output_offsets()[i] = i;
|
| if (bSwapRGB) {
|
| context->output_offsets()[0] = 2;
|
| context->output_offsets()[2] = 0;
|
| }
|
| - if (!pJpxModule->Decode(context->context(), m_pCachedBitmap->GetBuffer(),
|
| - m_pCachedBitmap->GetPitch(), bTranslateColor,
|
| + if (!pJpxModule->Decode(context->decoder(), m_pCachedBitmap->GetBuffer(),
|
| + m_pCachedBitmap->GetPitch(),
|
| context->output_offsets())) {
|
| m_pCachedBitmap.reset();
|
| return;
|
|
|