@@ -828,6 +828,27 @@ public static long win32_getHandle (Image image, int zoom) {
828828 return image .getImageMetadata (zoom ).handle ;
829829}
830830
831+ /**
832+ * <b>IMPORTANT:</b> This method is not part of the public
833+ * API for Image. It is marked public only so that it
834+ * can be shared within the packages provided by SWT. However, it is not
835+ * available on all platforms.
836+ *
837+ * Draws a scaled image using the GC by another image.
838+ *
839+ * @param gc the GC to draw on the resulting image
840+ * @param original the image which is supposed to be scaled and drawn on the resulting image
841+ * @param width the width of the original image
842+ * @param height the height of the original image
843+ * @param scaleFactor the factor with which the image is supposed to be scaled
844+ *
845+ * @noreference This method is not intended to be referenced by clients.
846+ */
847+ public static void drawScaled (GC gc , Image original , int width , int height , float scaleFactor ) {
848+ gc .drawImage (original , 0 , 0 , width , height ,
849+ 0 , 0 , Math .round (width * scaleFactor ), Math .round (height * scaleFactor ), false );
850+ }
851+
831852long [] createGdipImage () {
832853 return createGdipImage (this .getZoom ());
833854}
@@ -1259,7 +1280,7 @@ private ImageData getScaledImageData (int zoom) {
12591280 }
12601281 TreeSet <Integer > availableZooms = new TreeSet <>(zoomLevelToImageHandle .keySet ());
12611282 int closestZoom = Optional .ofNullable (availableZooms .higher (zoom )).orElse (availableZooms .lower (zoom ));
1262- return scaleImageData ( getImageMetadata (closestZoom ).getImageData (), zoom , closestZoom );
1283+ return DPIUtil . scaleImageData ( device , getImageMetadata (closestZoom ).getImageData (), zoom , closestZoom );
12631284}
12641285
12651286
@@ -1849,40 +1870,6 @@ public void setBackground(Color color) {
18491870 zoomLevelToImageHandle .values ().forEach (imageHandle -> imageHandle .setBackground (backgroundColor ));
18501871}
18511872
1852- private ImageData scaleImageData (final ImageData imageData , int targetZoom , int currentZoom ) {
1853- if (imageData == null || targetZoom == currentZoom || (device != null && !device .isAutoScalable ())) return imageData ;
1854- float scaleFactor = (float ) targetZoom / (float ) currentZoom ;
1855- int width = imageData .width ;
1856- int height = imageData .height ;
1857- int scaledWidth = Math .round (width * scaleFactor );
1858- int scaledHeight = Math .round (height * scaleFactor );
1859- boolean useSmoothScaling = DPIUtil .isSmoothScalingEnabled () && imageData .getTransparencyType () != SWT .TRANSPARENCY_MASK ;
1860- if (useSmoothScaling ) {
1861- return scaleToUsingSmoothScaling (scaledWidth , scaledHeight , imageData );
1862- }
1863- return imageData .scaledTo (scaledWidth , scaledHeight );
1864- }
1865-
1866- private ImageData scaleToUsingSmoothScaling (int width , int height , ImageData imageData ) {
1867- Image original = new Image (device , (ImageDataProvider ) zoom -> imageData );
1868- /* Create a 24 bit image data with alpha channel */
1869- final ImageData resultData = new ImageData (width , height , 24 , new PaletteData (0xFF , 0xFF00 , 0xFF0000 ));
1870- resultData .alphaData = new byte [width * height ];
1871- Image resultImage = new Image (device , (ImageDataProvider ) zoom -> resultData );
1872- GC gc = new GC (resultImage );
1873- gc .setAntialias (SWT .ON );
1874- gc .drawImage (original , 0 , 0 , imageData .width , imageData .height ,
1875- /* E.g. destWidth here is effectively DPIUtil.autoScaleDown (scaledWidth), but avoiding rounding errors.
1876- * Nevertheless, we still have some rounding errors due to the point-based API GC#drawImage(..).
1877- */
1878- 0 , 0 , width , height , false );
1879- gc .dispose ();
1880- original .dispose ();
1881- ImageData result = resultImage .getImageData (resultImage .getZoom ());
1882- resultImage .dispose ();
1883- return result ;
1884- }
1885-
18861873private int getZoom () {
18871874 return DPIUtil .getZoomForAutoscaleProperty (initialNativeZoom );
18881875}
@@ -2206,7 +2193,7 @@ final ImageHandle getImageMetadata(int zoom) {
22062193
22072194 private ImageHandle initializeHandleFromSource (int zoom ) {
22082195 ElementAtZoom <ImageData > imageDataAtZoom = loadImageData (zoom );
2209- ImageData imageData = scaleImageData ( imageDataAtZoom .element (), zoom , imageDataAtZoom .zoom ());
2196+ ImageData imageData = DPIUtil . scaleImageData ( device , imageDataAtZoom .element (), zoom , imageDataAtZoom .zoom ());
22102197 imageData = adaptImageDataIfDisabledOrGray (imageData );
22112198 return init (imageData , zoom );
22122199 }
0 commit comments