aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2024-01-26 21:17:56 +0100
committerm-holger <m-holger@kubitscheck.org>2024-01-27 13:04:36 +0100
commit20ca1e8644339ebb3df84c645b2244b5f786a6b3 (patch)
treed91ef077e931274f003947d9f89dc9ab9e4616b2
parentb7abb12f55ec2bd45eb8b20c2c058395c289111b (diff)
downloadqpdf-20ca1e8644339ebb3df84c645b2244b5f786a6b3.tar.zst
In Pl_TIFFPredictor::processRow optimize 8 bits_per_sample case
-rw-r--r--libqpdf/Pl_TIFFPredictor.cc50
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