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 00000000..3b8d8265 Binary files /dev/null and b/qpdf/qtest/qpdf/tiff-predictor.pdf differ