@@ -109,7 +109,7 @@ public final class Image extends Resource implements Drawable {
109109 /**
110110 * AbstractImageProvider to avail right ImageProvider (ImageDataProvider or ImageFileNameProvider)
111111 */
112- private AbstractImageProviderWrapper imageProvider ;
112+ private final AbstractImageProviderWrapper imageProvider ;
113113
114114 /**
115115 * Style flag used to differentiate normal, gray-scale and disabled images based
@@ -136,16 +136,13 @@ public final class Image extends Resource implements Drawable {
136136
137137 private Map <Integer , ImageHandle > zoomLevelToImageHandle = new HashMap <>();
138138
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 ) {
147140 super (device );
148141 initialNativeZoom = nativeZoom ;
142+ this .type = type ;
143+ this .imageProvider = new ExistingImageHandleProviderWrapper (handle , nativeZoom );
144+ this .isInitialized = true ;
145+ this .device .registerResourceWithZoomSupport (this );
149146}
150147
151148/**
@@ -241,9 +238,7 @@ public Image(Device device, Image srcImage, int flag) {
241238 initialNativeZoom = srcImage .initialNativeZoom ;
242239 Rectangle rect = srcImage .getBounds (getZoom ());
243240 this .type = srcImage .type ;
244- if (srcImage .imageProvider != null ) {
245- this .imageProvider = srcImage .imageProvider .createCopy (this );
246- }
241+ this .imageProvider = srcImage .imageProvider .createCopy (this );
247242 this .styleFlag = srcImage .styleFlag | flag ;
248243 long srcImageHandle = win32_getHandle (srcImage , getZoom ());
249244 switch (flag ) {
@@ -1923,11 +1918,7 @@ public String toString () {
19231918 * @noreference This method is not intended to be referenced by clients.
19241919 */
19251920public 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 );
19311922}
19321923
19331924private abstract class AbstractImageProviderWrapper {
@@ -1947,6 +1938,56 @@ protected void destroy() {
19471938 }
19481939}
19491940
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+
19501991private abstract class ImageFromImageDataProviderWrapper extends AbstractImageProviderWrapper {
19511992
19521993 protected abstract ElementAtZoom <ImageData > loadImageData (int zoom );
0 commit comments