You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2015/09/05 15:23:05 UTC
svn commit: r1701384 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java
Author: tilman
Date: Sat Sep 5 13:23:05 2015
New Revision: 1701384
URL: http://svn.apache.org/r1701384
Log:
PDFBOX-2958: implemented TIFF predictor for 1 bit bw pixels
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java?rev=1701384&r1=1701383&r2=1701384&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java Sat Sep 5 13:23:05 2015
@@ -95,6 +95,55 @@ public final class Predictor
}
break;
}
+ if (bitsPerComponent == 1)
+ {
+ if (colors != 1)
+ {
+ // possible, but unlikely
+ throw new IOException("TIFF-Predictor with 1 bit per component and " +
+ colors + " is not supported; please open JIRA issue with sample PDF");
+ }
+ // bytesPerPixel cannot be used:
+ // "A row shall occupy a whole number of bytes, rounded up if necessary.
+ // Samples and their components shall be packed into bytes
+ // from high-order to low-order bits."
+ for (int p = 0; p < rowlength; p++)
+ {
+ for (int bit = 7; bit >= 0; --bit)
+ {
+ int sub = (actline[p] >> bit) & 1;
+ int left;
+ if (p == 0 && bit == 7)
+ {
+ left = 0;
+ }
+ else
+ {
+ if (bit == 7)
+ {
+ // use bit #0 from previous byte
+ left = actline[p - 1] & 1;
+ }
+ else
+ {
+ // use "previous" bit
+ left = (actline[p] >> (bit + 1)) & 1;
+ }
+ }
+ if (((sub + left) & 1) == 0)
+ {
+ // reset bit
+ actline[p] = (byte) (actline[p] & ~(1 << bit));
+ }
+ else
+ {
+ // set bit
+ actline[p] = (byte) (actline[p] | (1 << bit));
+ }
+ }
+ }
+ break;
+ }
if (bitsPerComponent != 8)
{
throw new IOException("TIFF-Predictor with " + bitsPerComponent