diff options
author | Pierre-Charles David | 2016-03-10 13:58:56 +0000 |
---|---|---|
committer | Pierre-Charles David | 2016-03-22 08:01:06 +0000 |
commit | 4c5e96f4b45919ccbba25eafdf56f9077fe1bbde (patch) | |
tree | 70a648683a7b121b1d10cc33ae80c8ec31016336 | |
parent | 8e89137623cfab73e00a871685a977b2443ddd57 (diff) | |
download | org.eclipse.sirius-4c5e96f4b45919ccbba25eafdf56f9077fe1bbde.tar.gz org.eclipse.sirius-4c5e96f4b45919ccbba25eafdf56f9077fe1bbde.tar.xz org.eclipse.sirius-4c5e96f4b45919ccbba25eafdf56f9077fe1bbde.zip |
[442268] Use PrecisionRectangle for scaling
Some rounding errors can occur when scaling plain Rectangles which
apparently can cause inconsistencies and then crashes in Batik and/or
AWT (java.awt.ImageOpException) when rendering some SVGs, particulary
stroke.svg. This caused failures in LineStyleTest which uses stroke.svg.
Use PrecisionRectangle for all our rectangle scaling operations to avoid
the issue.
Bug: 442268
Change-Id: I085dc50bd3f491ba28e84372ec27e9f8db1dce7e
Signed-off-by: Pierre-Charles David <pierre-charles.david@obeo.fr>
3 files changed, 13 insertions, 11 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/SVGFigure.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/SVGFigure.java index 7b5438fec1..e6ecb5660c 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/SVGFigure.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/SVGFigure.java @@ -22,6 +22,7 @@ import org.apache.batik.util.XMLResourceDescriptor; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.XYLayout; +import org.eclipse.draw2d.geometry.PrecisionRectangle; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.sirius.common.tools.api.util.StringUtil; import org.eclipse.sirius.diagram.DiagramPlugin; @@ -300,13 +301,13 @@ public class SVGFigure extends Figure implements StyledFigure, ITransparentFigur result.append(SVGFigure.SEPARATOR); result.append(aaText); result.append(SVGFigure.SEPARATOR); - Rectangle r = getClientArea().getCopy(); + Rectangle r = new PrecisionRectangle(getClientArea()); if (CACHE_SCALED_IMAGES && graphics != null) { r.performScale(graphics.getAbsoluteScale()); } - result.append(r.width); + result.append(r.width()); result.append(SVGFigure.SEPARATOR); - result.append(r.height); + result.append(r.height()); return result.toString(); } @@ -317,16 +318,16 @@ public class SVGFigure extends Figure implements StyledFigure, ITransparentFigur modifier.pushState(); Rectangle svgArea = getClientArea(); if (CACHE_SCALED_IMAGES) { - Rectangle scaledArea = new Rectangle(svgArea); + Rectangle scaledArea = new PrecisionRectangle(svgArea); scaledArea.performScale(graphics.getAbsoluteScale()); Image image = getImage(svgArea, graphics); if (image != null) { - graphics.drawImage(image, 0, 0, scaledArea.width, scaledArea.height, svgArea.x, svgArea.y, svgArea.width, svgArea.height); + graphics.drawImage(image, 0, 0, scaledArea.width(), scaledArea.height(), svgArea.x(), svgArea.y(), svgArea.width(), svgArea.height()); } } else { Image image = getImage(svgArea, graphics); if (image != null) { - graphics.drawImage(image, svgArea.x, svgArea.y); + graphics.drawImage(image, svgArea.x(), svgArea.y()); } } modifier.popState(); diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/SVGWorkspaceImageFigure.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/SVGWorkspaceImageFigure.java index 4f976ffa78..4f7de67992 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/SVGWorkspaceImageFigure.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/SVGWorkspaceImageFigure.java @@ -15,7 +15,7 @@ import java.io.File; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.draw2d.geometry.Dimension; -import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.draw2d.geometry.PrecisionRectangle; import org.eclipse.sirius.common.tools.api.resource.FileProvider; import org.eclipse.sirius.diagram.ContainerStyle; import org.eclipse.sirius.diagram.FlatContainerStyle; @@ -186,7 +186,7 @@ public class SVGWorkspaceImageFigure extends SVGFigure implements IWorkspaceImag SVGWorkspaceImageFigure fig = new SVGWorkspaceImageFigure(); fig.updateImageURI(path); fig.contentChanged(); - return fig.getImage(new Rectangle(0, 0, -1, -1), null); + return fig.getImage(new PrecisionRectangle(0, 0, -1, -1), null); } /** diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/figure/svg/SimpleImageTranscoder.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/figure/svg/SimpleImageTranscoder.java index 6cf8150ed8..793ad048ef 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/figure/svg/SimpleImageTranscoder.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/figure/svg/SimpleImageTranscoder.java @@ -25,6 +25,7 @@ import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.ImageTranscoder; import org.eclipse.draw2d.Graphics; +import org.eclipse.draw2d.geometry.PrecisionRectangle; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.sirius.diagram.DiagramPlugin; import org.eclipse.sirius.diagram.ui.provider.Messages; @@ -125,11 +126,11 @@ public class SimpleImageTranscoder extends SVGAbstractTranscoder { Image result = null; if (document != null) { if (scaleImage && graphics != null) { - Rectangle scaledArea = new Rectangle(clientArea); + PrecisionRectangle scaledArea = new PrecisionRectangle(clientArea); scaledArea.performScale(graphics.getAbsoluteScale()); - setCanvasSize(scaledArea.width, scaledArea.height); + setCanvasSize(scaledArea.width(), scaledArea.height()); } else { - setCanvasSize(clientArea.width, clientArea.height); + setCanvasSize(clientArea.width(), clientArea.height()); } updateRenderingHints(graphics); BufferedImage awtImage = getBufferedImage(); |