You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by da...@apache.org on 2009/04/29 20:32:22 UTC

svn commit: r769865 [1/3] - in /incubator/pdfbox/trunk: src/main/java/org/apache/pdfbox/pdmodel/graphics/color/ src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/ src/main/java/org/apache/pdfbox/util/operator/ src/main/java/org/apache/pdfbox/uti...

Author: danielwilson
Date: Wed Apr 29 18:32:20 2009
New Revision: 769865

URL: http://svn.apache.org/viewvc?rev=769865&view=rev
Log:
Implemented external object image bitmasks.
Incorporated sector9's createColorModel implementation for PDDeviceCMYK.
Improved logging / error-trapping.
Correct operator description in Invoke.java
Add test case that shows stencil mask in use.

Added:
    incubator/pdfbox/trunk/test/input/rendering/HOTRODCMYK.ai
    incubator/pdfbox/trunk/test/input/rendering/HOTRODCMYK.ai-1.png   (with props)
Modified:
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingSeparation.java
    incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java?rev=769865&r1=769864&r2=769865&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java Wed Apr 29 18:32:20 2009
@@ -18,6 +18,7 @@
 
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSArray;
 
 import org.apache.pdfbox.pdmodel.common.COSObjectable;
 
@@ -36,6 +37,9 @@
  */
 public abstract class PDColorSpace extends LoggingObject implements COSObjectable
 {
+	
+    protected COSArray array;
+	
     /**
      * This will return the name of the color space.
      *
@@ -81,4 +85,15 @@
      * @throws IOException If there is an error creating the color model.
      */
     public abstract ColorModel createColorModel( int bpc ) throws IOException;
+
+    /*
+	Don't just tell me its color type -- tell me its contents!
+    */
+	public String toString()
+    {
+	    
+        String RetVal = getName() + "{ " + (array==null? "" : array.toString() ) + " }";
+	    
+	return RetVal;
+    }
 }

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java?rev=769865&r1=769864&r2=769865&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java Wed Apr 29 18:32:20 2009
@@ -21,6 +21,16 @@
 import java.io.IOException;
 
 
+import java.awt.Transparency;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.IndexColorModel;
+import java.awt.image.DataBuffer;
+
+import java.io.InputStream;
+
+import org.apache.pdfbox.util.ResourceLoader;
+
+
 /**
  * This class represents a CMYK color space.
  *
@@ -98,7 +108,28 @@
      */
     public ColorModel createColorModel( int bpc ) throws IOException
     {
-        logger().warning ("This looks like a test case for sector9's patch!!!  We need one of these!!!");
-        throw new IOException( "Not implemented" );
+	    
+	if (bpc >=8) {
+		//from Sector9 ... believed but not proven to be right.
+		int[] nbBits = { bpc, bpc, bpc, bpc };
+		ComponentColorModel componentColorModel = 
+			new ComponentColorModel( createColorSpace(), 
+						 nbBits, 
+						 false,                     
+						 false,              
+						 Transparency.OPAQUE,
+						 DataBuffer.TYPE_BYTE );
+	       return componentColorModel;
+	}else{
+		//Daniel Wilson's implementation with some guidance from Jeremias
+		if (bpc ==1){
+			byte[] map = new byte[] {(byte)0x00, (byte)0xff};
+			ColorModel cm = new IndexColorModel(1, 2, map, map, map, 1);
+			
+			return cm;
+		}else{
+			throw new IOException("Unsure how to create a Color Model for " + bpc + " bits per component");
+		}
+	}
     }
 }

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java?rev=769865&r1=769864&r2=769865&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java Wed Apr 29 18:32:20 2009
@@ -56,7 +56,7 @@
      */
     public static final String NAME = "ICCBased";
 
-    private COSArray array;
+    //private COSArray array;
     private PDStream stream;
 
     /**
@@ -150,7 +150,7 @@
      */
     public ColorModel createColorModel( int bpc ) throws IOException
     {
-        int[] nbBits = { bpc, bpc, bpc };
+        int[] nbBits = { bpc, bpc, bpc, bpc }; //added 4th bpc to handle CMYK
         ComponentColorModel componentColorModel =
                 new ComponentColorModel( createColorSpace(),
                                          nbBits,
@@ -326,4 +326,20 @@
     {
         stream.getStream().setItem( COSName.getPDFName( "Metadata" ), metadata );
     }
+    
+        /*
+	Need more info on the ICCBased ones ... Array contains very little.
+	*/
+	public String toString()
+    {
+	    
+        String RetVal = super.toString() + "\n\t Number of Components: " ;
+	try{
+		RetVal = RetVal + getNumberOfComponents();
+	}catch (IOException IOe){
+		RetVal = RetVal + IOe.toString();
+	}
+	    
+	return RetVal;
+    }
 }

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java?rev=769865&r1=769864&r2=769865&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java Wed Apr 29 18:32:20 2009
@@ -40,7 +40,6 @@
      */
     public static final String NAME = "Separation";
 
-    private COSArray array;
 
     /**
      * Constructor.
@@ -130,6 +129,7 @@
      */
     public ColorModel createColorModel( int bpc ) throws IOException
     {
+	    logger().info("About to create ColorModel for " + getAlternateColorSpace().toString());
         return getAlternateColorSpace().createColorModel(bpc);
     }
 
@@ -209,16 +209,6 @@
     }
     
     
