]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Had to introduce "clip-rect" to handle clipping on background images, leader etc...
authorJeremias Maerki <jeremias@apache.org>
Fri, 15 Aug 2008 15:31:55 +0000 (15:31 +0000)
committerJeremias Maerki <jeremias@apache.org>
Fri, 15 Aug 2008 15:31:55 +0000 (15:31 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign@686253 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/render/intermediate/IFConstants.java
src/java/org/apache/fop/render/intermediate/IFGraphicContext.java
src/java/org/apache/fop/render/intermediate/IFPainter.java
src/java/org/apache/fop/render/intermediate/IFParser.java
src/java/org/apache/fop/render/intermediate/IFRenderer.java
src/java/org/apache/fop/render/intermediate/IFSerializer.java
src/java/org/apache/fop/render/pdf/PDFPainter.java
src/sandbox/org/apache/fop/render/svg/AbstractSVGPainter.java

index 8fe09460488482d6740c30a1e4d6cebf1f7590a4..f101ad3637952d3645b7499480e70958cef5f452 100644 (file)
@@ -44,6 +44,7 @@ public interface IFConstants extends XMLConstants {
     String EL_VIEWPORT = "viewport";
     String EL_GROUP = "g";
     String EL_IMAGE = "image";
+    String EL_CLIP_RECT = "clip-rect";
     String EL_RECT = "rect";
     String EL_BORDER_RECT = "border-rect";
     String EL_FONT = "font";
index 6183bbbad5e742697503a1cdf28d017ef45e0258..7250dcc39c27e39d48460b2769ae95a508566df9 100644 (file)
@@ -31,6 +31,8 @@ import org.apache.xmlgraphics.java2d.GraphicContext;
  */
 public class IFGraphicContext extends GraphicContext {
 
+    private static final AffineTransform[] EMPTY_TRANSFORM_ARRAY = new AffineTransform[0];
+
     private List groupList = new java.util.ArrayList();
 
     /**
@@ -88,6 +90,10 @@ public class IFGraphicContext extends GraphicContext {
             this(new AffineTransform[] {transform});
         }
 
+        public Group() {
+            this(EMPTY_TRANSFORM_ARRAY);
+        }
+
         public AffineTransform[] getTransforms() {
             return this.transforms;
         }
index 6042ed816367f4543020f6c3f2b0a05e4d86055f..4722a02acc0282aad9e06b0be93752a7acba08f9 100644 (file)
@@ -268,6 +268,14 @@ public interface IFPainter {
      */
     void drawText(int x, int y, int[] dx, int[] dy, String text) throws IFException;
 
+    /**
+     * Restricts the current clipping region with the given rectangle.
+     * @param rect the rectangle's coordinates and extent
+     * @throws IFException if an error occurs while handling this event
+     */
+    void clipRect(Rectangle rect) throws IFException;
+    //TODO clipRect() shall be considered temporary until verified with SVG and PCL
+
     /**
      * Draws a rectangle. Either fill or stroke has to be specified.
      * @param rect the rectangle's coordinates and extent
index e365bb5196fb6495c73100c6a2c9152996a4f52d..50c061ff4c90ca80a751ae70ee41ead1fa5de1e9 100644 (file)
@@ -136,6 +136,7 @@ public class IFParser implements IFConstants {
             elementHandlers.put(EL_GROUP, new GroupHandler());
             elementHandlers.put(EL_FONT, new FontHandler());
             elementHandlers.put(EL_TEXT, new TextHandler());
+            elementHandlers.put(EL_CLIP_RECT, new ClipRectHandler());
             elementHandlers.put(EL_RECT, new RectHandler());
             elementHandlers.put(EL_BORDER_RECT, new BorderRectHandler());
             elementHandlers.put(EL_IMAGE, new ImageHandler());
@@ -441,6 +442,18 @@ public class IFParser implements IFConstants {
 
         }
 
+        private class ClipRectHandler extends AbstractElementHandler {
+
+            public void startElement(Attributes attributes) throws IFException {
+                int x = Integer.parseInt(attributes.getValue("x"));
+                int y = Integer.parseInt(attributes.getValue("y"));
+                int width = Integer.parseInt(attributes.getValue("width"));
+                int height = Integer.parseInt(attributes.getValue("height"));
+                painter.clipRect(new Rectangle(x, y, width, height));
+            }
+
+        }
+
         private class RectHandler extends AbstractElementHandler {
 
             public void startElement(Attributes attributes) throws IFException {
index 19c616df12e8970741d16a74944c5ac2b00ff9d7..0b74987b54a3a3ba7d7b886927488f8e7978b689 100644 (file)
@@ -584,12 +584,12 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
     /** {@inheritDoc} */
     protected void concatenateTransformationMatrix(AffineTransform at) {
         if (!at.isIdentity()) {
-            concatenateTransformationMatrixMpt(ptToMpt(at));
+            concatenateTransformationMatrixMpt(ptToMpt(at), false);
         }
     }
 
-    private void concatenateTransformationMatrixMpt(AffineTransform at) {
-        if (!at.isIdentity()) {
+    private void concatenateTransformationMatrixMpt(AffineTransform at, boolean force) {
+        if (force || !at.isIdentity()) {
             if (log.isTraceEnabled()) {
                 log.trace("-----concatenateTransformationMatrix: " + at);
             }
@@ -659,7 +659,7 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
 
             saveGraphicsState();
             //Viewport position
-            concatenateTransformationMatrixMpt(positionTransform);
+            concatenateTransformationMatrixMpt(positionTransform, false);
 
             //Background and borders
             float bpwidth = (borderPaddingStart + bv.getBorderAndPaddingWidthEnd());
@@ -670,7 +670,7 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
             //Shift to content rectangle after border painting
             AffineTransform contentRectTransform = new AffineTransform();
             contentRectTransform.translate(borderPaddingStart, borderPaddingBefore);
-            concatenateTransformationMatrixMpt(contentRectTransform);
+            concatenateTransformationMatrixMpt(contentRectTransform, false);
 
             //Clipping
             Rectangle clipRect = null;
@@ -994,20 +994,22 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
 
     /** {@inheritDoc} */
     protected void clip() {
-        // TODO Auto-generated method stub
-        log.warn("clip() NYI");
+        throw new IllegalStateException("Not used");
     }
 
     /** {@inheritDoc} */
     protected void clipRect(float x, float y, float width, float height) {
-        // TODO Auto-generated method stub
-        log.warn("clipRect() NYI");
+        pushGroup(new IFGraphicContext.Group());
+        try {
+            painter.clipRect(toMillipointRectangle(x, y, width, height));
+        } catch (IFException ife) {
+            handleIFException(ife);
+        }
     }
 
     /** {@inheritDoc} */
     protected void closePath() {
-        // TODO Auto-generated method stub
-        log.warn("closePath() NYI");
+        throw new IllegalStateException("Not used");
     }
 
     /** {@inheritDoc} */
@@ -1056,14 +1058,12 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
 
     /** {@inheritDoc} */
     protected void moveTo(float x, float y) {
-        // TODO Auto-generated method stub
-        log.warn("moveTo() NYI");
+        throw new IllegalStateException("Not used");
     }
 
     /** {@inheritDoc} */
     protected void lineTo(float x, float y) {
-        // TODO Auto-generated method stub
-        log.warn("lineTo() NYI");
+        throw new IllegalStateException("Not used");
     }
 
     /** {@inheritDoc} */
index 40cd9a25bfde93bfbc630297cde50577febdf678..4eb7f07139711d3ca78a98f063a9534aa73726a9 100644 (file)
@@ -349,6 +349,20 @@ public class IFSerializer extends AbstractXMLWritingIFPainter implements IFConst
         }
     }
 
+    /** {@inheritDoc} */
+    public void clipRect(Rectangle rect) throws IFException {
+        try {
+            AttributesImpl atts = new AttributesImpl();
+            addAttribute(atts, "x", Integer.toString(rect.x));
+            addAttribute(atts, "y", Integer.toString(rect.y));
+            addAttribute(atts, "width", Integer.toString(rect.width));
+            addAttribute(atts, "height", Integer.toString(rect.height));
+            element(EL_CLIP_RECT, atts);
+        } catch (SAXException e) {
+            throw new IFException("SAX error in clipRect()", e);
+        }
+    }
+
     /** {@inheritDoc} */
     public void drawRect(Rectangle rect, Paint fill, Color stroke) throws IFException {
         if (fill == null && stroke == null) {
index 2d1399814bd19e9b4b57474d2b1c73759c696517..0ddfd832422aee4c9892a485d5bf2f3f627efbcc 100644 (file)
@@ -241,12 +241,7 @@ public class PDFPainter extends AbstractBinaryWritingIFPainter {
         generator.saveGraphicsState();
         generator.concatenate(generator.toPoints(transform));
         if (clipRect != null) {
-            StringBuffer sb = new StringBuffer();
-            sb.append(format(clipRect.x)).append(' ');
-            sb.append(format(clipRect.y)).append(' ');
-            sb.append(format(clipRect.width)).append(' ');
-            sb.append(format(clipRect.height)).append(" re W n\n");
-            generator.add(sb.toString());
+            clipRect(clipRect);
         }
     }
 
@@ -329,6 +324,17 @@ public class PDFPainter extends AbstractBinaryWritingIFPainter {
         return PDFNumber.doubleOut(value / 1000f);
     }
 
+    /** {@inheritDoc} */
+    public void clipRect(Rectangle rect) throws IFException {
+        generator.endTextObject();
+        StringBuffer sb = new StringBuffer();
+        sb.append(format(rect.x)).append(' ');
+        sb.append(format(rect.y)).append(' ');
+        sb.append(format(rect.width)).append(' ');
+        sb.append(format(rect.height)).append(" re W n\n");
+        generator.add(sb.toString());
+    }
+
     /** {@inheritDoc} */
     public void drawRect(Rectangle rect, Paint fill, Color stroke) throws IFException {
         if (fill == null && stroke == null) {
@@ -365,8 +371,10 @@ public class PDFPainter extends AbstractBinaryWritingIFPainter {
     /** {@inheritDoc} */
     public void drawBorderRect(Rectangle rect, BorderProps before, BorderProps after,
             BorderProps start, BorderProps end) throws IFException {
-        generator.endTextObject();
-        this.borderPainter.drawBorders(rect, before, after, start, end);
+        if (before != null || after != null || start != null || end != null) {
+            generator.endTextObject();
+            this.borderPainter.drawBorders(rect, before, after, start, end);
+        }
     }
 
     private Typeface getTypeface(String fontName) {
@@ -387,6 +395,7 @@ public class PDFPainter extends AbstractBinaryWritingIFPainter {
         FontTriplet triplet = new FontTriplet(
                 state.getFontFamily(), state.getFontStyle(), state.getFontWeight());
         //TODO Ignored: state.getFontVariant()
+        //TODO Opportunity for font caching if font state is more heavily used
         String fontKey = fontInfo.getInternalFontKey(triplet);
         int sizeMillipoints = state.getFontSize();
         float fontSize = sizeMillipoints / 1000f;
@@ -431,7 +440,7 @@ public class PDFPainter extends AbstractBinaryWritingIFPainter {
                 if (CharUtilities.isFixedWidthSpace(orgChar)) {
                     //Fixed width space are rendered as spaces so copy/paste works in a reader
                     ch = font.mapChar(CharUtilities.SPACE);
-                    glyphAdjust = font.getCharWidth(ch) - font.getCharWidth(orgChar);
+                    glyphAdjust = -(font.getCharWidth(ch) - font.getCharWidth(orgChar));
                 } else {
                     ch = font.mapChar(orgChar);
                 }
index e32b9f93705c2ffc5ab96aafbd7d0883368e1f9d..80fcde0df94734103f2fccd990a23a249f35c477 100644 (file)
@@ -278,6 +278,11 @@ public abstract class AbstractSVGPainter extends AbstractXMLWritingIFPainter
         }
     }
 
+    /** {@inheritDoc} */
+    public void clipRect(Rectangle rect) throws IFException {
+        //TODO Implement me!!!
+    }
+
     /** {@inheritDoc} */
     public void drawRect(Rectangle rect, Paint fill, Color stroke) throws IFException {
         if (fill == null && stroke == null) {