@@ -780,23 +780,7 @@ private ImageHandle getImageMetadata(int zoom) {
780780 if (zoomLevelToImageHandle .get (zoom ) != null ) {
781781 return zoomLevelToImageHandle .get (zoom );
782782 }
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 );
800784}
801785
802786
@@ -999,9 +983,7 @@ public static long win32_getHandle (Image image, int zoom) {
999983void destroy () {
1000984 device .deregisterResourceWithZoomSupport (this );
1001985 if (memGC != null ) memGC .dispose ();
1002- if (this .imageProvider != null ) {
1003- this .imageProvider .destroy ();
1004- }
986+ this .imageProvider .destroy ();
1005987 destroyHandle ();
1006988 memGC = null ;
1007989}
@@ -1055,11 +1037,7 @@ public boolean equals (Object object) {
10551037 if (!(object instanceof Image )) return false ;
10561038 Image image = (Image ) object ;
10571039 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 );
10631041}
10641042
10651043/**
@@ -1156,13 +1134,8 @@ Rectangle getBounds(int zoom) {
11561134 ImageHandle imageMetadata = zoomLevelToImageHandle .get (zoom );
11571135 Rectangle rectangle = new Rectangle (0 , 0 , imageMetadata .width , imageMetadata .height );
11581136 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 );
11651137 }
1138+ return this .imageProvider .getBounds (zoom );
11661139}
11671140
11681141/**
@@ -1236,25 +1209,7 @@ public ImageData getImageData() {
12361209 */
12371210public ImageData getImageData (int zoom ) {
12381211 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 );
12581213}
12591214
12601215
@@ -1294,10 +1249,7 @@ public ImageData getImageDataAtCurrentZoom() {
12941249 */
12951250@ Override
12961251public int hashCode () {
1297- if (imageProvider != null ) {
1298- return imageProvider .hashCode ();
1299- }
1300- return (int )win32_getHandle (this , getZoom ());
1252+ return imageProvider .hashCode ();
13011253}
13021254
13031255static long createDIB (int width , int height , int depth ) {
@@ -1794,10 +1746,7 @@ public void internal_dispose_GC (long hDC, GCData data) {
17941746 */
17951747@ Override
17961748public boolean isDisposed () {
1797- if (this .imageProvider != null ) {
1798- return this .imageProvider .isDisposed ();
1799- }
1800- return zoomLevelToImageHandle .isEmpty ();
1749+ return this .imageProvider .isDisposed ();
18011750}
18021751
18031752/**
@@ -1918,10 +1867,42 @@ private abstract class AbstractImageProviderWrapper {
19181867 private boolean isDestroyed ;
19191868
19201869 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+
19231880 abstract AbstractImageProviderWrapper createCopy (Image image );
19241881
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+
19251906 protected boolean isDisposed () {
19261907 return !isInitialized || isDestroyed ;
19271908 }
@@ -1955,33 +1936,10 @@ protected Rectangle getBounds(int zoom) {
19551936 }
19561937
19571938 @ 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 ) {
19631940 return getScaledImageData (zoom );
19641941 }
19651942
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-
19851943 @ Override
19861944 AbstractImageProviderWrapper createCopy (Image image ) {
19871945 return image .new ExistingImageHandleProviderWrapper (handle , zoomForHandle );
@@ -2001,26 +1959,13 @@ void initImage() {
20011959 }
20021960
20031961 @ Override
2004- ImageData getImageData (int zoom ) {
2005- if (zoomLevelToImageHandle .containsKey (zoom )) {
2006- return zoomLevelToImageHandle .get (zoom ).getImageData ();
2007- }
1962+ ImageData newImageData (int zoom ) {
20081963 if (!zoomLevelToImageHandle .isEmpty ()) {
20091964 return getScaledImageData (zoom );
20101965 }
20111966 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 );
20241969 }
20251970}
20261971
@@ -2133,29 +2078,26 @@ protected Rectangle getBounds(int zoom) {
21332078 }
21342079
21352080 @ 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 ();
21392084 }
2140-
21412085 return getScaledImageData (zoom );
21422086 }
21432087
21442088 @ Override
2145- ImageHandle getImageMetadata (int zoom ) {
2089+ protected ImageHandle newImageHandle (int zoom ) {
21462090 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 );
21582092 }
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 ;
21592101 }
21602102
21612103 private long initBaseHandle (int zoom ) {
@@ -2233,7 +2175,7 @@ Object getProvider() {
22332175 }
22342176
22352177 @ Override
2236- final ImageData getImageData (int zoom ) {
2178+ ImageData newImageData (int zoom ) {
22372179 Function <Integer , ImageData > imageDataRetrival = zoomToRetrieve -> {
22382180 ImageHandle handle = initializeHandleFromSource (zoomToRetrieve );
22392181 ImageData data = handle .getImageData ();
@@ -2243,8 +2185,9 @@ final ImageData getImageData(int zoom) {
22432185 return cachedImageData .computeIfAbsent (zoom , imageDataRetrival );
22442186 }
22452187
2188+
22462189 @ Override
2247- final ImageHandle getImageMetadata (int zoom ) {
2190+ protected ImageHandle newImageHandle (int zoom ) {
22482191 ImageData cachedData = cachedImageData .remove (zoom );
22492192 if (cachedData != null ) {
22502193 return init (cachedData , zoom );
@@ -2280,7 +2223,7 @@ protected ElementAtZoom<ImageData> loadImageData(int zoom) {
22802223 // Load at appropriate zoom via loader
22812224 if (fileForZoom .zoom () != zoom && ImageDataLoader .canLoadAtZoom (fileForZoom .element (), fileForZoom .zoom (), zoom )) {
22822225 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 );
22842227 }
22852228
22862229 // Load at file zoom (native or via loader) and rescale
@@ -2539,12 +2482,12 @@ protected Rectangle getBounds(int zoom) {
25392482 }
25402483
25412484 @ Override
2542- ImageData getImageData (int zoom ) {
2485+ ImageData newImageData (int zoom ) {
25432486 return getImageMetadata (zoom ).getImageData ();
25442487 }
25452488
25462489 @ Override
2547- ImageHandle getImageMetadata (int zoom ) {
2490+ protected ImageHandle newImageHandle (int zoom ) {
25482491 initialNativeZoom = zoom ;
25492492 Image image = new Image (device , width , height , zoom );
25502493 GC gc = new GC (image , drawer .getGcStyle ());
@@ -2554,12 +2497,11 @@ ImageHandle getImageMetadata(int zoom) {
25542497 ImageData imageData = image .getImageMetadata (zoom ).getImageData ();
25552498 drawer .postProcess (imageData );
25562499 ImageData newData = adaptImageDataIfDisabledOrGray (imageData );
2557- init (newData , zoom );
2500+ return init (newData , zoom );
25582501 } finally {
25592502 gc .dispose ();
25602503 image .dispose ();
25612504 }
2562- return zoomLevelToImageHandle .get (zoom );
25632505 }
25642506
25652507 @ Override
0 commit comments