@@ -101,14 +101,9 @@ public final class Image extends Resource implements Drawable {
101101 GC memGC ;
102102
103103 /**
104- * ImageFileNameProvider to provide file names at various Zoom levels
105- */
106- private ImageFileNameProvider imageFileNameProvider ;
107-
108- /**
109- * ImageDataProvider to provide ImageData at various Zoom levels
104+ * AbstractImageProvider to avail right ImageProvider (ImageDataProvider or ImageFileNameProvider)
110105 */
111- private ImageDataProvider imageDataProvider ;
106+ private AbstractImageProvider imageProvider ;
112107
113108 /**
114109 * Style flag used to differentiate normal, gray-scale and disabled images based
@@ -228,8 +223,7 @@ public Image(Device device, Image srcImage, int flag) {
228223 if (srcImage .isDisposed ()) SWT .error (SWT .ERROR_INVALID_ARGUMENT );
229224 Rectangle rect = srcImage .getBoundsInPixels ();
230225 this .type = srcImage .type ;
231- this .imageDataProvider = srcImage .imageDataProvider ;
232- this .imageFileNameProvider = srcImage .imageFileNameProvider ;
226+ this .imageProvider = AbstractImageProvider .createCopy (srcImage .imageProvider , this );
233227 this .styleFlag = srcImage .styleFlag | flag ;
234228 initialNativeZoom = srcImage .initialNativeZoom ;
235229 long srcImageHandle = win32_getHandle (srcImage , getZoom ());
@@ -547,7 +541,7 @@ public Image (Device device, String filename) {
547541 */
548542public Image (Device device , ImageFileNameProvider imageFileNameProvider ) {
549543 super (device );
550- this .imageFileNameProvider = imageFileNameProvider ;
544+ this .imageProvider = new ImageFileNameProviderWrapper ( imageFileNameProvider ) ;
551545 initialNativeZoom = DPIUtil .getNativeDeviceZoom ();
552546 ElementAtZoom <String > fileName = DPIUtil .validateAndGetImagePathAtZoom (imageFileNameProvider , getZoom ());
553547 if (fileName .zoom () == getZoom ()) {
@@ -594,7 +588,7 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
594588 */
595589public Image (Device device , ImageDataProvider imageDataProvider ) {
596590 super (device );
597- this .imageDataProvider = imageDataProvider ;
591+ this .imageProvider = new ImageDataProviderWrapper ( imageDataProvider ) ;
598592 initialNativeZoom = DPIUtil .getNativeDeviceZoom ();
599593 ElementAtZoom <ImageData > data = DPIUtil .validateAndGetImageDataAtZoom (imageDataProvider , getZoom ());
600594 ImageData resizedData = DPIUtil .scaleImageData (device , data .element (), getZoom (), data .zoom ());
@@ -750,26 +744,8 @@ private ImageHandle getImageMetadata(int zoom) {
750744 if (zoomLevelToImageHandle .get (zoom ) != null ) {
751745 return zoomLevelToImageHandle .get (zoom );
752746 }
753-
754- if (imageFileNameProvider != null ) {
755- ElementAtZoom <String > imageCandidate = DPIUtil .validateAndGetImagePathAtZoom (imageFileNameProvider , zoom );
756- ImageData imageData = new ImageData (imageCandidate .element ());
757- if (imageCandidate .zoom () == zoom ) {
758- /* Release current native resources */
759- ImageHandle imageMetadata = initNative (imageCandidate .element (), zoom );
760- if (imageMetadata == null ) init (imageData , zoom );
761- init ();
762- } else {
763- ImageData resizedData = DPIUtil .scaleImageData (device , imageData , zoom , imageCandidate .zoom ());
764- ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
765- init (newData , zoom );
766- }
767- } else if (imageDataProvider != null ) {
768- ElementAtZoom <ImageData > imageCandidate = DPIUtil .validateAndGetImageDataAtZoom (imageDataProvider , zoom );
769- ImageData resizedData = DPIUtil .scaleImageData (device , imageCandidate .element (), zoom , imageCandidate .zoom ());
770- ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
771- init (newData , zoom );
772- init ();
747+ if (imageProvider != null ) {
748+ return imageProvider .getImageMetadata (zoom );
773749 } else {
774750 ImageData resizedData = getImageData (zoom );
775751 ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
@@ -1208,10 +1184,8 @@ public boolean equals (Object object) {
12081184 if (!(object instanceof Image )) return false ;
12091185 Image image = (Image ) object ;
12101186 if (device != image .device || transparentPixel != image .transparentPixel || getZoom () != image .getZoom ()) return false ;
1211- if (imageDataProvider != null && image .imageDataProvider != null ) {
1212- return (styleFlag == image .styleFlag ) && imageDataProvider .equals (image .imageDataProvider );
1213- } else if (imageFileNameProvider != null && image .imageFileNameProvider != null ) {
1214- return (styleFlag == image .styleFlag ) && imageFileNameProvider .equals (image .imageFileNameProvider );
1187+ if (imageProvider != null && image .imageProvider != null ) {
1188+ return (styleFlag == image .styleFlag ) && imageProvider .equals (image .imageProvider );
12151189 } else {
12161190 return win32_getHandle (this , getZoom ()) == win32_getHandle (image , getZoom ());
12171191 }
@@ -1381,15 +1355,8 @@ public ImageData getImageData (int zoom) {
13811355 int currentZoom = getZoom ();
13821356 if (zoom == currentZoom ) {
13831357 return getImageDataAtCurrentZoom ();
1384- } else if (imageDataProvider != null ) {
1385- ElementAtZoom <ImageData > data ;
1386- try (StaticZoomUpdater unused = new StaticZoomUpdater (zoom )) {
1387- data = DPIUtil .validateAndGetImageDataAtZoom (imageDataProvider , zoom );
1388- }
1389- return DPIUtil .scaleImageData (device , data .element (), zoom , data .zoom ());
1390- } else if (imageFileNameProvider != null ) {
1391- ElementAtZoom <String > fileName = DPIUtil .validateAndGetImagePathAtZoom (imageFileNameProvider , zoom );
1392- return DPIUtil .scaleImageData (device , new ImageData (fileName .element ()), zoom , fileName .zoom ());
1358+ } else if (imageProvider != null ) {
1359+ imageProvider .getImageData (zoom );
13931360 }
13941361
13951362 // if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
@@ -1436,13 +1403,10 @@ public ImageData getImageDataAtCurrentZoom() {
14361403 */
14371404@ Override
14381405public int hashCode () {
1439- if (imageDataProvider != null ) {
1440- return imageDataProvider .hashCode ();
1441- } else if (imageFileNameProvider != null ) {
1442- return Objects .hash (imageFileNameProvider , styleFlag , transparentPixel , getZoom ());
1443- } else {
1444- return (int )win32_getHandle (this , getZoom ());
1406+ if (imageProvider != null ) {
1407+ return imageProvider .hashCode ();
14451408 }
1409+ return (int )win32_getHandle (this , getZoom ());
14461410}
14471411
14481412void init (int width , int height ) {
@@ -2082,6 +2046,113 @@ public void close() {
20822046 }
20832047}
20842048
2049+ private abstract class AbstractImageProvider {
2050+ abstract Object getProvider ();
2051+ abstract ImageData getImageData (int zoom );
2052+ abstract ImageHandle getImageMetadata (int zoom );
2053+
2054+ @ Override
2055+ public int hashCode () {
2056+ return getProvider ().hashCode ();
2057+ }
2058+
2059+ @ Override
2060+ public boolean equals (Object otherProvider ) {
2061+ if (otherProvider != null && otherProvider instanceof AbstractImageProvider ) {
2062+ return getProvider ().equals (((AbstractImageProvider ) otherProvider ).getProvider ());
2063+ }
2064+ return false ;
2065+ }
2066+
2067+ private static AbstractImageProvider createCopy (AbstractImageProvider abstractImageProvider , Image image ) {
2068+ AbstractImageProvider imageProviderCopy = null ;
2069+ if (abstractImageProvider instanceof ImageFileNameProviderWrapper ) {
2070+ imageProviderCopy = image .new ImageFileNameProviderWrapper ((ImageFileNameProvider ) abstractImageProvider .getProvider ());
2071+ } else if (abstractImageProvider instanceof ImageDataProviderWrapper ) {
2072+ imageProviderCopy = image .new ImageDataProviderWrapper ((ImageDataProvider ) abstractImageProvider .getProvider ());
2073+ }
2074+ return imageProviderCopy ;
2075+ }
2076+ }
2077+
2078+ private class ImageFileNameProviderWrapper extends AbstractImageProvider {
2079+
2080+ /**
2081+ * ImageFileNameProvider to provide file names at various Zoom levels
2082+ */
2083+ final ImageFileNameProvider provider ;
2084+
2085+ public ImageFileNameProviderWrapper (ImageFileNameProvider provider ) {
2086+ this .provider = provider ;
2087+ }
2088+
2089+ @ Override
2090+ ImageData getImageData (int zoom ) {
2091+ ElementAtZoom <String > fileName = DPIUtil .validateAndGetImagePathAtZoom (provider , zoom );
2092+ return DPIUtil .scaleImageData (device , new ImageData (fileName .element ()), zoom , fileName .zoom ());
2093+ }
2094+
2095+ @ Override
2096+ ImageHandle getImageMetadata (int zoom ) {
2097+ ElementAtZoom <String > imageCandidate = DPIUtil .validateAndGetImagePathAtZoom (provider , zoom );
2098+ ImageData imageData = new ImageData (imageCandidate .element ());
2099+ if (imageCandidate .zoom () == zoom ) {
2100+ /* Release current native resources */
2101+ ImageHandle imageMetadata = initNative (imageCandidate .element (), zoom );
2102+ if (imageMetadata == null ) init (imageData , zoom );
2103+ init ();
2104+ } else {
2105+ ImageData resizedData = DPIUtil .scaleImageData (device , imageData , zoom , imageCandidate .zoom ());
2106+ ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
2107+ init (newData , zoom );
2108+ }
2109+ return zoomLevelToImageHandle .get (zoom );
2110+ }
2111+
2112+ @ Override
2113+ Object getProvider () {
2114+ return provider ;
2115+ }
2116+
2117+ @ Override
2118+ public int hashCode () {
2119+ return Objects .hash (provider , styleFlag , transparentPixel , getZoom ());
2120+ }
2121+ }
2122+
2123+ private class ImageDataProviderWrapper extends AbstractImageProvider {
2124+
2125+ /**
2126+ * ImageDataProvider to provide ImageData at various Zoom levels
2127+ */
2128+ final ImageDataProvider provider ;
2129+
2130+ public ImageDataProviderWrapper (ImageDataProvider provider ) {
2131+ this .provider = provider ;
2132+ }
2133+
2134+ @ Override
2135+ ImageData getImageData (int zoom ) {
2136+ ElementAtZoom <ImageData > data = DPIUtil .validateAndGetImageDataAtZoom (provider , zoom );
2137+ return DPIUtil .scaleImageData (device , data .element (), zoom , data .zoom ());
2138+ }
2139+
2140+ @ Override
2141+ ImageHandle getImageMetadata (int zoom ) {
2142+ ElementAtZoom <ImageData > imageCandidate = DPIUtil .validateAndGetImageDataAtZoom (provider , zoom );
2143+ ImageData resizedData = DPIUtil .scaleImageData (device , imageCandidate .element (), zoom , imageCandidate .zoom ());
2144+ ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
2145+ init (newData , zoom );
2146+ init ();
2147+ return zoomLevelToImageHandle .get (zoom );
2148+ }
2149+
2150+ @ Override
2151+ Object getProvider () {
2152+ return provider ;
2153+ }
2154+ }
2155+
20852156private class ImageHandle {
20862157 final long handle ;
20872158 final int height ;
0 commit comments