@@ -556,7 +556,6 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
556556 super (device );
557557 this .imageProvider = new ImageFileNameProviderWrapper (imageFileNameProvider );
558558 initialNativeZoom = DPIUtil .getNativeDeviceZoom ();
559- imageProvider .getImageMetadata (getZoom ());
560559 init ();
561560 this .device .registerResourceWithZoomSupport (this );
562561}
@@ -594,7 +593,6 @@ public Image(Device device, ImageDataProvider imageDataProvider) {
594593 super (device );
595594 this .imageProvider = new ImageDataProviderWrapper (imageDataProvider );
596595 initialNativeZoom = DPIUtil .getNativeDeviceZoom ();
597- imageProvider .getImageMetadata (getZoom ());
598596 init ();
599597 this .device .registerResourceWithZoomSupport (this );
600598}
@@ -2081,6 +2079,13 @@ public static Image win32_new(Device device, int type, long handle, int nativeZo
20812079 return image ;
20822080}
20832081
2082+ private void destroyHandle (int zoom ) {
2083+ ImageHandle imageHandle = zoomLevelToImageHandle .remove (zoom );
2084+ if (imageHandle != null ) {
2085+ destroyHandle (imageHandle .handle );
2086+ }
2087+ }
2088+
20842089private abstract class AbstractImageProviderWrapper {
20852090 abstract Object getProvider ();
20862091 protected abstract Rectangle getBounds (int zoom );
@@ -2115,17 +2120,24 @@ private class ImageFileNameProviderWrapper extends AbstractImageProviderWrapper
21152120 * ImageFileNameProvider to provide file names at various Zoom levels
21162121 */
21172122 private final ImageFileNameProvider provider ;
2123+ private boolean isDestroyed ;
2124+ private int width ;
2125+ private int height ;
2126+ private final static int BASE_ZOOM = 100 ;
21182127
21192128 ImageFileNameProviderWrapper (ImageFileNameProvider provider ) {
21202129 checkProvider (provider , ImageFileNameProvider .class );
21212130 this .provider = provider ;
2131+ ImageHandle handleAt100 = getImageMetadata (BASE_ZOOM );
2132+ width = handleAt100 .width ;
2133+ height = handleAt100 .height ;
2134+ destroyHandle (BASE_ZOOM );
21222135 }
21232136
21242137 @ Override
21252138 protected Rectangle getBounds (int zoom ) {
2126- ImageHandle imageHandle = zoomLevelToImageHandle .values ().iterator ().next ();
2127- Rectangle rectangle = new Rectangle (0 , 0 , imageHandle .width , imageHandle .height );
2128- return DPIUtil .scaleBounds (rectangle , zoom , imageHandle .zoom );
2139+ Rectangle rectangle = new Rectangle (0 , 0 , width , height );
2140+ return DPIUtil .scaleBounds (rectangle , zoom , BASE_ZOOM );
21292141 }
21302142
21312143 @ Override
@@ -2154,11 +2166,6 @@ ImageHandle getImageMetadata(int zoom) {
21542166 return zoomLevelToImageHandle .get (zoom );
21552167 }
21562168
2157- @ Override
2158- boolean isDisposed () {
2159- return zoomLevelToImageHandle .isEmpty ();
2160- }
2161-
21622169 @ Override
21632170 Object getProvider () {
21642171 return provider ;
@@ -2173,6 +2180,16 @@ public int hashCode() {
21732180 ImageFileNameProviderWrapper createCopy (Image image ) {
21742181 return image .new ImageFileNameProviderWrapper (provider );
21752182 }
2183+
2184+ @ Override
2185+ boolean isDisposed () {
2186+ return this .isDestroyed ;
2187+ }
2188+
2189+ @ Override
2190+ protected void destroy () {
2191+ this .isDestroyed = true ;
2192+ }
21762193}
21772194
21782195private class ImageDataProviderWrapper extends AbstractImageProviderWrapper {
@@ -2181,17 +2198,24 @@ private class ImageDataProviderWrapper extends AbstractImageProviderWrapper {
21812198 * ImageDataProvider to provide ImageData at various Zoom levels
21822199 */
21832200 private final ImageDataProvider provider ;
2201+ private int width ;
2202+ private int height ;
2203+ private boolean isDestroyed ;
2204+ private final static int BASE_ZOOM = 100 ;
21842205
21852206 ImageDataProviderWrapper (ImageDataProvider provider ) {
21862207 checkProvider (provider , ImageDataProvider .class );
21872208 this .provider = provider ;
2209+ ImageHandle handleAt100 = getImageMetadata (BASE_ZOOM );
2210+ width = handleAt100 .width ;
2211+ height = handleAt100 .height ;
2212+ destroyHandle (BASE_ZOOM );
21882213 }
21892214
21902215 @ Override
21912216 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 );
2217+ Rectangle rectangle = new Rectangle (0 , 0 , width , height );
2218+ return DPIUtil .scaleBounds (rectangle , zoom , BASE_ZOOM );
21952219 }
21962220
21972221 @ Override
@@ -2211,7 +2235,12 @@ ImageHandle getImageMetadata(int zoom) {
22112235
22122236 @ Override
22132237 boolean isDisposed () {
2214- return zoomLevelToImageHandle .isEmpty ();
2238+ return this .isDestroyed ;
2239+ }
2240+
2241+ @ Override
2242+ protected void destroy () {
2243+ this .isDestroyed = true ;
22152244 }
22162245
22172246 @ Override
0 commit comments