Skip to content

Commit d38a969

Browse files
committed
WIP
1 parent 5866dad commit d38a969

File tree

6 files changed

+136
-97
lines changed

6 files changed

+136
-97
lines changed

bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Image.java

+32-1
Original file line numberDiff line numberDiff line change
@@ -1408,7 +1408,38 @@ public ImageData getImageData(int zoom) {
14081408
} finally {
14091409
if (pool != null) pool.release();
14101410
}
1411-
return DPIUtil.scaleImageData (device, getImageData(100), zoom, 100);
1411+
return scaledTo (getImageData(100), zoom, 100, DPIUtil.getScalingType(imageData));
1412+
}
1413+
1414+
private ImageData scaledTo(ImageData imageData, int targetZoom, int currentZoom, int scaleType) {
1415+
if (imageData == null || currentZoom == targetZoom || !device.isAutoScalable()) {
1416+
return imageData;
1417+
}
1418+
float scaleFactor = (float) targetZoom / (float) currentZoom;
1419+
int scaledWidth = Math.round (imageData.width * scaleFactor);
1420+
int scaledHeight = Math.round (imageData.height * scaleFactor);
1421+
switch (scaleType) {
1422+
case SWT.SMOOTH:
1423+
return scaleUsingSmoothScaling(imageData, scaledWidth, scaledHeight);
1424+
default:
1425+
return imageData.scaledTo(scaledWidth, scaledHeight);
1426+
}
1427+
}
1428+
1429+
private ImageData scaleUsingSmoothScaling(ImageData imageData, int width, int height) {
1430+
Image original = new Image (device, (ImageDataProvider) zoom -> imageData);
1431+
/* Create a 24 bit image data with alpha channel */
1432+
final ImageData resultData = new ImageData (width, height, 24, new PaletteData (0xFF, 0xFF00, 0xFF0000));
1433+
resultData.alphaData = new byte [width * height];
1434+
Image resultImage = new Image (device, (ImageDataProvider) zoom -> resultData);
1435+
GC gc = new GC (resultImage);
1436+
gc.setAntialias (SWT.ON);
1437+
gc.drawImage (original, 0, 0, imageData.width, imageData.height, 0, 0, width, height, false);
1438+
gc.dispose ();
1439+
original.dispose ();
1440+
ImageData result = resultImage.getImageData (resultImage.getZoom());
1441+
resultImage.dispose ();
1442+
return result;
14121443
}
14131444

14141445
/** Returns the best available representation. May be 100% or 200% iff there is an image provider. */

bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/graphics/ImageData.java

-21
Original file line numberDiff line numberDiff line change
@@ -1114,27 +1114,6 @@ int getByteOrder() {
11141114
return depth != 16 ? MSB_FIRST : LSB_FIRST;
11151115
}
11161116

