Skip to content

Commit d874807

Browse files
Create handles for ImageDataProvider and ImageFilenameProvider on demand
1 parent 0a0b40c commit d874807

File tree

1 file changed

+52
-79
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics

1 file changed

+52
-79
lines changed

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java

Lines changed: 52 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,10 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
552552
super(device);
553553
this.imageProvider = new ImageFileNameProviderWrapper(imageFileNameProvider);
554554
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
555-
imageProvider.getImageMetadata(getZoom());
555+
if (imageProvider.getImageData(100) == null) {
556+
SWT.error(SWT.ERROR_INVALID_ARGUMENT, null,
557+
": ImageFileNameProvider [" + imageFileNameProvider + "] returns null ImageData at 100% zoom.");
558+
}
556559
init();
557560
this.device.registerResourceWithZoomSupport(this);
558561
}
@@ -590,7 +593,10 @@ public Image(Device device, ImageDataProvider imageDataProvider) {
590593
super(device);
591594
this.imageProvider = new ImageDataProviderWrapper(imageDataProvider);
592595
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
593-
imageProvider.getImageMetadata(getZoom());
596+
if (imageDataProvider.getImageData(100) == null) {
597+
SWT.error(SWT.ERROR_INVALID_ARGUMENT, null,
598+
": ImageDataProvider [" + imageDataProvider + "] returns null ImageData at 100% zoom.");
599+
}
594600
init();
595601
this.device.registerResourceWithZoomSupport(this);
596602
}
@@ -2050,18 +2056,23 @@ public static Image win32_new(Device device, int type, long handle, int nativeZo
20502056
}
20512057

20522058
private abstract class AbstractImageProviderWrapper {
2059+
private boolean isDestroyed;
2060+
20532061
protected abstract Rectangle getBounds(int zoom);
20542062
abstract ImageData getImageData(int zoom);
20552063
abstract ImageHandle getImageMetadata(int zoom);
20562064
abstract AbstractImageProviderWrapper createCopy(Image image);
2057-
abstract boolean isDisposed();
2065+
2066+
protected boolean isDisposed() {
2067+
return isDestroyed;
2068+
}
20582069

20592070
protected void destroy() {
2071+
this.isDestroyed = true;
20602072
}
20612073
}
20622074

