keiron      01/06/26 05:21:47

  Modified:    src/org/apache/fop/render/pdf PDFRenderer.java
               src/org/apache/fop/svg PDFGraphics2D.java
  Added:       src/org/apache/fop/svg PDFTextPainter.java
  Log:
  added initial impl of text painter that uses pdf fonts
  rather than stroking
  
  Revision  Changes    Path
  1.71      +10 -6     xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java
  
  Index: PDFRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java,v
  retrieving revision 1.70
  retrieving revision 1.71
  diff -u -r1.70 -r1.71
  --- PDFRenderer.java  2001/06/25 14:15:45     1.70
  +++ PDFRenderer.java  2001/06/26 12:21:34     1.71
  @@ -1,4 +1,4 @@
  -/* $Id: PDFRenderer.java,v 1.70 2001/06/25 14:15:45 keiron Exp $
  +/* $Id: PDFRenderer.java,v 1.71 2001/06/26 12:21:34 keiron Exp $
    * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
    * LICENSE file included with these sources."
  @@ -371,7 +371,7 @@
           UserAgent userAgent = new MUserAgent(new AffineTransform());
   
           GVTBuilder builder = new GVTBuilder();
  -        GraphicsNodeRenderContext rc = getRenderContext();
  +        GraphicsNodeRenderContext rc = getRenderContext(fs);
           BridgeContext ctx = new BridgeContext(userAgent, rc);
           GraphicsNode root;
           PDFGraphics2D graphics =
  @@ -392,7 +392,7 @@
           currentStream.add("Q\n");
       }
   
  -    public GraphicsNodeRenderContext getRenderContext() {
  +    public GraphicsNodeRenderContext getRenderContext(FontState fs) {
           GraphicsNodeRenderContext nodeRenderContext = null;
           if (nodeRenderContext == null) {
               RenderingHints hints = new RenderingHints(null);
  @@ -406,9 +406,13 @@
                 new FontRenderContext(new AffineTransform(), true,
                                       true);
   
  -            TextPainter textPainter = new StrokingTextPainter();
  -            //TextPainter textPainter = new PDFTextPainter();
  -
  +            TextPainter textPainter = null;
  +            Boolean bl = 
org.apache.fop.configuration.Configuration.getBooleanValue("strokeSVGText");
  +            if(bl == null || bl.booleanValue()) {
  +                textPainter = new StrokingTextPainter();
  +            } else {
  +                textPainter = new PDFTextPainter(fs);
  +            }
               GraphicsNodeRableFactory gnrFactory =
                 new ConcreteGraphicsNodeRableFactory();
   
  
  
  
  1.8       +42 -7     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.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- PDFGraphics2D.java        2001/06/18 08:19:20     1.7
  +++ PDFGraphics2D.java        2001/06/26 12:21:43     1.8
  @@ -1,4 +1,4 @@
  -/* $Id: PDFGraphics2D.java,v 1.7 2001/06/18 08:19:20 keiron Exp $
  +/* $Id: PDFGraphics2D.java,v 1.8 2001/06/26 12:21:43 keiron Exp $
    * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
    * LICENSE file included with these sources."
  @@ -38,7 +38,7 @@
    * implementing a <tt>Graphic2D</tt> piece-meal.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Keiron Liddle</a>
  - * @version $Id: PDFGraphics2D.java,v 1.7 2001/06/18 08:19:20 keiron Exp $
  + * @version $Id: PDFGraphics2D.java,v 1.8 2001/06/26 12:21:43 keiron Exp $
    * @see org.apache.batik.ext.awt.g2d.AbstractGraphics2D
    */
   public class PDFGraphics2D extends AbstractGraphics2D {
  @@ -688,6 +688,7 @@
       public void drawString(String s, float x, float y) {
           System.out.println("drawString(String)");
           currentStream.write("BT\n");
  +
         Shape imclip = getClip();
         writeClip(imclip);
           Color c = getColor();
  @@ -697,15 +698,40 @@
           PDFColor col = new PDFColor(c.getRed(), c.getGreen(), c.getBlue());
           currentStream.write(col.getColorSpaceOut(false));
   
  +        Font gFont = getFont();
  +        String name = gFont.getName();
  +        if(name.equals("sanserif")) {
  +            name = "sans-serif";
  +        }
  +        int size = gFont.getSize();
  +        String style = gFont.isItalic() ? "italic" : "normal";
  +        String weight = gFont.isBold() ? "bold" : "normal";
  +        try {
  +            fontState = new FontState(fontState.getFontInfo(), name,
  +                                      style, weight, size * 1000, 0);
  +        } catch(org.apache.fop.apps.FOPException fope) {
  +            fope.printStackTrace();
  +        }
  +        name = fontState.getFontName();
  +        size = fontState.getFontSize() / 1000;
  +
  +//System.out.println("ffn:" + gFont.getFontName() + "fn:" + gFont.getName() + " 
ff:" + gFont.getFamily() + " fs:" + fontState.getFontName());
  +
  +            if ((!name.equals(this.currentFontName)) ||
  +                    (size != this.currentFontSize)) {
  +                this.currentFontName = name;
  +                this.currentFontSize = size;
  +                currentStream.write("/" + name + " " + size + " Tf\n");
  +
  +            }
           AffineTransform trans = getTransform();
           trans.translate(x, y);
           double[] vals = new double[6];
           trans.getMatrix(vals);
   
           currentStream.write(PDFNumber.doubleOut(vals[0]) + " " + 
PDFNumber.doubleOut(vals[1]) + " "
  -+ PDFNumber.doubleOut(vals[2]) + " " + PDFNumber.doubleOut(vals[3]) + " " + 
PDFNumber.doubleOut(vals[4])
  -+ " " + PDFNumber.doubleOut(vals[5]) + " " +
  -                           PDFNumber.doubleOut(vals[6]) + " Tm [" + s + "]");
  ++ PDFNumber.doubleOut(vals[2]) + " " + PDFNumber.doubleOut(-vals[3]) + " " + 
PDFNumber.doubleOut(vals[4])
  ++ " " + PDFNumber.doubleOut(vals[5]) + " Tm (" + s + ") Tj\n");
   
           currentStream.write("ET\n");
       }
  @@ -755,10 +781,19 @@
           for(char ch = iterator.first(); ch != CharacterIterator.DONE; ch = 
iterator.next()) {
               Map attr = iterator.getAttributes();
   
  +            String name = fontState.getFontName();
  +            int size = fontState.getFontSize();
  +            if ((!name.equals(this.currentFontName)) ||
  +                    (size != this.currentFontSize)) {
  +                this.currentFontName = name;
  +                this.currentFontSize = size;
  +                currentStream.write("/" + name + " " + (size / 1000) + " Tf\n");
  +
  +            }
  +
               currentStream.write(PDFNumber.doubleOut(vals[0]) + " " + 
PDFNumber.doubleOut(vals[1]) + " "
   + PDFNumber.doubleOut(vals[2]) + " " + PDFNumber.doubleOut(vals[3]) + " " + 
PDFNumber.doubleOut(vals[4])
  -+ " " + PDFNumber.doubleOut(vals[5]) + " " +
  -                           PDFNumber.doubleOut(vals[6]) + " Tm [" + ch + "]");
  ++ " " + PDFNumber.doubleOut(vals[5]) + " Tm (" + ch + ") Tj\n");
           }
   
           currentStream.write("ET\n");
  
  
  
  1.1                  xml-fop/src/org/apache/fop/svg/PDFTextPainter.java
  
  Index: PDFTextPainter.java
  ===================================================================
  /*****************************************************************************
   * Copyright (C) The Apache Software Foundation. All rights reserved.        *
   * ------------------------------------------------------------------------- *
   * This software is published under the terms of the Apache Software License *
   * version 1.1, a copy of which has been included with this distribution in  *
   * the LICENSE file.                                                         *
   *****************************************************************************/
  
  package org.apache.fop.svg;
  
  import java.awt.Graphics2D;
  import java.awt.Shape;
  import java.text.AttributedCharacterIterator;
  import java.awt.font.FontRenderContext;
  import java.awt.geom.Point2D;
  import java.awt.geom.Rectangle2D;
  
  import java.text.AttributedCharacterIterator;
  import java.text.AttributedString;
  import java.text.CharacterIterator;
  import java.awt.font.TextLayout;
  import java.util.ArrayList;
  import java.util.HashSet;
  import java.util.List;
  
  import org.apache.batik.gvt.text.Mark;
  import org.apache.batik.gvt.*;
  import org.apache.batik.gvt.text.*;
  import org.apache.batik.gvt.renderer.*;
  
  import org.apache.fop.layout.*;
  
  /**
   * Renders the attributed character iterator of a <tt>TextNode</tt>.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Keiron Liddle</a>
   * @version $Id: PDFTextPainter.java,v 1.1 2001/06/26 12:21:45 keiron Exp $
   */
  public class PDFTextPainter implements TextPainter {
  FontState fontState;
  
  public PDFTextPainter(FontState fs)
  {
  fontState = fs;
  }
  
      /**
       * Paints the specified attributed character iterator using the
       * specified Graphics2D and context and font context.
       * @param node the TextNode to paint
       * @param g2d the Graphics2D to use
       * @param context the rendering context.
       */
      public void paint(TextNode node,
                 Graphics2D g2d,
                 GraphicsNodeRenderContext context)
      {
  System.out.println("PDFText paint");
  String txt = node.getText();
  Point2D loc = node.getLocation();
  g2d.drawString(txt, (float)loc.getX(), (float)loc.getY());
  }
  
      /**
       * Initiates a text selection on a particular AttributedCharacterIterator,
       * using the text/font metrics employed by this TextPainter instance.
       * @param x the x coordinate, in the text layout's coordinate system,
       *       of the selection event.
       * @param y the y coordinate, in the text layout's coordinate system,
       *       of the selection event.
       * @param aci the AttributedCharacterIterator describing the text
       * @param context the GraphicsNodeRenderContext to use when doing text layout.
       * @return an instance of Mark which encapsulates the state necessary to
       * implement hit testing and text selection.
       */
      public Mark selectAt(double x, double y, AttributedCharacterIterator aci,
                           TextNode node, GraphicsNodeRenderContext context)
  {
  System.out.println("PDFText selectAt");
  return null;
  }
  
      /**
       * Continues a text selection on a particular AttributedCharacterIterator,
       * using the text/font metrics employed by this TextPainter instance.
       * @param x the x coordinate, in the text layout's coordinate system,
       *       of the selection event.
       * @param y the y coordinate, in the text layout's coordinate system,
       *       of the selection event.
       * @param aci the AttributedCharacterIterator describing the text
       * @param context the GraphicsNodeRenderContext to use when doing text layout.
       * @return an instance of Mark which encapsulates the state necessary to
       * implement hit testing and text selection.
       */
      public Mark selectTo(double x, double y, Mark beginMark,
                              AttributedCharacterIterator aci,
                              TextNode node, GraphicsNodeRenderContext context)
  {
  System.out.println("PDFText selectTo");
  return null;
  }
  
      /**
       * Select all of the text represented by an AttributedCharacterIterator,
       * using the text/font metrics employed by this TextPainter instance.
       * @param x the x coordinate, in the text layout's coordinate system,
       *       of the selection event.
       * @param y the y coordinate, in the text layout's coordinate system,
       *       of the selection event.
       * @param aci the AttributedCharacterIterator describing the text
       * @param context the GraphicsNodeRenderContext to use when doing text layout.
       * @return an instance of Mark which encapsulates the state necessary to
       * implement hit testing and text selection.
       */
      public Mark selectAll(double x, double y,
                              AttributedCharacterIterator aci,
                              TextNode node, GraphicsNodeRenderContext context)
  {
  System.out.println("PDFText selectAll");
  return null;
  }
  
  
      /**
       * Selects the first glyph in the text node.
       */
      public Mark selectFirst(double x, double y,
                              AttributedCharacterIterator aci,
                              TextNode node,
                              GraphicsNodeRenderContext context)
  {
  System.out.println("PDFText selectFirst");
  return null;
  }
  
  
      /**
       * Selects the last glyph in the text node.
       */
      public Mark selectLast(double x, double y,
                              AttributedCharacterIterator aci,
                              TextNode node,
                              GraphicsNodeRenderContext context)
  {
  System.out.println("PDFText selectLast");
  return null;
  }
  
      /*
       * Get an array of index pairs corresponding to the indices within an
       * AttributedCharacterIterator regions bounded by two Marks.
       * Note that the instances of Mark passed to this function
       * <em>must come</em>
       * from the same TextPainter that generated them via selectAt() and
       * selectTo(), since the TextPainter implementation may rely on hidden
       * implementation details of its own Mark implementation.
       */
      public int[] getSelected(AttributedCharacterIterator aci,
                               Mark start, Mark finish)
  {
  System.out.println("PDFText getSelected");
  return null;
  }
  
  
      /*
       * Get a Shape in userspace coords which encloses the textnode
       * glyphs bounded by two Marks.
       * Note that the instances of Mark passed to this function
       * <em>must come</em>
       * from the same TextPainter that generated them via selectAt() and
       * selectTo(), since the TextPainter implementation may rely on hidden
       * implementation details of its own Mark implementation.
       */
       public Shape getHighlightShape(Mark beginMark, Mark endMark)
  {
  System.out.println("PDFText getHighlightShape");
  return null;
  }
  
      /*
       * Get a Shape in userspace coords which defines the textnode glyph outlines.
       * @param node the TextNode to measure
       * @param frc the font rendering context.
       * @param includeDecoration whether to include text decoration
       *            outlines.
       * @param includeStroke whether to create the "stroke shape outlines"
       *            instead of glyph outlines.
       */
       public Shape getShape(TextNode node, FontRenderContext frc)
  {
  System.out.println("PDFText getShape");
  return null;
  }
  
      /*
       * Get a Shape in userspace coords which defines the textnode glyph outlines.
       * @param node the TextNode to measure
       * @param frc the font rendering context.
       * @param includeDecoration whether to include text decoration
       *            outlines.
       * @param includeStroke whether to create the "stroke shape outlines"
       *            instead of glyph outlines.
       */
       public Shape getDecoratedShape(TextNode node, FontRenderContext frc)
  {
  System.out.println("PDFText getDecoratedShape");
  return null;
  }
  
      /*
       * Get a Rectangle2D in userspace coords which encloses the textnode
       * glyphs composed from an AttributedCharacterIterator.
       * @param node the TextNode to measure
       * @param g2d the Graphics2D to use
       * @param context rendering context.
       */
       public Rectangle2D getBounds(TextNode node,
                 FontRenderContext frc)
  {
  System.out.println("PDFText getBounds");
  return null;
  }
  
      /*
       * Get a Rectangle2D in userspace coords which encloses the textnode
       * glyphs composed from an AttributedCharacterIterator, inclusive of
       * glyph decoration (underline, overline, strikethrough).
       * @param node the TextNode to measure
       * @param g2d the Graphics2D to use
       * @param context rendering context.
       */
       public Rectangle2D getDecoratedBounds(TextNode node,
                 FontRenderContext frc)
  {
  System.out.println("PDFText getDecoratedBounds");
  return null;
  }
  
      /*
       * Get a Rectangle2D in userspace coords which encloses the
       * textnode glyphs (as-painted, inclusive of decoration and stroke, but
       * exclusive of filters, etc.) composed from an AttributedCharacterIterator.
       * @param node the TextNode to measure
       * @param g2d the Graphics2D to use
       * @param context rendering context.
       */
       public Rectangle2D getPaintedBounds(TextNode node,
                 FontRenderContext frc)
  {
  System.out.println("PDFText getPaintedBounds");
  return null;
  }
  
  
  }
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to