You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ke...@apache.org on 2002/09/11 11:51:13 UTC

cvs commit: xml-fop/src/org/apache/fop/svg PDFDocumentGraphics2D.java PDFGraphics2D.java PDFGraphicsConfiguration.java PDFGraphicsDevice.java

keiron      2002/09/11 02:51:13

  Modified:    src/org/apache/fop/render/pdf PDFXMLHandler.java
               src/org/apache/fop/svg PDFDocumentGraphics2D.java
                        PDFGraphics2D.java PDFGraphicsConfiguration.java
                        PDFGraphicsDevice.java
  Log:
  fixed most style errors
  
  Revision  Changes    Path
  1.9       +136 -52   xml-fop/src/org/apache/fop/render/pdf/PDFXMLHandler.java
  
  Index: PDFXMLHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/pdf/PDFXMLHandler.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- PDFXMLHandler.java	23 Jul 2002 11:06:51 -0000	1.8
  +++ PDFXMLHandler.java	11 Sep 2002 09:51:13 -0000	1.9
  @@ -1,64 +1,122 @@
   /*
    * $Id$
  - * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  + * Copyright (C) 2001-2002 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
    * LICENSE file included with these sources.
    */
   
   package org.apache.fop.render.pdf;
   
  -import org.apache.fop.fo.FOUserAgent;
   import org.apache.fop.render.XMLHandler;
   import org.apache.fop.render.RendererContext;
  -import org.apache.fop.pdf.*;
  -import org.apache.fop.svg.*;
  +import org.apache.fop.pdf.PDFDocument;
  +import org.apache.fop.pdf.PDFPage;
  +import org.apache.fop.pdf.PDFState;
  +import org.apache.fop.pdf.PDFStream;
  +import org.apache.fop.pdf.PDFNumber;
  +import org.apache.fop.svg.PDFTextElementBridge;
  +import org.apache.fop.svg.PDFAElementBridge;
  +import org.apache.fop.svg.PDFGraphics2D;
   import org.apache.fop.svg.SVGUserAgent;
   import org.apache.fop.layout.FontInfo;
   
  -import org.apache.batik.dom.util.DOMUtilities;
  -
   import org.w3c.dom.Document;
  -import org.w3c.dom.Node;
  -import org.w3c.dom.NamedNodeMap;
  -import org.w3c.dom.Attr;
   
  -import java.io.IOException;
   import java.io.OutputStream;
   
  -import org.apache.batik.bridge.*;
  -import org.apache.batik.swing.svg.*;
  -import org.apache.batik.swing.gvt.*;
  -import org.apache.batik.gvt.*;
  -import org.apache.batik.gvt.renderer.*;
  -import org.apache.batik.gvt.filter.*;
  -import org.apache.batik.gvt.event.*;
  -
  -import org.w3c.dom.*;
  -import org.w3c.dom.svg.*;
  -import org.w3c.dom.css.*;
  -import org.w3c.dom.svg.SVGLength;
  +import org.apache.batik.bridge.GVTBuilder;
  +import org.apache.batik.bridge.BridgeContext;
  +import org.apache.batik.bridge.ViewBox;
  +
  +import org.apache.batik.gvt.GraphicsNode;
  +
  +import org.w3c.dom.svg.SVGDocument;
  +import org.w3c.dom.svg.SVGSVGElement;
   
   import java.awt.geom.AffineTransform;
   
   /**
  + * PDF XML handler.
  + * This handler handles XML for foreign objects when rendering to PDF.
  + * It renders SVG to the PDF document using the PDFGraphics2D.
  + * The properties from the PDF renderer are subject to change.
    */
   public class PDFXMLHandler implements XMLHandler {
  -public static final String PDF_DOCUMENT = "pdfDoc";
  -public static final String OUTPUT_STREAM = "outputStream";
  -public static final String PDF_STATE = "pdfState";
  -public static final String PDF_PAGE = "pdfPage";
  -public static final String PDF_STREAM = "pdfStream";
  -public static final String PDF_WIDTH = "width";
  -public static final String PDF_HEIGHT = "height";
  -public static final String PDF_FONT_INFO = "fontInfo";
  -public static final String PDF_FONT_NAME = "fontName";
  -public static final String PDF_FONT_SIZE = "fontSize";
  -public static final String PDF_XPOS = "xpos";
  -public static final String PDF_YPOS = "ypos";
  +    /**
  +     * The PDF document that is being drawn into.
  +     */
  +    public static final String PDF_DOCUMENT = "pdfDoc";
  +
  +    /**
  +     * The output stream that the document is being sent to.
  +     */
  +    public static final String OUTPUT_STREAM = "outputStream";
  +
  +    /**
  +     * The current pdf state.
  +     */
  +    public static final String PDF_STATE = "pdfState";
  +
  +    /**
  +     * The current PDF page for page renference and as a resource context.
  +     */
  +    public static final String PDF_PAGE = "pdfPage";
  +
  +    /**
  +     * The current PDF stream to draw directly to.
  +     */
  +    public static final String PDF_STREAM = "pdfStream";
  +
  +    /**
  +     * The width of the current pdf page.
  +     */
  +    public static final String PDF_WIDTH = "width";
  +
  +    /**
  +     * The height of the current pdf page.
  +     */
  +    public static final String PDF_HEIGHT = "height";
   
  +    /**
  +     * The current font information for the pdf renderer.
  +     */
  +    public static final String PDF_FONT_INFO = "fontInfo";
  +
  +    /**
  +     * The current pdf font name.
  +     */
  +    public static final String PDF_FONT_NAME = "fontName";
  +
  +    /**
  +     * The current pdf font size.
  +     */
  +    public static final String PDF_FONT_SIZE = "fontSize";
  +
  +    /**
  +     * The x position that this is being drawn at.
  +     */
  +    public static final String PDF_XPOS = "xpos";
  +
  +    /**
  +     * The y position that this is being drawn at.
  +     */
  +    public static final String PDF_YPOS = "ypos";
  +
  +    /**
  +     * Create a new PDF XML handler for use by the PDF renderer.
  +     */
       public PDFXMLHandler() {
       }
   
  +    /**
  +     * Handle the XML.
  +     * This checks the type of XML and handles appropraitely.
  +     *
  +     * @param context the renderer context
  +     * @param doc the XML document to render
  +     * @param ns the namespace of the XML document
  +     * @throws Exception any sort of exception could be thrown and shuld be handled
  +     */
       public void handleXML(RendererContext context, Document doc,
                             String ns) throws Exception {
           PDFInfo pdfi = getPDFInfo(context);
  @@ -71,6 +129,12 @@
           }
       }
   
  +    /**
  +     * Get the pdf information from the render context.
  +     *
  +     * @param context the renderer context
  +     * @return the pdf information retrieved from the context
  +     */
       public static PDFInfo getPDFInfo(RendererContext context) {
           PDFInfo pdfi = new PDFInfo();
           pdfi.pdfDoc = (PDFDocument)context.getProperty(PDF_DOCUMENT);
  @@ -88,19 +152,34 @@
           return pdfi;
       }
   
  +    /**
  +     * PDF information structure for drawing the XML document.
  +     */
       public static class PDFInfo {
  -        PDFDocument pdfDoc;
  -        OutputStream outputStream;
  -        PDFState pdfState;
  -        PDFPage pdfPage;
  +        /** see PDF_DOCUMENT */
  +        public PDFDocument pdfDoc;
  +        /** see OUTPUT_STREAM */
  +        public OutputStream outputStream;
  +        /** see PDF_STATE */
  +        public PDFState pdfState;
  +        /** see PDF_PAGE */
  +        public PDFPage pdfPage;
  +        /** see PDF_STREAM */
           public PDFStream currentStream;
  -        int width;
  -        int height;
  -        FontInfo fi;
  -        String currentFontName;
  -        int currentFontSize;
  -        int currentXPosition;
  -        int currentYPosition;
  +        /** see PDF_WIDTH */
  +        public int width;
  +        /** see PDF_HEIGHT */
  +        public int height;
  +        /** see PDF_FONT_INFO */
  +        public FontInfo fi;
  +        /** see PDF_FONT_NAME */
  +        public String currentFontName;
  +        /** see PDF_FONT_SIZE */
  +        public int currentFontSize;
  +        /** see PDF_XPOS */
  +        public int currentXPosition;
  +        /** see PDF_YPOS */
  +        public int currentYPosition;
       }
   
       /**
  @@ -108,6 +187,12 @@
        * loading errors if batik is not present.
        */
       protected class SVGHandler {
  +        /**
  +         * Render the svg document.
  +         * @param context the renderer context
  +         * @param doc the svg document
  +         * @param pdfInfo the pdf information of the current context
  +         */
           protected void renderSVGDocument(RendererContext context, Document doc, PDFInfo pdfInfo) {
               int xOffset = pdfInfo.currentXPosition;
               int yOffset = pdfInfo.currentYPosition;
  @@ -159,7 +244,7 @@
   
               SVGSVGElement svg = ((SVGDocument)doc).getRootElement();
               AffineTransform at = ViewBox.getPreserveAspectRatioTransform(svg, w / 1000f, h / 1000f);
  -            if(!at.isIdentity()) {
  +            if (!at.isIdentity()) {
                   double[] vals = new double[6];
                   at.getMatrix(vals);
                   pdfInfo.currentStream.add(PDFNumber.doubleOut(vals[0]) + " "
  @@ -171,14 +256,13 @@
               }
   
               PDFGraphics2D graphics = new PDFGraphics2D(true, pdfInfo.fi, pdfInfo.pdfDoc,
  -                                     pdfInfo.pdfPage, pdfInfo.pdfPage.referencePDF(), pdfInfo.currentFontName,
  -                                     pdfInfo.currentFontSize,
  -                                     pdfInfo.currentXPosition,
  -                                     pdfInfo.currentYPosition);
  +                                     pdfInfo.pdfPage, pdfInfo.pdfPage.referencePDF(),
  +                                     pdfInfo.currentFontName,
  +                                     pdfInfo.currentFontSize);
               graphics.setGraphicContext(new org.apache.batik.ext.awt.g2d.GraphicContext());
               pdfInfo.pdfState.push();
               transform = new AffineTransform();
  -            // TODO scale to viewbox
  +            // scale to viewbox
               transform.translate(xOffset / 1000f, yOffset / 1000f);
               pdfInfo.pdfState.setTransform(transform);
               graphics.setPDFState(pdfInfo.pdfState);
  
  
  
  1.23      +2 -5      xml-fop/src/org/apache/fop/svg/PDFDocumentGraphics2D.java
  
  Index: PDFDocumentGraphics2D.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/svg/PDFDocumentGraphics2D.java,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- PDFDocumentGraphics2D.java	9 Sep 2002 06:00:56 -0000	1.22
  +++ PDFDocumentGraphics2D.java	11 Sep 2002 09:51:13 -0000	1.23
  @@ -63,15 +63,12 @@
               //                          FontInfo.NORMAL, 12, 0);
           }
   
  -        standalone = true;
           this.pdfDoc = new PDFDocument("FOP SVG Renderer");
   
           graphicsState = new PDFState();
   
           currentFontName = "";
           currentFontSize = 0;
  -        currentYPosition = 0;
  -        currentXPosition = 0;
   
           pdfStream = this.pdfDoc.makeStream(PDFStream.CONTENT_FILTER, false);
       }
  
  
  
  1.42      +225 -94   xml-fop/src/org/apache/fop/svg/PDFGraphics2D.java
  
  Index: PDFGraphics2D.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/svg/PDFGraphics2D.java,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- PDFGraphics2D.java	9 Sep 2002 08:28:12 -0000	1.41
  +++ PDFGraphics2D.java	11 Sep 2002 09:51:13 -0000	1.42
  @@ -82,8 +82,6 @@
    * @see org.apache.batik.ext.awt.g2d.AbstractGraphics2D
    */
   public class PDFGraphics2D extends AbstractGraphics2D {
  -    protected boolean standalone = false;
  -
       /**
        * the PDF Document being created
        */
  @@ -93,21 +91,37 @@
        * The current resource context for adding fonts, patterns etc.
        */
       protected PDFResourceContext resourceContext;
  +
  +    /**
  +     * The PDF reference of the current page.
  +     */
       protected String pageRef;
   
       /**
        * the current state of the pdf graphics
        */
       protected PDFState graphicsState;
  -    int baseLevel = 0;
   
  +    /**
  +     * The PDF graphics state level that this svg is being drawn into.
  +     */
  +    protected int baseLevel = 0;
  +
  +    /**
  +     * The current font information.
  +     */
       protected FontInfo fontInfo;
  +
  +    /**
  +     * The override font state used when drawing text and the font cannot be
  +     * set using java fonts.
  +     */
       protected FontState ovFontState = null;
   
       /**
        * the current stream to add PDF commands to
        */
  -    StringWriter currentStream = new StringWriter();
  +    protected StringWriter currentStream = new StringWriter();
   
       /**
        * the current (internal) font name
  @@ -120,16 +134,6 @@
       protected float currentFontSize;
   
       /**
  -     * the current vertical position in millipoints from bottom
  -     */
  -    protected int currentYPosition = 0;
  -
  -    /**
  -     * the current horizontal position in millipoints from left
  -     */
  -    protected int currentXPosition = 0;
  -
  -    /**
        * The output stream for the pdf document.
        * If this is set then it can progressively output
        * the pdf document objects to reduce memory.
  @@ -141,48 +145,93 @@
        * Create a new PDFGraphics2D with the given pdf document info.
        * This is used to create a Graphics object for use inside an already
        * existing document.
  +     *
  +     * @param textAsShapes if true then draw text as shapes
  +     * @param fi the current font information
  +     * @param doc the pdf document for creating pdf objects
  +     * @param page the current resource context or page
  +     * @param pref the PDF reference of the current page
  +     * @param font the current font name
  +     * @param size the current font size
        */
       public PDFGraphics2D(boolean textAsShapes, FontInfo fi, PDFDocument doc,
  -                         PDFResourceContext page, String pref, String font, float size, int xpos, int ypos) {
  +                         PDFResourceContext page, String pref, String font, float size) {
           super(textAsShapes);
           pdfDoc = doc;
           resourceContext = page;
           currentFontName = font;
           currentFontSize = size;
  -        currentYPosition = ypos;
  -        currentXPosition = xpos;
           fontInfo = fi;
           pageRef = pref;
           graphicsState = new PDFState();
       }
   
  +    /**
  +     * Create a new PDFGraphics2D.
  +     *
  +     * @param textAsShapes true if drawing text as shapes
  +     */
       protected PDFGraphics2D(boolean textAsShapes) {
           super(textAsShapes);
       }
   
  +    /**
  +     * Set the PDF state to use when starting to draw
  +     * into the PDF graphics.
  +     *
  +     * @param state the PDF state
  +     */
       public void setPDFState(PDFState state) {
           graphicsState = state;
           baseLevel = graphicsState.getStackLevel();
       }
   
  +    /**
  +     * Set the output stream that this PDF document is
  +     * being drawn to. This is so that it can progressively
  +     * use the PDF document to output data such as images.
  +     * This results in a significant saving on memory.
  +     *
  +     * @param os the output stream that is being used for the PDF document
  +     */
       public void setOutputStream(OutputStream os) {
           outputStream = os;
       }
   
  +    /**
  +     * Get the string containing all the commands written into this
  +     * Grpahics.
  +     * @return the string containing the PDF markup
  +     */
       public String getString() {
           return currentStream.toString();
       }
   
  +    /**
  +     * Set the Grpahics context.
  +     * @param c the graphics context to use
  +     */
       public void setGraphicContext(GraphicContext c) {
           gc = c;
       }
   
  +    /**
  +     * Set the override font state for drawing text.
  +     * This is used by the PDF text painter so that it can temporarily
  +     * set the font state when a java font cannot be used.
  +     * The next drawString will use this font state.
  +     *
  +     * @param infont the font state to use
  +     */
       public void setOverrideFontState(FontState infont) {
           ovFontState = infont;
       }
   
       /**
  -     * This constructor supports the create method
  +     * This constructor supports the create method.
  +     * This is not implemented properly.
  +     *
  +     * @param g the PDF graphics to make a copy of
        */
       public PDFGraphics2D(PDFGraphics2D g) {
           super(g);
  @@ -198,6 +247,9 @@
           return new PDFGraphics2D(this);
       }
   
  +    /**
  +     * Restore the PDF graphics state to the starting state level.
  +     */
       public void restorePDFState() {
           for (int count = graphicsState.getStackLevel(); count > baseLevel; count--) {
               currentStream.write("Q\n");
  @@ -208,6 +260,11 @@
       /**
        * This is a pdf specific method used to add a link to the
        * pdf document.
  +     *
  +     * @param bounds the bounds of the link in user coordinates
  +     * @param trans the transform of the current drawing position
  +     * @param dest the PDF destination
  +     * @param linkType the type of link, internal or external
        */
       public void addLink(Rectangle2D bounds, AffineTransform trans, String dest, int linkType) {
           AffineTransform at = getTransform();
  @@ -224,6 +281,18 @@
           }
       }
   
  +    /**
  +     * Add a JPEG image directly to the PDF document.
  +     * This is used by the PDFImageElementBridge to draw a JPEG
  +     * directly into the pdf document rather than converting the image into
  +     * a bitmap and increasing the size.
  +     *
  +     * @param jpeg the jpeg image to draw
  +     * @param x the x position
  +     * @param y the y position
  +     * @param width the width to draw the image
  +     * @param height the height to draw the image
  +     */
       public void addJpegImage(JpegImage jpeg, float x, float y, float width, float height) {
           FopPDFImage fopimage = new FopPDFImage(jpeg, jpeg.getURL());
           int xObjectNum = this.pdfDoc.addImage(resourceContext, fopimage).getXNumber();
  @@ -275,6 +344,7 @@
        * @param    y   the <i>y</i> coordinate.
        * @param    observer    object to be notified as more of
        * the image is converted.
  +     * @return true if the image was drawn
        * @see      java.awt.Image
        * @see      java.awt.image.ImageObserver
        * @see      java.awt.image.ImageObserver#imageUpdate(java.awt.Image, int, int, int, int, int)
  @@ -339,7 +409,9 @@
                           mask[maskpos++] = (byte)(alpha & 0xFF);
                           if (alpha != 255) {
                               hasMask = true;
  -                            if (alpha != 0) binaryMask = false;
  +                            if (alpha != 0) {
  +                                binaryMask = false;
  +                            }
   
                               // System.out.println("Alpha: " + alpha);
                               // Composite with opaque white...
  @@ -369,7 +441,9 @@
               String ref = null;
               if (hasMask) {
                   // if the mask is binary then we could convert it into a bitmask
  -                BitmapImage fopimg = new BitmapImage("TempImageMask:" + img.toString(), buf.getWidth(), buf.getHeight(), mask, null);
  +                BitmapImage fopimg = new BitmapImage("TempImageMask:"
  +                                             + img.toString(), buf.getWidth(),
  +                                             buf.getHeight(), mask, null);
                   fopimg.setColorSpace(new PDFColorSpace(PDFColorSpace.DEVICE_GRAY));
                   PDFXObject xobj = pdfDoc.addImage(resourceContext, fopimg);
                   ref = xobj.referencePDF();
  @@ -385,7 +459,9 @@
                   mask = null;
               }
   
  -            BitmapImage fopimg = new BitmapImage("TempImage:" + img.toString(), buf.getWidth(), buf.getHeight(), result, ref);
  +            BitmapImage fopimg = new BitmapImage("TempImage:"
  +                                          + img.toString(), buf.getWidth(),
  +                                          buf.getHeight(), result, ref);
               fopimg.setTransparent(new PDFColor(255, 255, 255));
               imageInfo = pdfDoc.addImage(resourceContext, fopimg);
               int xObjectNum = imageInfo.getXNumber();
  @@ -420,7 +496,7 @@
           return true;
       }
   
  -    public BufferedImage buildBufferedImage(Dimension size) {
  +    private BufferedImage buildBufferedImage(Dimension size) {
           return new BufferedImage(size.width, size.height,
                                    BufferedImage.TYPE_INT_ARGB);
       }
  @@ -454,6 +530,7 @@
        * @param    height the height of the rectangle.
        * @param    observer    object to be notified as more of
        * the image is converted.
  +     * @return true if the image was drawn
        * @see      java.awt.Image
        * @see      java.awt.image.ImageObserver
        * @see      java.awt.image.ImageObserver#imageUpdate(java.awt.Image, int, int, int, int, int)
  @@ -614,7 +691,8 @@
       public void clip(Shape cl) {
           super.clip(cl);
           Shape newClip = getClip();
  -        if (newClip == null || lastClip == null || !(new Area(newClip).equals(new Area(lastClip)))) {
  +        if (newClip == null || lastClip == null
  +                || !(new Area(newClip).equals(new Area(lastClip)))) {
           graphicsState.setClip(newClip);
           writeClip(newClip);
           }
  @@ -625,7 +703,8 @@
       public void setClip(Shape cl) {
           super.setClip(cl);
           Shape newClip = getClip();
  -        if (newClip == null || lastClip == null || !(new Area(newClip).equals(new Area(lastClip)))) {
  +        if (newClip == null || lastClip == null
  +                || !(new Area(newClip).equals(new Area(lastClip)))) {
           for (int count = graphicsState.getStackLevel(); count > baseLevel; count--) {
               currentStream.write("Q\n");
           }
  @@ -641,6 +720,14 @@
           lastClip = newClip;
       }
   */
  +
  +    /**
  +     * Set the clipping shape for future PDF drawing in the current graphics state.
  +     * This sets creates and writes a clipping shape that will apply
  +     * to future drawings in the current graphics state.
  +     *
  +     * @param s the clipping shape
  +     */
       protected void writeClip(Shape s) {
           if (s == null) {
               return;
  @@ -685,6 +772,14 @@
           currentStream.write("n\n");
       }
   
  +    /**
  +     * Apply the java Color to PDF.
  +     * This converts the java colour to a PDF colour and
  +     * sets it for the next drawing.
  +     *
  +     * @param col the java colour
  +     * @param fill true if the colour will be used for filling
  +     */
       protected void applyColor(Color col, boolean fill) {
           Color c = col;
           if (c.getColorSpace().getType()
  @@ -717,6 +812,15 @@
           }
       }
   
  +    /**
  +     * Apply the java paint to the PDF.
  +     * This takes the java paint sets up the appropraite PDF commands
  +     * for the drawing with that paint.
  +     * Currently this supports the gradients and patterns from batik.
  +     *
  +     * @param paint the paint to convert to PDF
  +     * @param fill true if the paint should be set for filling
  +     */
       protected void applyPaint(Paint paint, boolean fill) {
   
           if (paint instanceof LinearGradientPaint) {
  @@ -804,7 +908,8 @@
               Color[] cols = rgp.getColors();
               ArrayList someColors = new ArrayList();
               for (int count = 0; count < cols.length; count++) {
  -                someColors.add(new PDFColor(cols[count].getRed(), cols[count].getGreen(), cols[count].getBlue()));
  +                Color cc = cols[count];
  +                someColors.add(new PDFColor(cc.getRed(), cc.getGreen(), cc.getBlue()));
               }
   
               float[] fractions = rgp.getFractions();
  @@ -821,72 +926,81 @@
   
           } else if (paint instanceof PatternPaint) {
               PatternPaint pp = (PatternPaint)paint;
  -            Rectangle2D rect = pp.getPatternRect();
  +            createPattern(pp, fill);
  +        }
  +    }
   
  -            FontInfo fi = new FontInfo();
  -            FontSetup.setup(fi, null);
  +    private void createPattern(PatternPaint pp, boolean fill) {
  +        Rectangle2D rect = pp.getPatternRect();
   
  -            PDFResources res = pdfDoc.makeResources();
  -            PDFResourceContext context = new PDFResourceContext(0, pdfDoc, res);
  -            PDFGraphics2D pattGraphic = new PDFGraphics2D(textAsShapes, fi,
  -                                            pdfDoc, context, pageRef,
  -                                            "", 0,
  -                                            currentYPosition, currentXPosition);
  -            pattGraphic.gc = (GraphicContext)this.gc.clone();
  -            pattGraphic.gc.validateTransformStack();
  -            pattGraphic.setOutputStream(outputStream);
  -
  -            GraphicsNode gn = pp.getGraphicsNode();
  -            gn.paint(pattGraphic);
  -
  -            StringWriter pattStream = new StringWriter();
  -            pattStream.write("q\n");
  -
  -            // this makes the pattern the right way up, since
  -            // it is outside the original transform around the
  -            // whole svg document
  -            pattStream.write("1 0 0 -1 0 " + (rect.getHeight() + rect.getY()) + " cm\n");
  -
  -            pattStream.write(pattGraphic.getString());
  -            pattStream.write("Q");
  -
  -            ArrayList bbox = new ArrayList();
  -            bbox.add(new Double(0));
  -            bbox.add(new Double(0));
  -            bbox.add(new Double(rect.getWidth() + rect.getX()));
  -            bbox.add(new Double(rect.getHeight() + rect.getY()));
  -
  -            ArrayList translate = new ArrayList();
  -            AffineTransform pattt = pp.getPatternTransform();
  -            pattt.translate(rect.getWidth() + rect.getX(), rect.getHeight() + rect.getY());
  -            double[] flatmatrix = new double[6];
  -            pattt.getMatrix(flatmatrix);
  -            translate.add(new Double(flatmatrix[0]));
  -            translate.add(new Double(flatmatrix[1]));
  -            translate.add(new Double(flatmatrix[2]));
  -            translate.add(new Double(flatmatrix[3]));
  -            translate.add(new Double(flatmatrix[4]));
  -            translate.add(new Double(flatmatrix[5]));
  -
  -            FontSetup.addToResources(pdfDoc, res, fi);
  -
  -            PDFPattern myPat = pdfDoc.makePattern(resourceContext, 1, res, 1, 1, bbox,
  -                                    rect.getWidth(), rect.getHeight(),
  -                                    translate, null, pattStream.getBuffer());
  +        FontInfo fi = new FontInfo();
  +        FontSetup.setup(fi, null);
  +
  +        PDFResources res = pdfDoc.makeResources();
  +        PDFResourceContext context = new PDFResourceContext(0, pdfDoc, res);
  +        PDFGraphics2D pattGraphic = new PDFGraphics2D(textAsShapes, fi,
  +                                        pdfDoc, context, pageRef,
  +                                        "", 0);
  +        pattGraphic.gc = (GraphicContext)this.gc.clone();
  +        pattGraphic.gc.validateTransformStack();
  +        pattGraphic.setOutputStream(outputStream);
  +
  +        GraphicsNode gn = pp.getGraphicsNode();
  +        gn.paint(pattGraphic);
  +
  +        StringWriter pattStream = new StringWriter();
  +        pattStream.write("q\n");
  +
  +        // this makes the pattern the right way up, since
  +        // it is outside the original transform around the
  +        // whole svg document
  +        pattStream.write("1 0 0 -1 0 " + (rect.getHeight() + rect.getY()) + " cm\n");
  +
  +        pattStream.write(pattGraphic.getString());
  +        pattStream.write("Q");
  +
  +        ArrayList bbox = new ArrayList();
  +        bbox.add(new Double(0));
  +        bbox.add(new Double(0));
  +        bbox.add(new Double(rect.getWidth() + rect.getX()));
  +        bbox.add(new Double(rect.getHeight() + rect.getY()));
  +
  +        ArrayList translate = new ArrayList();
  +        AffineTransform pattt = pp.getPatternTransform();
  +        pattt.translate(rect.getWidth() + rect.getX(), rect.getHeight() + rect.getY());
  +        double[] flatmatrix = new double[6];
  +        pattt.getMatrix(flatmatrix);
  +        translate.add(new Double(flatmatrix[0]));
  +        translate.add(new Double(flatmatrix[1]));
  +        translate.add(new Double(flatmatrix[2]));
  +        translate.add(new Double(flatmatrix[3]));
  +        translate.add(new Double(flatmatrix[4]));
  +        translate.add(new Double(flatmatrix[5]));
  +
  +        FontSetup.addToResources(pdfDoc, res, fi);
  +
  +        PDFPattern myPat = pdfDoc.makePattern(resourceContext, 1, res, 1, 1, bbox,
  +                                rect.getWidth(), rect.getHeight(),
  +                                translate, null, pattStream.getBuffer());
   
  -            currentStream.write(myPat.getColorSpaceOut(fill));
  +        currentStream.write(myPat.getColorSpaceOut(fill));
   
  -            if (outputStream != null) {
  -                try {
  -                    this.pdfDoc.output(outputStream);
  -                } catch (IOException ioe) {
  -                    // ignore exception, will be thrown again later
  -                } 
  +        if (outputStream != null) {
  +            try {
  +                this.pdfDoc.output(outputStream); 
  +            } catch (IOException ioe) {
  +                // ignore exception, will be thrown again later
               }
  -
           }
       }
   
  +    /**
  +     * Apply the stroke to the PDF.
  +     * This takes the java stroke and outputs the appropriate settings
  +     * to the PDF so that the stroke attributes are handled.
  +     *
  +     * @param stroke the java stroke
  +     */
       protected void applyStroke(Stroke stroke) {
           if (stroke instanceof BasicStroke) {
               BasicStroke bs = (BasicStroke)stroke;
  @@ -1015,7 +1129,9 @@
        * left, in which case the coordinate supplied is the location of the
        * leftmost character on the baseline.
        * @param s the <code>String</code> to be rendered
  -     * @param x,&nbsp;y the coordinates where the <code>String</code>
  +     * @param x the coordinate where the <code>String</code>
  +     * should be rendered
  +     * @param y the coordinate where the <code>String</code>
        * should be rendered
        * @see #setPaint
        * @see java.awt.Graphics#setColor
  @@ -1042,7 +1158,8 @@
               fontState = new FontState(fname, metrics, siz * 1000);
           } else {
               FontMetric metrics = fontInfo.getMetricsFor(ovFontState.getFontName());
  -            fontState = new FontState(ovFontState.getFontName(), metrics, ovFontState.getFontSize());
  +            fontState = new FontState(ovFontState.getFontName(),
  +                                      metrics, ovFontState.getFontSize());
               ovFontState = null;
           }
           String name;
  @@ -1080,7 +1197,7 @@
           boolean kerningAvailable = false;
   
           kerning = fontState.getKerning();
  -        if (kerning != null &&!kerning.isEmpty()) {
  +        if (kerning != null && !kerning.isEmpty()) {
               kerningAvailable = true;
           }
   
  @@ -1088,11 +1205,11 @@
           boolean useMultiByte = false;
           org.apache.fop.render.pdf.Font f =
               (org.apache.fop.render.pdf.Font)fontInfo.getFonts().get(name);
  -        if (f instanceof LazyFont){
  -            if (((LazyFont) f).getRealFont() instanceof CIDFont){
  +        if (f instanceof LazyFont) {
  +            if (((LazyFont) f).getRealFont() instanceof CIDFont) {
                   useMultiByte = true;
               }
  -        } else if (f instanceof CIDFont){
  +        } else if (f instanceof CIDFont) {
               useMultiByte = true;
           }
   
  @@ -1186,10 +1303,11 @@
                       : (int)uniBytes[i];
   
               String hexString = Integer.toHexString(b);
  -            if (hexString.length() == 1)
  +            if (hexString.length() == 1) {
                   buf = buf.append("0" + hexString);
  -            else
  +            } else {
                   buf = buf.append(hexString);
  +            }
           }
   
           return buf.toString();
  @@ -1210,7 +1328,9 @@
        * coordinate supplied is the location of the leftmost character
        * on the baseline.
        * @param iterator the iterator whose text is to be rendered
  -     * @param x,&nbsp;y the coordinates where the iterator's text is to be
  +     * @param x the coordinate where the iterator's text is to be
  +     * rendered
  +     * @param y the coordinate where the iterator's text is to be
        * rendered
        * @see #setPaint
        * @see java.awt.Graphics#setColor
  @@ -1381,6 +1501,15 @@
           }
       }
   
  +    /**
  +     * Do the PDF drawing command.
  +     * This does the PDF drawing command according to fill
  +     * stroke and winding rule.
  +     *
  +     * @param fill true if filling the path
  +     * @param stroke true if stroking the path
  +     * @param nonzero true if using the non-zero winding rule
  +     */
       protected void doDrawing(boolean fill, boolean stroke, boolean nonzero) {
           if (fill) {
               if (stroke) {
  @@ -1405,6 +1534,8 @@
       /**
        * Returns the device configuration associated with this
        * <code>Graphics2D</code>.
  +     *
  +     * @return the PDF graphics configuration
        */
       public GraphicsConfiguration getDeviceConfiguration() {
           return new PDFGraphicsConfiguration();
  
  
  
  1.2       +41 -19    xml-fop/src/org/apache/fop/svg/PDFGraphicsConfiguration.java
  
  Index: PDFGraphicsConfiguration.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/svg/PDFGraphicsConfiguration.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PDFGraphicsConfiguration.java	23 Jul 2002 10:57:57 -0000	1.1
  +++ PDFGraphicsConfiguration.java	11 Sep 2002 09:51:13 -0000	1.2
  @@ -1,20 +1,19 @@
   /*
    * $Id$
  - * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  + * Copyright (C) 2001-2002 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
    * LICENSE file included with these sources.
    */
   
   package org.apache.fop.svg;
   
  -import java.awt.*;
  -import java.awt.Font;
  -import java.awt.Image;
  -import java.awt.image.*;
  -import java.awt.font.*;
  -import java.awt.geom.*;
  -import java.awt.color.ColorSpace;
  -import java.awt.image.renderable.*;
  +import java.awt.GraphicsConfiguration;
  +import java.awt.Rectangle;
  +import java.awt.GraphicsDevice;
  +import java.awt.Transparency;
  +import java.awt.image.ColorModel;
  +import java.awt.geom.AffineTransform;
  +import java.awt.image.BufferedImage;
   
   /**
    * Our implementation of the class that returns information about
  @@ -22,28 +21,38 @@
    */
   class PDFGraphicsConfiguration extends GraphicsConfiguration {
       // We use this to get a good colormodel..
  -    static BufferedImage BIWithAlpha =
  +    private static final BufferedImage BI_WITH_ALPHA =
           new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
       // We use this to get a good colormodel..
  -    static BufferedImage BIWithOutAlpha =
  +    private static final BufferedImage BI_WITHOUT_ALPHA =
           new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
   
       /**
        * Construct a buffered image with an alpha channel, unless
        * transparencty is OPAQUE (no alpha at all).
  +     *
  +     * @param width the width of the image
  +     * @param height the height of the image
  +     * @param transparency the alpha value of the image
  +     * @return the new buffered image
        */
       public BufferedImage createCompatibleImage(int width, int height,
               int transparency) {
  -        if (transparency == Transparency.OPAQUE)
  +        if (transparency == Transparency.OPAQUE) {
               return new BufferedImage(width, height,
                                        BufferedImage.TYPE_INT_RGB);
  -        else
  +        } else {
               return new BufferedImage(width, height,
                                        BufferedImage.TYPE_INT_ARGB);
  +        }
       }
   
       /**
        * Construct a buffered image with an alpha channel.
  +     *
  +     * @param width the width of the image
  +     * @param height the height of the image
  +     * @return the new buffered image
        */
       public BufferedImage createCompatibleImage(int width, int height) {
           return new BufferedImage(width, height,
  @@ -55,6 +64,8 @@
        * I couldn't figure out how to get this for the current
        * page from the PDFDocument (this still works for now,
        * but it should be fixed...).
  +     *
  +     * @return the bounds of the PDF document page
        */
       public Rectangle getBounds() {
           System.out.println("getting getBounds");
  @@ -63,23 +74,30 @@
   
       /**
        * Return a good default color model for this 'device'.
  +     * @return the colour model for the configuration
        */
       public ColorModel getColorModel() {
  -        return BIWithAlpha.getColorModel();
  +        return BI_WITH_ALPHA.getColorModel();
       }
   
       /**
        * Return a good color model given <tt>transparency</tt>
  +     *
  +     * @param transparency the alpha value for the colour model
  +     * @return the colour model for the configuration
        */
       public ColorModel getColorModel(int transparency) {
  -        if (transparency == Transparency.OPAQUE)
  -            return BIWithOutAlpha.getColorModel();
  -        else
  -            return BIWithAlpha.getColorModel();
  +        if (transparency == Transparency.OPAQUE) {
  +            return BI_WITHOUT_ALPHA.getColorModel();
  +        } else {
  +            return BI_WITH_ALPHA.getColorModel();
  +        }
       }
   
       /**
        * The default transform (1:1).
  +     *
  +     * @return the default transform for the configuration
        */
       public AffineTransform getDefaultTransform() {
           System.out.println("getting getDefaultTransform");
  @@ -90,6 +108,8 @@
        * The normalizing transform (1:1) (since we currently
        * render images at 72dpi, which we might want to change
        * in the future).
  +     *
  +     * @return the normalizing transform for the configuration
        */
       public AffineTransform getNormalizingTransform() {
           System.out.println("getting getNormalizingTransform");
  @@ -98,6 +118,8 @@
   
       /**
        * Return our dummy instance of GraphicsDevice
  +     *
  +     * @return the PDF graphics device
        */
       public GraphicsDevice getDevice() {
           return new PDFGraphicsDevice(this);
  
  
  
  1.2       +19 -7     xml-fop/src/org/apache/fop/svg/PDFGraphicsDevice.java
  
  Index: PDFGraphicsDevice.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/svg/PDFGraphicsDevice.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PDFGraphicsDevice.java	23 Jul 2002 10:57:57 -0000	1.1
  +++ PDFGraphicsDevice.java	11 Sep 2002 09:51:13 -0000	1.2
  @@ -1,16 +1,15 @@
   /*
    * $Id$
  - * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  + * Copyright (C) 2001-2002 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
    * LICENSE file included with these sources.
    */
   
   package org.apache.fop.svg;
   
  -import java.awt.*;
  -import java.awt.Image;
  -import java.awt.image.*;
  -import java.awt.image.renderable.*;
  +import java.awt.GraphicsDevice;
  +import java.awt.GraphicsConfiguration;
  +import java.awt.GraphicsConfigTemplate;
   
   /**
    * This implements the GraphicsDevice interface as appropriate for
  @@ -23,9 +22,11 @@
       /**
        * The Graphics Config that created us...
        */
  -    GraphicsConfiguration gc;
  +    protected GraphicsConfiguration gc;
   
       /**
  +     * Create a new PDF graphics device.
  +     *
        * @param The gc we should reference
        */
       PDFGraphicsDevice(PDFGraphicsConfiguration gc) {
  @@ -34,6 +35,9 @@
   
       /**
        * Ignore template and return the only config we have
  +     *
  +     * @param gct the template configuration
  +     * @return the best configuration which is the only one
        */
       public GraphicsConfiguration getBestConfiguration(
         GraphicsConfigTemplate gct) {
  @@ -42,6 +46,8 @@
   
       /**
        * Return an array of our one GraphicsConfig
  +     *
  +     * @return an array containing the one graphics configuration
        */
       public GraphicsConfiguration[] getConfigurations() {
           return new GraphicsConfiguration[]{ gc };
  @@ -49,6 +55,8 @@
   
       /**
        * Return out sole GraphicsConfig.
  +     *
  +     * @return the grpahics configuration that created this object
        */
       public GraphicsConfiguration getDefaultConfiguration() {
           return gc;
  @@ -56,6 +64,8 @@
   
       /**
        * Generate an IdString..
  +     *
  +     * @return the ID string for this device, uses toString
        */
       public String getIDstring() {
           return toString();
  @@ -63,6 +73,8 @@
   
       /**
        * Let the caller know that we are "a printer"
  +     *
  +     * @return the type which is always printer
        */
       public int getType() {
           return GraphicsDevice.TYPE_PRINTER;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: fop-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: fop-cvs-help@xml.apache.org