20632075
private class PlainImageProviderWrapper extends AbstractImageProviderWrapper {
2064-
private boolean isDestroyed;
20652076
private final int width;
20662077
private final int height;
20672078

@@ -2143,16 +2154,6 @@ private long initBaseHandle(int zoom) {
21432154
AbstractImageProviderWrapper createCopy(Image image) {
21442155
return image.new PlainImageProviderWrapper(width, height);
21452156
}
2146-
2147-
@Override
2148-
protected void destroy() {
2149-
this.isDestroyed = true;
2150-
}
2151-
2152-
@Override
2153-
boolean isDisposed() {
2154-
return isDestroyed;
2155-
}
21562157
}
21572158

21582159
private abstract class DynamicImageProviderWrapper extends AbstractImageProviderWrapper {
@@ -2175,24 +2176,41 @@ public boolean equals(Object otherProvider) {
21752176
}
21762177
}
21772178

2178-
private class ImageFileNameProviderWrapper extends DynamicImageProviderWrapper {
21792179

2180-
/**
2181-
* ImageFileNameProvider to provide file names at various Zoom levels
2182-
*/
2183-
private final ImageFileNameProvider provider;
2180+
private abstract class BaseImageProviderWrapper<T> extends DynamicImageProviderWrapper {
2181+
protected final T provider;
2182+
protected final Map<Integer, Rectangle> zoomToBounds = new HashMap<>();
21842183

2185-
ImageFileNameProviderWrapper(ImageFileNameProvider provider) {
2186-
checkProvider(provider, ImageFileNameProvider.class);
2187-
this.provider = provider;
2188-
}
2184+
BaseImageProviderWrapper(T provider, Class<T> expectedClass) {
2185+
checkProvider(provider, expectedClass);
2186+
this.provider = provider;
2187+
}
21892188

2190-
@Override
2189+
@Override
2190+
Object getProvider() {
2191+
return provider;
2192+
}
2193+
2194+
@Override
21912195
protected Rectangle getBounds(int zoom) {
2192-
ImageHandle imageHandle = zoomLevelToImageHandle.values().iterator().next();
2193-
Rectangle rectangle = new Rectangle(0, 0, imageHandle.width, imageHandle.height);
2194-
return DPIUtil.scaleBounds(rectangle, zoom, imageHandle.zoom);
2195-
}
2196+
if (zoomLevelToImageHandle.containsKey(zoom)) {
2197+
ImageHandle imgHandle = zoomLevelToImageHandle.get(zoom);
2198+
return new Rectangle(0, 0, imgHandle.width, imgHandle.height);
2199+
}
2200+
if (!zoomToBounds.containsKey(zoom)) {
2201+
ImageData imageData = getImageData(zoom);
2202+
Rectangle rectangle = new Rectangle(0, 0, imageData.width, imageData.height);
2203+
zoomToBounds.put(zoom, rectangle);
2204+
}
2205+
return zoomToBounds.get(zoom);
2206+
}
2207+
}
2208+
2209+
2210+
private class ImageFileNameProviderWrapper extends BaseImageProviderWrapper<ImageFileNameProvider> {
2211+
ImageFileNameProviderWrapper(ImageFileNameProvider provider) {
2212+
super(provider, ImageFileNameProvider.class);
2213+
}
21962214

21972215
@Override
21982216
ImageData getImageData(int zoom) {
@@ -2221,44 +2239,20 @@ ImageHandle getImageMetadata(int zoom) {
22212239
}
22222240

22232241
@Override
2224-
boolean isDisposed() {
2225-
return zoomLevelToImageHandle.isEmpty();
2226-
}
2227-
2228-
@Override
2229-
Object getProvider() {
2230-
return provider;
2242+
ImageFileNameProviderWrapper createCopy(Image image) {
2243+
return image.new ImageFileNameProviderWrapper(provider);
22312244
}
22322245

22332246
@Override
22342247
public int hashCode() {
22352248
return Objects.hash(provider, styleFlag, transparentPixel, getZoom());
22362249
}
2237-
2238-
@Override
2239-
ImageFileNameProviderWrapper createCopy(Image image) {
2240-
return image.new ImageFileNameProviderWrapper(provider);
2241-
}
22422250
}
22432251

2244-
private class ImageDataProviderWrapper extends DynamicImageProviderWrapper {
2245-
2246-
/**
2247-
* ImageDataProvider to provide ImageData at various Zoom levels
2248-
*/
2249-
private final ImageDataProvider provider;
2250-
2252+
private class ImageDataProviderWrapper extends BaseImageProviderWrapper<ImageDataProvider> {
22512253
ImageDataProviderWrapper(ImageDataProvider provider) {
2252-
checkProvider(provider, ImageDataProvider.class);
2253-
this.provider = provider;
2254-
}
2255-
2256-
@Override
2257-
protected Rectangle getBounds(int zoom) {
2258-
ImageHandle imageHandle = zoomLevelToImageHandle.values().iterator().next();
2259-
Rectangle rectangle = new Rectangle(0, 0, imageHandle.width, imageHandle.height);
2260-
return DPIUtil.scaleBounds(rectangle, zoom, imageHandle.zoom);
2261-
}
2254+
super(provider, ImageDataProvider.class);
2255+
}
22622256

22632257
@Override
22642258
ImageData getImageData(int zoom) {
@@ -2275,16 +2269,6 @@ ImageHandle getImageMetadata(int zoom) {
22752269
return zoomLevelToImageHandle.get(zoom);
22762270
}
22772271

2278-
@Override
2279-
boolean isDisposed() {
2280-
return zoomLevelToImageHandle.isEmpty();
2281-
}
2282-
2283-
@Override
2284-
Object getProvider() {
2285-
return provider;
2286-
}
2287-
22882272
@Override
22892273
ImageDataProviderWrapper createCopy(Image image) {
22902274
return image.new ImageDataProviderWrapper(provider);
@@ -2295,7 +2279,6 @@ private class ImageGcDrawerWrapper extends DynamicImageProviderWrapper {
22952279
private ImageGcDrawer drawer;
22962280
private int width;
22972281
private int height;
2298-
private boolean isDestroyed;
22992282

23002283
ImageGcDrawerWrapper(ImageGcDrawer imageGcDrawer, int width, int height) {
23012284
checkProvider(imageGcDrawer, ImageGcDrawer.class);
@@ -2334,16 +2317,6 @@ ImageHandle getImageMetadata(int zoom) {
23342317
return zoomLevelToImageHandle.get(zoom);
23352318
}
23362319

2337-
@Override
2338-
protected void destroy() {
2339-
isDestroyed = true;
2340-
}
2341-
2342-
@Override
2343-
boolean isDisposed() {
2344-
return isDestroyed;
2345-
}
2346-
23472320
@Override
23482321
Object getProvider() {
23492322
return drawer;
@@ -2682,4 +2655,4 @@ private ImageData getImageData() {
26822655
}
26832656

26842657
}
2685-
}
2658+
}

0 commit comments

Comments
 (0)