Skip to content

Commit 663817f

Browse files
committed
Add internal API in SVGrasterizer to rasterize images at given height and width
Adding internal API to SVGRasterizer and simple tests to see if the svgs are loaded at right sizes by the rasterizer
1 parent c6a29a9 commit 663817f

File tree

3 files changed

+83
-18
lines changed

3 files changed

+83
-18
lines changed

bundles/org.eclipse.swt.svg/src/org/eclipse/swt/svg/JSVGRasterizer.java

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -72,34 +72,44 @@ public class JSVGRasterizer implements SVGRasterizer {
7272

7373
@Override
7474
public ImageData rasterizeSVG(InputStream inputStream, int zoom) throws IOException {
75-
SVGDocument svgDocument = loadSVG(inputStream);
76-
if (svgDocument == null) {
77-
SWT.error(SWT.ERROR_INVALID_IMAGE);
78-
}
75+
SVGDocument svgDocument = loadAndValidateSVG(inputStream);
7976
BufferedImage rasterizedImage = renderSVG(svgDocument, zoom);
8077
return convertToSWTImageData(rasterizedImage);
8178
}
82-
83-
private SVGDocument loadSVG(InputStream inputStream) {
84-
return SVG_LOADER.load(inputStream, null, LoaderContext.createDefault());
79+
80+
@Override
81+
public ImageData rasterizeSVG(InputStream inputStream, int width, int height) throws IOException {
82+
SVGDocument svgDocument = loadAndValidateSVG(inputStream);
83+
BufferedImage rasterizedImage = renderSVG(svgDocument, width, height);
84+
return convertToSWTImageData(rasterizedImage);
85+
}
86+
87+
private SVGDocument loadAndValidateSVG(InputStream inputStream) throws IOException {
88+
SVGDocument svgDocument = SVG_LOADER.load(inputStream, null, LoaderContext.createDefault());
89+
if (svgDocument == null) {
90+
SWT.error(SWT.ERROR_INVALID_IMAGE);
91+
}
92+
return svgDocument;
8593
}
8694

8795
private BufferedImage renderSVG(SVGDocument svgDocument, int zoom) {
96+
FloatSize sourceImageSize = svgDocument.size();
8897
float scalingFactor = zoom / 100.0f;
89-
BufferedImage image = createImageBase(svgDocument, scalingFactor);
90-
Graphics2D g = configureRenderingOptions(scalingFactor, image);
98+
int targetImageWidth = calculateTargetWidth(scalingFactor, sourceImageSize);
99+
int targetImageHeight = calculateTargetHeight(scalingFactor, sourceImageSize);
100+
return renderSVG(svgDocument, targetImageWidth, targetImageHeight);
101+
}
102+
103+
private BufferedImage renderSVG(SVGDocument svgDocument, int width, int height) {
104+
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
105+
float widthScalingFactor = width / svgDocument.size().width;
106+
float heightScalingFactor = height / svgDocument.size().height;
107+
Graphics2D g = configureRenderingOptions(widthScalingFactor, heightScalingFactor, image);
91108
svgDocument.render(null, g);
92109
g.dispose();
93110
return image;
94111
}
95112

96-
private BufferedImage createImageBase(SVGDocument svgDocument, float scalingFactor) {
97-
FloatSize sourceImageSize = svgDocument.size();
98-
int targetImageWidth = calculateTargetWidth(scalingFactor, sourceImageSize);
99-
int targetImageHeight = calculateTargetHeight(scalingFactor, sourceImageSize);
100-
return new BufferedImage(targetImageWidth, targetImageHeight, BufferedImage.TYPE_INT_ARGB);
101-
}
102-
103113
private int calculateTargetWidth(float scalingFactor, FloatSize sourceImageSize) {
104114
double sourceImageWidth = sourceImageSize.getWidth();
105115
return (int) Math.round(sourceImageWidth * scalingFactor);
@@ -110,10 +120,10 @@ private int calculateTargetHeight(float scalingFactor, FloatSize sourceImageSize
110120
return (int) Math.round(sourceImageHeight * scalingFactor);
111121
}
112122

113-
private Graphics2D configureRenderingOptions(float scalingFactor, BufferedImage image) {
123+
private Graphics2D configureRenderingOptions(float widthScalingFactor, float heightScalingFactor, BufferedImage image) {
114124
Graphics2D g = image.createGraphics();
115125
g.setRenderingHints(RENDERING_HINTS);
116-
g.scale(scalingFactor, scalingFactor);
126+
g.scale(widthScalingFactor, heightScalingFactor);
117127
return g;
118128
}
119129

bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/image/SVGRasterizer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,6 @@ public interface SVGRasterizer {
3232
* the input is not a valid SVG file or cannot be processed.
3333
*/
3434
public ImageData rasterizeSVG(InputStream stream, int zoom) throws IOException;
35+
36+
public ImageData rasterizeSVG(InputStream stream, int width, int height) throws IOException;
3537
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2024, 2025 Yatta Solutions and others.
3+
*
4+
* This program and the accompanying materials
5+
* are made available under the terms of the Eclipse Public License 2.0
6+
* which accompanies this distribution, and is available at
7+
* https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
*
11+
* Contributors:
12+
* Yatta Solutions - initial API and implementation
13+
*******************************************************************************/
14+
package org.eclipse.swt.tests.junit;
15+
16+
import static org.junit.jupiter.api.Assertions.assertEquals;
17+
18+
import java.io.ByteArrayInputStream;
19+
import java.io.IOException;
20+
import java.nio.charset.StandardCharsets;
21+
22+
import org.eclipse.swt.graphics.ImageData;
23+
import org.eclipse.swt.svg.JSVGRasterizer;
24+
import org.junit.jupiter.api.Test;
25+
26+
class JSVGRasterizerTest {
27+
28+
private final JSVGRasterizer rasterizer = new JSVGRasterizer();
29+
private String svgString = """
30+
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
31+
<rect width="100%" height="100%"/>
32+
</svg>
33+
""";
34+
private ByteArrayInputStream svgStream(String svg) {
35+
return new ByteArrayInputStream(svg.getBytes(StandardCharsets.UTF_8));
36+
}
37+
38+
@Test
39+
void testRasterizeWithZoom() throws IOException {
40+
ImageData data = rasterizer.rasterizeSVG(svgStream(svgString), 200);
41+
assertEquals(200, data.width);
42+
assertEquals(200, data.height);
43+
}
44+
45+
@Test
46+
void testRasterizeWithWidthHeight() throws IOException {
47+
ImageData data = rasterizer.rasterizeSVG(svgStream(svgString), 300, 150);
48+
assertEquals(300, data.width);
49+
assertEquals(150, data.height);
50+
}
51+
52+
53+
}

0 commit comments

Comments
 (0)