@@ -101,14 +101,9 @@ public final class Image extends Resource implements Drawable {
101
101
GC memGC ;
102
102
103
103
/**
104
- * ImageFileNameProvider to provide file names at various Zoom levels
104
+ * AbstractImageProvider to avail right ImageProvider (ImageDataProvider or ImageFileNameProvider)
105
105
*/
106
- private ImageFileNameProvider imageFileNameProvider ;
107
-
108
- /**
109
- * ImageDataProvider to provide ImageData at various Zoom levels
110
- */
111
- private ImageDataProvider imageDataProvider ;
106
+ private AbstractImageProvider imageProvider ;
112
107
113
108
/**
114
109
* Style flag used to differentiate normal, gray-scale and disabled images based
@@ -228,8 +223,9 @@ public Image(Device device, Image srcImage, int flag) {
228
223
if (srcImage .isDisposed ()) SWT .error (SWT .ERROR_INVALID_ARGUMENT );
229
224
Rectangle rect = srcImage .getBoundsInPixels ();
230
225
this .type = srcImage .type ;
231
- this .imageDataProvider = srcImage .imageDataProvider ;
232
- this .imageFileNameProvider = srcImage .imageFileNameProvider ;
226
+ if (srcImage .imageProvider != null ) {
227
+ this .imageProvider = srcImage .imageProvider .createCopy (this );
228
+ }
233
229
this .styleFlag = srcImage .styleFlag | flag ;
234
230
initialNativeZoom = srcImage .initialNativeZoom ;
235
231
long srcImageHandle = win32_getHandle (srcImage , getZoom ());
@@ -547,7 +543,7 @@ public Image (Device device, String filename) {
547
543
*/
548
544
public Image (Device device , ImageFileNameProvider imageFileNameProvider ) {
549
545
super (device );
550
- this .imageFileNameProvider = imageFileNameProvider ;
546
+ this .imageProvider = new ImageFileNameProviderWrapper ( imageFileNameProvider ) ;
551
547
initialNativeZoom = DPIUtil .getNativeDeviceZoom ();
552
548
ElementAtZoom <String > fileName = DPIUtil .validateAndGetImagePathAtZoom (imageFileNameProvider , getZoom ());
553
549
if (fileName .zoom () == getZoom ()) {
@@ -594,7 +590,7 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
594
590
*/
595
591
public Image (Device device , ImageDataProvider imageDataProvider ) {
596
592
super (device );
597
- this .imageDataProvider = imageDataProvider ;
593
+ this .imageProvider = new ImageDataProviderWrapper ( imageDataProvider ) ;
598
594
initialNativeZoom = DPIUtil .getNativeDeviceZoom ();
599
595
ElementAtZoom <ImageData > data = DPIUtil .validateAndGetImageDataAtZoom (imageDataProvider , getZoom ());
600
596
ImageData resizedData = DPIUtil .scaleImageData (device , data .element (), getZoom (), data .zoom ());
@@ -750,26 +746,8 @@ private ImageHandle getImageMetadata(int zoom) {
750
746
if (zoomLevelToImageHandle .get (zoom ) != null ) {
751
747
return zoomLevelToImageHandle .get (zoom );
752
748
}
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 ();
749
+ if (imageProvider != null ) {
750
+ return imageProvider .getImageMetadata (zoom );
773
751
} else {
774
752
ImageData resizedData = getImageData (zoom );
775
753
ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
@@ -1208,10 +1186,8 @@ public boolean equals (Object object) {
1208
1186
if (!(object instanceof Image )) return false ;
1209
1187
Image image = (Image ) object ;
1210
1188
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 );
1189
+ if (imageProvider != null && image .imageProvider != null ) {
1190
+ return (styleFlag == image .styleFlag ) && imageProvider .equals (image .imageProvider );
1215
1191
} else {
1216
1192
return win32_getHandle (this , getZoom ()) == win32_getHandle (image , getZoom ());
1217
1193
}
@@ -1387,15 +1363,8 @@ public ImageData getImageData (int zoom) {
1387
1363
int currentZoom = getZoom ();
1388
1364
if (zoom == currentZoom ) {
1389
1365
return getImageDataAtCurrentZoom ();
1390
- } else if (imageDataProvider != null ) {
1391
- ElementAtZoom <ImageData > data ;
1392
- try (StaticZoomUpdater unused = new StaticZoomUpdater (zoom )) {
1393
- data = DPIUtil .validateAndGetImageDataAtZoom (imageDataProvider , zoom );
1394
- }
1395
- return DPIUtil .scaleImageData (device , data .element (), zoom , data .zoom ());
1396
- } else if (imageFileNameProvider != null ) {
1397
- ElementAtZoom <String > fileName = DPIUtil .validateAndGetImagePathAtZoom (imageFileNameProvider , zoom );
1398
- return DPIUtil .scaleImageData (device , new ImageData (fileName .element ()), zoom , fileName .zoom ());
1366
+ } else if (imageProvider != null ) {
1367
+ return imageProvider .getImageData (zoom );
1399
1368
}
1400
1369
1401
1370
// if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
@@ -1442,13 +1411,10 @@ public ImageData getImageDataAtCurrentZoom() {
1442
1411
*/
1443
1412
@ Override
1444
1413
public int hashCode () {
1445
- if (imageDataProvider != null ) {
1446
- return imageDataProvider .hashCode ();
1447
- } else if (imageFileNameProvider != null ) {
1448
- return Objects .hash (imageFileNameProvider , styleFlag , transparentPixel , getZoom ());
1449
- } else {
1450
- return (int )win32_getHandle (this , getZoom ());
1414
+ if (imageProvider != null ) {
1415
+ return imageProvider .hashCode ();
1451
1416
}
1417
+ return (int )win32_getHandle (this , getZoom ());
1452
1418
}
1453
1419
1454
1420
void init (int width , int height ) {
@@ -2088,6 +2054,114 @@ public void close() {
2088
2054
}
2089
2055
}
2090
2056
2057
+ private abstract class AbstractImageProvider {
2058
+ abstract Object getProvider ();
2059
+ abstract ImageData getImageData (int zoom );
2060
+ abstract ImageHandle getImageMetadata (int zoom );
2061
+ abstract AbstractImageProvider createCopy (Image image );
2062
+
2063
+ @ Override
2064
+ public int hashCode () {
2065
+ return getProvider ().hashCode ();
2066
+ }
2067
+
2068
+ @ Override
2069
+ public boolean equals (Object otherProvider ) {
2070
+ if (otherProvider != null && otherProvider instanceof AbstractImageProvider ) {
2071
+ return getProvider ().equals (((AbstractImageProvider ) otherProvider ).getProvider ());
2072
+ }
2073
+ return false ;
2074
+ }
2075
+ }
2076
+
2077
+ private class ImageFileNameProviderWrapper extends AbstractImageProvider {
2078
+
2079
+ /**
2080
+ * ImageFileNameProvider to provide file names at various Zoom levels
2081
+ */
2082
+ final ImageFileNameProvider provider ;
2083
+
2084
+ public ImageFileNameProviderWrapper (ImageFileNameProvider provider ) {
2085
+ this .provider = provider ;
2086
+ }
2087
+
2088
+ @ Override
2089
+ ImageData getImageData (int zoom ) {
2090
+ ElementAtZoom <String > fileName = DPIUtil .validateAndGetImagePathAtZoom (provider , zoom );
2091
+ return DPIUtil .scaleImageData (device , new ImageData (fileName .element ()), zoom , fileName .zoom ());
2092
+ }
2093
+
2094
+ @ Override
2095
+ ImageHandle getImageMetadata (int zoom ) {
2096
+ ElementAtZoom <String > imageCandidate = DPIUtil .validateAndGetImagePathAtZoom (provider , zoom );
2097
+ ImageData imageData = new ImageData (imageCandidate .element ());
2098
+ if (imageCandidate .zoom () == zoom ) {
2099
+ /* Release current native resources */
2100
+ ImageHandle imageMetadata = initNative (imageCandidate .element (), zoom );
2101
+ if (imageMetadata == null ) init (imageData , zoom );
2102
+ init ();
2103
+ } else {
2104
+ ImageData resizedData = DPIUtil .scaleImageData (device , imageData , zoom , imageCandidate .zoom ());
2105
+ ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
2106
+ init (newData , zoom );
2107
+ }
2108
+ return zoomLevelToImageHandle .get (zoom );
2109
+ }
2110
+
2111
+ @ Override
2112
+ Object getProvider () {
2113
+ return provider ;
2114
+ }
2115
+
2116
+ @ Override
2117
+ public int hashCode () {
2118
+ return Objects .hash (provider , styleFlag , transparentPixel , getZoom ());
2119
+ }
2120
+
2121
+ @ Override
2122
+ AbstractImageProvider createCopy (Image image ) {
2123
+ return image .new ImageFileNameProviderWrapper (provider );
2124
+ }
2125
+ }
2126
+
2127
+ private class ImageDataProviderWrapper extends AbstractImageProvider {
2128
+
2129
+ /**
2130
+ * ImageDataProvider to provide ImageData at various Zoom levels
2131
+ */
2132
+ final ImageDataProvider provider ;
2133
+
2134
+ public ImageDataProviderWrapper (ImageDataProvider provider ) {
2135
+ this .provider = provider ;
2136
+ }
2137
+
2138
+ @ Override
2139
+ ImageData getImageData (int zoom ) {
2140
+ ElementAtZoom <ImageData > data = DPIUtil .validateAndGetImageDataAtZoom (provider , zoom );
2141
+ return DPIUtil .scaleImageData (device , data .element (), zoom , data .zoom ());
2142
+ }
2143
+
2144
+ @ Override
2145
+ ImageHandle getImageMetadata (int zoom ) {
2146
+ ElementAtZoom <ImageData > imageCandidate = DPIUtil .validateAndGetImageDataAtZoom (provider , zoom );
2147
+ ImageData resizedData = DPIUtil .scaleImageData (device , imageCandidate .element (), zoom , imageCandidate .zoom ());
2148
+ ImageData newData = adaptImageDataIfDisabledOrGray (resizedData );
2149
+ init (newData , zoom );
2150
+ init ();
2151
+ return zoomLevelToImageHandle .get (zoom );
2152
+ }
2153
+
2154
+ @ Override
2155
+ Object getProvider () {
2156
+ return provider ;
2157
+ }
2158
+
2159
+ @ Override
2160
+ AbstractImageProvider createCopy (Image image ) {
2161
+ return image .new ImageDataProviderWrapper (provider );
2162
+ }
2163
+ }
2164
+
2091
2165
private class ImageHandle {
2092
2166
final long handle ;
2093
2167
final int zoom ;
0 commit comments