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/10/02 07:35:44 UTC

svn commit: r1706346 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics: color/PDColorSpace.java image/PDInlineImage.java

Author: tilman
Date: Fri Oct  2 05:35:44 2015
New Revision: 1706346

URL: http://svn.apache.org/viewvc?rev=1706346&view=rev
Log:
PDFBOX-3003: fix handling of inline images, as suggested by Evgeniy Muravitskiy; move out handling of abbreviated color space names

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImage.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java?rev=1706346&r1=1706345&r2=1706346&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java Fri Oct  2 05:35:44 2015
@@ -99,15 +99,15 @@ public abstract class PDColorSpace imple
             }
 
             // built-in color spaces
-            if (name == COSName.DEVICECMYK || name == COSName.CMYK)
+            if (name == COSName.DEVICECMYK)
             {
                 return PDDeviceCMYK.INSTANCE;
             }
-            else if (name == COSName.DEVICERGB || name == COSName.RGB)
+            else if (name == COSName.DEVICERGB)
             {
                 return PDDeviceRGB.INSTANCE;
             }
-            else if (name == COSName.DEVICEGRAY || name == COSName.G)
+            else if (name == COSName.DEVICEGRAY)
             {
                 return PDDeviceGray.INSTANCE;
             }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImage.java?rev=1706346&r1=1706345&r2=1706346&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImage.java Fri Oct  2 05:35:44 2015
@@ -132,8 +132,7 @@ public final class PDInlineImage impleme
 
         if (cs != null)
         {
-            // TODO: handling of abbreviated color space names belongs here, not in the factory
-            return PDColorSpace.create(cs, resources);
+            return create(cs);
         }
         else if (isStencil())
         {
@@ -146,6 +145,61 @@ public final class PDInlineImage impleme
             throw new IOException("could not determine color space");
         }
     }
+    
+    private PDColorSpace create(COSBase cs) throws IOException
+    {
+        if (cs instanceof COSName)
+        {
+            if (COSName.RGB.equals(cs))
+            {
+                return PDColorSpace.create(COSName.DEVICERGB, resources);
+            }
+            else if (COSName.CMYK.equals(cs))
+            {
+                return PDColorSpace.create(COSName.DEVICECMYK, resources);
+            }
+            else if (COSName.G.equals(cs))
+            {
+                return PDColorSpace.create(COSName.DEVICEGRAY, resources);
+            }
+            else
+            {
+                return PDColorSpace.create(cs, resources);
+            }
+        }
+        else if (cs instanceof COSArray && ((COSArray) cs).size() > 1)
+        {
+            COSBase csType = ((COSArray) cs).get(0);
+            if (COSName.I.equals(csType) || COSName.INDEXED.equals(csType))
+            {
+                COSArray array = new COSArray();
+                array.addAll((COSArray) cs);
+                array.set(0, COSName.INDEXED);
+                COSBase cs1 = ((COSArray) cs).get(1);
+                if (COSName.RGB.equals(cs1))
+                {
+                    array.set(1, COSName.DEVICERGB);
+                }
+                else if (COSName.CMYK.equals(cs1))
+                {
+                    array.set(1, COSName.DEVICECMYK);
+                }
+                else if (COSName.G.equals(cs1))
+                {
+                    array.set(1, COSName.DEVICEGRAY);
+                }
+                return PDColorSpace.create(array, resources);
+            }
+            else
+            {
+                throw new IOException("Illegal type of color space in inline image: " + csType);
+            }
+        }
+        else
+        {
+            throw new IOException("Illegal type of object for color space: " + cs);
+        }
+    }
 
     @Override
     public void setColorSpace(PDColorSpace colorSpace)