]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
This adds colorspace (RGB + CMYK) support to PDF output, and the ability
authorSteve Coffman <gears@apache.org>
Fri, 21 Apr 2000 16:43:19 +0000 (16:43 +0000)
committerSteve Coffman <gears@apache.org>
Fri, 21 Apr 2000 16:43:19 +0000 (16:43 +0000)
to switch colorspaces. I need to make a colorspace datatype before I'll
patch the render code.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193335 13f79535-47bb-0310-9956-ffa450edef68

src/org/apache/fop/pdf/PDFColor.java [new file with mode: 0644]
src/org/apache/fop/pdf/PDFFunction.java
src/org/apache/fop/pdf/PDFPathPaint.java [new file with mode: 0644]
src/org/apache/fop/pdf/PDFPattern.java
src/org/apache/fop/pdf/PDFShading.java

diff --git a/src/org/apache/fop/pdf/PDFColor.java b/src/org/apache/fop/pdf/PDFColor.java
new file mode 100644 (file)
index 0000000..589959c
--- /dev/null
@@ -0,0 +1,296 @@
+/*-- $Id$ -- 
+
+ ============================================================================
+                                                The Apache Software License, Version 1.1
+ ============================================================================
+        Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must        retain the above copyright  notice,
+        this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+        this list of conditions and the following disclaimer in the documentation
+        and/or other materials provided with the distribution.
+ 3. The end-user documentation included with the redistribution, if any, must
+        include  the following  acknowledgment:        "This product includes  software
+        developed      by the  Apache Software Foundation      (http://www.apache.org/)."
+        Alternately, this  acknowledgment may  appear in the software itself,  if
+        and wherever such third-party acknowledgments normally appear.
+ 4. The names "Fop" and  "Apache Software Foundation"  must not be used to
+        endorse  or promote  products derived  from this       software without        prior
+        written permission. For written permission, please contact
+        apache@apache.org.
+ 5. Products  derived from this software may not  be called "Apache", nor may
+        "Apache" appear        in their name,  without prior written permission  of the
+        Apache Software Foundation.
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.   IN NO  EVENT SHALL  THE
+ APACHE SOFTWARE       FOUNDATION      OR ITS CONTRIBUTORS     BE LIABLE FOR   ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL,        EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
+ ANY   THEORY OF LIABILITY,  WHETHER  IN CONTRACT,     STRICT LIABILITY,  OR TORT
+ (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN      ANY WAY OUT OF THE  USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ This software  consists of voluntary contributions made  by many individuals
+ on  behalf of the Apache Software     Foundation and was  originally created by
+ James Tauber <jtauber@jtauber.com>. For more  information on the Apache 
+ Software Foundation, please see <http://www.apache.org/>.
+ */
+package org.apache.fop.pdf;
+
+// Java
+import java.io.IOException;
+import java.io.PrintWriter;
+import org.apache.fop.datatypes.ColorType;
+import java.util.Vector;
+
+public class PDFColor extends PDFPathPaint {
+
+       protected double red  = -1.0;
+       protected double green= -1.0;
+       protected double blue = -1.0;
+       
+       protected double cyan   = -1.0;
+       protected double magenta= -1.0;
+       protected double yellow = -1.0;
+       protected double black  = -1.0;
+
+       
+       public PDFColor(int theNumber, org.apache.fop.datatypes.ColorType theColor)
+       {
+               this.colorspace = 0;
+               //super(theNumber)
+               this.red  =  (double)theColor.red();
+               this.green = (double)theColor.green();
+               this.blue  = (double)theColor.blue();
+               
+       }
+
+       public PDFColor(int theNumber, double theRed, double theGreen, double theBlue) {
+               //super(theNumber);
+               
+               this.colorspace=0;
+
+               this.red = theRed;
+               this.green = theGreen;
+               this.blue = theBlue;
+       }
+       
+       public PDFColor(int theNumber, double theCyan, double theMagenta, double theYellow, double theBlack) {
+               //super(theNumber);//?
+               
+               this.colorspace = 1;
+               
+               this.cyan = theCyan;
+               this.magenta = theMagenta;
+               this.yellow = theYellow;
+               this.black = theBlack;
+       }
+       
+       public int setColorspace()
+       {
+               return(this.colorspace);
+       }
+       
+       public Vector getVector()
+       {//return a vector representation of the color
+       //in the appropriate colorspace.
+               Vector theColorVector= new Vector();
+               if (this.colorspace == 0)
+               {//RGB                          
+                       theColorVector.addElement(new Double(this.red));
+                       theColorVector.addElement(new Double(this.green));
+                       theColorVector.addElement(new Double(this.blue));
+               }
+               else
+               {//CMYK
+                       theColorVector.addElement(new Double(this.cyan));
+                       theColorVector.addElement(new Double(this.magenta));
+                       theColorVector.addElement(new Double(this.yellow));
+                       theColorVector.addElement(new Double(this.black));
+
+               }
+               return(theColorVector);
+       }
+       
+       public double red()
+       {
+               return(this.red);
+       }
+       public double green()
+       {
+               return(this.green);
+       }
+       public double blue()
+       {
+               return(this.blue);
+       }
+       public double cyan()
+       {
+               return(this.cyan);
+       }
+       public double magenta()
+       {
+               return(this.magenta);
+       }
+       public double yellow()
+       {
+               return(this.yellow);
+       }
+       public double black()
+       {
+               return(this.black);
+       }
+       
+       public String getColorspaceOut(boolean fillNotStroke)
+       {
+               StringBuffer p = new StringBuffer("");
+
+               double tempDouble;
+               
+               //if the color was constructed in a different colorspace,
+               //then we need to convert it.
+               
+               if(this.colorspace==0)
+               {//colorspace is RGB
+                       if((this.red < 0)
+                               || (this.green < 0)
+                               || (this.blue < 0))
+                       {
+                               this.convertCMYKtoRGB();
+                       } //end of convert from CMYK
+                               
+                       //output RGB
+                       if(fillNotStroke)
+                       { //fill
+                               p.append(this.doubleOut(this.red)+" "
+                                       +this.doubleOut(this.green)+" "
+                                       +this.doubleOut(this.blue)+" "
+                                       +" rg \n");
+                       } 
+                       else
+                       {//stroke/border
+                               p.append(this.doubleOut(this.red)+" "
+                                       +this.doubleOut(this.green)+" "
+                                       +this.doubleOut(this.blue)+" "
+                                       +" RG \n");
+                       }
+               }//end of output RGB
+               else
+               {//colorspace is CMYK
+                       if((this.cyan < 0)
+                               || (this.magenta < 0)
+                               || (this.yellow < 0)
+                               || (this.black < 0))
+                       {
+                               this.convertRGBtoCMYK();
+                       }//end of if convert from RGB
+                       
+                       if(fillNotStroke)
+                       { //fill
+                               p.append(this.doubleOut(this.cyan) + " "
+                                       + this.doubleOut(this.magenta) + " "
+                                       + this.doubleOut(this.yellow) + " "
+                                       + this.doubleOut(this.black) + " k \n");
+                       }
+                       else
+                       { //fill
+                               p.append(this.doubleOut(this.cyan) + " "
+                                       + this.doubleOut(this.magenta) + " "
+                                       + this.doubleOut(this.yellow) + " "
+                                       + this.doubleOut(this.black) + " K \n");
+                       }
+                       
+               }//end of if CMYK
+               return(p.toString());
+       }
+
+       
+       
+       public String doubleOut(double doubleDown)
+       {
+               StringBuffer p = new StringBuffer();
+               double trouble = doubleDown % 1;
+               
+               if(trouble > 0.950)
+               {
+                       p.append((int)doubleDown+1);
+               }
+               else if (trouble < 0.050)
+               {
+                       p.append((int)doubleDown);
+               }
+               else
+               {
+                       String doubleString = new String(doubleDown+"");
+                       int decimal = doubleString.indexOf(".");
+                       p.append(doubleString.substring(0, decimal));
+
+                       if ((doubleString.length() - decimal) > 6)
+                       {
+                               p.append(doubleString.substring(decimal,decimal+6));
+                       }
+                       else
+                       {
+                               p.append(doubleString.substring(decimal));
+                       }
+               }
+               return(p.toString());
+       }
+       
+       protected void convertCMYKtoRGB()
+       {
+               //convert CMYK to RGB
+               this.red = 1.0 - this.cyan;
+               this.green = 1.0 - this.green;
+               this.blue= 1.0 - this.yellow;
+                               
+               this.red   = (this.black / 2.0)+ this.red;
+               this.green = (this.black / 2.0)+ this.green;
+               this.blue  = (this.blue / 2.0) + this.blue;
+               
+       }
+
+       protected void convertRGBtoCMYK()
+       {
+               //convert RGB to CMYK
+               this.cyan   = 1.0 - this.red;
+               this.magenta= 1.0 - this.green;
+               this.yellow = 1.0 - this.blue;
+                               
+               this.black = 0.0;
+               /* If you want to calculate black, uncomment this
+               //pick the lowest color
+               tempDouble = this.red;
+                               
+               if (this.green < tempDouble)
+                       tempDouble = this.green;
+                               
+               if (this.blue < tempDouble)
+                       tempDouble = this.blue;
+                                       
+               this.black = tempDouble / 2.0; // 3.0???
+               */
+       }
+       
+       
+
+       
+       String toPDF()
+       {
+               return ("");
+
+       } //end of toPDF
+}
index 973c660d1be562c5a5afb23c08ea9e65cacbfa47..0e4b442223a4e9267758142f36f28dd2faf480cf 100644 (file)
@@ -208,7 +208,6 @@ public class PDFFunction extends PDFObject {
                super(theNumber);
                
                this.functionType = 0; //dang well better be 0;
-               
                this.size = theSize;
                this.bitsPerSample = theBitsPerSample; 
                this.order = theOrder; //int
@@ -403,6 +402,8 @@ public class PDFFunction extends PDFObject {
                }
                return(p.toString());
        }
