You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2011/10/03 15:42:53 UTC

svn commit: r1178412 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: pdmodel/graphics/color/PDDeviceN.java util/operator/SetNonStrokingDeviceN.java util/operator/SetStrokingDeviceN.java

Author: lehmi
Date: Mon Oct  3 13:42:53 2011
New Revision: 1178412

URL: http://svn.apache.org/viewvc?rev=1178412&view=rev
Log:
PDFBOX-1128: don't set the alternate colorspace of a DeviceN colorspace as current colorspace, fixed the calculation of black in CMYK-colorspace as default replacement for a non supported type 4 tint transform function

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceN.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingDeviceN.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingDeviceN.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceN.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceN.java?rev=1178412&r1=1178411&r2=1178412&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceN.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceN.java Mon Oct  3 13:42:53 2011
@@ -27,7 +27,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
-import org.apache.pdfbox.cos.COSFloat;
+import org.apache.pdfbox.cos.COSInteger;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSNull;
 
@@ -47,7 +47,15 @@ public class PDDeviceN extends PDColorSp
     /**
      * Log instance.
      */
-    private static final Log log = LogFactory.getLog(PDDeviceN.class);
+    private static final Log LOG = LogFactory.getLog(PDDeviceN.class);
+
+    private static final int COLORANT_NAMES = 1;
+    
+    private static final int ALTERNATE_CS = 2;
+
+    private static final int TINT_TRANSFORM = 3;
+
+    private static final int DEVICEN_ATTRIBUTES = 4;
 
     /**
      * The name of this color space.
@@ -115,12 +123,12 @@ public class PDDeviceN extends PDColorSp
         }
         catch (IOException ioexception)
         {
-            log.error(ioexception, ioexception);
+            LOG.error(ioexception, ioexception);
             throw ioexception;
         }
         catch (Exception exception)
         {
-            log.error(exception, exception);
+            LOG.error(exception, exception);
             throw new IOException("Failed to Create ColorSpace");
         }
     }
@@ -136,7 +144,7 @@ public class PDDeviceN extends PDColorSp
      */
     public ColorModel createColorModel( int bpc ) throws IOException
     {
-        log.info("About to create ColorModel for " + getAlternateColorSpace().toString());
+        LOG.info("About to create ColorModel for " + getAlternateColorSpace().toString());
         return getAlternateColorSpace().createColorModel(bpc);
     }
 
@@ -147,7 +155,7 @@ public class PDDeviceN extends PDColorSp
      */
     public List<COSBase> getColorantNames()
     {
-        COSArray names = (COSArray)array.getObject( 1 );
+        COSArray names = (COSArray)array.getObject( COLORANT_NAMES );
         return COSArrayList.convertCOSNameCOSArrayToList( names );
     }
 
@@ -159,7 +167,7 @@ public class PDDeviceN extends PDColorSp
     public void setColorantNames( List<COSBase> names )
     {
         COSArray namesArray = COSArrayList.convertStringListToCOSNameCOSArray( names );
-        array.set( 1, namesArray );
+        array.set( COLORANT_NAMES, namesArray );
     }
 
     /**
@@ -171,7 +179,7 @@ public class PDDeviceN extends PDColorSp
      */
     public PDColorSpace getAlternateColorSpace() throws IOException
     {
-        COSBase alternate = array.getObject( 2 );
+        COSBase alternate = array.getObject( ALTERNATE_CS );
         return PDColorSpaceFactory.createColorSpace( alternate );
     }
 
@@ -187,7 +195,7 @@ public class PDDeviceN extends PDColorSp
         {
             space = cs.getCOSObject();
         }
