Skip to content

Commit e06a13e

Browse files
arunjose696HeikoKlare
authored andcommitted
[Win32] Add check that ImageDataProvider returns linearly scaled data
A strict check to be used only for debugging means, which ensures the imageData returned by an ImageDataProvider is scaled linearly for 100 and 200 zooms.
1 parent f0afb7f commit e06a13e

File tree

4 files changed

+36
-16
lines changed

4 files changed

+36
-16
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,10 @@ public static ImageData autoScaleImageData (Device device, final ImageData image
150150
int height = imageData.height;
151151
int scaledWidth = Math.round (width * scaleFactor);
152152
int scaledHeight = Math.round (height * scaleFactor);
153+
int defaultZoomLevel = 100;
153154
boolean useSmoothScaling = isSmoothScalingEnabled() && imageData.getTransparencyType() != SWT.TRANSPARENCY_MASK;
154155
if (useSmoothScaling) {
155-
Image original = new Image (device, (ImageDataProvider) zoom -> imageData);
156+
Image original = new Image(device, (ImageDataProvider) zoom -> (zoom == defaultZoomLevel) ? imageData : null);
156157
ImageGcDrawer drawer = new ImageGcDrawer() {
157158
@Override
158159
public void drawOn(GC gc, int imageWidth, int imageHeight) {
@@ -166,7 +167,7 @@ public int getGcStyle() {
166167
}
167168
};
168169
Image resultImage = new Image (device, drawer, scaledWidth, scaledHeight);
169-
ImageData result = resultImage.getImageData (100);
170+
ImageData result = resultImage.getImageData (defaultZoomLevel);
170171
original.dispose ();
171172
resultImage.dispose ();
172173
return result;

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,10 +612,33 @@ public Image(Device device, ImageDataProvider imageDataProvider) {
612612
SWT.error(SWT.ERROR_INVALID_ARGUMENT, null,
613613
": ImageDataProvider [" + imageDataProvider + "] returns null ImageData at 100% zoom.");
614614
}
615+
if (Device.strictChecks) {
616+
validateLinearScaling(imageDataProvider);
617+
}
615618
init();
616619
this.device.registerResourceWithZoomSupport(this);
617620
}
618621

622+
private void validateLinearScaling(ImageDataProvider provider) {
623+
final int baseZoom = 100;
624+
final int scaledZoom = 200;
625+
final int scaleFactor = scaledZoom / baseZoom;
626+
ImageData baseImageData = provider.getImageData(baseZoom);
627+
ImageData scaledImageData = provider.getImageData(scaledZoom);
628+
629+
if (scaledImageData == null) {
630+
return;
631+
}
632+
633+
if (scaledImageData.width != scaleFactor * baseImageData.width
634+
|| scaledImageData.height != scaleFactor * baseImageData.height) {
635+
System.err.println(String.format(
636+
"***WARNING: ImageData should be linearly scaled across zooms but size is (%d, %d) at 100%% and (%d, %d) at 200%%.",
637+
baseImageData.width, baseImageData.height, scaledImageData.width, scaledImageData.height));
638+
new Error().printStackTrace(System.err);
639+
}
640+
}
641+
619642
/**
620643
* The provided ImageGcDrawer will be called on demand whenever a new variant of the
621644
* Image for an additional zoom is required. Depending on the OS-specific implementation

tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_Image.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,13 +1043,15 @@ public void test_imageDataIsCached() {
10431043
public void test_imageDataSameViaDifferentProviders() {
10441044
assumeFalse("Cocoa generates inconsistent image data", SwtTestUtil.isCocoa);
10451045
String imagePath = getPath("collapseall.png");
1046-
ImageFileNameProvider imageFileNameProvider = __ -> {
1047-
return imagePath;
1046+
ImageFileNameProvider imageFileNameProvider = zoom -> {
1047+
return (zoom == 100) ? imagePath : null;
10481048
};
1049-
ImageDataProvider dataProvider = __ -> {
1050-
try (InputStream imageStream = Files.newInputStream(Path.of(imagePath))) {
1051-
return new ImageData(imageStream);
1052-
} catch (IOException e) {
1049+
ImageDataProvider dataProvider = zoom -> {
1050+
if (zoom == 100) {
1051+
try (InputStream imageStream = Files.newInputStream(Path.of(imagePath))) {
1052+
return new ImageData(imageStream);
1053+
} catch (IOException e) {
1054+
}
10531055
}
10541056
return null;
10551057
};

tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_internal_SVGRasterizer.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,11 @@ public void test_ConstructorLorg_eclipse_swt_graphics_Device_ImageFileNameProvid
5454

5555
@Test
5656
public void test_ConstructorLorg_eclipse_swt_graphics_Device_ImageDataProvider() {
57-
ImageDataProvider validImageDataProvider = zoom -> {
58-
String fileName = "collapseall.svg";
59-
return new ImageData(getPath(fileName));
60-
};
57+
ImageDataProvider validImageDataProvider = zoom -> (zoom == 100) ? new ImageData(getPath("collapseall.svg")) : null;
6158
Image image = new Image(Display.getDefault(), validImageDataProvider);
6259
image.dispose();
6360

64-
ImageDataProvider corruptImageDataProvider = zoom -> {
65-
String fileName = "corrupt.svg";
66-
return new ImageData(getPath(fileName));
67-
};
61+
ImageDataProvider corruptImageDataProvider = zoom -> (zoom == 100) ? new ImageData(getPath("corrupt.svg")) : null;
6862
SWTException e = assertThrows(SWTException.class,
6963
() -> new Image(Display.getDefault(), corruptImageDataProvider));
7064
assertSWTProblem("Incorrect exception thrown for provider with corrupt images", SWT.ERROR_INVALID_IMAGE, e);

0 commit comments

Comments
 (0)