@@ -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,27 +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 );
20121967 return DPIUtil .scaleImageData (device , loadedImageData , zoom );
20131968 }
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- }
2024- }
20251969}
20261970
20271971private class PlainImageDataProviderWrapper extends ImageFromImageDataProviderWrapper {
@@ -2133,29 +2077,26 @@ protected Rectangle getBounds(int zoom) {
21332077 }
21342078
21352079 @ Override
2136- ImageData getImageData (int zoom ) {
2137- if (zoomLevelToImageHandle .isEmpty () || zoomLevelToImageHandle . containsKey ( zoom ) ) {
2138- return getImageMetadata (zoom ).getImageData ();
2080+ ImageData newImageData (int zoom ) {
2081+ if (zoomLevelToImageHandle .isEmpty ()) {
2082+ return createBaseHandle (zoom ).getImageData ();
21392083 }
2140-
21412084 return getScaledImageData (zoom );
21422085 }
21432086
21442087 @ Override
2145- ImageHandle getImageMetadata (int zoom ) {
2088+ protected ImageHandle newImageHandle (int zoom ) {
21462089 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 );
2090+ return createBaseHandle (zoom );
21582091 }
2092+ return super .newImageHandle (zoom );
2093+ }
2094+
2095+ private ImageHandle createBaseHandle (int zoom ) {
2096+ long handle = initBaseHandle (zoom );
2097+ ImageHandle imageHandle = new ImageHandle (handle , zoom );
2098+ zoomLevelToImageHandle .put (zoom , imageHandle );
2099+ return imageHandle ;
21592100 }
21602101
21612102 private long initBaseHandle (int zoom ) {
@@ -2233,7 +2174,7 @@ Object getProvider() {
22332174 }
22342175
22352176 @ Override
2236- final ImageData getImageData (int zoom ) {
2177+ ImageData newImageData (int zoom ) {
22372178 Function <Integer , ImageData > imageDataRetrival = zoomToRetrieve -> {
22382179 ImageHandle handle = initializeHandleFromSource (zoomToRetrieve );
22392180 ImageData data = handle .getImageData ();
@@ -2243,8 +2184,9 @@ final ImageData getImageData(int zoom) {
22432184 return cachedImageData .computeIfAbsent (zoom , imageDataRetrival );
22442185 }
22452186
2187+
22462188 @ Override
2247- final ImageHandle getImageMetadata (int zoom ) {
2189+ protected ImageHandle newImageHandle (int zoom ) {
22482190 ImageData cachedData = cachedImageData .remove (zoom );
22492191 if (cachedData != null ) {
22502192 return init (cachedData , zoom );
@@ -2539,12 +2481,12 @@ protected Rectangle getBounds(int zoom) {
25392481 }
25402482
25412483 @ Override
2542- ImageData getImageData (int zoom ) {
2484+ ImageData newImageData (int zoom ) {
25432485 return getImageMetadata (zoom ).getImageData ();
25442486 }
25452487
25462488 @ Override
2547- ImageHandle getImageMetadata (int zoom ) {
2489+ protected ImageHandle newImageHandle (int zoom ) {
25482490 initialNativeZoom = zoom ;
25492491 Image image = new Image (device , width , height , zoom );
25502492 GC gc = new GC (image , drawer .getGcStyle ());
@@ -2554,12 +2496,11 @@ ImageHandle getImageMetadata(int zoom) {
25542496 ImageData imageData = image .getImageMetadata (zoom ).getImageData ();
25552497 drawer .postProcess (imageData );
25562498 ImageData newData = adaptImageDataIfDisabledOrGray (imageData );
2557- init (newData , zoom );
2499+ return init (newData , zoom );
25582500 } finally {
25592501 gc .dispose ();
25602502 image .dispose ();
25612503 }
2562- return zoomLevelToImageHandle .get (zoom );
25632504 }
25642505
25652506 @ Override
0 commit comments