Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre-Charles David2016-03-10 13:58:56 +0000
committerPierre-Charles David2016-03-22 08:01:06 +0000
commit4c5e96f4b45919ccbba25eafdf56f9077fe1bbde (patch)
tree70a648683a7b121b1d10cc33ae80c8ec31016336
parent8e89137623cfab73e00a871685a977b2443ddd57 (diff)
downloadorg.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>
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/SVGFigure.java13
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/SVGWorkspaceImageFigure.java4
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/figure/svg/SimpleImageTranscoder.java7
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();

Back to the top