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 2014/12/08 19:24:28 UTC

svn commit: r1643881 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/Predictor.java

Author: tilman
Date: Mon Dec  8 18:24:27 2014
New Revision: 1643881

URL: http://svn.apache.org/r1643881
Log:
PDFBOX-2549: TIFF SUB predictor for 16bpc

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=1643881&r1=1643880&r2=1643881&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 Mon Dec  8 18:24:27 2014
@@ -73,8 +73,22 @@ public class Predictor
                 switch (linepredictor)
                 {
                     case 2:// PRED TIFF SUB
-                        // TODO decode tiff with bitsPerComponent != 8;
+                        // TODO decode tiff with bitsPerComponent < 8;
                         // e.g. for 4 bpc each nibble must be subtracted separately
+                        if (bitsPerComponent == 16)
+                        {
+                            for (int p = 0; p < rowlength; p += 2)
+                            {
+                                int sub = ((actline[p] & 0xff) << 8) + (actline[p + 1] & 0xff);
+                                int left = p - bytesPerPixel >= 0
+                                        ? (((actline[p - bytesPerPixel] & 0xff) << 8)
+                                        + (actline[p - bytesPerPixel + 1] & 0xff))
+                                        : 0;
+                                actline[p] = (byte) (((sub + left) >> 8) & 0xff);
+                                actline[p + 1] = (byte) ((sub + left) & 0xff);
+                            }
+                            break;
+                        }
                         if (bitsPerComponent != 8)
                         {
                             throw new IOException("TIFF-Predictor with " + bitsPerComponent