diff options
author | m-holger <m-holger@kubitscheck.org> | 2024-01-26 21:17:56 +0100 |
---|---|---|
committer | m-holger <m-holger@kubitscheck.org> | 2024-01-27 13:04:36 +0100 |
commit | 20ca1e8644339ebb3df84c645b2244b5f786a6b3 (patch) | |
tree | d91ef077e931274f003947d9f89dc9ab9e4616b2 /libqpdf/Pl_TIFFPredictor.cc | |
parent | b7abb12f55ec2bd45eb8b20c2c058395c289111b (diff) | |
download | qpdf-20ca1e8644339ebb3df84c645b2244b5f786a6b3.tar.zst |
In Pl_TIFFPredictor::processRow optimize 8 bits_per_sample case
Diffstat (limited to 'libqpdf/Pl_TIFFPredictor.cc')
-rw-r--r-- | libqpdf/Pl_TIFFPredictor.cc | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/libqpdf/Pl_TIFFPredictor.cc b/libqpdf/Pl_TIFFPredictor.cc index 5454d13a..a4addaae 100644 --- a/libqpdf/Pl_TIFFPredictor.cc +++ b/libqpdf/Pl_TIFFPredictor.cc @@ -58,24 +58,46 @@ void Pl_TIFFPredictor::processRow() { QTC::TC("libtests", "Pl_TIFFPredictor processRow", (action == a_decode ? 0 : 1)); - BitWriter bw(p_next); - BitStream in(cur_row.data(), cur_row.size()); previous.assign(samples_per_pixel, 0); - for (unsigned int col = 0; col < this->columns; ++col) { - for (auto& prev: previous) { - long long sample = in.getBitsSigned(this->bits_per_sample); - long long new_sample = sample; - if (action == a_encode) { - new_sample -= prev; - prev = sample; - } else { - new_sample += prev; - prev = new_sample; + if (bits_per_sample != 8) { + BitWriter bw(p_next); + BitStream in(cur_row.data(), cur_row.size()); + for (unsigned int col = 0; col < this->columns; ++col) { + for (auto& prev: previous) { + long long sample = in.getBitsSigned(this->bits_per_sample); + long long new_sample = sample; + if (action == a_encode) { + new_sample -= prev; + prev = sample; + } else { + new_sample += prev; + prev = new_sample; + } + bw.writeBitsSigned(new_sample, this->bits_per_sample); + } + } + bw.flush(); + } else { + auto next = cur_row.begin(); + auto cr_end = cur_row.end(); + auto pr_end = previous.end(); + + while (next != cr_end) { + for (auto prev = previous.begin(); prev != pr_end && next != cr_end; ++prev, ++next) { + long long sample = *next; + long long new_sample = sample; + if (action == a_encode) { + new_sample -= *prev; + *prev = sample; + } else { + new_sample += *prev; + *prev = new_sample; + } + auto out = static_cast<unsigned char>(255U & new_sample); + p_next->write(&out, 1); } - bw.writeBitsSigned(new_sample, this->bits_per_sample); } } - bw.flush(); } void |