Commit 4edfe1f41d386c0fa6043926d761219bdb29e7c0
1 parent
38bdbc07
Add tests for new PNG filters
Showing
7 changed files
with
79 additions
and
10 deletions
libqpdf/Pl_PNGFilter.cc
| 1 | 1 | #include <qpdf/Pl_PNGFilter.hh> |
| 2 | +#include <qpdf/QTC.hh> | |
| 2 | 3 | #include <stdexcept> |
| 3 | 4 | #include <string.h> |
| 4 | 5 | #include <limits.h> |
| ... | ... | @@ -134,6 +135,7 @@ Pl_PNGFilter::decodeRow() |
| 134 | 135 | void |
| 135 | 136 | Pl_PNGFilter::decodeSub() |
| 136 | 137 | { |
| 138 | + QTC::TC("libtests", "Pl_PNGFilter decodeSub"); | |
| 137 | 139 | unsigned char* buffer = this->cur_row + 1; |
| 138 | 140 | unsigned int bpp = this->bytes_per_pixel; |
| 139 | 141 | |
| ... | ... | @@ -153,6 +155,7 @@ Pl_PNGFilter::decodeSub() |
| 153 | 155 | void |
| 154 | 156 | Pl_PNGFilter::decodeUp() |
| 155 | 157 | { |
| 158 | + QTC::TC("libtests", "Pl_PNGFilter decodeUp"); | |
| 156 | 159 | unsigned char* buffer = this->cur_row + 1; |
| 157 | 160 | unsigned char* above_buffer = this->prev_row + 1; |
| 158 | 161 | |
| ... | ... | @@ -166,6 +169,7 @@ Pl_PNGFilter::decodeUp() |
| 166 | 169 | void |
| 167 | 170 | Pl_PNGFilter::decodeAverage() |
| 168 | 171 | { |
| 172 | + QTC::TC("libtests", "Pl_PNGFilter decodeAverage"); | |
| 169 | 173 | unsigned char* buffer = this->cur_row + 1; |
| 170 | 174 | unsigned char* above_buffer = this->prev_row + 1; |
| 171 | 175 | unsigned int bpp = this->bytes_per_pixel; |
| ... | ... | @@ -188,6 +192,7 @@ Pl_PNGFilter::decodeAverage() |
| 188 | 192 | void |
| 189 | 193 | Pl_PNGFilter::decodePaeth() |
| 190 | 194 | { |
| 195 | + QTC::TC("libtests", "Pl_PNGFilter decodePaeth"); | |
| 191 | 196 | unsigned char* buffer = this->cur_row + 1; |
| 192 | 197 | unsigned char* above_buffer = this->prev_row + 1; |
| 193 | 198 | unsigned int bpp = this->bytes_per_pixel; | ... | ... |
libtests/libtests.testcov
| ... | ... | @@ -29,3 +29,7 @@ Pl_RunLength flush full buffer 1 |
| 29 | 29 | Pl_RunLength flush empty buffer 0 |
| 30 | 30 | Pl_DCT empty_pipeline_output_buffer 0 |
| 31 | 31 | Pl_DCT term_pipeline_destination 0 |
| 32 | +Pl_PNGFilter decodeSub 0 | |
| 33 | +Pl_PNGFilter decodeUp 0 | |
| 34 | +Pl_PNGFilter decodeAverage 0 | |
| 35 | +Pl_PNGFilter decodePaeth 0 | ... | ... |
libtests/png_filter.cc
| ... | ... | @@ -8,7 +8,8 @@ |
| 8 | 8 | #include <string.h> |
| 9 | 9 | #include <stdlib.h> |
| 10 | 10 | |
| 11 | -void run(char const* filename, bool encode, unsigned int columns) | |
| 11 | +void run(char const* filename, bool encode, unsigned int columns, | |
| 12 | + int bits_per_sample, int samples_per_pixel) | |
| 12 | 13 | { |
| 13 | 14 | // Decode the file |
| 14 | 15 | FILE* in = QUtil::safe_fopen(filename, "rb"); |
| ... | ... | @@ -17,7 +18,7 @@ void run(char const* filename, bool encode, unsigned int columns) |
| 17 | 18 | Pipeline* pl = new Pl_PNGFilter( |
| 18 | 19 | "png", out, |
| 19 | 20 | encode ? Pl_PNGFilter::a_encode : Pl_PNGFilter::a_decode, |
| 20 | - columns); | |
| 21 | + columns, samples_per_pixel, bits_per_sample); | |
| 21 | 22 | assert((2 * (columns + 1)) < 1024); |
| 22 | 23 | unsigned char buf[1024]; |
| 23 | 24 | size_t len; |
| ... | ... | @@ -54,18 +55,22 @@ void run(char const* filename, bool encode, unsigned int columns) |
| 54 | 55 | |
| 55 | 56 | int main(int argc, char* argv[]) |
| 56 | 57 | { |
| 57 | - if (argc != 4) | |
| 58 | + if (argc != 6) | |
| 58 | 59 | { |
| 59 | - std::cerr << "Usage: pipeline {en,de}code filename columns" << std::endl; | |
| 60 | + std::cerr << "Usage: png_filter {en,de}code filename" | |
| 61 | + << " columns samples-per-pixel bits-per-sample" | |
| 62 | + << std::endl; | |
| 60 | 63 | exit(2); |
| 61 | 64 | } |
| 62 | 65 | bool encode = (strcmp(argv[1], "encode") == 0); |
| 63 | 66 | char* filename = argv[2]; |
| 64 | 67 | int columns = QUtil::string_to_int(argv[3]); |
| 68 | + int samples_per_pixel = QUtil::string_to_int(argv[4]); | |
| 69 | + int bits_per_sample = QUtil::string_to_int(argv[5]); | |
| 65 | 70 | |
| 66 | 71 | try |
| 67 | 72 | { |
| 68 | - run(filename, encode, columns); | |
| 73 | + run(filename, encode, columns, bits_per_sample, samples_per_pixel); | |
| 69 | 74 | } |
| 70 | 75 | catch (std::exception& e) |
| 71 | 76 | { | ... | ... |
libtests/qtest/png_filter.test
| ... | ... | @@ -14,7 +14,7 @@ my $td = new TestDriver('png_filter'); |
| 14 | 14 | cleanup(); |
| 15 | 15 | |
| 16 | 16 | $td->runtest("decode columns = 4", |
| 17 | - {$td->COMMAND => "png_filter decode in1 4"}, | |
| 17 | + {$td->COMMAND => "png_filter decode in1 4 1 8"}, | |
| 18 | 18 | {$td->STRING => "done\n", |
| 19 | 19 | $td->EXIT_STATUS => 0}, |
| 20 | 20 | $td->NORMALIZE_NEWLINES); |
| ... | ... | @@ -24,7 +24,7 @@ $td->runtest("check output", |
| 24 | 24 | {$td->FILE => "out1"}); |
| 25 | 25 | |
| 26 | 26 | $td->runtest("decode columns = 5", |
| 27 | - {$td->COMMAND => "png_filter decode in2 5"}, | |
| 27 | + {$td->COMMAND => "png_filter decode in2 5 1 8"}, | |
| 28 | 28 | {$td->STRING => "done\n", |
| 29 | 29 | $td->EXIT_STATUS => 0}, |
| 30 | 30 | $td->NORMALIZE_NEWLINES); |
| ... | ... | @@ -34,7 +34,7 @@ $td->runtest("check output", |
| 34 | 34 | {$td->FILE => "out2"}); |
| 35 | 35 | |
| 36 | 36 | $td->runtest("encode columns = 4", |
| 37 | - {$td->COMMAND => "png_filter encode out1 4"}, | |
| 37 | + {$td->COMMAND => "png_filter encode out1 4 1 8"}, | |
| 38 | 38 | {$td->STRING => "done\n", |
| 39 | 39 | $td->EXIT_STATUS => 0}, |
| 40 | 40 | $td->NORMALIZE_NEWLINES); |
| ... | ... | @@ -44,7 +44,7 @@ $td->runtest("check output", |
| 44 | 44 | {$td->FILE => "in1"}); |
| 45 | 45 | |
| 46 | 46 | $td->runtest("encode columns = 5", |
| 47 | - {$td->COMMAND => "png_filter encode out2 5"}, | |
| 47 | + {$td->COMMAND => "png_filter encode out2 5 1 8"}, | |
| 48 | 48 | {$td->STRING => "done\n", |
| 49 | 49 | $td->EXIT_STATUS => 0}, |
| 50 | 50 | $td->NORMALIZE_NEWLINES); |
| ... | ... | @@ -53,9 +53,41 @@ $td->runtest("check output", |
| 53 | 53 | {$td->FILE => "out"}, |
| 54 | 54 | {$td->FILE => "in2"}); |
| 55 | 55 | |
| 56 | +my @other = ( | |
| 57 | + '01--32-3-16', | |
| 58 | + '02--32-1-8', | |
| 59 | + '03--32-3-8', | |
| 60 | + '04--32-1-8', | |
| 61 | + '05--32-3-8', | |
| 62 | + '06--32-1-8', | |
| 63 | + '07--32-3-8', | |
| 64 | + '08--32-1-8', | |
| 65 | + '09--32-3-8', | |
| 66 | + '10--32-1-8', | |
| 67 | + '11--32-3-8', | |
| 68 | + '12--32-1-4', | |
| 69 | + ); | |
| 70 | + | |
| 71 | +foreach my $i (@other) | |
| 72 | +{ | |
| 73 | + $i =~ m/^.*?--(\d+)-(\d+)-(\d+)$/ or die; | |
| 74 | + my $columns = $1; | |
| 75 | + my $samples_per_pixel = $2; | |
| 76 | + my $bits_per_sample = $3; | |
| 77 | + $td->runtest("decode $i", | |
| 78 | + {$td->COMMAND => "png_filter decode $i.data" . | |
| 79 | + " $columns $samples_per_pixel $bits_per_sample"}, | |
| 80 | + {$td->STRING => "done\n", | |
| 81 | + $td->EXIT_STATUS => 0}, | |
| 82 | + $td->NORMALIZE_NEWLINES); | |
| 83 | + $td->runtest("check output for $i", | |
| 84 | + {$td->FILE => "out"}, | |
| 85 | + {$td->FILE => "$i.decoded"}); | |
| 86 | +} | |
| 87 | + | |
| 56 | 88 | cleanup(); |
| 57 | 89 | |
| 58 | -$td->report(8); | |
| 90 | +$td->report(8 + (2 * scalar(@other))); | |
| 59 | 91 | |
| 60 | 92 | sub cleanup |
| 61 | 93 | { | ... | ... |
qpdf/qtest/qpdf.test
| ... | ... | @@ -2336,6 +2336,29 @@ $td->runtest("convert inline-images to qdf", |
| 2336 | 2336 | compare_pdfs("inline-images.pdf", "a.pdf"); |
| 2337 | 2337 | |
| 2338 | 2338 | show_ntests(); |
| 2339 | + | |
| 2340 | + | |
| 2341 | +# ---------- | |
| 2342 | +$td->notify("--- PNG filtering Tests ---"); | |
| 2343 | +$n_tests += 2; | |
| 2344 | +$n_compare_pdfs += 1; | |
| 2345 | + | |
| 2346 | +# The PDF file was submitted on bug #83 on github. All the PNG filters | |
| 2347 | +# are exercised. The test suite does not exercise PNG predictors with | |
| 2348 | +# LZW because I don't have a way to create such a file, but it's very | |
| 2349 | +# likely that it will work since the handling of the PNG filters is | |
| 2350 | +# separate from the regular decompression. | |
| 2351 | +$td->runtest("decode png-filtering", | |
| 2352 | + {$td->COMMAND => "qpdf --static-id" . | |
| 2353 | + " --compress-streams=n --decode-level=generalized" . | |
| 2354 | + " png-filters.pdf a.pdf"}, | |
| 2355 | + {$td->STRING => "", $td->EXIT_STATUS => 0}); | |
| 2356 | +$td->runtest("check output", | |
| 2357 | + {$td->FILE => "a.pdf"}, | |
| 2358 | + {$td->FILE => "png-filters-decoded.pdf"}); | |
| 2359 | +compare_pdfs("png-filters.pdf", "a.pdf"); | |
| 2360 | + | |
| 2361 | +show_ntests(); | |
| 2339 | 2362 | # ---------- |
| 2340 | 2363 | $td->notify("--- fix-qdf Tests ---"); |
| 2341 | 2364 | $n_tests += 5; | ... | ... |
qpdf/qtest/qpdf/png-filters-decoded.pdf
0 → 100644
No preview for this file type
qpdf/qtest/qpdf/png-filters.pdf
0 → 100644
No preview for this file type