diff options
author | Andrey Loskutov | 2022-02-12 12:11:48 +0000 |
---|---|---|
committer | Andrey Loskutov | 2022-02-12 12:30:20 +0000 |
commit | d23aeac5d7658c71af73b6e790f40feea843031e (patch) | |
tree | 3ff8dfc3d8e7a4185ebf57a5a75fbebe483e8e82 | |
parent | dbdc293578b21c6aa23f33d9a3175f4f457f31d0 (diff) | |
download | eclipse.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.java | 98 | ||||
-rw-r--r-- | tests/org.eclipse.swt.tests/ManualTests/org/eclipse/swt/tests/manual/SnippetDrawAlphaTwoPass.java | 138 | ||||
-rw-r--r-- | tests/org.eclipse.swt.tests/data/eclipse.png | bin | 0 -> 3353 bytes | |||
-rw-r--r-- | tests/org.eclipse.swt.tests/data/eclipse16.png | bin | 0 -> 664 bytes | |||
-rw-r--r-- | tests/org.eclipse.swt.tests/data/eclipse24.png | bin | 0 -> 1813 bytes | |||
-rw-r--r-- | tests/org.eclipse.swt.tests/data/eclipse32.png | bin | 0 -> 2233 bytes | |||
-rw-r--r-- | tests/org.eclipse.swt.tests/data/pause.gif | bin | 0 -> 338 bytes | |||
-rw-r--r-- | tests/org.eclipse.swt.tests/data/run.gif | bin | 0 -> 122 bytes | |||
-rw-r--r-- | tests/org.eclipse.swt.tests/data/warning.gif | bin | 0 -> 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 Binary files differnew file mode 100644 index 0000000000..73975241eb --- /dev/null +++ b/tests/org.eclipse.swt.tests/data/eclipse.png diff --git a/tests/org.eclipse.swt.tests/data/eclipse16.png b/tests/org.eclipse.swt.tests/data/eclipse16.png Binary files differnew file mode 100644 index 0000000000..7fc69518a8 --- /dev/null +++ b/tests/org.eclipse.swt.tests/data/eclipse16.png diff --git a/tests/org.eclipse.swt.tests/data/eclipse24.png b/tests/org.eclipse.swt.tests/data/eclipse24.png Binary files differnew file mode 100644 index 0000000000..fbddd3cd78 --- /dev/null +++ b/tests/org.eclipse.swt.tests/data/eclipse24.png diff --git a/tests/org.eclipse.swt.tests/data/eclipse32.png b/tests/org.eclipse.swt.tests/data/eclipse32.png Binary files differnew file mode 100644 index 0000000000..bf85680075 --- /dev/null +++ b/tests/org.eclipse.swt.tests/data/eclipse32.png diff --git a/tests/org.eclipse.swt.tests/data/pause.gif b/tests/org.eclipse.swt.tests/data/pause.gif Binary files differnew file mode 100644 index 0000000000..161e3f594f --- /dev/null +++ b/tests/org.eclipse.swt.tests/data/pause.gif diff --git a/tests/org.eclipse.swt.tests/data/run.gif b/tests/org.eclipse.swt.tests/data/run.gif Binary files differnew file mode 100644 index 0000000000..944a230aad --- /dev/null +++ b/tests/org.eclipse.swt.tests/data/run.gif diff --git a/tests/org.eclipse.swt.tests/data/warning.gif b/tests/org.eclipse.swt.tests/data/warning.gif Binary files differnew file mode 100644 index 0000000000..cf4fdf93c7 --- /dev/null +++ b/tests/org.eclipse.swt.tests/data/warning.gif |