Skip to content

Commit e769db4

Browse files
Michael5601HannesWell
authored andcommitted
Enable Loading of SVGs in arbitrary sized for ImageDataProvider
1 parent 037c5d7 commit e769db4

File tree

3 files changed

+54
-38
lines changed

3 files changed

+54
-38
lines changed

bundles/org.eclipse.jface/.settings/org.eclipse.jdt.core.prefs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ org.eclipse.jdt.core.compiler.problem.deadCode=warning
4646
org.eclipse.jdt.core.compiler.problem.deprecation=warning
4747
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
4848
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
49-
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
49+
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
5050
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
5151
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
5252
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error

bundles/org.eclipse.jface/src/org/eclipse/jface/resource/FileImageDescriptor.java

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
*******************************************************************************/
1717
package org.eclipse.jface.resource;
1818

19-
import java.io.BufferedInputStream;
19+
import static org.eclipse.jface.resource.URLImageDescriptor.loadImageData;
20+
2021
import java.io.FileInputStream;
2122
import java.io.FileNotFoundException;
2223
import java.io.IOException;
@@ -32,7 +33,6 @@
3233
import org.eclipse.core.runtime.Status;
3334
import org.eclipse.jface.internal.InternalPolicy;
3435
import org.eclipse.jface.util.Policy;
35-
import org.eclipse.swt.SWT;
3636
import org.eclipse.swt.SWTException;
3737
import org.eclipse.swt.graphics.Device;
3838
import org.eclipse.swt.graphics.Image;
@@ -122,20 +122,7 @@ public boolean equals(Object o) {
122122
*/
123123
@Override
124124
public ImageData getImageData(int zoom) {
125-
InputStream in = getStream(zoom);
126-
if (in != null) {
127-
try (BufferedInputStream stream = new BufferedInputStream(in)) {
128-
return new ImageData(stream);
129-
} catch (SWTException e) {
130-
if (e.code != SWT.ERROR_INVALID_IMAGE) {
131-
throw e;
132-
// fall through otherwise
133-
}
134-
} catch (IOException ioe) {
135-
// fall through
136-
}
137-
}
138-
return null;
125+
return getImageData(name, zoom);
139126
}
140127

141128
/**
@@ -146,19 +133,20 @@ public ImageData getImageData(int zoom) {
146133
* @return the buffered stream on the file or <code>null</code> if the
147134
* file cannot be found
148135
*/
149-
private InputStream getStream(int zoom) {
150-
if (zoom == 100) {
151-
return getStream(name);
136+
@SuppressWarnings("resource")
137+
private ImageData getImageData(String name, int zoom) {
138+
if (zoom == 100 || URLImageDescriptor.canLoadAtZoom(() -> getStream(name), zoom)) {
139+
return loadImageData(getStream(name), 100, zoom);
152140
}
153141

154142
InputStream xstream = getStream(getxName(name, zoom));
155143
if (xstream != null) {
156-
return xstream;
144+
return loadImageData(xstream, zoom, zoom);
157145
}
158146

159147
InputStream xpath = getStream(getxPath(name, zoom));
160148
if (xpath != null) {
161-
return xpath;
149+
return loadImageData(xpath, zoom, zoom);
162150
}
163151

164152
return null;

bundles/org.eclipse.jface/src/org/eclipse/jface/resource/URLImageDescriptor.java

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717
*******************************************************************************/
1818
package org.eclipse.jface.resource;
1919

20+
2021
import java.io.BufferedInputStream;
2122
import java.io.IOException;
2223
import java.io.InputStream;
2324
import java.net.MalformedURLException;
2425
import java.net.URL;
2526
import java.nio.file.Files;
2627
import java.nio.file.Path;
28+
import java.util.function.Supplier;
2729

2830
import org.eclipse.core.runtime.FileLocator;
2931
import org.eclipse.core.runtime.IAdaptable;
@@ -38,6 +40,10 @@
3840
import org.eclipse.swt.graphics.ImageData;
3941
import org.eclipse.swt.graphics.ImageDataProvider;
4042
import org.eclipse.swt.graphics.ImageFileNameProvider;
43+
import org.eclipse.swt.graphics.ImageLoader;
44+
import org.eclipse.swt.internal.DPIUtil.ElementAtZoom;
45+
import org.eclipse.swt.internal.NativeImageLoader;
46+
import org.eclipse.swt.internal.image.FileFormat;
4147

4248
/**
4349
* An ImageDescriptor that gets its information from a URL. This class is not
@@ -127,7 +133,7 @@ public boolean equals(Object o) {
127133
@Deprecated
128134
@Override
129135
public ImageData getImageData() {
130-
return getImageData(getURL(url));
136+
return getImageData(getURL(url), 100, 100);
131137
}
132138

133139
@Override
@@ -138,12 +144,12 @@ public ImageData getImageData(int zoom) {
138144
private static ImageData getImageData(String url, int zoom) {
139145
URL tempURL = getURL(url);
140146
if (tempURL != null) {
141-
if (zoom == 100) {
142-
return getImageData(tempURL);
147+
if (zoom == 100 || canLoadAtZoom(() -> getStream(tempURL), zoom)) {
148+
return getImageData(tempURL, 100, zoom);
143149
}
144150
URL xUrl = getxURL(tempURL, zoom);
145151
if (xUrl != null) {
146-
ImageData xdata = getImageData(xUrl);
152+
ImageData xdata = getImageData(xUrl, zoom, zoom);
147153
if (xdata != null) {
148154
return xdata;
149155
}
@@ -152,28 +158,50 @@ private static ImageData getImageData(String url, int zoom) {
152158
if (xpath != null) {
153159
URL xPathUrl = getURL(xpath);
154160
if (xPathUrl != null) {
155-
return getImageData(xPathUrl);
161+
return getImageData(xPathUrl, zoom, zoom);
156162
}
157163
}
158164
}
159165
return null;
160166
}
161167

162-
private static ImageData getImageData(URL url) {
163-
ImageData result = null;
164-
try (InputStream in = getStream(url)) {
165-
if (in != null) {
166-
result = new ImageData(in);
168+
@SuppressWarnings("resource")
169+
private static ImageData getImageData(URL url, int fileZoom, int targetZoom) {
170+
return loadImageData(getStream(url), fileZoom, targetZoom);
171+
}
172+
173+
static ImageData loadImageData(InputStream in, int fileZoom, int targetZoom) {
174+
if (in != null) {
175+
try (InputStream stream = new BufferedInputStream(in)) {
176+
return loadImageFromStream(in, fileZoom, targetZoom);
177+
} catch (SWTException e) {
178+
if (e.code != SWT.ERROR_INVALID_IMAGE) {
179+
throw e;
180+
// fall through otherwise
181+
}
182+
} catch (IOException e) {
183+
Policy.getLog().log(Status.error(e.getLocalizedMessage(), e));
167184
}
168-
} catch (SWTException e) {
169-
if (e.code != SWT.ERROR_INVALID_IMAGE) {
170-
throw e;
171-
// fall through otherwise
185+
}
186+
return null;
187+
}
188+
189+
@SuppressWarnings("restriction")
190+
private static ImageData loadImageFromStream(InputStream stream, int fileZoom, int targetZoom) {
191+
return NativeImageLoader.load(new ElementAtZoom<>(stream, fileZoom), new ImageLoader(), targetZoom).get(0)
192+
.element();
193+
}
194+
195+
@SuppressWarnings("restriction")
196+
static boolean canLoadAtZoom(Supplier<InputStream> stream, int zoom) {
197+
try (InputStream in = stream.get()) {
198+
if (in != null) {
199+
return FileFormat.canLoadAtZoom(new ElementAtZoom<>(in, 100), zoom);
172200
}
173201
} catch (IOException e) {
174202
Policy.getLog().log(Status.error(e.getLocalizedMessage(), e));
175203
}
176-
return result;
204+
return false;
177205
}
178206

179207
/**
@@ -198,7 +226,7 @@ private static InputStream getStream(URL url) {
198226
url = platformURL;
199227
}
200228
}
201-
return new BufferedInputStream(url.openStream());
229+
return url.openStream();
202230
} catch (IOException e) {
203231
if (InternalPolicy.DEBUG_LOG_URL_IMAGE_DESCRIPTOR_MISSING_2x) {
204232
String path = url.getPath();

0 commit comments

Comments
 (0)