-        array.set( 2, space );
+        array.set( ALTERNATE_CS, space );
     }
 
     /**
@@ -199,7 +207,7 @@ public class PDDeviceN extends PDColorSp
      */
     public PDFunction getTintTransform() throws IOException
     {
-        return  PDFunction.create( array.getObject( 3 ) );
+        return  PDFunction.create( array.getObject( TINT_TRANSFORM ) );
     }
 
     /**
@@ -209,7 +217,7 @@ public class PDDeviceN extends PDColorSp
      */
     public void setTintTransform( PDFunction tint )
     {
-        array.set( 3, tint );
+        array.set( TINT_TRANSFORM, tint );
     }
 
     /**
@@ -221,7 +229,7 @@ public class PDDeviceN extends PDColorSp
     public PDDeviceNAttributes getAttributes()
     {
         PDDeviceNAttributes retval = null;
-        if( array.size() <5)
+        if( array.size() <= DEVICEN_ATTRIBUTES )
         {
             retval = new PDDeviceNAttributes();
             setAttributes( retval );
@@ -239,21 +247,22 @@ public class PDDeviceN extends PDColorSp
     {
         if( attributes == null )
         {
-            array.remove( 4 );
+            array.remove( DEVICEN_ATTRIBUTES );
         }
         else
         {
             //make sure array is large enough
-            while( array.size() < 5 )
+            while( array.size() <= DEVICEN_ATTRIBUTES )
             {
                 array.add( COSNull.NULL );
             }
-            array.set( 4, attributes.getCOSDictionary() );
+            array.set( DEVICEN_ATTRIBUTES, attributes.getCOSDictionary() );
         }
     }
     
     /**
      * Returns the components of the color in the alternate colorspace for the given tint value.
+     * @param tintValues a list containing the tint values
      * @return COSArray with the color components
      * @throws IOException If the tint function is not supported
      */
