aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2018-01-13 20:24:09 +0100
committerJay Berkenbilt <ejb@ql.org>2018-01-14 01:49:42 +0100
commitec0087e3ce2ae7554098b3506378ca3eb9d87795 (patch)
tree27c7535c74371a438d924f7ca4630ec8c5668112
parent53971d50be39448c980d842a1fe1f525b4cee597 (diff)
downloadqpdf-ec0087e3ce2ae7554098b3506378ca3eb9d87795.tar.zst
Support TIFF Predictor (fixes #171)
-rw-r--r--ChangeLog5
-rw-r--r--libqpdf/QPDF_Stream.cc27
-rw-r--r--qpdf/qpdf.testcov1
-rw-r--r--qpdf/qtest/qpdf.test8
-rw-r--r--qpdf/qtest/qpdf/tiff-predictor.out6
-rw-r--r--qpdf/qtest/qpdf/tiff-predictor.pdfbin0 -> 1331 bytes
6 files changed, 38 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 245b96f2..5c023bd3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2018-01-13 Jay Berkenbilt <ejb@ql.org>
+
+ * Add support for TIFF predictor for LZW and Flate streams. Now
+ all predictor functions are supported.
+
2017-12-25 Jay Berkenbilt <ejb@ql.org>
* 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 <qpdf/Pipeline.hh>
#include <qpdf/Pl_Flate.hh>
#include <qpdf/Pl_PNGFilter.hh>
+#include <qpdf/Pl_TIFFPredictor.hh>
#include <qpdf/Pl_RC4.hh>
#include <qpdf/Pl_Buffer.hh>
#include <qpdf/Pl_ASCII85Decoder.hh>
@@ -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
--- /dev/null
+++ b/qpdf/qtest/qpdf/tiff-predictor.pdf
Binary files differ