@@ -829,10 +829,22 @@ private ImageHandle getImageMetadata(ZoomContext zoomContext) {
829829 * @noreference This method is not intended to be referenced by clients.
830830 */
831831public static long win32_getHandle (Image image , int zoom ) {
832- if (image .isDisposed ()) {
832+ return image .getHandle (zoom , zoom );
833+ }
834+
835+ long getHandle (int targetZoom , int nativeZoom ) {
836+ if (isDisposed ()) {
833837 return 0L ;
834838 }
835- return image .getImageMetadata (new ZoomContext (zoom )).handle ;
839+ if (targetZoom == nativeZoom || !imageProvider .supportComplexZoom ()) {
840+ return getImageMetadata (new ZoomContext (targetZoom )).handle ;
841+ }
842+
843+ ZoomContext zoomContext = new ZoomContext (targetZoom , nativeZoom );
844+ if (memGC != null ) {
845+ return imageProvider .newImageHandle (zoomContext ).handle ;
846+ }
847+ return getImageMetadata (zoomContext ).handle ;
836848}
837849
838850/**
@@ -1772,6 +1784,7 @@ private long configureGC(GCData data, ZoomContext zoomContext) {
17721784 }
17731785 data .device = device ;
17741786 data .nativeZoom = zoomContext .nativeZoom ();
1787+ data .imageZoom = zoomContext .targetZoom ();
17751788 data .image = this ;
17761789 data .font = SWTFontProvider .getSystemFont (device , zoomContext .nativeZoom ());
17771790 }
@@ -1933,6 +1946,10 @@ private abstract class AbstractImageProviderWrapper {
19331946
19341947 protected abstract Rectangle getBounds (int zoom );
19351948
1949+ protected boolean supportComplexZoom () {
1950+ return false ;
1951+ }
1952+
19361953 protected long configureGCData (GCData data ) {
19371954 return configureGC (data , new ZoomContext (100 ));
19381955 }
@@ -2158,14 +2175,19 @@ private class PlainImageProviderWrapper extends AbstractImageProviderWrapper {
21582175 type = SWT .BITMAP ;
21592176 }
21602177
2178+ @ Override
2179+ protected boolean supportComplexZoom () {
2180+ return memGC != null ;
2181+ }
2182+
21612183 @ Override
21622184 public Collection <Integer > getPreservedZoomLevels () {
21632185 return Collections .singleton (baseZoom );
21642186 }
21652187
21662188 @ Override
21672189 protected long configureGCData (GCData data ) {
2168- return configureGC (data , new ZoomContext (DPIUtil .getDeviceZoom ()));
2190+ return configureGC (data , new ZoomContext (DPIUtil .getDeviceZoom (), DPIUtil . getNativeDeviceZoom () ));
21692191 }
21702192
21712193 @ Override
@@ -2597,6 +2619,11 @@ private class ImageGcDrawerWrapper extends DynamicImageProviderWrapper {
25972619 this .height = height ;
25982620 }
25992621
2622+ @ Override
2623+ protected boolean supportComplexZoom () {
2624+ return true ;
2625+ }
2626+
26002627 @ Override
26012628 protected Rectangle getBounds (int zoom ) {
26022629 Rectangle rectangle = new Rectangle (0 , 0 , width , height );
0 commit comments