Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Loskutov2022-02-12 12:11:48 +0000
committerAndrey Loskutov2022-02-12 12:30:20 +0000
commitd23aeac5d7658c71af73b6e790f40feea843031e (patch)
tree3ff8dfc3d8e7a4185ebf57a5a75fbebe483e8e82
parentdbdc293578b21c6aa23f33d9a3175f4f457f31d0 (diff)
downloadeclipse.platform.swt-d23aeac5d7658c71af73b6e790f40feea843031e.tar.gz
eclipse.platform.swt-d23aeac5d7658c71af73b6e790f40feea843031e.tar.xz
eclipse.platform.swt-d23aeac5d7658c71af73b6e790f40feea843031e.zip
Bug 493455 - manual tests
Note: transparent.png crashes SnippetDrawAlphaTwoPass Change-Id: I62eb14b36b601fb2b2ddb0a046d7c8ee82648823 Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.swt/+/190739 Tested-by: Andrey Loskutov <loskutov@gmx.de> Reviewed-by: Andrey Loskutov <loskutov@gmx.de>
-rw-r--r--tests/org.eclipse.swt.tests/ManualTests/org/eclipse/swt/tests/manual/SnippetDrawAlpha.java98
-rw-r--r--tests/org.eclipse.swt.tests/ManualTests/org/eclipse/swt/tests/manual/SnippetDrawAlphaTwoPass.java138
-rw-r--r--tests/org.eclipse.swt.tests/data/eclipse.pngbin0 -> 3353 bytes
-rw-r--r--tests/org.eclipse.swt.tests/data/eclipse16.pngbin0 -> 664 bytes
-rw-r--r--tests/org.eclipse.swt.tests/data/eclipse24.pngbin0 -> 1813 bytes
-rw-r--r--tests/org.eclipse.swt.tests/data/eclipse32.pngbin0 -> 2233 bytes
-rw-r--r--tests/org.eclipse.swt.tests/data/pause.gifbin0 -> 338 bytes
-rw-r--r--tests/org.eclipse.swt.tests/data/run.gifbin0 -> 122 bytes
-rw-r--r--tests/org.eclipse.swt.tests/data/warning.gifbin0 -> 152 bytes
9 files changed, 236 insertions, 0 deletions
diff --git a/tests/org.eclipse.swt.tests/ManualTests/org/eclipse/swt/tests/manual/SnippetDrawAlpha.java b/tests/org.eclipse.swt.tests/ManualTests/org/eclipse/swt/tests/manual/SnippetDrawAlpha.java
new file mode 100644
index 0000000000..2570ba506e
--- /dev/null
+++ b/tests/org.eclipse.swt.tests/ManualTests/org/eclipse/swt/tests/manual/SnippetDrawAlpha.java
@@ -0,0 +1,98 @@
+package org.eclipse.swt.tests.manual;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Device;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.swt.graphics.PaletteData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+public class SnippetDrawAlpha {
+ public static void main(String[] args) {
+ Display display = new Display();
+ Shell shell = new Shell(display);
+ shell.setLayout(new GridLayout(4, false));
+
+ createImageLabels(display, shell, "/eclipse16.png");
+ createImageLabels(display, shell, "/eclipse32.png");
+ createImageLabels(display, shell, "/pause.gif");
+ createImageLabels(display, shell, "/run.gif");
+ createImageLabels(display, shell, "/warning.gif");
+ createImageLabels(display, shell, "/transparent.png");
+
+ shell.pack();
+ shell.open();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch())
+ display.sleep();
+ }
+ display.dispose();
+ }
+
+ private static void createImageLabels(Display display, Shell shell, String fileName) {
+ createImageLabel(display, shell, fileName, -1);
+ createImageLabel(display, shell, fileName, 1);
+ createImageLabel(display, shell, fileName, 1.5f);
+ createImageLabel(display, shell, fileName, 2);
+ }
+
+ private static void createImageLabel(Display display, Shell shell, String fileName, float scaleFactor) {
+ ImageLoader loader = new ImageLoader();
+ loader.load(SnippetDrawAlpha.class.getResourceAsStream(fileName));
+ ImageData data = loader.data[0];
+ if (scaleFactor != -1) {
+ data = autoScaleImageData(display, data, scaleFactor);
+ }
+ Image image = new Image(display, data);
+ Label label = new Label(shell, SWT.NONE);
+ label.setImage(image);
+ }
+
+ private static ImageData autoScaleImageData(Device device, final ImageData imageData, float scaleFactor) {
+ int width = imageData.width;
+ int height = imageData.height;
+ int scaledWidth = Math.round(width * scaleFactor);
+ int scaledHeight = Math.round(height * scaleFactor);
+
+ Image original = new Image(device, imageData);
+
+ /* Create a 24 bit image data with alpha channel */
+ final ImageData resultData = new ImageData(scaledWidth, scaledHeight, 24,
+ new PaletteData(0xFF, 0xFF00, 0xFF0000));
+ resultData.alphaData = new byte[scaledWidth * scaledHeight];
+
+ /*
+ * FIXME: something is wrong in SWT on win32. alphaData is apparently
+ * not used in GC#drawImage(..) below, and images end up fully
+ * transparent.
+ */
+// if ("win32".equals(SWT.getPlatform())) {
+// // This hack makes the images at least visible, but loses all transparency:
+// Arrays.fill (resultData.alphaData, (byte) 0xFF);
+// // Makes the wrong non-transparent background white instead of black:
+// Arrays.fill(resultData.data, (byte) 0xFF);
+// }
+
+ Image resultImage = new Image(device, resultData);
+ GC gc = new GC(resultImage);
+ gc.setAntialias(SWT.ON);
+ gc.drawImage(original, 0, 0, width, height,
+ /*
+ * E.g. destWidth here is effectively DPIUtil.autoScaleDown
+ * (scaledWidth), but avoiding rounding errors. Nevertheless, we
+ * still have some rounding errors due to the point-based API
+ * GC#drawImage(..).
+ */
+ 0, 0, scaledWidth, scaledHeight);
+ gc.dispose();
+ original.dispose();
+ ImageData result = resultImage.getImageData();
+ resultImage.dispose();
+ return result;
+ }
+} \ No newline at end of file
diff --git a/tests/org.eclipse.swt.tests/ManualTests/org/eclipse/swt/tests/manual/SnippetDrawAlphaTwoPass.java b/tests/org.eclipse.swt.tests/ManualTests/org/eclipse/swt/tests/manual/SnippetDrawAlphaTwoPass.java
new file mode 100644
index 0000000000..bd0e0373be
--- /dev/null
+++ b/tests/org.eclipse.swt.tests/ManualTests/org/eclipse/swt/tests/manual/SnippetDrawAlphaTwoPass.java
@@ -0,0 +1,138 @@
+package org.eclipse.swt.tests.manual;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Device;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.swt.graphics.PaletteData;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+public class SnippetDrawAlphaTwoPass {
+
+ // Alpha and BW palette definitions from org.eclipse.ui.internal.decorators.DecorationImageBuilder
+ private static final PaletteData ALPHA_PALETTE, BW_PALETTE;
+
+ static {
+ RGB[] rgbs = new RGB[256];
+ for (int i = 0; i < rgbs.length; i++) {
+ rgbs[i] = new RGB(i, i, i);
+ }
+
+ ALPHA_PALETTE = new PaletteData(rgbs);
+ BW_PALETTE = new PaletteData(new RGB[] { new RGB(0, 0, 0), new RGB(255, 255, 255) });
+ }
+
+ public static void main(String[] args) {
+ Display display = new Display();
+ Shell shell = new Shell(display);
+ shell.setLayout(new GridLayout(4, false));
+
+ createImageLabels(display, shell, "/eclipse16.png");
+ createImageLabels(display, shell, "/eclipse32.png");
+ createImageLabels(display, shell, "/pause.gif");
+ createImageLabels(display, shell, "/run.gif");
+ createImageLabels(display, shell, "/warning.gif");
+ createImageLabels(display, shell, "/transparent.png");
+
+ shell.pack();
+ shell.open();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch())
+ display.sleep();
+ }
+ display.dispose();
+ }
+
+ private static void createImageLabels(Display display, Shell shell, String fileName) {
+ createImageLabel(display, shell, fileName, -1);
+ createImageLabel(display, shell, fileName, 1);
+ createImageLabel(display, shell, fileName, 1.5f);
+ createImageLabel(display, shell, fileName, 2);
+ }
+
+ private static void createImageLabel(Display display, Shell shell, String fileName, float scaleFactor) {
+ ImageLoader loader = new ImageLoader();
+ loader.load(SnippetDrawAlpha.class.getResourceAsStream(fileName));
+ ImageData data = loader.data[0];
+ if (scaleFactor != -1) {
+ data = autoScaleImageData(display, data, scaleFactor);
+ }
+ Image image = new Image(display, data);
+ Label label = new Label(shell, SWT.NONE);
+ label.setImage(image);
+ }
+
+ private static ImageData autoScaleImageData(Device device, final ImageData imageData, float scaleFactor) {
+ int width = imageData.width;
+ int height = imageData.height;
+ int scaledWidth = Math.round(width * scaleFactor);
+ int scaledHeight = Math.round(height * scaleFactor);
+
+ ImageData imageMaskData = null;
+
+ if (imageData.getTransparencyType() == SWT.TRANSPARENCY_ALPHA) {
+ imageMaskData = new ImageData(width, height, 8, ALPHA_PALETTE, imageData.scanlinePad, imageData.alphaData);
+ } else if (imageData.getTransparencyType() == SWT.TRANSPARENCY_PIXEL || imageData.getTransparencyType() == SWT.TRANSPARENCY_MASK) {
+ ImageData transparencyMaskData = imageData.getTransparencyMask();
+ imageMaskData = new ImageData(width, height, 1, BW_PALETTE, transparencyMaskData.scanlinePad, transparencyMaskData.data);
+ }
+
+ Image original = new Image(device, imageData);
+ Image originalMask = null;
+
+ if (imageMaskData != null) {
+ originalMask = new Image(device, imageMaskData);
+ }
+
+ /* Create a 24 bit image data with alpha channel */
+ ImageData resultData = new ImageData(scaledWidth, scaledHeight, 24, new PaletteData(0xFF, 0xFF00, 0xFF0000));
+ ImageData resultMaskData = null;
+
+ if (imageMaskData != null) {
+ resultMaskData = new ImageData(scaledWidth, scaledHeight, imageMaskData.depth, imageMaskData.palette);
+ }
+
+ Image result = new Image(device, resultData);
+ Image resultMask = null;
+
+ GC gc = new GC(result);
+ gc.setAntialias(SWT.ON);
+ gc.drawImage(original, 0, 0, width, height, 0, 0, scaledWidth, scaledHeight);
+ gc.dispose();
+
+ if (resultMaskData != null) {
+ resultMask = new Image(device, resultMaskData);
+ gc = new GC(resultMask);
+ gc.setAntialias(SWT.ON);
+ gc.drawImage(originalMask, 0, 0, width, height, 0, 0, scaledWidth, scaledHeight);
+ gc.dispose();
+ }
+
+ original.dispose();
+ originalMask.dispose();
+
+ ImageData scaledResult = result.getImageData();
+
+ if (resultMask != null) {
+ ImageData scaledResultMaskData = resultMask.getImageData();
+
+ // Convert 1-bit mask
+ if (scaledResultMaskData.depth == 1) {
+ scaledResult.maskPad = scaledResultMaskData.scanlinePad;
+ scaledResult.maskData = scaledResultMaskData.data;
+ } else {
+ scaledResult.alphaData = scaledResultMaskData.data;
+ }
+ }
+
+ result.dispose();
+ resultMask.dispose();
+ return scaledResult;
+ }
+} \ No newline at end of file
diff --git a/tests/org.eclipse.swt.tests/data/eclipse.png b/tests/org.eclipse.swt.tests/data/eclipse.png
new file mode 100644
index 0000000000..73975241eb
--- /dev/null
+++ b/tests/org.eclipse.swt.tests/data/eclipse.png
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/data/eclipse16.png b/tests/org.eclipse.swt.tests/data/eclipse16.png
new file mode 100644
index 0000000000..7fc69518a8
--- /dev/null
+++ b/tests/org.eclipse.swt.tests/data/eclipse16.png
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/data/eclipse24.png b/tests/org.eclipse.swt.tests/data/eclipse24.png
new file mode 100644
index 0000000000..fbddd3cd78
--- /dev/null
+++ b/tests/org.eclipse.swt.tests/data/eclipse24.png
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/data/eclipse32.png b/tests/org.eclipse.swt.tests/data/eclipse32.png
new file mode 100644
index 0000000000..bf85680075
--- /dev/null
+++ b/tests/org.eclipse.swt.tests/data/eclipse32.png
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/data/pause.gif b/tests/org.eclipse.swt.tests/data/pause.gif
new file mode 100644
index 0000000000..161e3f594f
--- /dev/null
+++ b/tests/org.eclipse.swt.tests/data/pause.gif
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/data/run.gif b/tests/org.eclipse.swt.tests/data/run.gif
new file mode 100644
index 0000000000..944a230aad
--- /dev/null
+++ b/tests/org.eclipse.swt.tests/data/run.gif
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/data/warning.gif b/tests/org.eclipse.swt.tests/data/warning.gif
new file mode 100644
index 0000000000..cf4fdf93c7
--- /dev/null
+++ b/tests/org.eclipse.swt.tests/data/warning.gif
Binary files differ

Back to the top