-    /*
-	Don't just tell me it's a Separation -- tell me its contents!
-    */
-	public String toString()
-    {
-	    
-        String RetVal = NAME + "{ " + array.toString() + " }";
-	    
-	return RetVal;
-    }
     
     /*
 	Some of the key values are stored within the COSDictionary, item 3 in the array.

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java?rev=769865&r1=769864&r2=769865&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java Wed Apr 29 18:32:20 2009
@@ -102,13 +102,20 @@
      */
     public BufferedImage getRGBImage() throws IOException
     {
+	    BufferedImage retval = null;
+	    
         InputStream tiff = new TiffWrapper(
                 getPDStream().getPartiallyFilteredStream( FAX_FILTERS ),
                 getCOSStream());
         try {
-            return ImageIO.read(tiff);
+            retval = ImageIO.read(tiff);
+	}catch (Exception e){
+		logger().severe(e.toString() + "\n at\n" + FullStackTrace(e));
         } finally {
-            tiff.close();
+		if (tiff != null)
+			tiff.close();
+		
+		return retval;
         }
     }
 

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java?rev=769865&r1=769864&r2=769865&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java Wed Apr 29 18:32:20 2009
@@ -126,12 +126,15 @@
 		
 		byte[] array = getPDStream().getByteArray();
 
+		//logger().info("array contains " + array.length + " bytes.\nUsing " + bpc + " bits per component.");
+		
 	//      Get the ColorModel right
 		PDColorSpace colorspace = getColorSpace();
 		if (colorspace == null){
 			logger().severe("getColorSpace() returned NULL.  Predictor = " + getPredictor());
 			return null;
 		}
+		
 		ColorModel cm = colorspace.createColorModel( bpc );
 		logger().info("ColorModel: " + cm.toString());
 		WritableRaster raster = cm.createCompatibleWritableRaster( width, height );
@@ -139,7 +142,7 @@
 		DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
 		byte[] bufferData = buffer.getData();
 	
-		logger().info("bufferData contains " + bufferData.length + " bytes.");
+		//logger().info("bufferData contains " + bufferData.length + " bytes.");
 
 		/**
 		 * PDF Spec 1.6 3.3.3 LZW and Flate predictor function
@@ -165,7 +168,7 @@
 		}
 		else
 		{
-		    System.arraycopy( array, 0,bufferData, 0, bufferData.length );
+		    System.arraycopy( array, 0,bufferData, 0, (array.length<bufferData.length?array.length: bufferData.length) );
 		}
 		image = new BufferedImage(cm, raster, false, null);
 		

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingSeparation.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingSeparation.java?rev=769865&r1=769864&r2=769865&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingSeparation.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingSeparation.java Wed Apr 29 18:32:20 2009
@@ -42,39 +42,42 @@
     {
         PDColorSpaceInstance colorInstance = context.getGraphicsState().getNonStrokingColorSpace();
         PDColorSpace colorSpace = colorInstance.getColorSpace() ;//.getAlternateColorSpace();
-	    logger().info("handling color space " + colorSpace.toString());
-	    //logger().info("Arguments: " + arguments.toString());
+	List argList = arguments;
+	    
+	    //logger().info("handling color space " + colorSpace.toString());
 	if (colorSpace instanceof PDSeparation){
 		PDSeparation sep = (PDSeparation) colorSpace;
 		colorSpace = sep.getAlternateColorSpace();
-		logger().info("now handling alternate color space " + colorSpace.toString());
-		
-		if (colorSpace != null) 
-		{
-			OperatorProcessor newOperator = null;
-			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();
-			else if (colorSpace instanceof PDSeparation)
-				newOperator = new SetNonStrokingSeparation();
+		argList = sep.getColorValues().toList();
+		//logger().info("now handling alternate color space " + colorSpace.toString());
+	}
+	
+	if (colorSpace != null) 
+	{
+		OperatorProcessor newOperator = null;
+		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();
+		else if (colorSpace instanceof PDSeparation)
+			newOperator = new SetNonStrokingSeparation();
 
-			if (newOperator != null) 
-			{
-				newOperator.setContext(getContext());
-				newOperator.process(operator, sep.getColorValues().toList());
-			}
-			else
-				logger().warning("Not supported colorspace "+colorSpace.getName() + " within operator "+operator.getOperation());
+		if (newOperator != null) 
+		{
+			newOperator.setContext(getContext());
+			newOperator.process(operator, argList);
 		}
+		else
+			logger().warning("Not supported colorspace "+colorSpace.getName() + " within operator "+operator.getOperation());
+	}
 		
-	} else throw new IOException ("Invalid attempt to process colorspace " + colorSpace.toString() + " in SetNonStrokingSeparation");
+	//} else throw new IOException ("Invalid attempt to process colorspace " + colorSpace.toString() + " in SetNonStrokingSeparation");
         
     }
 }

Modified: incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java
URL: http://svn.apache.org/viewvc/incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java?rev=769865&r1=769864&r2=769865&view=diff
==============================================================================
--- incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java (original)
+++ incubator/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java Wed Apr 29 18:32:20 2009
@@ -45,7 +45,7 @@
 public class Invoke extends OperatorProcessor
 {
     /**
-     * process : re : append rectangle to path.
+     * process : Do : Paint the specified XObject (section 4.7)
      * @param operator The operator that is being executed.
      * @param arguments List
      * @throws IOException If there is an error invoking the sub object.