@@ -780,23 +780,7 @@ private ImageHandle getImageMetadata(int zoom) {
780
780
if (zoomLevelToImageHandle .get (zoom ) != null ) {
781
781
return zoomLevelToImageHandle .get (zoom );
782
782
}
783
- if (imageProvider != null ) {
784
- return imageProvider .getImageMetadata (zoom );
785
- } else {
786
- ImageData resizedData = getImageData (zoom );
787
- ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
788
- if (type == SWT .ICON && newData .getTransparencyType () != SWT .TRANSPARENCY_MASK ) {
789
- // If the original type was an icon with transparency mask and re-scaling leads
790
- // to image data without transparency mask, this will create invalid images
791
- // so this fallback will "repair" the image data by explicitly passing
792
- // the transparency mask created from the scaled image data
793
- initIconHandle (this .device , newData , newData .getTransparencyMask (), zoom );
794
- } else {
795
- init (newData , zoom );
796
- }
797
- init ();
798
- }
799
- return zoomLevelToImageHandle .get (zoom );
783
+ return imageProvider .newImageHandle (zoom );
800
784
}
801
785
802
786
@@ -999,9 +983,7 @@ public static long win32_getHandle (Image image, int zoom) {
999
983
void destroy () {
1000
984
device .deregisterResourceWithZoomSupport (this );
1001
985
if (memGC != null ) memGC .dispose ();
1002
- if (this .imageProvider != null ) {
1003
- this .imageProvider .destroy ();
1004
- }
986
+ this .imageProvider .destroy ();
1005
987
destroyHandle ();
1006
988
memGC = null ;
1007
989
}
@@ -1055,11 +1037,7 @@ public boolean equals (Object object) {
1055
1037
if (!(object instanceof Image )) return false ;
1056
1038
Image image = (Image ) object ;
1057
1039
if (device != image .device || transparentPixel != image .transparentPixel || getZoom () != image .getZoom ()) return false ;
1058
- if (imageProvider != null && image .imageProvider != null ) {
1059
- return (styleFlag == image .styleFlag ) && imageProvider .equals (image .imageProvider );
1060
- } else {
1061
- return win32_getHandle (this , getZoom ()) == win32_getHandle (image , getZoom ());
1062
- }
1040
+ return (styleFlag == image .styleFlag ) && imageProvider .equals (image .imageProvider );
1063
1041
}
1064
1042
1065
1043
/**
@@ -1156,13 +1134,8 @@ Rectangle getBounds(int zoom) {
1156
1134
ImageHandle imageMetadata = zoomLevelToImageHandle .get (zoom );
1157
1135
Rectangle rectangle = new Rectangle (0 , 0 , imageMetadata .width , imageMetadata .height );
1158
1136
return DPIUtil .scaleBounds (rectangle , zoom , imageMetadata .zoom );
1159
- } else if (this .imageProvider != null ) {
1160
- return this .imageProvider .getBounds (zoom );
1161
- } else {
1162
- ImageHandle imageMetadata = zoomLevelToImageHandle .values ().iterator ().next ();
1163
- Rectangle rectangle = new Rectangle (0 , 0 , imageMetadata .width , imageMetadata .height );
1164
- return DPIUtil .scaleBounds (rectangle , zoom , imageMetadata .zoom );
1165
1137
}
1138
+ return this .imageProvider .getBounds (zoom );
1166
1139
}
1167
1140
1168
1141
/**
@@ -1236,25 +1209,7 @@ public ImageData getImageData() {
1236
1209
*/
1237
1210
public ImageData getImageData (int zoom ) {
1238
1211
if (isDisposed ()) SWT .error (SWT .ERROR_GRAPHIC_DISPOSED );
1239
- if (zoomLevelToImageHandle .containsKey (zoom )) {
1240
- return zoomLevelToImageHandle .get (zoom ).getImageData ();
1241
- }
1242
- if (imageProvider != null ) {
1243
- return imageProvider .getImageData (zoom );
1244
- }
1245
-
1246
- return getScaledImageData (zoom );
1247
- }
1248
-
1249
- private ImageData getScaledImageData (int zoom ) {
1250
- // if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
1251
- // be a destructive operation. Therefor, always the current image data must be returned
1252
- if (memGC != null ) {
1253
- return getImageDataAtCurrentZoom ();
1254
- }
1255
- TreeSet <Integer > availableZooms = new TreeSet <>(zoomLevelToImageHandle .keySet ());
1256
- int closestZoom = Optional .ofNullable (availableZooms .higher (zoom )).orElse (availableZooms .lower (zoom ));
1257
- return scaleImageData (getImageMetadata (closestZoom ).getImageData (), zoom , closestZoom );
1212
+ return imageProvider .getImageData (zoom );
1258
1213
}
1259
1214
1260
1215
@@ -1294,10 +1249,7 @@ public ImageData getImageDataAtCurrentZoom() {
1294
1249
*/
1295
1250
@ Override
1296
1251
public int hashCode () {
1297
- if (imageProvider != null ) {
1298
- return imageProvider .hashCode ();
1299
- }
1300
- return (int )win32_getHandle (this , getZoom ());
1252
+ return imageProvider .hashCode ();
1301
1253
}
1302
1254
1303
1255
static long createDIB (int width , int height , int depth ) {
@@ -1794,10 +1746,7 @@ public void internal_dispose_GC (long hDC, GCData data) {
1794
1746
*/
1795
1747
@ Override
1796
1748
public boolean isDisposed () {
1797
- if (this .imageProvider != null ) {
1798
- return this .imageProvider .isDisposed ();
1799
- }
1800
- return zoomLevelToImageHandle .isEmpty ();
1749
+ return this .imageProvider .isDisposed ();
1801
1750
}
1802
1751
1803
1752
/**
@@ -1918,10 +1867,42 @@ private abstract class AbstractImageProviderWrapper {
1918
1867
private boolean isDestroyed ;
1919
1868
1920
1869
protected abstract Rectangle getBounds (int zoom );
1921
- abstract ImageData getImageData (int zoom );
1922
- abstract ImageHandle getImageMetadata (int zoom );
1870
+
1871
+ protected final ImageData getImageData (int zoom ) {
1872
+ if (zoomLevelToImageHandle .containsKey (zoom )) {
1873
+ return zoomLevelToImageHandle .get (zoom ).getImageData ();
1874
+ }
1875
+ return newImageData (zoom );
1876
+ }
1877
+
1878
+ abstract ImageData newImageData (int zoom );
1879
+
1923
1880
abstract AbstractImageProviderWrapper createCopy (Image image );
1924
1881
1882
+ ImageData getScaledImageData (int zoom ) {
1883
+ // if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
1884
+ // be a destructive operation. Therefor, always the current image data must be returned
1885
+ if (memGC != null ) {
1886
+ return getImageDataAtCurrentZoom ();
1887
+ }
1888
+ TreeSet <Integer > availableZooms = new TreeSet <>(zoomLevelToImageHandle .keySet ());
1889
+ int closestZoom = Optional .ofNullable (availableZooms .higher (zoom )).orElse (availableZooms .lower (zoom ));
1890
+ return scaleImageData (getImageMetadata (closestZoom ).getImageData (), zoom , closestZoom );
1891
+ }
1892
+
1893
+ protected ImageHandle newImageHandle (int zoom ) {
1894
+ ImageData resizedData = getImageData (zoom );
1895
+ if (type == SWT .ICON && resizedData .getTransparencyType () != SWT .TRANSPARENCY_MASK ) {
1896
+ // If the original type was an icon with transparency mask and re-scaling leads
1897
+ // to image data without transparency mask, this will create invalid images
1898
+ // so this fallback will "repair" the image data by explicitly passing
1899
+ // the transparency mask created from the scaled image data
1900
+ return initIconHandle (device , resizedData , resizedData .getTransparencyMask (), zoom );
1901
+ } else {
1902
+ return init (resizedData , zoom );
1903
+ }
1904
+ }
1905
+
1925
1906
protected boolean isDisposed () {
1926
1907
return !isInitialized || isDestroyed ;
1927
1908
}
@@ -1955,33 +1936,10 @@ protected Rectangle getBounds(int zoom) {
1955
1936
}
1956
1937
1957
1938
@ Override
1958
- ImageData getImageData (int zoom ) {
1959
- if (zoomLevelToImageHandle .isEmpty () || zoomLevelToImageHandle .containsKey (zoom )) {
1960
- return getImageMetadata (zoom ).getImageData ();
1961
- }
1962
-
1939
+ ImageData newImageData (int zoom ) {
1963
1940
return getScaledImageData (zoom );
1964
1941
}
1965
1942
1966
- @ Override
1967
- ImageHandle getImageMetadata (int zoom ) {
1968
- if (zoomLevelToImageHandle .containsKey (zoom )) {
1969
- return zoomLevelToImageHandle .get (zoom );
1970
- } else {
1971
- ImageData resizedData = getImageData (zoom );
1972
- ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
1973
- if (type == SWT .ICON && newData .getTransparencyType () != SWT .TRANSPARENCY_MASK ) {
1974
- // If the original type was an icon with transparency mask and re-scaling leads
1975
- // to image data without transparency mask, this will create invalid images
1976
- // so this fallback will "repair" the image data by explicitly passing
1977
- // the transparency mask created from the scaled image data
1978
- return initIconHandle (device , newData , newData .getTransparencyMask (), zoom );
1979
- } else {
1980
- return init (newData , zoom );
1981
- }
1982
- }
1983
- }
1984
-
1985
1943
@ Override
1986
1944
AbstractImageProviderWrapper createCopy (Image image ) {
1987
1945
return image .new ExistingImageHandleProviderWrapper (handle , zoomForHandle );
@@ -2001,26 +1959,13 @@ void initImage() {
2001
1959
}
2002
1960
2003
1961
@ Override
2004
- ImageData getImageData (int zoom ) {
2005
- if (zoomLevelToImageHandle .containsKey (zoom )) {
2006
- return zoomLevelToImageHandle .get (zoom ).getImageData ();
2007
- }
1962
+ ImageData newImageData (int zoom ) {
2008
1963
if (!zoomLevelToImageHandle .isEmpty ()) {
2009
1964
return getScaledImageData (zoom );
2010
1965
}
2011
1966
ElementAtZoom <ImageData > loadedImageData = loadImageData (zoom );
2012
- return DPIUtil .scaleImageData (device , loadedImageData , zoom );
2013
- }
2014
-
2015
- @ Override
2016
- ImageHandle getImageMetadata (int zoom ) {
2017
- if (zoomLevelToImageHandle .containsKey (zoom )) {
2018
- return zoomLevelToImageHandle .get (zoom );
2019
- } else {
2020
- ImageData scaledImageData = getImageData (zoom );
2021
- ImageHandle imageHandle = init (scaledImageData , zoom );
2022
- return imageHandle ;
2023
- }
1967
+ ImageData scaledImageData = DPIUtil .scaleImageData (device , loadedImageData , zoom );
1968
+ return adaptImageDataIfDisabledOrGray (scaledImageData );
2024
1969
}
2025
1970
}
2026
1971
@@ -2133,29 +2078,26 @@ protected Rectangle getBounds(int zoom) {
2133
2078
}
2134
2079
2135
2080
@ Override
2136
- ImageData getImageData (int zoom ) {
2137
- if (zoomLevelToImageHandle .isEmpty () || zoomLevelToImageHandle . containsKey ( zoom ) ) {
2138
- return getImageMetadata (zoom ).getImageData ();
2081
+ ImageData newImageData (int zoom ) {
2082
+ if (zoomLevelToImageHandle .isEmpty ()) {
2083
+ return createBaseHandle (zoom ).getImageData ();
2139
2084
}
2140
-
2141
2085
return getScaledImageData (zoom );
2142
2086
}
2143
2087
2144
2088
@ Override
2145
- ImageHandle getImageMetadata (int zoom ) {
2089
+ protected ImageHandle newImageHandle (int zoom ) {
2146
2090
if (zoomLevelToImageHandle .isEmpty ()) {
2147
- long handle = initBaseHandle (zoom );
2148
- ImageHandle imageHandle = new ImageHandle (handle , zoom );
2149
- zoomLevelToImageHandle .put (zoom , imageHandle );
2150
- return imageHandle ;
2151
- } else if (zoomLevelToImageHandle .containsKey (zoom )) {
2152
- return zoomLevelToImageHandle .get (zoom );
2153
- } else {
2154
- ImageData resizedData = getImageData (zoom );
2155
- ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
2156
- init (newData , zoom );
2157
- return zoomLevelToImageHandle .get (zoom );
2091
+ return createBaseHandle (zoom );
2158
2092
}
2093
+ return super .newImageHandle (zoom );
2094
+ }
2095
+
2096
+ private ImageHandle createBaseHandle (int zoom ) {
2097
+ long handle = initBaseHandle (zoom );
2098
+ ImageHandle imageHandle = new ImageHandle (handle , zoom );
2099
+ zoomLevelToImageHandle .put (zoom , imageHandle );
2100
+ return imageHandle ;
2159
2101
}
2160
2102
2161
2103
private long initBaseHandle (int zoom ) {
@@ -2233,7 +2175,7 @@ Object getProvider() {
2233
2175
}
2234
2176
2235
2177
@ Override
2236
- final ImageData getImageData (int zoom ) {
2178
+ ImageData newImageData (int zoom ) {
2237
2179
Function <Integer , ImageData > imageDataRetrival = zoomToRetrieve -> {
2238
2180
ImageHandle handle = initializeHandleFromSource (zoomToRetrieve );
2239
2181
ImageData data = handle .getImageData ();
@@ -2243,8 +2185,9 @@ final ImageData getImageData(int zoom) {
2243
2185
return cachedImageData .computeIfAbsent (zoom , imageDataRetrival );
2244
2186
}
2245
2187
2188
+
2246
2189
@ Override
2247
- final ImageHandle getImageMetadata (int zoom ) {
2190
+ protected ImageHandle newImageHandle (int zoom ) {
2248
2191
ImageData cachedData = cachedImageData .remove (zoom );
2249
2192
if (cachedData != null ) {
2250
2193
return init (cachedData , zoom );
@@ -2280,7 +2223,7 @@ protected ElementAtZoom<ImageData> loadImageData(int zoom) {
2280
2223
// Load at appropriate zoom via loader
2281
2224
if (fileForZoom .zoom () != zoom && ImageDataLoader .canLoadAtZoom (fileForZoom .element (), fileForZoom .zoom (), zoom )) {
2282
2225
ElementAtZoom <ImageData > imageDataAtZoom = ImageDataLoader .load (fileForZoom .element (), fileForZoom .zoom (), zoom );
2283
- return new ElementAtZoom <>(adaptImageDataIfDisabledOrGray ( imageDataAtZoom .element () ), zoom );
2226
+ return new ElementAtZoom <>(imageDataAtZoom .element (), zoom );
2284
2227
}
2285
2228
2286
2229
// Load at file zoom (native or via loader) and rescale
@@ -2539,12 +2482,12 @@ protected Rectangle getBounds(int zoom) {
2539
2482
}
2540
2483
2541
2484
@ Override
2542
- ImageData getImageData (int zoom ) {
2485
+ ImageData newImageData (int zoom ) {
2543
2486
return getImageMetadata (zoom ).getImageData ();
2544
2487
}
2545
2488
2546
2489
@ Override
2547
- ImageHandle getImageMetadata (int zoom ) {
2490
+ protected ImageHandle newImageHandle (int zoom ) {
2548
2491
initialNativeZoom = zoom ;
2549
2492
Image image = new Image (device , width , height , zoom );
2550
2493
GC gc = new GC (image , drawer .getGcStyle ());
@@ -2554,12 +2497,11 @@ ImageHandle getImageMetadata(int zoom) {
2554
2497
ImageData imageData = image .getImageMetadata (zoom ).getImageData ();
2555
2498
drawer .postProcess (imageData );
2556
2499
ImageData newData = adaptImageDataIfDisabledOrGray (imageData );
2557
- init (newData , zoom );
2500
+ return init (newData , zoom );
2558
2501
} finally {
2559
2502
gc .dispose ();
2560
2503
image .dispose ();
2561
2504
}
2562
- return zoomLevelToImageHandle .get (zoom );
2563
2505
}
2564
2506
2565
2507
@ Override
0 commit comments