Commit c01fc3c2ae3a6487d310f807bc25499d5d517c61

Authored by m-holger
1 parent 2e8b5f29

In Pl_TIFFPredictor::processRow avoid repeated vector allocation

Also, modernize for loop.
libqpdf/Pl_TIFFPredictor.cc
@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
7 #include <climits> 7 #include <climits>
8 #include <stdexcept> 8 #include <stdexcept>
9 #include <vector> 9 #include <vector>
  10 +#include <iostream>
10 11
11 Pl_TIFFPredictor::Pl_TIFFPredictor( 12 Pl_TIFFPredictor::Pl_TIFFPredictor(
12 char const* identifier, 13 char const* identifier,
@@ -60,23 +61,23 @@ Pl_TIFFPredictor::processRow() @@ -60,23 +61,23 @@ Pl_TIFFPredictor::processRow()
60 { 61 {
61 QTC::TC("libtests", "Pl_TIFFPredictor processRow", (action == a_decode ? 0 : 1)); 62 QTC::TC("libtests", "Pl_TIFFPredictor processRow", (action == a_decode ? 0 : 1));
62 BitWriter bw(p_next); 63 BitWriter bw(p_next);
63 - BitStream in(this->cur_row.data(), this->bytes_per_row);  
64 - std::vector<long long> prev; 64 + BitStream in(cur_row.data(), cur_row.size());
  65 + previous.clear();
65 for (unsigned int i = 0; i < this->samples_per_pixel; ++i) { 66 for (unsigned int i = 0; i < this->samples_per_pixel; ++i) {
66 long long sample = in.getBitsSigned(this->bits_per_sample); 67 long long sample = in.getBitsSigned(this->bits_per_sample);
67 bw.writeBitsSigned(sample, this->bits_per_sample); 68 bw.writeBitsSigned(sample, this->bits_per_sample);
68 - prev.push_back(sample); 69 + previous.push_back(sample);
69 } 70 }
70 for (unsigned int col = 1; col < this->columns; ++col) { 71 for (unsigned int col = 1; col < this->columns; ++col) {
71 - for (unsigned int i = 0; i < this->samples_per_pixel; ++i) { 72 + for (auto& prev : previous) {
72 long long sample = in.getBitsSigned(this->bits_per_sample); 73 long long sample = in.getBitsSigned(this->bits_per_sample);
73 long long new_sample = sample; 74 long long new_sample = sample;
74 if (action == a_encode) { 75 if (action == a_encode) {
75 - new_sample -= prev[i];  
76 - prev[i] = sample; 76 + new_sample -= prev;
  77 + prev = sample;
77 } else { 78 } else {
78 - new_sample += prev[i];  
79 - prev[i] = new_sample; 79 + new_sample += prev;
  80 + prev = new_sample;
80 } 81 }
81 bw.writeBitsSigned(new_sample, this->bits_per_sample); 82 bw.writeBitsSigned(new_sample, this->bits_per_sample);
82 } 83 }
libqpdf/qpdf/Pl_TIFFPredictor.hh
@@ -34,6 +34,7 @@ class Pl_TIFFPredictor: public Pipeline @@ -34,6 +34,7 @@ class Pl_TIFFPredictor: public Pipeline
34 unsigned int samples_per_pixel; 34 unsigned int samples_per_pixel;
35 unsigned int bits_per_sample; 35 unsigned int bits_per_sample;
36 std::vector<unsigned char> cur_row; 36 std::vector<unsigned char> cur_row;
  37 + std::vector<long long> previous;
37 Pipeline* p_next; 38 Pipeline* p_next;
38 }; 39 };
39 40