Author: lehmi
Date: Tue Jan 31 18:49:38 2012
New Revision: 1238741

URL: http://svn.apache.org/viewvc?rev=1238741&view=rev
Log:
PDFBOX-1094: added support for pattern color spaces to be used in combination 
with fill, stroke or showText-operators

Modified:
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDPatternResources.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDShadingPatternResources.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPatternResources.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColorSpace.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColorSpace.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java?rev=1238741&r1=1238740&r2=1238741&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java 
(original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java 
Tue Jan 31 18:49:38 2012
@@ -18,6 +18,7 @@ package org.apache.pdfbox.pdfviewer;
 
 import java.awt.BasicStroke;
 import java.awt.Color;
+import java.awt.Composite;
 import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
@@ -155,23 +156,33 @@ public class PageDrawer extends PDFStrea
     {
         try
         {
-            switch(this.getGraphicsState().getTextState().getRenderingMode()) 
+            PDGraphicsState graphicsState = getGraphicsState();
+            Composite composite;
+            Paint paint;
+            switch(graphicsState.getTextState().getRenderingMode()) 
             {
                 case PDTextState.RENDERING_MODE_FILL_TEXT:
-                    graphics.setComposite( 
this.getGraphicsState().getNonStrokeJavaComposite() );
-                    graphics.setColor( 
this.getGraphicsState().getNonStrokingColor().getJavaColor() );
+                    composite = graphicsState.getNonStrokeJavaComposite();
+                    paint = graphicsState.getNonStrokingColor().getJavaColor();
+                    if (paint == null)
+                    {
+                        paint = 
graphicsState.getNonStrokingColor().getPaint(pageSize.height);
+                    }
                     break;
                 case PDTextState.RENDERING_MODE_STROKE_TEXT:
-                    graphics.setComposite( 
this.getGraphicsState().getStrokeJavaComposite() );
-                    graphics.setColor( 
this.getGraphicsState().getStrokingColor().getJavaColor() );
+                    composite = graphicsState.getStrokeJavaComposite();
+                    paint = graphicsState.getStrokingColor().getJavaColor();
+                    if (paint == null)
+                    {
+                        paint = 
graphicsState.getStrokingColor().getPaint(pageSize.height);
+                    }
                     break;
                 case PDTextState.RENDERING_MODE_NEITHER_FILL_NOR_STROKE_TEXT:
                     //basic support for text rendering mode "invisible"
-                    Color nsc = 
this.getGraphicsState().getStrokingColor().getJavaColor();
+                    Color nsc = 
graphicsState.getStrokingColor().getJavaColor();
                     float[] components = 
{Color.black.getRed(),Color.black.getGreen(),Color.black.getBlue()};
-                    Color  c = new Color(nsc.getColorSpace(),components,0f);
-                    graphics.setComposite( 
this.getGraphicsState().getStrokeJavaComposite() );
-                    graphics.setColor(c);
+                    paint = new Color(nsc.getColorSpace(),components,0f);
+                    composite = graphicsState.getStrokeJavaComposite();
                     break;
                 default:
                     // TODO : need to implement....
@@ -181,10 +192,12 @@ public class PageDrawer extends PDFStrea
                             + " Using RenderingMode "
                             + PDTextState.RENDERING_MODE_FILL_TEXT
                             + " instead");
-                    graphics.setComposite( 
this.getGraphicsState().getNonStrokeJavaComposite() );
-                    graphics.setColor( 
this.getGraphicsState().getNonStrokingColor().getJavaColor() );
+                    composite = graphicsState.getNonStrokeJavaComposite();
+                    paint = graphicsState.getNonStrokingColor().getJavaColor();
             }
-
+            graphics.setComposite(composite);
+            graphics.setPaint(paint);
+            
             PDFont font = text.getFont();
             Matrix textPos = text.getTextPos().copy();
             float x = textPos.getXPosition();
@@ -200,7 +213,7 @@ public class PageDrawer extends PDFStrea
             PDMatrix fontMatrix = font.getFontMatrix();
             at.scale(fontMatrix.getValue(0, 0) * 1000f, fontMatrix.getValue(1, 
1) * 1000f);
             //TODO setClip() is a massive performance hot spot. Investigate 
optimization possibilities
-            graphics.setClip(getGraphicsState().getCurrentClippingPath());
+            graphics.setClip(graphicsState.getCurrentClippingPath());
             // the fontSize is no longer needed as it is already part of the 
transformation
             // we should remove it from the parameter list in the long run
             font.drawString( text.getCharacter(), graphics, 1, at, x, y );
@@ -290,17 +303,18 @@ public class PageDrawer extends PDFStrea
     public void fillPath(int windingRule) throws IOException
     {
         graphics.setComposite(getGraphicsState().getNonStrokeJavaComposite());
-        Color nonStrokingColor = 
getGraphicsState().getNonStrokingColor().getJavaColor();
-        if ( nonStrokingColor != null )
+        Paint nonStrokingPaint = 
getGraphicsState().getNonStrokingColor().getJavaColor();
+        if ( nonStrokingPaint == null )
         {
-            graphics.setColor( nonStrokingColor );
+            nonStrokingPaint = 
getGraphicsState().getNonStrokingColor().getPaint(pageSize.height);
         }
-        else 
+        if ( nonStrokingPaint == null )
         {
             LOG.info("ColorSpace 
"+getGraphicsState().getNonStrokingColor().getColorSpace().getName()
                     +" doesn't provide a non-stroking color, using white 
instead!");
-            graphics.setColor( Color.WHITE );
+            nonStrokingPaint = Color.WHITE;
         }
+        graphics.setPaint( nonStrokingPaint );
         getLinePath().setWindingRule(windingRule);
         graphics.setRenderingHint( RenderingHints.KEY_ANTIALIASING, 
RenderingHints.VALUE_ANTIALIAS_OFF );
         graphics.setClip(getGraphicsState().getCurrentClippingPath());
@@ -339,17 +353,18 @@ public class PageDrawer extends PDFStrea
     public void strokePath() throws IOException
     {
         graphics.setComposite(getGraphicsState().getStrokeJavaComposite());
-        Color strokingColor = 
getGraphicsState().getStrokingColor().getJavaColor();
-        if ( strokingColor != null )
+        Paint strokingPaint = 
getGraphicsState().getStrokingColor().getJavaColor();
+        if ( strokingPaint == null )
         {
-            graphics.setColor( strokingColor );
+            strokingPaint = 
getGraphicsState().getStrokingColor().getPaint(pageSize.height);
         }
-        else 
+        if ( strokingPaint == null )
         {
             LOG.info("ColorSpace 
"+getGraphicsState().getStrokingColor().getColorSpace().getName()
                     +" doesn't provide a stroking color, using white 
instead!");
-            graphics.setColor( Color.WHITE );
+            strokingPaint = Color.WHITE;
         }
+        graphics.setPaint(strokingPaint);
         graphics.setRenderingHint( RenderingHints.KEY_ANTIALIASING, 
RenderingHints.VALUE_ANTIALIAS_OFF );
         graphics.setClip(getGraphicsState().getCurrentClippingPath());
         GeneralPath path = getLinePath();
@@ -460,7 +475,7 @@ public class PageDrawer extends PDFStrea
                 LOG.debug("Function based shading not yet supported");
             break;
             case 2:
-                paint = new AxialShadingPaint((PDShadingType2)shading, ctm, 
pageSize);
+                paint = new AxialShadingPaint((PDShadingType2)shading, ctm, 
pageSize.height);
                 break;
             case 3:
                 // TODO

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java?rev=1238741&r1=1238740&r2=1238741&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java
 Tue Jan 31 18:49:38 2012
@@ -27,6 +27,7 @@ import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSFloat;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.graphics.pattern.PDPatternResources;
 import org.apache.pdfbox.pdmodel.common.PDStream;
 import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
 
@@ -70,7 +71,25 @@ public final class PDColorSpaceFactory
      *
      * @throws IOException If the color space name is unknown.
      */
-    public static PDColorSpace createColorSpace( COSBase colorSpace, 
Map<String, PDColorSpace> colorSpaces ) throws IOException
+    public static PDColorSpace createColorSpace( COSBase colorSpace, 
Map<String, PDColorSpace> colorSpaces ) 
+    throws IOException 
+    {
+        return createColorSpace( colorSpace, colorSpaces, null );
+    }
+
+    /**
+     * This will create the correct color space given the name.
+     *
+     * @param colorSpace The color space object.
+     * @param colorSpaces The ColorSpace dictionary from the current 
resources, if any.
+     * @param patterns The patterns dictionary from the current resources, if 
any
+     * @return The color space.
+     *
+     * @throws IOException If the color space name is unknown.
+     */
+    public static PDColorSpace createColorSpace( COSBase colorSpace, 
Map<String, PDColorSpace> colorSpaces, 
+            Map<String,PDPatternResources> patterns) 
+    throws IOException
     {
         PDColorSpace retval = null;
         if( colorSpace instanceof COSName )
@@ -162,7 +181,8 @@ public final class PDColorSpaceFactory
      *
      * @throws IOException If the color space name is unknown.
      */
-    public static PDColorSpace createColorSpace( String colorSpaceName, 
Map<String, PDColorSpace> colorSpaces ) throws IOException
+    public static PDColorSpace createColorSpace( String colorSpaceName, 
Map<String, PDColorSpace> colorSpaces ) 
+    throws IOException
     {
         PDColorSpace cs = null;
         if( colorSpaceName.equals( PDDeviceCMYK.NAME ) ||

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java?rev=1238741&r1=1238740&r2=1238741&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java
 Tue Jan 31 18:49:38 2012
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.pdmodel.graphics.color;
 
 import java.awt.Color;
+import java.awt.Paint;
 import java.awt.color.ColorSpace;
 import java.awt.color.ICC_ColorSpace;
 import java.io.IOException;
@@ -83,6 +84,7 @@ public class PDColorState implements Clo
      * @see #getJavaColor()
      */
     private Color color = null;
+    private Paint paint = null;
 
     /**
      * Default constructor.
@@ -122,6 +124,23 @@ public class PDColorState implements Clo
     }
 
     /**
+     * Returns the Java AWT paint based on the current pattern.
+     *
+     * @param pageHeight the height of the current page
+     * @return current Java AWT paint
+     * 
+     * @throws IOException if the current color can not be created
+     */
+    public Paint getPaint(int pageHeight) throws IOException
+    {
+        if (paint == null && pattern != null) 
+        {
+            paint = pattern.getPaint(pageHeight);
+        }
+        return paint;
+    }
+
+    /**
      * Create the current color from the colorspace and values.
      * @return The current awt color.
      * @throws IOException If there is an error creating the color.
@@ -311,7 +330,7 @@ public class PDColorState implements Clo
      */
     public void setPattern(PDPatternResources patternValue)
     {
-        this.pattern = patternValue;
+        pattern = patternValue;
         // Clear color cache
         color = null;
     }

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDPatternResources.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDPatternResources.java?rev=1238741&r1=1238740&r2=1238741&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDPatternResources.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDPatternResources.java
 Tue Jan 31 18:49:38 2012
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.pdmodel.graphics.pattern;
 
 
+import java.awt.Paint;
 import java.io.IOException;
 
 import org.apache.pdfbox.cos.COSBase;
@@ -181,4 +182,13 @@ public abstract class PDPatternResources
         return pattern;
     }
     
+    /**
+     * This will return the paint of the pattern.
+     * 
+     * @param the height of the current page
+     * 
+     * @return the paint of the pattern
+     */
+    public abstract Paint getPaint(int pageHeight) throws IOException;
+    
 }

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDShadingPatternResources.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDShadingPatternResources.java?rev=1238741&r1=1238740&r2=1238741&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDShadingPatternResources.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDShadingPatternResources.java
 Tue Jan 31 18:49:38 2012
@@ -17,8 +17,12 @@
 package org.apache.pdfbox.pdmodel.graphics.pattern;
 
 
+import java.awt.Paint;
 import java.awt.geom.AffineTransform;
+import java.io.IOException;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSFloat;
@@ -26,6 +30,9 @@ import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSNumber;
 import org.apache.pdfbox.pdmodel.graphics.PDExtendedGraphicsState;
 import org.apache.pdfbox.pdmodel.graphics.pattern.PDPatternResources;
+import org.apache.pdfbox.pdmodel.graphics.shading.AxialShadingPaint;
+import org.apache.pdfbox.pdmodel.graphics.shading.PDShadingResources;
+import org.apache.pdfbox.pdmodel.graphics.shading.PDShadingType2;
 import org.apache.pdfbox.util.Matrix;
 
 /**
@@ -36,8 +43,14 @@ import org.apache.pdfbox.util.Matrix;
 public class PDShadingPatternResources extends PDPatternResources
 {
     private PDExtendedGraphicsState extendedGraphicsState;
+    private PDShadingResources shading;
     private COSArray matrix = null;
-    
+
+    /**
+     * Log instance.
+     */
+    private static final Log LOG = 
LogFactory.getLog(PDShadingPatternResources.class);
+
     /**
      * Default constructor.
      */
@@ -142,4 +155,68 @@ public class PDShadingPatternResources e
         }
     }
 
+    /**
+     * This will get the shading resources for this pattern.
+     *
+     * @return The shading resourcesfor this pattern.
+     * 
+     * @throws IOException if something went wrong
+     */
+    public PDShadingResources getShading() throws IOException
+    {
+        if (shading == null) 
+        {
+            COSDictionary dictionary = 
(COSDictionary)getCOSDictionary().getDictionaryObject( COSName.SHADING );
+            if( dictionary != null )
+            {
+                shading = PDShadingResources.create(dictionary);
+            }
+        }
+        return shading;
+    }
+
+    /**
+     * This will set the shading resources for this pattern.
+     *
+     * @param shadingResources The new shading resources for this pattern.
+     */
+    public void setShading( PDShadingResources shadingResources )
+    {
+        shading = shadingResources;
+        if (shadingResources != null)
+        {
+            getCOSDictionary().setItem( COSName.SHADING, shadingResources );
+        }
+        else
+        {
+            getCOSDictionary().removeItem(COSName.SHADING);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Paint getPaint(int pageHeight) throws IOException
+    {
+        Paint paint = null;
+        PDShadingResources shadingResources = getShading();
+        int shadingType = shadingResources != null ? 
shadingResources.getShadingType() : 0;
+        switch (shadingType)
+        {
+            case PDShadingResources.SHADING_TYPE2:
+                paint = new AxialShadingPaint((PDShadingType2)getShading(), 
null, pageHeight);
+                break;
+            case PDShadingResources.SHADING_TYPE1: 
+            case PDShadingResources.SHADING_TYPE3:
+            case PDShadingResources.SHADING_TYPE4:
+            case PDShadingResources.SHADING_TYPE5:
+            case PDShadingResources.SHADING_TYPE6:
+            case PDShadingResources.SHADING_TYPE7:
+                LOG.debug( "Error: Unsupported shading type " + shadingType );
+                break;
+            default:
+                throw new IOException( "Error: Unknown shading type " + 
shadingType );
+        }
+        return paint;
+    }
 }

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPatternResources.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPatternResources.java?rev=1238741&r1=1238740&r2=1238741&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPatternResources.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPatternResources.java
 Tue Jan 31 18:49:38 2012
@@ -17,7 +17,9 @@
 package org.apache.pdfbox.pdmodel.graphics.pattern;
 
 
+import java.awt.Paint;
 import java.awt.geom.AffineTransform;
+import java.io.IOException;
 
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSDictionary;
@@ -271,4 +273,14 @@ public class PDTilingPatternResources ex
         getCOSDictionary().setItem(COSName.MATRIX, matrix);
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Paint getPaint(int pageHeight) throws IOException
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java?rev=1238741&r1=1238740&r2=1238741&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java
 Tue Jan 31 18:49:38 2012
@@ -16,8 +16,8 @@
  */
 package org.apache.pdfbox.pdmodel.graphics.shading;
 
-import java.awt.Dimension;
 import java.awt.PaintContext;
+import java.awt.color.ColorSpace;
 import java.awt.geom.AffineTransform;
 import java.awt.image.ColorModel;
 import java.awt.image.Raster;
@@ -29,6 +29,8 @@ import org.apache.commons.logging.LogFac
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBoolean;
 import org.apache.pdfbox.pdmodel.common.function.PDFunction;
+import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
 import org.apache.pdfbox.util.Matrix;
 
 /**
@@ -43,6 +45,7 @@ public class AxialShadingContext impleme
 
     private ColorModel colorModel;
     private PDFunction function;
+    private ColorSpace shadingColorSpace;
 
     private float[] coords;
     private float[] domain;
@@ -58,19 +61,54 @@ public class AxialShadingContext impleme
     private static final Log LOG = 
LogFactory.getLog(AxialShadingContext.class);
 
     /**
-     * Constructor.
+     * Constructor creates an instance to be used for fill operations.
      * 
      * @param shadingType2 the shading type to be used
      * @param colorModelValue the color model to be used
      * @param xform transformation for user to device space
      * @param ctm current transformation matrix
-     * @param pageSize size of the current page
+     * @param pageHeight height of the current page
      * 
      */
     public AxialShadingContext(PDShadingType2 shadingType2, ColorModel 
colorModelValue, 
-            AffineTransform xform, Matrix ctm, Dimension pageSize) 
+            AffineTransform xform, Matrix ctm, int pageHeight) 
     {
-        int pageHeight = pageSize.height;
+        coords = shadingType2.getCoords().toFloatArray();
+        if (ctm != null)
+        {
+            // the shading is used in combination with the sh-operator
+            float[] coordsTemp = new float[coords.length]; 
+            // transform the coords from shading to user space
+            ctm.createAffineTransform().transform(coords, 0, coordsTemp, 0, 2);
+            // move the 0,0-reference
+            coordsTemp[1] = pageHeight - coordsTemp[1];
+            coordsTemp[3] = pageHeight - coordsTemp[3];
+            // transform the coords from user to device space
+            xform.transform(coordsTemp, 0, coords, 0, 2);
+        }
+        else
+        {
+            // the shading is used as pattern colorspace in combination
+            // with a fill-, stroke- or showText-operator
+            float translateY = (float)xform.getTranslateY();
+            // move the 0,0-reference including the y-translation from user to 
device space
+            coords[1] = pageHeight + translateY - coords[1];
+            coords[3] = pageHeight + translateY - coords[3];
+        }
+        // colorSpace 
+        try 
+        {
+            PDColorSpace cs = shadingType2.getColorSpace();
+            if (!(cs instanceof PDDeviceRGB))
+            {
+                // we have to create an instance of the shading colorspace if 
it isn't RGB
+                shadingColorSpace = cs.getJavaColorSpace();
+            }
+        } 
+        catch (IOException exception) 
+        {
+            LOG.error("error while creating colorSpace", exception);
+        }
         // colorModel
         if (colorModelValue != null)
         {
@@ -97,17 +135,6 @@ public class AxialShadingContext impleme
         {
             LOG.error("error while creating a function", exception);
         }
-        
-        coords = shadingType2.getCoords().toFloatArray();
-        float[] coordsTemp = new float[coords.length]; 
-        // transform the coords from shading to user space
-        ctm.createAffineTransform().transform(coords, 0, coordsTemp, 0, 2);
-        // move the 0,0-reference
-        coordsTemp[1] = pageHeight - coordsTemp[1];
-        coordsTemp[3] = pageHeight - coordsTemp[3];
-        // transform the coords from user to device space
-        xform.transform(coordsTemp, 0, coords, 0, 2);
-
         // domain values
         if (shadingType2.getDomain() != null)
         {
@@ -137,8 +164,8 @@ public class AxialShadingContext impleme
         d1d0 = domain[1]-domain[0];
         denom = Math.pow(x1x0,2) + Math.pow(y1y0, 2);
         // TODO take a possible Background value into account
+        
     }
-    
     /**
      * {@inheritDoc}
      */
@@ -209,6 +236,11 @@ public class AxialShadingContext impleme
                     LOG.error("error while processing a function", exception);
                 }
                 int index = (j * w + i) * 3;
+                // convert color values from shading colorspace to RGB 
+                if (shadingColorSpace != null)
+                {
+                    values = shadingColorSpace.toRGB(values);
+                }
                 data[index] = (int)(values[0]*255);
                 data[index+1] = (int)(values[1]*255);
                 data[index+2] = (int)(values[2]*255);

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java?rev=1238741&r1=1238740&r2=1238741&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java
 Tue Jan 31 18:49:38 2012
@@ -16,7 +16,6 @@
  */
 package org.apache.pdfbox.pdmodel.graphics.shading;
 
-import java.awt.Dimension;
 import java.awt.Paint;
 import java.awt.PaintContext;
 import java.awt.Rectangle;
@@ -39,7 +38,7 @@ public class AxialShadingPaint implement
 
     private PDShadingType2 shading;
     private Matrix currentTransformationMatrix;
-    private Dimension pageSize;
+    private int pageHeight;
     
     /**
      * Constructor.
@@ -48,13 +47,12 @@ public class AxialShadingPaint implement
      * @param ctm current transformation matrix
      * @param pageSizeValue size of the current page
      */
-    public AxialShadingPaint(PDShadingType2 shadingType2, Matrix ctm, 
Dimension pageSizeValue) 
+    public AxialShadingPaint(PDShadingType2 shadingType2, Matrix ctm, int 
pageHeightValue) 
     {
         shading = shadingType2;
         currentTransformationMatrix = ctm;
-        pageSize = pageSizeValue;
+        pageHeight = pageHeightValue;
     }
-    
     /**
      * {@inheritDoc}
      */
@@ -69,7 +67,7 @@ public class AxialShadingPaint implement
     public PaintContext createContext(ColorModel cm, Rectangle deviceBounds,
             Rectangle2D userBounds, AffineTransform xform, RenderingHints 
hints) 
     {
-        return new AxialShadingContext(shading, cm, xform, 
currentTransformationMatrix, pageSize);
+        return new AxialShadingContext(shading, cm, xform, 
currentTransformationMatrix, pageHeight);
     }
 
 }

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColorSpace.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColorSpace.java?rev=1238741&r1=1238740&r2=1238741&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColorSpace.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColorSpace.java
 Tue Jan 31 18:49:38 2012
@@ -45,9 +45,10 @@ public class SetNonStrokingColorSpace ex
      */
     public void process(PDFOperator operator, List<COSBase> arguments) throws 
IOException
     {
-//      (PDF 1.1) Set color space for stroking operations
+        // (PDF 1.1) Set color space for stroking operations
         COSName name = (COSName)arguments.get( 0 );
-        PDColorSpace cs = PDColorSpaceFactory.createColorSpace( name, 
context.getColorSpaces() );
+        PDColorSpace cs = PDColorSpaceFactory.createColorSpace( name, 
context.getColorSpaces(), 
+                context.getResources().getPatterns() );
         PDColorState colorInstance = 
context.getGraphicsState().getNonStrokingColor();
         colorInstance.setColorSpace( cs );
         int numComponents = cs.getNumberOfComponents();

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColorSpace.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColorSpace.java?rev=1238741&r1=1238740&r2=1238741&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColorSpace.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColorSpace.java
 Tue Jan 31 18:49:38 2012
@@ -50,7 +50,8 @@ public class SetStrokingColorSpace exten
     {
         //(PDF 1.1) Set color space for stroking operations
         COSName name = (COSName)arguments.get( 0 );
-        PDColorSpace cs = PDColorSpaceFactory.createColorSpace( name, 
context.getColorSpaces() );
+        PDColorSpace cs = PDColorSpaceFactory.createColorSpace( name, 
context.getColorSpaces(), 
+                context.getResources().getPatterns() );
         PDColorState color = context.getGraphicsState().getStrokingColor();
         color.setColorSpace( cs );
         int numComponents = cs.getNumberOfComponents();


Reply via email to