@@ -90,6 +90,11 @@ public final class Image extends Resource implements Drawable {
90
90
*/
91
91
public int type ;
92
92
93
+ /**
94
+ * this field make sure the image is initialized without any errors
95
+ */
96
+ boolean isInitialized = false ;
97
+
93
98
/**
94
99
* specifies the transparent pixel
95
100
*/
@@ -552,7 +557,10 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
552
557
super (device );
553
558
this .imageProvider = new ImageFileNameProviderWrapper (imageFileNameProvider );
554
559
initialNativeZoom = DPIUtil .getNativeDeviceZoom ();
555
- imageProvider .getImageMetadata (getZoom ());
560
+ if (imageProvider .getImageData (100 ) == null ) {
561
+ SWT .error (SWT .ERROR_INVALID_ARGUMENT , null ,
562
+ ": ImageFileNameProvider [" + imageFileNameProvider + "] returns null ImageData at 100% zoom." );
563
+ }
556
564
init ();
557
565
this .device .registerResourceWithZoomSupport (this );
558
566
}
@@ -590,7 +598,10 @@ public Image(Device device, ImageDataProvider imageDataProvider) {
590
598
super (device );
591
599
this .imageProvider = new ImageDataProviderWrapper (imageDataProvider );
592
600
initialNativeZoom = DPIUtil .getNativeDeviceZoom ();
593
- imageProvider .getImageMetadata (getZoom ());
601
+ if (imageDataProvider .getImageData (100 ) == null ) {
602
+ SWT .error (SWT .ERROR_INVALID_ARGUMENT , null ,
603
+ ": ImageDataProvider [" + imageDataProvider + "] returns null ImageData at 100% zoom." );
604
+ }
594
605
init ();
595
606
this .device .registerResourceWithZoomSupport (this );
596
607
}
@@ -642,6 +653,12 @@ private ImageData adaptImageDataIfDisabledOrGray(ImageData data) {
642
653
return returnImageData ;
643
654
}
644
655
656
+ @ Override
657
+ void init () {
658
+ super .init ();
659
+ this .isInitialized = true ;
660
+ }
661
+
645
662
private ImageData applyDisableImageData (ImageData data , int height , int width ) {
646
663
PaletteData palette = data .palette ;
647
664
RGB [] rgbs = new RGB [3 ];
@@ -1891,18 +1908,23 @@ public static Image win32_new(Device device, int type, long handle, int nativeZo
1891
1908
}
1892
1909
1893
1910
private abstract class AbstractImageProviderWrapper {
1911
+ private boolean isDestroyed ;
1912
+
1894
1913
protected abstract Rectangle getBounds (int zoom );
1895
1914
abstract ImageData getImageData (int zoom );
1896
1915
abstract ImageHandle getImageMetadata (int zoom );
1897
1916
abstract AbstractImageProviderWrapper createCopy (Image image );
1898
- abstract boolean isDisposed ();
1917
+
1918
+ protected boolean isDisposed () {
1919
+ return !isInitialized || isDestroyed ;
1920
+ }
1899
1921
1900
1922
protected void destroy () {
1923
+ this .isDestroyed = true ;
1901
1924
}
1902
1925
}
1903
1926
1904
1927
private class PlainImageProviderWrapper extends AbstractImageProviderWrapper {
1905
- private boolean isDestroyed ;
1906
1928
private final int width ;
1907
1929
private final int height ;
1908
1930
@@ -1984,16 +2006,6 @@ private long initBaseHandle(int zoom) {
1984
2006
AbstractImageProviderWrapper createCopy (Image image ) {
1985
2007
return image .new PlainImageProviderWrapper (width , height );
1986
2008
}
1987
-
1988
- @ Override
1989
- protected void destroy () {
1990
- this .isDestroyed = true ;
1991
- }
1992
-
1993
- @ Override
1994
- boolean isDisposed () {
1995
- return isDestroyed ;
1996
- }
1997
2009
}
1998
2010
1999
2011
private abstract class DynamicImageProviderWrapper extends AbstractImageProviderWrapper {
@@ -2016,28 +2028,43 @@ public boolean equals(Object otherProvider) {
2016
2028
}
2017
2029
}
2018
2030
2019
- private class ImageFileNameProviderWrapper extends DynamicImageProviderWrapper {
2031
+ private abstract class BaseImageProviderWrapper <T > extends DynamicImageProviderWrapper {
2032
+ protected final T provider ;
2033
+ private final Map <Integer , Rectangle > zoomToBounds = new HashMap <>();
2020
2034
2021
- /**
2022
- * ImageFileNameProvider to provide file names at various Zoom levels
2023
- */
2024
- private final ImageFileNameProvider provider ;
2025
-
2026
- ImageFileNameProviderWrapper (ImageFileNameProvider provider ) {
2027
- checkProvider (provider , ImageFileNameProvider .class );
2035
+ BaseImageProviderWrapper (T provider , Class <T > expectedClass ) {
2036
+ checkProvider (provider , expectedClass );
2028
2037
this .provider = provider ;
2029
2038
}
2030
2039
2040
+ @ Override
2041
+ Object getProvider () {
2042
+ return provider ;
2043
+ }
2044
+
2031
2045
@ Override
2032
2046
protected Rectangle getBounds (int zoom ) {
2033
- ImageHandle imageHandle = zoomLevelToImageHandle .values ().iterator ().next ();
2034
- Rectangle rectangle = new Rectangle (0 , 0 , imageHandle .width , imageHandle .height );
2035
- return DPIUtil .scaleBounds (rectangle , zoom , imageHandle .zoom );
2047
+ if (zoomLevelToImageHandle .containsKey (zoom )) {
2048
+ ImageHandle imgHandle = zoomLevelToImageHandle .get (zoom );
2049
+ return new Rectangle (0 , 0 , imgHandle .width , imgHandle .height );
2050
+ }
2051
+ if (!zoomToBounds .containsKey (zoom )) {
2052
+ ImageData imageData = getImageData (zoom );
2053
+ Rectangle rectangle = new Rectangle (0 , 0 , imageData .width , imageData .height );
2054
+ zoomToBounds .put (zoom , rectangle );
2055
+ }
2056
+ return zoomToBounds .get (zoom );
2057
+ }
2058
+ }
2059
+
2060
+ private class ImageFileNameProviderWrapper extends BaseImageProviderWrapper <ImageFileNameProvider > {
2061
+ ImageFileNameProviderWrapper (ImageFileNameProvider provider ) {
2062
+ super (provider , ImageFileNameProvider .class );
2036
2063
}
2037
2064
2038
2065
@ Override
2039
2066
ImageData getImageData (int zoom ) {
2040
- ElementAtZoom <String > fileForZoom = DPIUtil .validateAndGetImagePathAtZoom (provider , zoom );
2067
+ ElementAtZoom <String > fileForZoom = DPIUtil .validateAndGetImagePathAtZoom (provider , zoom );
2041
2068
ImageHandle nativeInitializedImage ;
2042
2069
if (zoomLevelToImageHandle .containsKey (fileForZoom .zoom ())) {
2043
2070
nativeInitializedImage = zoomLevelToImageHandle .get (fileForZoom .zoom ());
@@ -2072,16 +2099,6 @@ ImageHandle getImageMetadata(int zoom) {
2072
2099
return zoomLevelToImageHandle .get (zoom );
2073
2100
}
2074
2101
2075
- @ Override
2076
- boolean isDisposed () {
2077
- return zoomLevelToImageHandle .isEmpty ();
2078
- }
2079
-
2080
- @ Override
2081
- Object getProvider () {
2082
- return provider ;
2083
- }
2084
-
2085
2102
@ Override
2086
2103
public int hashCode () {
2087
2104
return Objects .hash (provider , styleFlag , transparentPixel , getZoom ());
@@ -2286,23 +2303,9 @@ private long extractHandleForPixelFormat(int width, int height, int pixelFormat)
2286
2303
}
2287
2304
}
2288
2305
2289
- private class ImageDataProviderWrapper extends DynamicImageProviderWrapper {
2290
-
2291
- /**
2292
- * ImageDataProvider to provide ImageData at various Zoom levels
2293
- */
2294
- private final ImageDataProvider provider ;
2295
-
2306
+ private class ImageDataProviderWrapper extends BaseImageProviderWrapper <ImageDataProvider > {
2296
2307
ImageDataProviderWrapper (ImageDataProvider provider ) {
2297
- checkProvider (provider , ImageDataProvider .class );
2298
- this .provider = provider ;
2299
- }
2300
-
2301
- @ Override
2302
- protected Rectangle getBounds (int zoom ) {
2303
- ImageHandle imageHandle = zoomLevelToImageHandle .values ().iterator ().next ();
2304
- Rectangle rectangle = new Rectangle (0 , 0 , imageHandle .width , imageHandle .height );
2305
- return DPIUtil .scaleBounds (rectangle , zoom , imageHandle .zoom );
2308
+ super (provider , ImageDataProvider .class );
2306
2309
}
2307
2310
2308
2311
@ Override
@@ -2320,16 +2323,6 @@ ImageHandle getImageMetadata(int zoom) {
2320
2323
return zoomLevelToImageHandle .get (zoom );
2321
2324
}
2322
2325
2323
- @ Override
2324
- boolean isDisposed () {
2325
- return zoomLevelToImageHandle .isEmpty ();
2326
- }
2327
-
2328
- @ Override
2329
- Object getProvider () {
2330
- return provider ;
2331
- }
2332
-
2333
2326
@ Override
2334
2327
ImageDataProviderWrapper createCopy (Image image ) {
2335
2328
return image .new ImageDataProviderWrapper (provider );
@@ -2340,7 +2333,6 @@ private class ImageGcDrawerWrapper extends DynamicImageProviderWrapper {
2340
2333
private ImageGcDrawer drawer ;
2341
2334
private int width ;
2342
2335
private int height ;
2343
- private boolean isDestroyed ;
2344
2336
2345
2337
ImageGcDrawerWrapper (ImageGcDrawer imageGcDrawer , int width , int height ) {
2346
2338
checkProvider (imageGcDrawer , ImageGcDrawer .class );
@@ -2379,16 +2371,6 @@ ImageHandle getImageMetadata(int zoom) {
2379
2371
return zoomLevelToImageHandle .get (zoom );
2380
2372
}
2381
2373
2382
- @ Override
2383
- protected void destroy () {
2384
- isDestroyed = true ;
2385
- }
2386
-
2387
- @ Override
2388
- boolean isDisposed () {
2389
- return isDestroyed ;
2390
- }
2391
-
2392
2374
@ Override
2393
2375
Object getProvider () {
2394
2376
return drawer ;
@@ -2726,5 +2708,9 @@ private ImageData getImageData() {
2726
2708
}
2727
2709
}
2728
2710
2711
+ private boolean isDisposed () {
2712
+ return this .handle == 0 ;
2713
+ }
2714
+
2729
2715
}
2730
2716
}
0 commit comments