1117-
/**
1118-
* Returns the scaled ImageData using smooth scaling.
1119-
*
1120-
* @since 3.130
1121-
*/
1122-
public ImageData scaleToUsingSmoothScaling(Device device, int width, int height) {
1123-
Image original = new Image (device, (ImageDataProvider) zoom -> this);
1124-
/* Create a 24 bit image data with alpha channel */
1125-
final ImageData resultData = new ImageData (width, height, 24, new PaletteData (0xFF, 0xFF00, 0xFF0000));
1126-
resultData.alphaData = new byte [width * height];
1127-
Image resultImage = new Image (device, (ImageDataProvider) zoom -> resultData);
1128-
GC gc = new GC (resultImage);
1129-
gc.setAntialias (SWT.ON);
1130-
gc.drawImage (original, 0, 0, this.width, this.height, 0, 0, width, height, false);
1131-
gc.dispose ();
1132-
original.dispose ();
1133-
ImageData result = resultImage.getImageData (DPIUtil.getDeviceZoom());
1134-
resultImage.dispose ();
1135-
return result;
1136-
}
1137-
11381117
/**
11391118
* Returns a copy of the receiver which has been stretched or
11401119
* shrunk to the specified size. If either the width or height

bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/DPIUtil.java

+14-54
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,6 @@ private static enum AutoScaleMethod { AUTO, NEAREST, SMOOTH }
109109
}
110110
}
111111

112-
/**
113-
* Auto-scale down ImageData
114-
*/
115-
public static ImageData autoScaleDown (Device device, final ImageData imageData) {
116-
if (deviceZoom == 100 || imageData == null || (device != null && !device.isAutoScalable())) return imageData;
117-
float scaleFactor = 1.0f / getScalingFactor (deviceZoom);
118-
return autoScaleImageData(device, imageData, scaleFactor);
119-
}
120-
121112
public static int[] autoScaleDown(int[] pointArray) {
122113
if (deviceZoom == 100 || pointArray == null) return pointArray;
123114
float scaleFactor = getScalingFactor (deviceZoom);
@@ -272,31 +263,16 @@ public static Rectangle scaleDown(Drawable drawable, Rectangle rect, int zoom) {
272263
return scaleDown (rect, zoom);
273264
}
274265

275-
/**
276-
* Auto-scale image with ImageData
277-
*/
278-
public static ImageData scaleImageData (Device device, final ImageData imageData, int targetZoom, int currentZoom) {
279-
if (imageData == null || targetZoom == currentZoom || (device != null && !device.isAutoScalable())) return imageData;
280-
float scaleFactor = (float) targetZoom / (float) currentZoom;
281-
return autoScaleImageData(device, imageData, scaleFactor);
282-
}
283-
284-
285-
public static ImageData scaleImageData (Device device, final ElementAtZoom<ImageData> elementAtZoom, int targetZoom) {
286-
return scaleImageData(device, elementAtZoom.element(), targetZoom, elementAtZoom.zoom());
287-
}
288-
289-
private static ImageData autoScaleImageData (Device device, final ImageData imageData, float scaleFactor) {
290-
// Guards are already implemented in callers: if (deviceZoom == 100 || imageData == null || scaleFactor == 1.0f) return imageData;
291-
int width = imageData.width;
292-
int height = imageData.height;
293-
int scaledWidth = Math.round (width * scaleFactor);
294-
int scaledHeight = Math.round (height * scaleFactor);
295-
boolean useSmoothScaling = autoScaleMethod == AutoScaleMethod.SMOOTH && imageData.getTransparencyType() != SWT.TRANSPARENCY_MASK;
296-
if (useSmoothScaling) {
297-
return imageData.scaleToUsingSmoothScaling(device, scaledWidth, scaledHeight);
266+
public static int getScalingType(ImageData imageData) {
267+
switch(autoScaleMethod) {
268+
case SMOOTH:
269+
if (imageData.getTransparencyType() != SWT.TRANSPARENCY_MASK) {
270+
return SWT.SMOOTH;
271+
}
272+
return SWT.DEFAULT;
273+
default:
274+
return SWT.DEFAULT;
298275
}
299-
return imageData.scaledTo (scaledWidth, scaledHeight);
300276
}
301277

302278
/**
@@ -313,22 +289,6 @@ public static Rectangle scaleBounds (Rectangle rect, int targetZoom, int current
313289
return returnRect;
314290
}
315291

316-
/**
317-
* Auto-scale ImageData to device zoom that are at given zoom factor.
318-
*/
319-
public static ImageData autoScaleImageData (Device device, final ImageData imageData, int imageDataZoomFactor) {
320-
if (deviceZoom == imageDataZoomFactor || imageData == null || (device != null && !device.isAutoScalable())) return imageData;
321-
float scaleFactor = (float) deviceZoom / imageDataZoomFactor;
322-
return autoScaleImageData(device, imageData, scaleFactor);
323-
}
324-
325-
/**
326-
* Auto-scale up ImageData to device zoom that is at 100%.
327-
*/
328-
public static ImageData autoScaleUp (Device device, final ImageData imageData) {
329-
return autoScaleImageData(device, imageData, 100);
330-
}
331-
332292
public static int[] autoScaleUp(int[] pointArray) {
333293
return scaleUp(pointArray, deviceZoom);
334294
}
@@ -584,10 +544,6 @@ public static int getDeviceZoom() {
584544
return deviceZoom;
585545
}
586546

587-
public static int getDeviceZoom(String autoScaleProperty) {
588-
return getZoomForAutoscaleProperty(nativeDeviceZoom, autoScaleProperty);
589-
}
590-
591547
public static void setDeviceZoom (int nativeDeviceZoom) {
592548
DPIUtil.nativeDeviceZoom = nativeDeviceZoom;
593549
int deviceZoom = getZoomForAutoscaleProperty (nativeDeviceZoom);
@@ -715,7 +671,11 @@ public AutoScaleImageDataProvider(Device device, ImageData data, int zoom){
715671
}
716672
@Override
717673
public ImageData getImageData(int zoom) {
718-
return DPIUtil.scaleImageData(device, imageData, zoom, currentZoom);
674+
Image image = new Image(device, imageData);
675+
int adjustedZoom = (int) ((float) getDeviceZoom() / (float) currentZoom) * zoom;
676+
ImageData imageData = image.getImageData(adjustedZoom);
677+
image.dispose();
678+
return imageData;
719679
}
720680
}
721681
}

bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Image.java

+39-8
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ public Image(Device device, InputStream stream) {
533533
super(device);
534534
currentDeviceZoom = DPIUtil.getDeviceZoom();
535535
ElementAtZoom<ImageData> image = ImageDataLoader.load(stream, FileFormat.DEFAULT_ZOOM, currentDeviceZoom);
536-
ImageData data = DPIUtil.scaleImageData(device, image, currentDeviceZoom);
536+
ImageData data = scaledTo(image.element(), currentDeviceZoom, image.zoom(), DPIUtil.getScalingType(imageData));
537537
init(data);
538538
init();
539539
}
@@ -575,7 +575,7 @@ public Image(Device device, String filename) {
575575
if (filename == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
576576
currentDeviceZoom = DPIUtil.getDeviceZoom();
577577
ElementAtZoom<ImageData> image = ImageDataLoader.load(filename, FileFormat.DEFAULT_ZOOM, currentDeviceZoom);
578-
ImageData data = DPIUtil.scaleImageData(device, image, currentDeviceZoom);
578+
ImageData data = scaledTo(image.element(), currentDeviceZoom, image.zoom(), DPIUtil.getScalingType(imageData));
579579
init(data);
580580
init();
581581
}
@@ -744,7 +744,7 @@ boolean refreshImageForZoom () {
744744
if (deviceZoomLevel != currentDeviceZoom) {
745745
ImageData data = getImageDataAtCurrentZoom();
746746
destroy ();
747-
ImageData resizedData = DPIUtil.scaleImageData(device, data, deviceZoomLevel, currentDeviceZoom);
747+
ImageData resizedData = scaledTo(data, deviceZoomLevel, currentDeviceZoom, DPIUtil.getScalingType(imageData));
748748
init(resizedData);
749749
init();
750750
refreshed = true;
@@ -778,15 +778,15 @@ private void initFromFileNameProvider(int zoom) {
778778
ElementAtZoom<ImageData> imageDataAtZoom = ImageDataLoader.load(fileForZoom.element(), fileForZoom.zoom(), zoom);
779779
ImageData imageData = imageDataAtZoom.element();
780780
if (imageDataAtZoom.zoom() != zoom) {
781-
imageData = DPIUtil.scaleImageData(device, imageDataAtZoom, zoom);
781+
imageData = scaledTo(imageDataAtZoom.element(), zoom, imageDataAtZoom.zoom(), DPIUtil.getScalingType(imageData));
782782
}
783783
init(imageData);
784784
}
785785
}
786786

787787
private void initFromImageDataProvider(int zoom) {
788788
ElementAtZoom<ImageData> data = DPIUtil.validateAndGetImageDataAtZoom (imageDataProvider, zoom);
789-
ImageData resizedData = DPIUtil.scaleImageData (device, data.element(), zoom, data.zoom());
789+
ImageData resizedData = scaledTo(data.element(), zoom, data.zoom(), DPIUtil.getScalingType(imageData));
790790
init(resizedData);
791791
}
792792

@@ -1146,17 +1146,48 @@ public ImageData getImageData (int zoom) {
11461146
return getImageDataAtCurrentZoom();
11471147
} else if (imageDataProvider != null) {
11481148
ElementAtZoom<ImageData> data = DPIUtil.validateAndGetImageDataAtZoom (imageDataProvider, zoom);
1149-
return DPIUtil.scaleImageData (device, data.element(), zoom, data.zoom());
1149+
return scaledTo(data.element(), zoom, data.zoom(), DPIUtil.getScalingType(imageData));
11501150
} else if (imageFileNameProvider != null) {
11511151
ElementAtZoom<String> fileName = DPIUtil.validateAndGetImagePathAtZoom (imageFileNameProvider, zoom);
1152-
return DPIUtil.scaleImageData (device, new ImageData (fileName.element()), zoom, fileName.zoom());
1152+
return scaledTo(new ImageData (fileName.element()), zoom, fileName.zoom(), DPIUtil.getScalingType(imageData));
11531153
} else if (imageGcDrawer != null) {
11541154
return drawWithImageGcDrawer(width, height, zoom);
11551155
} else {
1156-
return DPIUtil.scaleImageData (device, getImageDataAtCurrentZoom (), zoom, currentDeviceZoom);
1156+
return scaledTo(getImageDataAtCurrentZoom (), zoom, currentDeviceZoom, DPIUtil.getScalingType(imageData));
11571157
}
11581158
}
11591159

1160+
private ImageData scaledTo(ImageData imageData, int targetZoom, int currentZoom, int scaleType) {
1161+
if (imageData == null || currentZoom == targetZoom || !device.isAutoScalable()) {
1162+
return imageData;
1163+
}
1164+
float scaleFactor = (float) targetZoom / (float) currentZoom;
1165+
int scaledWidth = Math.round (imageData.width * scaleFactor);
1166+
int scaledHeight = Math.round (imageData.height * scaleFactor);
1167+
switch (scaleType) {
1168+
case SWT.SMOOTH:
1169+
return scaleUsingSmoothScaling(imageData, scaledWidth, scaledHeight);
1170+
default:
1171+
return imageData.scaledTo(scaledWidth, scaledHeight);
1172+
}
1173+
}
1174+
1175+
private ImageData scaleUsingSmoothScaling(ImageData imageData, int width, int height) {
1176+
Image original = new Image (device, (ImageDataProvider) zoom -> imageData);
1177+
/* Create a 24 bit image data with alpha channel */
1178+
final ImageData resultData = new ImageData (width, height, 24, new PaletteData (0xFF, 0xFF00, 0xFF0000));
1179+
resultData.alphaData = new byte [width * height];
1180+
Image resultImage = new Image (device, (ImageDataProvider) zoom -> resultData);
1181+
GC gc = new GC (resultImage);
1182+
gc.setAntialias (SWT.ON);
1183+
gc.drawImage (original, 0, 0, imageData.width, imageData.height, 0, 0, width, height, false);
1184+
gc.dispose ();
1185+
original.dispose ();
1186+
ImageData result = resultImage.getImageData (resultImage.getZoom());
1187+
resultImage.dispose ();
1188+
return result;
1189+
}
1190+
11601191
private ImageData drawWithImageGcDrawer(int width, int height, int zoom) {
11611192
Image image = new Image(device, width, height);
11621193
GC gc = new GC(image);

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Cursor.java

+12-6
Original file line numberDiff line numberDiff line change
@@ -372,15 +372,21 @@ public static Long win32_getHandle (Cursor cursor, int zoom) {
372372
if (cursor.source == null) {
373373
cursor.setHandleForZoomLevel(cursor.handle, zoom);
374374
} else {
375-
ImageData source = DPIUtil.scaleImageData(cursor.device, cursor.source, zoom, DEFAULT_ZOOM);
375+
Image image;
376+
ImageData source, mask;
377+
Cursor newCursor;
378+
image = new Image(cursor.device, cursor.source);
379+
source = image.getImageData(zoom);
380+
image.dispose();
376381
if (cursor.isIcon) {
377-
Cursor newCursor = new Cursor(cursor.device, source, cursor.hotspotX, cursor.hotspotY);
378-
cursor.setHandleForZoomLevel(newCursor.handle, zoom);
382+
newCursor = new Cursor(cursor.device, source, cursor.hotspotX, cursor.hotspotY);
379383
} else {
380-
ImageData mask = DPIUtil.scaleImageData(cursor.device, cursor.mask, zoom, DEFAULT_ZOOM);
381-
Cursor newCursor = new Cursor(cursor.device, source, mask, cursor.hotspotX, cursor.hotspotY);
382-
cursor.setHandleForZoomLevel(newCursor.handle, zoom);
384+
image = new Image(cursor.device, cursor.mask);
385+
mask = image.getImageData(zoom);
386+
image.dispose();
387+
newCursor = new Cursor(cursor.device, source, mask, cursor.hotspotX, cursor.hotspotY);
383388
}
389+
cursor.setHandleForZoomLevel(newCursor.handle, zoom);
384390
}
385391
return cursor.zoomLevelToHandle.get(zoom);
386392
}

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java

+39-7
Original file line numberDiff line numberDiff line change
@@ -1265,7 +1265,39 @@ private ImageData getScaledImageData (int zoom) {
12651265
}
12661266
TreeSet<Integer> availableZooms = new TreeSet<>(zoomLevelToImageHandle.keySet());
12671267
int closestZoom = Optional.ofNullable(availableZooms.higher(zoom)).orElse(availableZooms.lower(zoom));
1268-
return DPIUtil.scaleImageData (device, getImageMetadata(closestZoom).getImageData(), zoom, closestZoom);
1268+
ImageData imageData = getImageMetadata(closestZoom).getImageData();
1269+
return scaledTo(imageData, zoom, closestZoom, DPIUtil.getScalingType(imageData));
1270+
}
1271+
1272+
private ImageData scaledTo(ImageData imageData, int targetZoom, int currentZoom, int scaleType) {
1273+
if (imageData == null || currentZoom == targetZoom || !device.isAutoScalable()) {
1274+
return imageData;
1275+
}
1276+
float scaleFactor = (float) targetZoom / (float) currentZoom;
1277+
int scaledWidth = Math.round (imageData.width * scaleFactor);
1278+
int scaledHeight = Math.round (imageData.height * scaleFactor);
1279+
switch (scaleType) {
1280+
case SWT.SMOOTH:
1281+
return scaleUsingSmoothScaling(imageData, scaledWidth, scaledHeight);
1282+
default:
1283+
return imageData.scaledTo(scaledWidth, scaledHeight);
1284+
}
1285+
}
1286+
1287+
private ImageData scaleUsingSmoothScaling(ImageData imageData, int width, int height) {
1288+
Image original = new Image (device, (ImageDataProvider) zoom -> imageData);
1289+
/* Create a 24 bit image data with alpha channel */
1290+
final ImageData resultData = new ImageData (width, height, 24, new PaletteData (0xFF, 0xFF00, 0xFF0000));
1291+
resultData.alphaData = new byte [width * height];
1292+
Image resultImage = new Image (device, (ImageDataProvider) zoom -> resultData);
1293+
GC gc = new GC (resultImage);
1294+
gc.setAntialias (SWT.ON);
1295+
gc.drawImage (original, 0, 0, imageData.width, imageData.height, 0, 0, width, height, false);
1296+
gc.dispose ();
1297+
original.dispose ();
1298+
ImageData result = resultImage.getImageData (resultImage.getZoom());
1299+
resultImage.dispose ();
1300+
return result;
12691301
}
12701302

12711303

@@ -1933,7 +1965,7 @@ ImageData getImageData(int zoom) {
19331965
return getScaledImageData(zoom);
19341966
}
19351967
ElementAtZoom<ImageData> loadedImageData = loadImageData(zoom);
1936-
return DPIUtil.scaleImageData(device, loadedImageData, zoom);
1968+
return scaledTo(loadedImageData.element(), zoom, loadedImageData.zoom(), DPIUtil.getScalingType(loadedImageData.element()));
19371969
}
19381970

19391971
@Override
@@ -1991,8 +2023,8 @@ protected Rectangle getBounds(int zoom) {
19912023

19922024
@Override
19932025
protected ElementAtZoom<ImageData> loadImageData(int zoom) {
1994-
ImageData scaledSource = DPIUtil.scaleImageData(device, srcAt100, zoom, 100);
1995-
ImageData scaledMask = DPIUtil.scaleImageData(device, maskAt100, zoom, 100);
2026+
ImageData scaledSource = scaledTo(srcAt100, zoom, 100, DPIUtil.getScalingType(srcAt100));
2027+
ImageData scaledMask = scaledTo(maskAt100, zoom, 100, DPIUtil.getScalingType(maskAt100));
19962028
scaledMask = ImageData.convertMask(scaledMask);
19972029
ImageData mergedData = applyMask(scaledSource, scaledMask);
19982030
return new ElementAtZoom<>(mergedData, zoom);
@@ -2199,7 +2231,7 @@ ImageData getImageData(int zoom) {
21992231

22002232
private ImageData scaleIfNecessary(ElementAtZoom<ImageData> imageDataAtZoom, int zoom) {
22012233
if (imageDataAtZoom.zoom() != zoom) {
2202-
return DPIUtil.scaleImageData(device, imageDataAtZoom, zoom);
2234+
return scaledTo(imageDataAtZoom.element(), zoom, imageDataAtZoom.zoom(), DPIUtil.getScalingType(imageDataAtZoom.element()));
22032235
} else {
22042236
return imageDataAtZoom.element();
22052237
}
@@ -2424,13 +2456,13 @@ private class ImageDataProviderWrapper extends BaseImageProviderWrapper<ImageDat
24242456
@Override
24252457
ImageData getImageData(int zoom) {
24262458
ElementAtZoom<ImageData> data = DPIUtil.validateAndGetImageDataAtZoom (provider, zoom);
2427-
return DPIUtil.scaleImageData (device, data.element(), zoom, data.zoom());
2459+
return scaledTo(data.element(), zoom, data.zoom(), DPIUtil.getScalingType(data.element()));
24282460
}
24292461

24302462
@Override
24312463
ImageHandle getImageMetadata(int zoom) {
24322464
ElementAtZoom<ImageData> imageCandidate = DPIUtil.validateAndGetImageDataAtZoom (provider, zoom);
2433-
ImageData resizedData = DPIUtil.scaleImageData (device, imageCandidate.element(), zoom, imageCandidate.zoom());
2465+
ImageData resizedData = scaledTo(imageCandidate.element(), zoom, imageCandidate.zoom(), DPIUtil.getScalingType(imageCandidate.element()));
24342466
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
24352467
init(newData, zoom);
24362468
return zoomLevelToImageHandle.get(zoom);

0 commit comments

Comments
 (0)