Skip to content

Commit 2f57b89

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 35119f0 commit 2f57b89

File tree

4 files changed

+103
-28
lines changed

4 files changed

+103
-28
lines changed

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

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import java.awt.RenderingHints.Key;
3636
import java.awt.image.BufferedImage;
3737
import java.awt.image.DataBufferInt;
38-
import java.io.IOException;
3938
import java.io.InputStream;
4039
import java.util.Map;
4140

@@ -71,35 +70,48 @@ public class JSVGRasterizer implements SVGRasterizer {
7170
);
7271

7372
@Override
74-
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-
}
73+
public ImageData rasterizeSVG(InputStream inputStream, int zoom){
74+
SVGDocument svgDocument = loadAndValidateSVG(inputStream);
7975
BufferedImage rasterizedImage = renderSVG(svgDocument, zoom);
8076
return convertToSWTImageData(rasterizedImage);
8177
}
82-
83-
private SVGDocument loadSVG(InputStream inputStream) {
84-
return SVG_LOADER.load(inputStream, null, LoaderContext.createDefault());
78+
79+
@Override
80+
public ImageData rasterizeSVG(InputStream inputStream, int width, int height){
81+
SVGDocument svgDocument = loadAndValidateSVG(inputStream);
82+
BufferedImage rasterizedImage = renderSVG(svgDocument, width, height);
83+
return convertToSWTImageData(rasterizedImage);
84+
}
85+
86+
private SVGDocument loadAndValidateSVG(InputStream inputStream) {
87+
SVGDocument svgDocument = SVG_LOADER.load(inputStream, null, LoaderContext.createDefault());
88+
if (svgDocument == null) {
89+
SWT.error(SWT.ERROR_INVALID_IMAGE);
90+
}
91+
return svgDocument;
8592
}
8693

8794
private BufferedImage renderSVG(SVGDocument svgDocument, int zoom) {
95+
FloatSize sourceImageSize = svgDocument.size();
8896
float scalingFactor = zoom / 100.0f;
89-
BufferedImage image = createImageBase(svgDocument, scalingFactor);
90-
Graphics2D g = configureRenderingOptions(scalingFactor, image);
97+
int targetImageWidth = calculateTargetWidth(scalingFactor, sourceImageSize);
98+
int targetImageHeight = calculateTargetHeight(scalingFactor, sourceImageSize);
99+
return renderSVG(svgDocument, targetImageWidth, targetImageHeight);
100+
}
101+
102+
private BufferedImage renderSVG(SVGDocument svgDocument, int width, int height) {
103+
if (width <= 0 || height <= 0) {
104+
SWT.error(SWT.ERROR_INVALID_ARGUMENT);
105+
}
106+
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
107+
float widthScalingFactor = width / svgDocument.size().width;
108+
float heightScalingFactor = height / svgDocument.size().height;
109+
Graphics2D g = configureRenderingOptions(widthScalingFactor, heightScalingFactor, image);
91110
svgDocument.render(null, g);
92111
g.dispose();
93112
return image;
94113
}
95114

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-
103115
private int calculateTargetWidth(float scalingFactor, FloatSize sourceImageSize) {
104116
double sourceImageWidth = sourceImageSize.getWidth();
105117
return (int) Math.round(sourceImageWidth * scalingFactor);
@@ -110,10 +122,10 @@ private int calculateTargetHeight(float scalingFactor, FloatSize sourceImageSize
110122
return (int) Math.round(sourceImageHeight * scalingFactor);
111123
}
112124

113-
private Graphics2D configureRenderingOptions(float scalingFactor, BufferedImage image) {
125+
private Graphics2D configureRenderingOptions(float widthScalingFactor, float heightScalingFactor, BufferedImage image) {
114126
Graphics2D g = image.createGraphics();
115127
g.setRenderingHints(RENDERING_HINTS);
116-
g.scale(scalingFactor, scalingFactor);
128+
g.scale(widthScalingFactor, heightScalingFactor);
117129
return g;
118130
}
119131

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,8 @@ List<ElementAtZoom<ImageData>> loadFromByteStream(int fileZoom, int targetZoom)
5151
if (targetZoom <= 0) {
5252
SWT.error(SWT.ERROR_INVALID_ARGUMENT, null, " [Cannot rasterize SVG for zoom <= 0]");
5353
}
54-
try {
55-
ImageData rasterizedImageData = RASTERIZER.rasterizeSVG(inputStream, 100 * targetZoom / fileZoom);
56-
return List.of(new ElementAtZoom<>(rasterizedImageData, targetZoom));
57-
} catch (IOException e) {
58-
SWT.error(SWT.ERROR_INVALID_IMAGE, e);
59-
return List.of();
60-
}
54+
ImageData rasterizedImageData = RASTERIZER.rasterizeSVG(inputStream, 100 * targetZoom / fileZoom);
55+
return List.of(new ElementAtZoom<>(rasterizedImageData, targetZoom));
6156
}
6257

6358
@Override

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import java.io.*;
1616

17+
import org.eclipse.swt.*;
1718
import org.eclipse.swt.graphics.*;
1819

1920
/**
@@ -31,5 +32,20 @@ public interface SVGRasterizer {
3132
* @return the {@link ImageData} for the rasterized image, or {@code null} if
3233
* the input is not a valid SVG file or cannot be processed.
3334
*/
34-
public ImageData rasterizeSVG(InputStream stream, int zoom) throws IOException;
35+
public ImageData rasterizeSVG(InputStream stream, int zoom);
36+
37+
/**
38+
* Rasterizes an SVG image from the provided {@code InputStream} into a
39+
* raster image of the specified width and height.
40+
*
41+
* If {@code width} or {@code height}
42+
* is zero or negative, this method throws an {@link SWT#ERROR_INVALID_ARGUMENT}.
43+
*
44+
* @param stream the SVG image as an {@link InputStream}.
45+
* @param width the width of the rasterized image in pixels (must be positive).
46+
* @param height the height of the rasterized image in pixels (must be positive).
47+
* @return the {@link ImageData} for the rasterized image, or {@code null} if
48+
* the input is not a valid SVG file or cannot be processed.
49+
*/
50+
public ImageData rasterizeSVG(InputStream stream, int width, int height);
3551
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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.nio.charset.StandardCharsets;
20+
21+
import org.eclipse.swt.graphics.ImageData;
22+
import org.eclipse.swt.svg.JSVGRasterizer;
23+
import org.junit.jupiter.api.Test;
24+
25+
class JSVGRasterizerTest {
26+
27+
private final JSVGRasterizer rasterizer = new JSVGRasterizer();
28+
private String svgString = """
29+
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
30+
<rect width="100%" height="100%"/>
31+
</svg>
32+
""";
33+
private ByteArrayInputStream svgStream(String svg) {
34+
return new ByteArrayInputStream(svg.getBytes(StandardCharsets.UTF_8));
35+
}
36+
37+
@Test
38+
void testRasterizeWithZoom(){
39+
ImageData data = rasterizer.rasterizeSVG(svgStream(svgString), 200);
40+
assertEquals(200, data.width);
41+
assertEquals(200, data.height);
42+
}
43+
44+
@Test
45+
void testRasterizeWithWidthHeight(){
46+
ImageData data = rasterizer.rasterizeSVG(svgStream(svgString), 300, 150);
47+
assertEquals(300, data.width);
48+
assertEquals(150, data.height);
49+
}
50+
51+
52+
}

0 commit comments

Comments
 (0)