@@ -823,6 +823,27 @@ public static long win32_getHandle (Image image, int zoom) {
823823 return image .getImageMetadata (zoom ).handle ;
824824}
825825
826+ /**
827+ * <b>IMPORTANT:</b> This method is not part of the public
828+ * API for Image. It is marked public only so that it
829+ * can be shared within the packages provided by SWT. However, it is not
830+ * available on all platforms.
831+ *
832+ * Draws a scaled image using the GC by another image.
833+ *
834+ * @param gc the GC to draw on the resulting image
835+ * @param original the image which is supposed to be scaled and drawn on the resulting image
836+ * @param width the width of the original image
837+ * @param height the height of the original image
838+ * @param scaleFactor the factor with which the image is supposed to be scaled
839+ *
840+ * @noreference This method is not intended to be referenced by clients.
841+ */
842+ public static void drawScaled (GC gc , Image original , int width , int height , float scaleFactor ) {
843+ gc .drawImage (original , 0 , 0 , width , height ,
844+ 0 , 0 , Math .round (width * scaleFactor ), Math .round (height * scaleFactor ), false );
845+ }
846+
826847long [] createGdipImage () {
827848 return createGdipImage (this .getZoom ());
828849}
@@ -1254,7 +1275,7 @@ private ImageData getScaledImageData (int zoom) {
12541275 }
12551276 TreeSet <Integer > availableZooms = new TreeSet <>(zoomLevelToImageHandle .keySet ());
12561277 int closestZoom = Optional .ofNullable (availableZooms .higher (zoom )).orElse (availableZooms .lower (zoom ));
1257- return scaleImageData ( getImageMetadata (closestZoom ).getImageData (), zoom , closestZoom );
1278+ return DPIUtil . scaleImageData ( device , getImageMetadata (closestZoom ).getImageData (), zoom , closestZoom );
12581279}
12591280
12601281
@@ -1844,40 +1865,6 @@ public void setBackground(Color color) {
18441865 zoomLevelToImageHandle .values ().forEach (imageHandle -> imageHandle .setBackground (backgroundColor ));
18451866}
18461867
1847- private ImageData scaleImageData (final ImageData imageData , int targetZoom , int currentZoom ) {
1848- if (imageData == null || targetZoom == currentZoom || (device != null && !device .isAutoScalable ())) return imageData ;
1849- float scaleFactor = (float ) targetZoom / (float ) currentZoom ;
1850- int width = imageData .width ;
1851- int height = imageData .height ;
1852- int scaledWidth = Math .round (width * scaleFactor );
1853- int scaledHeight = Math .round (height * scaleFactor );
1854- boolean useSmoothScaling = DPIUtil .isSmoothScalingEnabled () && imageData .getTransparencyType () != SWT .TRANSPARENCY_MASK ;
1855- if (useSmoothScaling ) {
1856- return scaleToUsingSmoothScaling (scaledWidth , scaledHeight , imageData );
1857- }
1858- return imageData .scaledTo (scaledWidth , scaledHeight );
1859- }
1860-
1861- private ImageData scaleToUsingSmoothScaling (int width , int height , ImageData imageData ) {
1862- Image original = new Image (device , (ImageDataProvider ) zoom -> imageData );
1863- /* Create a 24 bit image data with alpha channel */
1864- final ImageData resultData = new ImageData (width , height , 24 , new PaletteData (0xFF , 0xFF00 , 0xFF0000 ));
1865- resultData .alphaData = new byte [width * height ];
1866- Image resultImage = new Image (device , (ImageDataProvider ) zoom -> resultData );
1867- GC gc = new GC (resultImage );
1868- gc .setAntialias (SWT .ON );
1869- gc .drawImage (original , 0 , 0 , imageData .width , imageData .height ,
1870- /* E.g. destWidth here is effectively DPIUtil.autoScaleDown (scaledWidth), but avoiding rounding errors.
1871- * Nevertheless, we still have some rounding errors due to the point-based API GC#drawImage(..).
1872- */
1873- 0 , 0 , width , height , false );
1874- gc .dispose ();
1875- original .dispose ();
1876- ImageData result = resultImage .getImageData (resultImage .getZoom ());
1877- resultImage .dispose ();
1878- return result ;
1879- }
1880-
18811868private int getZoom () {
18821869 return DPIUtil .getZoomForAutoscaleProperty (initialNativeZoom );
18831870}
@@ -2254,7 +2241,7 @@ final ImageHandle getImageMetadata(int zoom) {
22542241
22552242 private ImageHandle initializeHandleFromSource (int zoom ) {
22562243 ElementAtZoom <ImageData > imageDataAtZoom = loadImageData (zoom );
2257- ImageData imageData = scaleImageData ( imageDataAtZoom .element (), zoom , imageDataAtZoom .zoom ());
2244+ ImageData imageData = DPIUtil . scaleImageData ( device , imageDataAtZoom .element (), zoom , imageDataAtZoom .zoom ());
22582245 imageData = adaptImageDataIfDisabledOrGray (imageData );
22592246 return init (imageData , zoom );
22602247 }
0 commit comments