@@ -109,7 +109,7 @@ public final class Image extends Resource implements Drawable {
109
109
/**
110
110
* AbstractImageProvider to avail right ImageProvider (ImageDataProvider or ImageFileNameProvider)
111
111
*/
112
- private AbstractImageProviderWrapper imageProvider ;
112
+ private final AbstractImageProviderWrapper imageProvider ;
113
113
114
114
/**
115
115
* Style flag used to differentiate normal, gray-scale and disabled images based
@@ -136,16 +136,13 @@ public final class Image extends Resource implements Drawable {
136
136
137
137
private Map <Integer , ImageHandle > zoomLevelToImageHandle = new HashMap <>();
138
138
139
- /**
140
- * Prevents uninitialized instances from being created outside the package.
141
- */
142
- Image (Device device ) {
143
- this (device , DPIUtil .getNativeDeviceZoom ());
144
- }
145
-
146
- private Image (Device device , int nativeZoom ) {
139
+ private Image (Device device , int type , long handle , int nativeZoom ) {
147
140
super (device );
148
141
initialNativeZoom = nativeZoom ;
142
+ this .type = type ;
143
+ this .imageProvider = new ExistingImageHandleProviderWrapper (handle , nativeZoom );
144
+ this .isInitialized = true ;
145
+ this .device .registerResourceWithZoomSupport (this );
149
146
}
150
147
151
148
/**
@@ -241,9 +238,7 @@ public Image(Device device, Image srcImage, int flag) {
241
238
initialNativeZoom = srcImage .initialNativeZoom ;
242
239
Rectangle rect = srcImage .getBounds (getZoom ());
243
240
this .type = srcImage .type ;
244
- if (srcImage .imageProvider != null ) {
245
- this .imageProvider = srcImage .imageProvider .createCopy (this );
246
- }
241
+ this .imageProvider = srcImage .imageProvider .createCopy (this );
247
242
this .styleFlag = srcImage .styleFlag | flag ;
248
243
long srcImageHandle = win32_getHandle (srcImage , getZoom ());
249
244
switch (flag ) {
@@ -1923,11 +1918,7 @@ public String toString () {
1923
1918
* @noreference This method is not intended to be referenced by clients.
1924
1919
*/
1925
1920
public static Image win32_new (Device device , int type , long handle , int nativeZoom ) {
1926
- Image image = new Image (device , nativeZoom );
1927
- image .type = type ;
1928
- image .new ImageHandle (handle , nativeZoom );
1929
- image .device .registerResourceWithZoomSupport (image );
1930
- return image ;
1921
+ return new Image (device , type , handle , nativeZoom );
1931
1922
}
1932
1923
1933
1924
private abstract class AbstractImageProviderWrapper {
@@ -1947,6 +1938,56 @@ protected void destroy() {
1947
1938
}
1948
1939
}
1949
1940
1941
+ private class ExistingImageHandleProviderWrapper extends AbstractImageProviderWrapper {
1942
+
1943
+ private final int width ;
1944
+ private final int height ;
1945
+ private final long handle ;
1946
+ private final int zoomForHandle ;
1947
+
1948
+ public ExistingImageHandleProviderWrapper (long handle , int zoomForHandle ) {
1949
+ this .handle = handle ;
1950
+ this .zoomForHandle = zoomForHandle ;
1951
+ ImageHandle imageHandle = new ImageHandle (handle , zoomForHandle );
1952
+
1953
+ ImageData baseData = imageHandle .getImageData ();
1954
+ this .width = DPIUtil .scaleDown (baseData .width , zoomForHandle );
1955
+ this .height = DPIUtil .scaleDown (baseData .height , zoomForHandle );
1956
+ }
1957
+
1958
+ @ Override
1959
+ protected Rectangle getBounds (int zoom ) {
1960
+ Rectangle rectangle = new Rectangle (0 , 0 , width , height );
1961
+ return DPIUtil .scaleUp (rectangle , zoom );
1962
+ }
1963
+
1964
+ @ Override
1965
+ ImageData getImageData (int zoom ) {
1966
+ if (zoomLevelToImageHandle .isEmpty () || zoomLevelToImageHandle .containsKey (zoom )) {
1967
+ return getImageMetadata (zoom ).getImageData ();
1968
+ }
1969
+
1970
+ return getScaledImageData (zoom );
1971
+ }
1972
+
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
+
1985
+ @ Override
1986
+ AbstractImageProviderWrapper createCopy (Image image ) {
1987
+ return image .new ExistingImageHandleProviderWrapper (handle , zoomForHandle );
1988
+ }
1989
+ }
1990
+
1950
1991
private abstract class ImageFromImageDataProviderWrapper extends AbstractImageProviderWrapper {
1951
1992
1952
1993
protected abstract ElementAtZoom <ImageData > loadImageData (int zoom );
0 commit comments