@@ -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
20522058private 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
20632075private 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
21582159private 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