From 870b5b6793fa261f0c6f31f026010d2d715968bf Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 2 Sep 2015 13:52:01 -0700 Subject: Reapply Foxit's libopenjpeg modifications. They were lost in commit d53e6fd. BUG=pdfium:168 R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1196523002 . --- .../fpdfapi/fpdf_render/fpdf_render_loadimage.cpp | 2 +- core/src/fxcodec/codec/fx_codec_jpx_opj.cpp | 4 +++- testing/resources/pixel/bug_71.in | Bin 0 -> 1180 bytes testing/resources/pixel/bug_71_expected.pdf.0.png | Bin 0 -> 3670 bytes .../libopenjpeg20/0000-use-colorspace.patch | 25 +++++++++++++++++++++ third_party/libopenjpeg20/README.pdfium | 13 +++++++++++ third_party/libopenjpeg20/jp2.c | 2 +- third_party/libopenjpeg20/openjpeg.h | 3 +++ 8 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 testing/resources/pixel/bug_71.in create mode 100644 testing/resources/pixel/bug_71_expected.pdf.0.png create mode 100644 third_party/libopenjpeg20/0000-use-colorspace.patch create mode 100644 third_party/libopenjpeg20/README.pdfium diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp index f75453557d..0362ff2e90 100644 --- a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp +++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp @@ -700,7 +700,7 @@ void CPDF_DIBSource::LoadJpxBitmap() { new JpxBitMapContext(pJpxModule)); context->set_decoder(pJpxModule->CreateDecoder(m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), - m_pColorSpace != nullptr)); + m_pColorSpace == nullptr)); if (!context->decoder()) return; diff --git a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp index 81de30e58a..b7e032e614 100644 --- a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp +++ b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp @@ -627,7 +627,7 @@ class CJPX_Decoder { opj_image_t* image; opj_codec_t* l_codec; opj_stream_t* l_stream; - bool m_UseColorSpace; + const bool m_UseColorSpace; }; CJPX_Decoder::CJPX_Decoder(bool use_colorspace) @@ -687,6 +687,8 @@ FX_BOOL CJPX_Decoder::Init(const unsigned char* src_data, int src_size) { image = NULL; return FALSE; } + image->pdfium_use_colorspace = m_UseColorSpace; + if (!parameters.nb_tile_to_decode) { if (!opj_set_decode_area(l_codec, image, parameters.DA_x0, parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)) { diff --git a/testing/resources/pixel/bug_71.in b/testing/resources/pixel/bug_71.in new file mode 100644 index 0000000000..6bb6f19db0 Binary files /dev/null and b/testing/resources/pixel/bug_71.in differ diff --git a/testing/resources/pixel/bug_71_expected.pdf.0.png b/testing/resources/pixel/bug_71_expected.pdf.0.png new file mode 100644 index 0000000000..65d23c27b0 Binary files /dev/null and b/testing/resources/pixel/bug_71_expected.pdf.0.png differ diff --git a/third_party/libopenjpeg20/0000-use-colorspace.patch b/third_party/libopenjpeg20/0000-use-colorspace.patch new file mode 100644 index 0000000000..92f83a2291 --- /dev/null +++ b/third_party/libopenjpeg20/0000-use-colorspace.patch @@ -0,0 +1,25 @@ +diff -u a/jp2.c b/jp2.c +--- a/jp2.c ++++ b/jp2.c +@@ -1429,7 +1429,7 @@ + /* Part 1, I.5.3.4: Either both or none : */ + if( !jp2->color.jp2_pclr->cmap) + opj_jp2_free_pclr(&(jp2->color)); +- else ++ else if (p_image->pdfium_use_colorspace) + opj_jp2_apply_pclr(p_image, &(jp2->color)); + } + +diff -u a/openjpeg.h b/openjpeg.h +--- a/openjpeg.h ++++ b/openjpeg.h +@@ -677,6 +677,9 @@ + OPJ_BYTE *icc_profile_buf; + /** size of ICC profile */ + OPJ_UINT32 icc_profile_len; ++ ++ /** Whether to apply PCLR or not */ ++ OPJ_BOOL pdfium_use_colorspace; + } opj_image_t; + + diff --git a/third_party/libopenjpeg20/README.pdfium b/third_party/libopenjpeg20/README.pdfium new file mode 100644 index 0000000000..e1fad70151 --- /dev/null +++ b/third_party/libopenjpeg20/README.pdfium @@ -0,0 +1,13 @@ +Name: OpenJPEG +URL: http://www.openjpeg.org/ +Version: 0fa5a17c98c4b8f9ee2286f4f0a50cf52a5fccb0 +Security Critical: yes +License: 2-clause BSD + +Description: +JPEG 2000 library. + +Local Modifications: + +0000-use-colorspace.patch: Makes it possible to not call opj_jp2_apply_pclr(). +TODO(thestig): List all the other patches. diff --git a/third_party/libopenjpeg20/jp2.c b/third_party/libopenjpeg20/jp2.c index aafbe199d6..08b195304d 100644 --- a/third_party/libopenjpeg20/jp2.c +++ b/third_party/libopenjpeg20/jp2.c @@ -1429,7 +1429,7 @@ OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2, /* Part 1, I.5.3.4: Either both or none : */ if( !jp2->color.jp2_pclr->cmap) opj_jp2_free_pclr(&(jp2->color)); - else + else if (p_image->pdfium_use_colorspace) opj_jp2_apply_pclr(p_image, &(jp2->color)); } diff --git a/third_party/libopenjpeg20/openjpeg.h b/third_party/libopenjpeg20/openjpeg.h index 4a8e75ce5a..e988de4785 100644 --- a/third_party/libopenjpeg20/openjpeg.h +++ b/third_party/libopenjpeg20/openjpeg.h @@ -677,6 +677,9 @@ typedef struct opj_image { OPJ_BYTE *icc_profile_buf; /** size of ICC profile */ OPJ_UINT32 icc_profile_len; + + /** Whether to apply PCLR or not */ + OPJ_BOOL pdfium_use_colorspace; } opj_image_t; -- cgit v1.2.3