From ec0087e3ce2ae7554098b3506378ca3eb9d87795 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 13 Jan 2018 14:24:09 -0500 Subject: [PATCH] Support TIFF Predictor (fixes #171) --- ChangeLog | 5 +++++ libqpdf/QPDF_Stream.cc | 27 +++++++++++++++++++-------- qpdf/qpdf.testcov | 1 + qpdf/qtest/qpdf.test | 8 +++++++- qpdf/qtest/qpdf/tiff-predictor.out | 6 ++++++ qpdf/qtest/qpdf/tiff-predictor.pdf | Bin 0 -> 1331 bytes 6 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 qpdf/qtest/qpdf/tiff-predictor.out create mode 100644 qpdf/qtest/qpdf/tiff-predictor.pdf diff --git a/ChangeLog b/ChangeLog index 245b96f2..5c023bd3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2018-01-13 Jay Berkenbilt + + * Add support for TIFF predictor for LZW and Flate streams. Now + all predictor functions are supported. + 2017-12-25 Jay Berkenbilt * Clarify documentation around options that control parsing but diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 351df043..89b6b5a9 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -133,7 +134,7 @@ QPDF_Stream::understandDecodeParams( if (predictor_obj.isInteger()) { predictor = predictor_obj.getIntValue(); - if (! ((predictor == 1) || + if (! ((predictor == 1) || (predictor == 2) || ((predictor >= 10) && (predictor <= 15)))) { filterable = false; @@ -459,14 +460,24 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, { std::string const& filter = *iter; - if (((filter == "/FlateDecode") || (filter == "/LZWDecode")) && - ((predictor >= 10) && (predictor <= 15))) + if ((filter == "/FlateDecode") || (filter == "/LZWDecode")) { - QTC::TC("qpdf", "QPDF_Stream PNG filter"); - pipeline = new Pl_PNGFilter( - "png decode", pipeline, Pl_PNGFilter::a_decode, - columns, colors, bits_per_component); - to_delete.push_back(pipeline); + if ((predictor >= 10) && (predictor <= 15)) + { + QTC::TC("qpdf", "QPDF_Stream PNG filter"); + pipeline = new Pl_PNGFilter( + "png decode", pipeline, Pl_PNGFilter::a_decode, + columns, colors, bits_per_component); + to_delete.push_back(pipeline); + } + else if (predictor == 2) + { + QTC::TC("qpdf", "QPDF_Stream TIFF predictor"); + pipeline = new Pl_TIFFPredictor( + "tiff decode", pipeline, Pl_TIFFPredictor::a_decode, + columns, colors, bits_per_component); + to_delete.push_back(pipeline); + } } if (filter == "/Crypt") diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index a36d9706..fd717783 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -301,3 +301,4 @@ qpdf-c called qpdf_set_decode_level 0 qpdf-c called qpdf_set_compress_streams 0 qpdf-c called qpdf_set_preserve_unreferenced_objects 0 qpdf-c called qpdf_set_newline_before_endstream 0 +QPDF_Stream TIFF predictor 0 diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index 6c88e098..b6e9905b 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -240,7 +240,7 @@ foreach my $d (@bug_tests) show_ntests(); # ---------- $td->notify("--- Miscellaneous Tests ---"); -$n_tests += 86; +$n_tests += 87; $td->runtest("qpdf version", {$td->COMMAND => "qpdf --version"}, @@ -684,6 +684,12 @@ $td->runtest("short /O or /U", $td->EXIT_STATUS => 0}, $td->NORMALIZE_NEWLINES); +$td->runtest("stream with tiff predictor", + {$td->COMMAND => "qpdf --check tiff-predictor.pdf"}, + {$td->FILE => "tiff-predictor.out", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + show_ntests(); # ---------- $td->notify("--- Newline before endstream ---"); diff --git a/qpdf/qtest/qpdf/tiff-predictor.out b/qpdf/qtest/qpdf/tiff-predictor.out new file mode 100644 index 00000000..773af026 --- /dev/null +++ b/qpdf/qtest/qpdf/tiff-predictor.out @@ -0,0 +1,6 @@ +checking tiff-predictor.pdf +PDF Version: 1.5 +File is not encrypted +File is not linearized +No syntax or stream encoding errors found; the file may still contain +errors that qpdf cannot detect diff --git a/qpdf/qtest/qpdf/tiff-predictor.pdf b/qpdf/qtest/qpdf/tiff-predictor.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3b8d8265864ac18f75bca6cf7e534f5251e480a9 GIT binary patch literal 1331 zcmah|PiqrV5VzL{egIF-C7_`0|J`g26`M3ztZhsdDwIlJc3|AiaPUlw?Rm2Nb+Xh?9T5uGrwu{I^EmW9gj7Re}4GQ8jrPW zGG>7Za(KX6Ee2pjFAfD5Tf>8anvlOCvXOcQf$fmD2_7BYG%pl1eYUc~3Y7~!VK$h| zfiPe$*p|&aaJ_)};5i7`0L&+11?98L1V^rY3(_nRGcfOh%+pbt@o^nn?<|8=aq97r zD8NCU{W--pS9~l-MBzdJrv|VV1K1TnTTU~Da9G;IG$~*QEdaLy+?|7JCYM6GHKe^5 z(jm5#=DfPL%#_Gf0YP2hBax(hRn96Nre;(A``BCJ7KC(aW<8$c>+|;XMIonoj2+Vx zrEwub?T~AMUqJz2`zW8$%Vj(e3cMY|;+MSF}oYM=t?h{Q~>-HWH@ z*V){~+5Bp1tGp1pG~l*!bJG6KldcqtwoAJv3pU^1X zbgV><1&_HB9f8vlgi%_k=1I|Np&oGwVuek%jkX-iya0=g=_D(_HL-c~{>_f!J^Y** zzm86?e|rV{duN|dPJX<7clzgE_xth2r`