diff options
author | Simon Steiner <ssteiner@apache.org> | 2024-06-13 15:19:18 +0100 |
---|---|---|
committer | Simon Steiner <ssteiner@apache.org> | 2024-06-13 15:19:18 +0100 |
commit | b8a6ee005de66e26ba4418c611985f68f323e230 (patch) | |
tree | 4f99dc0d3606f485fb07c0c1e9f0d558adbcff30 | |
parent | 742784c4a90d18174682aa871b8d4b35a2ea2d1d (diff) | |
download | xmlgraphics-fop-b8a6ee005de66e26ba4418c611985f68f323e230.tar.gz xmlgraphics-fop-b8a6ee005de66e26ba4418c611985f68f323e230.zip |
FOP-3185: Exclude shape not in clipping path for AFP
-rw-r--r-- | fop-core/src/main/java/org/apache/fop/afp/AFPGraphics2D.java | 23 | ||||
-rw-r--r-- | fop-core/src/test/java/org/apache/fop/afp/AFPGraphics2DTestCase.java | 15 |
2 files changed, 37 insertions, 1 deletions
diff --git a/fop-core/src/main/java/org/apache/fop/afp/AFPGraphics2D.java b/fop-core/src/main/java/org/apache/fop/afp/AFPGraphics2D.java index 88a15ad12..cf0728683 100644 --- a/fop-core/src/main/java/org/apache/fop/afp/AFPGraphics2D.java +++ b/fop-core/src/main/java/org/apache/fop/afp/AFPGraphics2D.java @@ -33,6 +33,7 @@ import java.awt.Rectangle; import java.awt.Shape; import java.awt.Stroke; import java.awt.geom.AffineTransform; +import java.awt.geom.Area; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; import java.awt.geom.PathIterator; @@ -356,6 +357,28 @@ public class AFPGraphics2D extends AbstractGraphics2D implements NativeImageHand * true if the shape is to be drawn filled */ private void doDrawing(Shape shape, boolean fill) { + Shape clip = getClip(); + if (clip != null) { + if (shape instanceof Line2D + && (((Line2D) shape).getX1() == ((Line2D) shape).getX2() + || ((Line2D) shape).getY1() == ((Line2D) shape).getY2())) { + Rectangle2D bounds = shape.getBounds2D(); + Rectangle2D newShape = bounds.createIntersection(clip.getBounds2D()); + ((Line2D) shape).setLine(newShape.getX(), + newShape.getY(), + newShape.getX() + newShape.getWidth(), + newShape.getY() + newShape.getHeight()); + } else if (shape instanceof Rectangle2D) { + Area area = new Area(shape); + area.intersect(new Area(clip)); + shape = area.getBounds2D(); + } else { + Area area = new Area(shape); + if (!area.isEmpty() && !area.intersects(clip.getBounds2D())) { + return; + } + } + } if (!fill) { graphicsObj.newSegment(); } diff --git a/fop-core/src/test/java/org/apache/fop/afp/AFPGraphics2DTestCase.java b/fop-core/src/test/java/org/apache/fop/afp/AFPGraphics2DTestCase.java index 7045e80ee..d6b14af0f 100644 --- a/fop-core/src/test/java/org/apache/fop/afp/AFPGraphics2DTestCase.java +++ b/fop-core/src/test/java/org/apache/fop/afp/AFPGraphics2DTestCase.java @@ -66,7 +66,7 @@ public class AFPGraphics2DTestCase { @Test public void testDrawGraphicsFillet() throws IOException { GraphicContext gc = new GraphicContext(); - gc.setClip(new Rectangle(0, 0, 2, 2)); + gc.setClip(new Rectangle(0, 0, 100, 100)); graphics2D.setGraphicContext(gc); GraphicsObject go = new GraphicsObject(new Factory(), "test"); graphics2D.setGraphicsObject(go); @@ -80,4 +80,17 @@ public class AFPGraphics2DTestCase { int sizeOfGraphicsFillet = 128; Assert.assertEquals(is.read(), sizeOfGraphicsFillet); } + + @Test + public void testDrawGraphicsFilletClipped() throws IOException { + GraphicContext gc = new GraphicContext(); + gc.setClip(new Rectangle(50, 50, 100, 100)); + graphics2D.setGraphicContext(gc); + GraphicsObject go = new GraphicsObject(new Factory(), "test"); + graphics2D.setGraphicsObject(go); + graphics2D.draw(new Ellipse2D.Double(0, 0, 50, 50)); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + go.writeToStream(bos); + Assert.assertEquals(bos.size(), 17 + 17); + } } |