+       
+                               
 
         /**
          * represent as PDF. Whatever the FunctionType is, the correct
@@ -440,7 +441,11 @@ public class PDFFunction extends PDFObject {
                                
                                p.append("] \n");
                        }                       
-                       
+                       else
+                       {
+                               p.append("/Domain [ 0 1 ] \n");
+                       }
+
                        //SIZE
                        if(this.size != null)
                        {
@@ -465,6 +470,17 @@ public class PDFFunction extends PDFObject {
                                }
                                p.append("] \n");
                        }
+                       else
+                       {
+                               p.append("/Encode [ ");
+                               vectorSize = this.functions.size();
+                               for(tempInt=0; tempInt < vectorSize; tempInt++)
+                               {
+                                       p.append("0 1 ");
+                               }
+                               p.append("] \n");
+                               
+                       }
                        
                        //BITSPERSAMPLE
                        p.append("/BitsPerSample "+this.bitsPerSample);
@@ -555,6 +571,11 @@ public class PDFFunction extends PDFObject {
                                
                                p.append("] \n");
                        }
+                       else
+                       {
+                               p.append("/Domain [ 0 1 ] \n");
+                       }
+
                        
                        //RANGE
                        if(this.range != null)
@@ -621,7 +642,11 @@ public class PDFFunction extends PDFObject {
                                }
                                p.append("] \n");
                        }
-                       
+                       else
+                       {
+                               p.append("/Domain [ 0 1 ] \n");
+                       }
+
                        //RANGE
                        if(this.range != null)
                        {
@@ -663,6 +688,18 @@ public class PDFFunction extends PDFObject {
                                                                
                                p.append("] \n");
                        }
+                       else
+                       {
+                               p.append("/Encode [ ");
+                               vectorSize = this.functions.size();
+                               for(tempInt=0; tempInt < vectorSize; tempInt++)
+                               {
+                                       p.append("0 1 ");
+                               }
+                               p.append("] \n");
+                               
+                       }
+                       
                        
                        //BOUNDS, required, but can be empty
                        p.append("/Bounds [ ");
@@ -720,7 +757,11 @@ public class PDFFunction extends PDFObject {
                                
                                p.append("] \n");
                        }
-                       
+                       else
+                       {
+                               p.append("/Domain [ 0 1 ] \n");
+                       }
+
                        //RANGE
                        if(this.range != null)
                        {
diff --git a/src/org/apache/fop/pdf/PDFPathPaint.java b/src/org/apache/fop/pdf/PDFPathPaint.java
new file mode 100644 (file)
index 0000000..894bd54
--- /dev/null
@@ -0,0 +1,81 @@
+/*-- $Id$ -- 
+
+ ============================================================================
+                                                The Apache Software License, Version 1.1
+ ============================================================================
+        Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must        retain the above copyright  notice,
+        this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+        this list of conditions and the following disclaimer in the documentation
+        and/or other materials provided with the distribution.
+ 3. The end-user documentation included with the redistribution, if any, must
+        include  the following  acknowledgment:        "This product includes  software
+        developed      by the  Apache Software Foundation      (http://www.apache.org/)."
+        Alternately, this  acknowledgment may  appear in the software itself,  if
+        and wherever such third-party acknowledgments normally appear.
+ 4. The names "Fop" and  "Apache Software Foundation"  must not be used to
+        endorse  or promote  products derived  from this       software without        prior
+        written permission. For written permission, please contact
+        apache@apache.org.
+ 5. Products  derived from this software may not  be called "Apache", nor may
+        "Apache" appear        in their name,  without prior written permission  of the
+        Apache Software Foundation.
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.   IN NO  EVENT SHALL  THE
+ APACHE SOFTWARE       FOUNDATION      OR ITS CONTRIBUTORS     BE LIABLE FOR   ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL,        EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
+ ANY   THEORY OF LIABILITY,  WHETHER  IN CONTRACT,     STRICT LIABILITY,  OR TORT
+ (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN      ANY WAY OUT OF THE  USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ This software  consists of voluntary contributions made  by many individuals
+ on  behalf of the Apache Software     Foundation and was  originally created by
+ James Tauber <jtauber@jtauber.com>. For more  information on the Apache 
+ Software Foundation, please see <http://www.apache.org/>.
+ */
+package org.apache.fop.pdf;
+
+public abstract class PDFPathPaint extends PDFObject
+{
+
+       protected int colorspace = 0; //default is 0:RGB, not 1:CMYK
+       
+       public PDFPathPaint(int theNumber) {
+               super(theNumber);
+       
+       }
+       
+       public PDFPathPaint(){
+               //do nothing
+       }
+       
+       abstract String getColorspaceOut(boolean fillNotStroke);
+       
+       
+       public void setColorspace(int theColorspace)
+       {
+               this.colorspace = theColorspace;
+       }
+       
+       public int getColorspace()
+       {
+               return(this.colorspace);
+       }
+       
+}
+
index 620452a61df422cddea762261d775dd3cb8e5699..40085a3f419b4f34262de04c6549f213f476b545 100644 (file)
@@ -64,7 +64,7 @@ import java.util.Vector;
  *
  * All PDF Functions have a FunctionType (0,2,3, or 4), a Domain, and a Range.
  */
