@@ -100,14 +100,9 @@ public final class Image extends Resource implements Drawable {
100100 GC memGC ;
101101
102102 /**
103- * ImageFileNameProvider to provide file names at various Zoom levels
104- */
105- private ImageFileNameProvider imageFileNameProvider ;
106-
107- /**
108- * ImageDataProvider to provide ImageData at various Zoom levels
103+ * AbstractImageProvider to avail right ImageProvider (ImageDataProvider or ImageFileNameProvider)
109104 */
110- private ImageDataProvider imageDataProvider ;
105+ private AbstractImageProvider imageProvider ;
111106
112107 /**
113108 * Style flag used to differentiate normal, gray-scale and disabled images based
@@ -225,8 +220,7 @@ public Image(Device device, Image srcImage, int flag) {
225220 if (srcImage .isDisposed ()) SWT .error (SWT .ERROR_INVALID_ARGUMENT );
226221 Rectangle rect = srcImage .getBoundsInPixels ();
227222 this .type = srcImage .type ;
228- this .imageDataProvider = srcImage .imageDataProvider ;
229- this .imageFileNameProvider = srcImage .imageFileNameProvider ;
223+ this .imageProvider = srcImage .imageProvider ;
230224 this .styleFlag = srcImage .styleFlag | flag ;
231225 initialNativeZoom = srcImage .initialNativeZoom ;
232226 long srcImageHandle = win32_getHandle (srcImage , getZoom ());
@@ -538,7 +532,7 @@ public Image (Device device, String filename) {
538532 */
539533public Image (Device device , ImageFileNameProvider imageFileNameProvider ) {
540534 super (device );
541- this .imageFileNameProvider = imageFileNameProvider ;
535+ this .imageProvider = new ImageFileNameProviderWrapper ( imageFileNameProvider ) ;
542536 initialNativeZoom = DPIUtil .getNativeDeviceZoom ();
543537 ElementAtZoom <String > fileName = DPIUtil .validateAndGetImagePathAtZoom (imageFileNameProvider , getZoom ());
544538 if (fileName .zoom () == getZoom ()) {
@@ -584,7 +578,7 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
584578 */
585579public Image (Device device , ImageDataProvider imageDataProvider ) {
586580 super (device );
587- this .imageDataProvider = imageDataProvider ;
581+ this .imageProvider = new ImageDataProviderWrapper ( imageDataProvider ) ;
588582 initialNativeZoom = DPIUtil .getNativeDeviceZoom ();
589583 ElementAtZoom <ImageData > data = DPIUtil .validateAndGetImageDataAtZoom (imageDataProvider , getZoom ());
590584 ImageData resizedData = DPIUtil .scaleImageData (device , data .element (), getZoom (), data .zoom ());
@@ -739,26 +733,8 @@ private ImageHandle getImageMetadata(int zoom) {
739733 if (zoomLevelToImageHandle .get (zoom ) != null ) {
740734 return zoomLevelToImageHandle .get (zoom );
741735 }
742-
743- if (imageFileNameProvider != null ) {
744- ElementAtZoom <String > imageCandidate = DPIUtil .validateAndGetImagePathAtZoom (imageFileNameProvider , zoom );
745- ImageData imageData = new ImageData (imageCandidate .element ());
746- if (imageCandidate .zoom () == zoom ) {
747- /* Release current native resources */
748- ImageHandle imageMetadata = initNative (imageCandidate .element (), zoom );
749- if (imageMetadata == null ) init (imageData , zoom );
750- init ();
751- } else {
752- ImageData resizedData = DPIUtil .scaleImageData (device , imageData , zoom , imageCandidate .zoom ());
753- ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
754- init (newData , zoom );
755- }
756- } else if (imageDataProvider != null ) {
757- ElementAtZoom <ImageData > imageCandidate = DPIUtil .validateAndGetImageDataAtZoom (imageDataProvider , zoom );
758- ImageData resizedData = DPIUtil .scaleImageData (device , imageCandidate .element (), zoom , imageCandidate .zoom ());
759- ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
760- init (newData , zoom );
761- init ();
736+ if (imageProvider != null ) {
737+ return imageProvider .getImageMetadata (zoom );
762738 } else {
763739 ImageData resizedData = getImageData (zoom );
764740 ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
@@ -1180,10 +1156,8 @@ public boolean equals (Object object) {
11801156 if (!(object instanceof Image )) return false ;
11811157 Image image = (Image ) object ;
11821158 if (device != image .device || transparentPixel != image .transparentPixel || getZoom () != image .getZoom ()) return false ;
1183- if (imageDataProvider != null && image .imageDataProvider != null ) {
1184- return (styleFlag == image .styleFlag ) && imageDataProvider .equals (image .imageDataProvider );
1185- } else if (imageFileNameProvider != null && image .imageFileNameProvider != null ) {
1186- return (styleFlag == image .styleFlag ) && imageFileNameProvider .equals (image .imageFileNameProvider );
1159+ if (imageProvider != null && image .imageProvider != null ) {
1160+ return (styleFlag == image .styleFlag ) && imageProvider .equals (image .imageProvider );
11871161 } else {
11881162 return win32_getHandle (this , getZoom ()) == win32_getHandle (image , getZoom ());
11891163 }
@@ -1353,12 +1327,8 @@ public ImageData getImageData (int zoom) {
13531327 int currentZoom = getZoom ();
13541328 if (zoom == currentZoom ) {
13551329 return getImageDataAtCurrentZoom ();
1356- } else if (imageDataProvider != null ) {
1357- ElementAtZoom <ImageData > data = DPIUtil .validateAndGetImageDataAtZoom (imageDataProvider , zoom );
1358- return DPIUtil .scaleImageData (device , data .element (), zoom , data .zoom ());
1359- } else if (imageFileNameProvider != null ) {
1360- ElementAtZoom <String > fileName = DPIUtil .validateAndGetImagePathAtZoom (imageFileNameProvider , zoom );
1361- return DPIUtil .scaleImageData (device , new ImageData (fileName .element ()), zoom , fileName .zoom ());
1330+ } else if (imageProvider != null ) {
1331+ imageProvider .getImageData (zoom );
13621332 }
13631333
13641334 // if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
@@ -1405,10 +1375,8 @@ public ImageData getImageDataAtCurrentZoom() {
14051375 */
14061376@ Override
14071377public int hashCode () {
1408- if (imageDataProvider != null ) {
1409- return imageDataProvider .hashCode ();
1410- } else if (imageFileNameProvider != null ) {
1411- return Objects .hash (imageFileNameProvider , styleFlag , transparentPixel , getZoom ());
1378+ if (imageProvider != null ) {
1379+ return imageProvider .hashCode ();
14121380 } else {
14131381 return (int )win32_getHandle (this , getZoom ());
14141382 }
@@ -2030,6 +1998,103 @@ public static Image win32_new(Device device, int type, long handle) {
20301998 return image ;
20311999}
20322000
2001+ private abstract class AbstractImageProvider {
2002+ abstract Object getProvider ();
2003+ abstract ImageData getImageData (int zoom );
2004+ abstract ImageHandle getImageMetadata (int zoom );
2005+
2006+ @ Override
2007+ public int hashCode () {
2008+ return getProvider ().hashCode ();
2009+ }
2010+
2011+ @ Override
2012+ public boolean equals (Object otherProvider ) {
2013+ if (otherProvider != null && otherProvider instanceof AbstractImageProvider ) {
2014+ getProvider ().equals (((AbstractImageProvider ) otherProvider ).getProvider ());
2015+ }
2016+ return false ;
2017+ }
2018+ }
2019+
2020+ private class ImageFileNameProviderWrapper extends AbstractImageProvider {
2021+
2022+ /**
2023+ * ImageFileNameProvider to provide file names at various Zoom levels
2024+ */
2025+ ImageFileNameProvider provider ;
2026+
2027+ public ImageFileNameProviderWrapper (ImageFileNameProvider provider ) {
2028+ this .provider = provider ;
2029+ }
2030+
2031+ @ Override
2032+ ImageData getImageData (int zoom ) {
2033+ ElementAtZoom <String > fileName = DPIUtil .validateAndGetImagePathAtZoom (provider , zoom );
2034+ return DPIUtil .scaleImageData (device , new ImageData (fileName .element ()), zoom , fileName .zoom ());
2035+ }
2036+
2037+ @ Override
2038+ ImageHandle getImageMetadata (int zoom ) {
2039+ ElementAtZoom <String > imageCandidate = DPIUtil .validateAndGetImagePathAtZoom (provider , zoom );
2040+ ImageData imageData = new ImageData (imageCandidate .element ());
2041+ if (imageCandidate .zoom () == zoom ) {
2042+ /* Release current native resources */
2043+ ImageHandle imageMetadata = initNative (imageCandidate .element (), zoom );
2044+ if (imageMetadata == null ) init (imageData , zoom );
2045+ init ();
2046+ } else {
2047+ ImageData resizedData = DPIUtil .scaleImageData (device , imageData , zoom , imageCandidate .zoom ());
2048+ ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
2049+ init (newData , zoom );
2050+ }
2051+ return zoomLevelToImageHandle .get (zoom );
2052+ }
2053+
2054+ @ Override
2055+ Object getProvider () {
2056+ return provider ;
2057+ }
2058+
2059+ @ Override
2060+ public int hashCode () {
2061+ return Objects .hash (provider , styleFlag , transparentPixel , getZoom ());
2062+ }
2063+ }
2064+
2065+ private class ImageDataProviderWrapper extends AbstractImageProvider {
2066+
2067+ /**
2068+ * ImageDataProvider to provide ImageData at various Zoom levels
2069+ */
2070+ ImageDataProvider provider ;
2071+
2072+ public ImageDataProviderWrapper (ImageDataProvider provider ) {
2073+ this .provider = provider ;
2074+ }
2075+
2076+ @ Override
2077+ ImageData getImageData (int zoom ) {
2078+ ElementAtZoom <ImageData > data = DPIUtil .validateAndGetImageDataAtZoom (provider , zoom );
2079+ return DPIUtil .scaleImageData (device , data .element (), zoom , data .zoom ());
2080+ }
2081+
2082+ @ Override
2083+ ImageHandle getImageMetadata (int zoom ) {
2084+ ElementAtZoom <ImageData > imageCandidate = DPIUtil .validateAndGetImageDataAtZoom (provider , zoom );
2085+ ImageData resizedData = DPIUtil .scaleImageData (device , imageCandidate .element (), zoom , imageCandidate .zoom ());
2086+ ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
2087+ init (newData , zoom );
2088+ init ();
2089+ return zoomLevelToImageHandle .get (zoom );
2090+ }
2091+
2092+ @ Override
2093+ Object getProvider () {
2094+ return provider ;
2095+ }
2096+ }
2097+
20332098private class ImageHandle {
20342099 long handle ;
20352100 int zoom ;
0 commit comments