@@ -262,18 +271,21 @@ public class PDDeviceN extends PDColorSp
         PDFunction tintTransform = getTintTransform();
         if(tintTransform instanceof PDFunctionType4)
         {
-            log.warn("Unsupported tint transformation type: "+tintTransform.getClass().getName() 
+            LOG.warn("Unsupported tint transformation type: "+tintTransform.getClass().getName() 
                     + " in "+getClass().getName()+".getColorValues()"
                     + " using color black instead.");
             int numberOfComponents = getAlternateColorSpace().getNumberOfComponents();
             // To get black as color:
-            // 0.0f is used for the single value(s) if the colorspace is gray or RGB based
-            // 1.0f is used for the single value if the colorspace is CMYK based
-            float colorValue = numberOfComponents == 4 ? 1.0f : 0.0f;
+            // 0 is used for the single value(s) if the colorspace is gray or RGB based
             COSArray retval = new COSArray();
-            for (int i=0;i<numberOfComponents;i++) 
+            for ( int i=0; i < numberOfComponents; i++ ) 
+            {
+                retval.add(COSInteger.ZERO);
+            }
+            // 1 is used as forth value if the colorspace is CMYK based
+            if (numberOfComponents == PDDeviceCMYK.INSTANCE.getNumberOfComponents())
             {
-                retval.add(new COSFloat(colorValue));
+                retval.set(3, COSInteger.ONE);
             }
             return retval;
         }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingDeviceN.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingDeviceN.java?rev=1178412&r1=1178411&r2=1178412&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingDeviceN.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingDeviceN.java Mon Oct  3 13:42:53 2011
@@ -19,16 +19,10 @@ package org.apache.pdfbox.util.operator;
 import java.io.IOException;
 import java.util.List;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
-import org.apache.pdfbox.pdmodel.graphics.color.PDCalRGB;
 import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
 import org.apache.pdfbox.pdmodel.graphics.color.PDColorState;
-import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
-import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
-import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
-import org.apache.pdfbox.pdmodel.graphics.color.PDICCBased;
 import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceN;
 import org.apache.pdfbox.util.PDFOperator;
 
@@ -40,12 +34,6 @@ public class SetNonStrokingDeviceN exten
 {
 
     /**
-     * Log instance.
-     */
-    private static final Log log =
-        LogFactory.getLog(SetNonStrokingDeviceN.class);
-
-    /**
      * scn Set color space for non stroking operations.
      * @param operator The operator that is being executed.
      * @param arguments List
@@ -58,48 +46,10 @@ public class SetNonStrokingDeviceN exten
         
         if (colorSpace != null) 
         {
-            List<COSBase> argList = arguments;
-            OperatorProcessor newOperator = null;
-
-            if (colorSpace instanceof PDDeviceN) {
-                PDDeviceN sep = (PDDeviceN) colorSpace;
-                colorSpace = sep.getAlternateColorSpace();
-                argList = sep.calculateColorValues(arguments).toList();
-            }
-
-            if (colorSpace instanceof PDDeviceGray)
-            {
-                newOperator = new SetNonStrokingGrayColor();
-            }
-            else if (colorSpace instanceof PDDeviceRGB)
-            {
-                newOperator = new SetNonStrokingRGBColor();
-            }
-            else if (colorSpace instanceof PDDeviceCMYK)
-            {
-                newOperator = new SetNonStrokingCMYKColor();
-            }
-            else if (colorSpace instanceof PDICCBased)
-            {
-                newOperator = new SetNonStrokingICCBasedColor();
-            }
-            else if (colorSpace instanceof PDCalRGB)
-            {
-                newOperator = new SetNonStrokingCalRGBColor();
-            }
-    
-            if (newOperator != null) 
-            {
-                colorInstance.setColorSpace(colorSpace);
-                newOperator.setContext(getContext());
-                newOperator.process(operator, argList);
-            }
-            else
-            {
-                log.warn("Not supported colorspace "+colorSpace.getName() 
-                        + " within operator "+operator.getOperation());
-            }
+            PDDeviceN sep = (PDDeviceN) colorSpace;
+            colorSpace = sep.getAlternateColorSpace();
+            COSArray colorValues = sep.calculateColorValues(arguments);
+            colorInstance.setColorSpaceValue(colorValues.toFloatArray());
         }
-        
     }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingDeviceN.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingDeviceN.java?rev=1178412&r1=1178411&r2=1178412&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingDeviceN.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingDeviceN.java Mon Oct  3 13:42:53 2011
@@ -19,17 +19,11 @@ package org.apache.pdfbox.util.operator;
 import java.io.IOException;
 import java.util.List;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
-import org.apache.pdfbox.pdmodel.graphics.color.PDCalRGB;
 import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
 import org.apache.pdfbox.pdmodel.graphics.color.PDColorState;
-import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
-import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
 import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceN;
-import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
-import org.apache.pdfbox.pdmodel.graphics.color.PDICCBased;
 import org.apache.pdfbox.util.PDFOperator;
 
 /**
@@ -40,12 +34,6 @@ public class SetStrokingDeviceN extends 
 {
 
     /**
-     * Log instance.
-     */
-    private static final Log log =
-        LogFactory.getLog(SetStrokingDeviceN.class);
-
-    /**
      * scn Set color space for non stroking operations.
      * @param operator The operator that is being executed.
      * @param arguments List
@@ -53,53 +41,15 @@ public class SetStrokingDeviceN extends 
      */
     public void process(PDFOperator operator, List<COSBase> arguments) throws IOException
     {
-        PDColorState color = context.getGraphicsState().getStrokingColor();
-        PDColorSpace colorSpace = color.getColorSpace();
+        PDColorState colorInstance = context.getGraphicsState().getStrokingColor();
+        PDColorSpace colorSpace = colorInstance.getColorSpace();
 
         if (colorSpace != null) 
         {
-            OperatorProcessor newOperator = null;
-            List<COSBase> argList = arguments;
-
-            if (colorSpace instanceof PDDeviceN) 
-            {
-                PDDeviceN sep = (PDDeviceN) colorSpace;
-                colorSpace = sep.getAlternateColorSpace();
-                argList = sep.calculateColorValues(arguments).toList();
-            }
-
-            if (colorSpace instanceof PDDeviceGray)
-            {
-                newOperator = new SetStrokingGrayColor();
-            }
-            else if (colorSpace instanceof PDDeviceRGB)
-            {
-                newOperator = new SetStrokingRGBColor();
-            }
-            else if (colorSpace instanceof PDDeviceCMYK)
-            {
-                newOperator = new SetStrokingCMYKColor();
-            }
-            else if (colorSpace instanceof PDICCBased)
-            {
-                newOperator = new SetStrokingICCBasedColor();
-            }
-            else if (colorSpace instanceof PDCalRGB)
-            {
-                newOperator = new SetStrokingCalRGBColor();
-            }
-
-            if (newOperator != null) 
-            {
-                color.setColorSpace(colorSpace);
-                newOperator.setContext(getContext());
-                newOperator.process(operator, argList);
-            }
-            else
-            {
-                log.warn("Not supported colorspace "+colorSpace.getName() 
-                        + " within operator "+operator.getOperation());
-            }
+            PDDeviceN sep = (PDDeviceN) colorSpace;
+            colorSpace = sep.getAlternateColorSpace();
+            COSArray colorValues = sep.calculateColorValues(arguments);
+            colorInstance.setColorSpaceValue(colorValues.toFloatArray());
         }
     }
 }