-public class PDFPattern extends PDFObject {
+public class PDFPattern extends PDFPathPaint {
 
        /**
         * The resources associated with this pattern
@@ -214,6 +214,18 @@ public class PDFPattern extends PDFObject {
                return (this.patternName);
        }
        
+       
+       public String getColorspaceOut(boolean fillNotStroke)
+       {
+               if(fillNotStroke)
+               { //fill but no stroke
+                       return("/Pattern cs /"+this.getName()+" scn \n");
+               }
+               else
+               { //stroke (or border)
+                       return("/Pattern CS /"+this.getName()+" SCN \n");
+               }
+       }
        /**
         * Output a Double prettily as a string
         * 
index 27fa6402c4863e8561a9551581c8bfbc9146a7c0..6ba18f9a2bed30fb0ffd288ba30e8c91e905e5d6 100644 (file)
@@ -220,7 +220,8 @@ public class PDFShading extends PDFObject {
                 * @param theExtend Vector of Booleans of whether to extend teh start and end colors past the start and end points
                 * The default is [false, false]
                 */
-               public PDFShading(int theNumber, String theShadingName, int theShadingType, StringBuffer theColorSpace,
+       public PDFShading(int theNumber, String theShadingName,
+               int theShadingType, StringBuffer theColorSpace,
                Vector theBackground, Vector theBBox, boolean theAntiAlias,
                Vector theCoords, Vector theDomain, PDFFunction theFunction,
                Vector theExtend)
@@ -330,6 +331,7 @@ public class PDFShading extends PDFObject {
        public String getName() {
                return (this.shadingName);
    }
+   
        public String doubleOut(Double doubleDown)
        {
                StringBuffer p = new StringBuffer();
@@ -425,6 +427,10 @@ public class PDFShading extends PDFObject {
                                }
                                p.append("] \n");
                        }
+                       else
+                       {
+                               p.append("/Domain [ 0 1 ] \n");
+                       }
                        
                        if(this.matrix != null)
                        {
@@ -460,6 +466,7 @@ public class PDFShading extends PDFObject {
                                p.append("] \n");
                        }
                        
+                       //DOMAIN
                        if(this.domain != null)
                        {
                                p.append("/Domain [ ");
@@ -471,7 +478,11 @@ public class PDFShading extends PDFObject {
                                }
                                p.append("] \n");
                        }
-
+                       else
+                       {
+                               p.append("/Domain [ 0 1 ] \n");
+                       }
+                       
                        if(this.extend != null)
                        {
                                p.append("/Extend [ ");
@@ -483,6 +494,10 @@ public class PDFShading extends PDFObject {
                                
                                p.append("] \n");
                        }
+                       else
+                       {
+                               p.append("/Extend [ true true ] \n");
+                       }
 
 
                        if(this.function != null)
@@ -490,33 +505,6 @@ public class PDFShading extends PDFObject {
                                p.append("/Function ");
                                p.append(this.function.referencePDF()+" \n");
                        }
-                       else if(true)
-                       {
-                               
-                               //FunctionType 2 /Domain [ 0 1 ] /N 1.048 /C0 [ 0.929 0.357 1 0.298 ] /C1 [ 0.631 0.278 1 0.027 ] >> \n"
-                               //+"<< /FunctionType 2 /Domain [ 0 1 ] /N 1.374 /C0 [ 0.929 0.357 1 0.298 ] /C1 [ 0.941 0.4 1 0.102 ]
-
-                               p.append("/Function << /FunctionType 3 /Domain [ 0 1 ] /Functions [ << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0 0 0 0 ] /C1 [ 0.506 0.306 0 0 ] /N 1 >> ] /Encode [ 0 1 ] /Bounds [ ] >> \n");
-                       }
-                       else if(true)
-                       {//RGB function
-                               p.append("/Function << /FunctionType 3 /Domain [ 0 1 ] /Encode [ 1 0 1 0 ] /Functions [ << /FunctionType 2 /Domain [ 0 1 ] /N 1.49834 /C0 [ 0 0.73332 0.98038 ] \n"
-+"/C1 [ 0 0.38039 0.50587 ] >> \n"
-+"<< /FunctionType 2 /Domain [ 0 1 ] /N 1 /C0 [ 0.37254 0.8196 0.96861 ] \n"
-+"/C1 [ 0 0.73332 0.98038 ] >> \n"
-+"] \n"
-+"/Bounds [ 0.61581 ] >> ");
-
-                       }
-                       else
-                       {       
-                               
-                               p.append("/Function << /FunctionType 3 /Domain [ 0 1 ] /Encode [ 1 0 ] /Functions [ << /FunctionType 2 /Domain [ 0 1 ] /N 1 /C0 [ 0.81175 0 0 ] /C1 [ 1 1 1 ] >> \n"
-                               +"] \n"
-                               +"/Bounds [ ] >> \n");
-                       }
-                       
-                       
                        
                        
                }