@@ -787,23 +787,7 @@ private ImageHandle getImageMetadata(int zoom) {
787787 if (zoomLevelToImageHandle .get (zoom ) != null ) {
788788 return zoomLevelToImageHandle .get (zoom );
789789 }
790- if (imageProvider != null ) {
791- return imageProvider .getImageMetadata (zoom );
792- } else {
793- ImageData resizedData = getImageData (zoom );
794- ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
795- if (type == SWT .ICON && newData .getTransparencyType () != SWT .TRANSPARENCY_MASK ) {
796- // If the original type was an icon with transparency mask and re-scaling leads
797- // to image data without transparency mask, this will create invalid images
798- // so this fallback will "repair" the image data by explicitly passing
799- // the transparency mask created from the scaled image data
800- initIconHandle (this .device , newData , newData .getTransparencyMask (), zoom );
801- } else {
802- init (newData , zoom );
803- }
804- init ();
805- }
806- return zoomLevelToImageHandle .get (zoom );
790+ return imageProvider .newImageHandle (zoom );
807791}
808792
809793
@@ -1006,9 +990,7 @@ public static long win32_getHandle (Image image, int zoom) {
1006990void destroy () {
1007991 device .deregisterResourceWithZoomSupport (this );
1008992 if (memGC != null ) memGC .dispose ();
1009- if (this .imageProvider != null ) {
1010- this .imageProvider .destroy ();
1011- }
993+ this .imageProvider .destroy ();
1012994 destroyHandle ();
1013995 memGC = null ;
1014996}
@@ -1062,11 +1044,7 @@ public boolean equals (Object object) {
10621044 if (!(object instanceof Image )) return false ;
10631045 Image image = (Image ) object ;
10641046 if (device != image .device || transparentPixel != image .transparentPixel || getZoom () != image .getZoom ()) return false ;
1065- if (imageProvider != null && image .imageProvider != null ) {
1066- return (styleFlag == image .styleFlag ) && imageProvider .equals (image .imageProvider );
1067- } else {
1068- return win32_getHandle (this , getZoom ()) == win32_getHandle (image , getZoom ());
1069- }
1047+ return (styleFlag == image .styleFlag ) && imageProvider .equals (image .imageProvider );
10701048}
10711049
10721050/**
@@ -1163,13 +1141,8 @@ Rectangle getBounds(int zoom) {
11631141 ImageHandle imageMetadata = zoomLevelToImageHandle .get (zoom );
11641142 Rectangle rectangle = new Rectangle (0 , 0 , imageMetadata .width , imageMetadata .height );
11651143 return DPIUtil .scaleBounds (rectangle , zoom , imageMetadata .zoom );
1166- } else if (this .imageProvider != null ) {
1167- return this .imageProvider .getBounds (zoom );
1168- } else {
1169- ImageHandle imageMetadata = zoomLevelToImageHandle .values ().iterator ().next ();
1170- Rectangle rectangle = new Rectangle (0 , 0 , imageMetadata .width , imageMetadata .height );
1171- return DPIUtil .scaleBounds (rectangle , zoom , imageMetadata .zoom );
11721144 }
1145+ return this .imageProvider .getBounds (zoom );
11731146}
11741147
11751148/**
@@ -1243,25 +1216,7 @@ public ImageData getImageData() {
12431216 */
12441217public ImageData getImageData (int zoom ) {
12451218 if (isDisposed ()) SWT .error (SWT .ERROR_GRAPHIC_DISPOSED );
1246- if (zoomLevelToImageHandle .containsKey (zoom )) {
1247- return zoomLevelToImageHandle .get (zoom ).getImageData ();
1248- }
1249- if (imageProvider != null ) {
1250- return imageProvider .getImageData (zoom );
1251- }
1252-
1253- return getScaledImageData (zoom );
1254- }
1255-
1256- private ImageData getScaledImageData (int zoom ) {
1257- // if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
1258- // be a destructive operation. Therefor, always the current image data must be returned
1259- if (memGC != null ) {
1260- return getImageDataAtCurrentZoom ();
1261- }
1262- TreeSet <Integer > availableZooms = new TreeSet <>(zoomLevelToImageHandle .keySet ());
1263- int closestZoom = Optional .ofNullable (availableZooms .higher (zoom )).orElse (availableZooms .lower (zoom ));
1264- return scaleImageData (getImageMetadata (closestZoom ).getImageData (), zoom , closestZoom );
1219+ return imageProvider .getImageData (zoom );
12651220}
12661221
12671222
@@ -1301,10 +1256,7 @@ public ImageData getImageDataAtCurrentZoom() {
13011256 */
13021257@ Override
13031258public int hashCode () {
1304- if (imageProvider != null ) {
1305- return imageProvider .hashCode ();
1306- }
1307- return (int )win32_getHandle (this , getZoom ());
1259+ return imageProvider .hashCode ();
13081260}
13091261
13101262static long createDIB (int width , int height , int depth ) {
@@ -1801,10 +1753,7 @@ public void internal_dispose_GC (long hDC, GCData data) {
18011753 */
18021754@ Override
18031755public boolean isDisposed () {
1804- if (this .imageProvider != null ) {
1805- return this .imageProvider .isDisposed ();
1806- }
1807- return zoomLevelToImageHandle .isEmpty ();
1756+ return this .imageProvider .isDisposed ();
18081757}
18091758
18101759/**
@@ -1925,10 +1874,42 @@ private abstract class AbstractImageProviderWrapper {
19251874 private boolean isDestroyed ;
19261875
19271876 protected abstract Rectangle getBounds (int zoom );
1928- abstract ImageData getImageData (int zoom );
1929- abstract ImageHandle getImageMetadata (int zoom );
1877+
1878+ protected final ImageData getImageData (int zoom ) {
1879+ if (zoomLevelToImageHandle .containsKey (zoom )) {
1880+ return zoomLevelToImageHandle .get (zoom ).getImageData ();
1881+ }
1882+ return newImageData (zoom );
1883+ }
1884+
1885+ abstract ImageData newImageData (int zoom );
1886+
19301887 abstract AbstractImageProviderWrapper createCopy (Image image );
19311888
1889+ ImageData getScaledImageData (int zoom ) {
1890+ // if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
1891+ // be a destructive operation. Therefor, always the current image data must be returned
1892+ if (memGC != null ) {
1893+ return getImageDataAtCurrentZoom ();
1894+ }
1895+ TreeSet <Integer > availableZooms = new TreeSet <>(zoomLevelToImageHandle .keySet ());
1896+ int closestZoom = Optional .ofNullable (availableZooms .higher (zoom )).orElse (availableZooms .lower (zoom ));
1897+ return scaleImageData (getImageMetadata (closestZoom ).getImageData (), zoom , closestZoom );
1898+ }
1899+
1900+ protected ImageHandle newImageHandle (int zoom ) {
1901+ ImageData resizedData = getImageData (zoom );
1902+ if (type == SWT .ICON && resizedData .getTransparencyType () != SWT .TRANSPARENCY_MASK ) {
1903+ // If the original type was an icon with transparency mask and re-scaling leads
1904+ // to image data without transparency mask, this will create invalid images
1905+ // so this fallback will "repair" the image data by explicitly passing
1906+ // the transparency mask created from the scaled image data
1907+ return initIconHandle (device , resizedData , resizedData .getTransparencyMask (), zoom );
1908+ } else {
1909+ return init (resizedData , zoom );
1910+ }
1911+ }
1912+
19321913 protected boolean isDisposed () {
19331914 return !isInitialized || isDestroyed ;
19341915 }
@@ -1962,26 +1943,10 @@ protected Rectangle getBounds(int zoom) {
19621943 }
19631944
19641945 @ Override
1965- ImageData getImageData (int zoom ) {
1966- if (zoomLevelToImageHandle .isEmpty () || zoomLevelToImageHandle .containsKey (zoom )) {
1967- return getImageMetadata (zoom ).getImageData ();
1968- }
1969-
1946+ ImageData newImageData (int zoom ) {
19701947 return getScaledImageData (zoom );
19711948 }
19721949
1973- @ Override
1974- ImageHandle getImageMetadata (int zoom ) {
1975- if (zoomLevelToImageHandle .containsKey (zoom )) {
1976- return zoomLevelToImageHandle .get (zoom );
1977- } else {
1978- ImageData resizedData = getImageData (zoom );
1979- ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
1980- init (newData , zoom );
1981- return zoomLevelToImageHandle .get (zoom );
1982- }
1983- }
1984-
19851950 @ Override
19861951 AbstractImageProviderWrapper createCopy (Image image ) {
19871952 return image .new ExistingImageHandleProviderWrapper (handle , zoomForHandle );
@@ -2001,27 +1966,13 @@ void initImage() {
20011966 }
20021967
20031968 @ Override
2004- ImageData getImageData (int zoom ) {
2005- if (zoomLevelToImageHandle .containsKey (zoom )) {
2006- return zoomLevelToImageHandle .get (zoom ).getImageData ();
2007- }
1969+ ImageData newImageData (int zoom ) {
20081970 if (!zoomLevelToImageHandle .isEmpty ()) {
20091971 return getScaledImageData (zoom );
20101972 }
20111973 ElementAtZoom <ImageData > loadedImageData = loadImageData (zoom );
20121974 return DPIUtil .scaleImageData (device , loadedImageData , zoom );
20131975 }
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- }
20251976}
20261977
20271978private class PlainImageDataProviderWrapper extends ImageFromImageDataProviderWrapper {
@@ -2133,29 +2084,19 @@ protected Rectangle getBounds(int zoom) {
21332084 }
21342085
21352086 @ Override
2136- ImageData getImageData (int zoom ) {
2137- if (zoomLevelToImageHandle .isEmpty () || zoomLevelToImageHandle .containsKey (zoom )) {
2138- return getImageMetadata (zoom ).getImageData ();
2139- }
2140-
2087+ ImageData newImageData (int zoom ) {
21412088 return getScaledImageData (zoom );
21422089 }
21432090
21442091 @ Override
2145- ImageHandle getImageMetadata (int zoom ) {
2092+ protected ImageHandle newImageHandle (int zoom ) {
21462093 if (zoomLevelToImageHandle .isEmpty ()) {
21472094 long handle = initBaseHandle (zoom );
21482095 ImageHandle imageHandle = new ImageHandle (handle , zoom );
21492096 zoomLevelToImageHandle .put (zoom , imageHandle );
21502097 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 );
21582098 }
2099+ return super .newImageHandle (zoom );
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