Commit c01fc3c2ae3a6487d310f807bc25499d5d517c61
1 parent
2e8b5f29
In Pl_TIFFPredictor::processRow avoid repeated vector allocation
Also, modernize for loop.
Showing
2 changed files
with
10 additions
and
8 deletions
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 |