From fefe52f582c5f7bcc72812c1162adb039813d3be Mon Sep 17 00:00:00 2001 From: "shahzaib.ibrahim" Date: Fri, 26 Jul 2024 12:15:43 +0200 Subject: [PATCH] Adding disable/gray image props in ImageData when rescaled Disabled image do not work when rescaled. Writing a new method copyImageDataForDisabledOrGrayImages and calling it before init image in win32_getHandle --- .../win32/org/eclipse/swt/graphics/Image.java | 278 ++++++++++-------- examples/org.eclipse.swt.snippets/Snippets.md | 1 + .../previews/Snippet382.png | Bin 0 -> 26038 bytes .../org/eclipse/swt/snippets/Snippet382.java | 125 ++++++++ 4 files changed, 284 insertions(+), 120 deletions(-) create mode 100644 examples/org.eclipse.swt.snippets/previews/Snippet382.png create mode 100644 examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet382.java diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java index df01ceb47e6..835497b8e1c 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java @@ -297,124 +297,13 @@ public Image(Device device, Image srcImage, int flag) { } case SWT.IMAGE_DISABLE: { ImageData data = srcImage.getImageData(srcImage.getZoom()); - PaletteData palette = data.palette; - RGB[] rgbs = new RGB[3]; - rgbs[0] = device.getSystemColor(SWT.COLOR_BLACK).getRGB(); - rgbs[1] = device.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW).getRGB(); - rgbs[2] = device.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND).getRGB(); - ImageData newData = new ImageData(rect.width, rect.height, 8, new PaletteData(rgbs)); - newData.alpha = data.alpha; - newData.alphaData = data.alphaData; - newData.maskData = data.maskData; - newData.maskPad = data.maskPad; - if (data.transparentPixel != -1) newData.transparentPixel = 0; - - /* Convert the pixels. */ - int[] scanline = new int[rect.width]; - int[] maskScanline = null; - ImageData mask = null; - if (data.maskData != null) mask = data.getTransparencyMask(); - if (mask != null) maskScanline = new int[rect.width]; - int redMask = palette.redMask; - int greenMask = palette.greenMask; - int blueMask = palette.blueMask; - int redShift = palette.redShift; - int greenShift = palette.greenShift; - int blueShift = palette.blueShift; - for (int y=0; y>> -redShift : red << redShift; - green = pixel & greenMask; - green = (greenShift < 0) ? green >>> -greenShift : green << greenShift; - blue = pixel & blueMask; - blue = (blueShift < 0) ? blue >>> -blueShift : blue << blueShift; - } else { - red = palette.colors[pixel].red; - green = palette.colors[pixel].green; - blue = palette.colors[pixel].blue; - } - int intensity = red * red + green * green + blue * blue; - if (intensity < 98304) { - newData.data[offset] = (byte)1; - } else { - newData.data[offset] = (byte)2; - } - } - offset++; - } - } + ImageData newData = applyDisableImageData(data, rect.height, rect.width); init (newData, getZoom()); break; } case SWT.IMAGE_GRAY: { ImageData data = srcImage.getImageData(srcImage.getZoom()); - PaletteData palette = data.palette; - ImageData newData = data; - if (!palette.isDirect) { - /* Convert the palette entries to gray. */ - RGB [] rgbs = palette.getRGBs(); - for (int i=0; i> 3; - color.red = color.green = color.blue = intensity; - } - } - newData.palette = new PaletteData(rgbs); - } else { - /* Create a 8 bit depth image data with a gray palette. */ - RGB[] rgbs = new RGB[256]; - for (int i=0; i>> -redShift : red << redShift; - int green = pixel & greenMask; - green = (greenShift < 0) ? green >>> -greenShift : green << greenShift; - int blue = pixel & blueMask; - blue = (blueShift < 0) ? blue >>> -blueShift : blue << blueShift; - int intensity = (red+red+green+green+green+green+green+blue) >> 3; - if (newData.transparentPixel == intensity) intensity = 255; - newData.data[offset] = (byte)intensity; - } else { - newData.data[offset] = (byte)254; - } - offset++; - } - } - } + ImageData newData = applyGrayImageData(data, rect.height, rect.width); init (newData, getZoom()); break; } @@ -738,6 +627,150 @@ public Image(Device device, ImageDataProvider imageDataProvider) { init(); } +private ImageData adaptImageDataIfDisabledOrGray(ImageData data) { + ImageData returnImageData = null; + switch (this.styleFlag) { + case SWT.IMAGE_DISABLE: { + ImageData newData = applyDisableImageData(data, data.height, data.width); + returnImageData = newData; + break; + } + case SWT.IMAGE_GRAY: { + ImageData newData = applyGrayImageData(data, data.height, data.width); + returnImageData = newData; + break; + } + default: { + returnImageData = data; + break; + } + } + + return returnImageData; +} + +private ImageData applyDisableImageData(ImageData data, int height, int width) { + PaletteData palette = data.palette; + RGB[] rgbs = new RGB[3]; + rgbs[0] = this.device.getSystemColor(SWT.COLOR_BLACK).getRGB(); + rgbs[1] = this.device.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW).getRGB(); + rgbs[2] = this.device.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND).getRGB(); + ImageData newData = new ImageData(width, height, 8, new PaletteData(rgbs)); + newData.alpha = data.alpha; + newData.alphaData = data.alphaData; + newData.maskData = data.maskData; + newData.maskPad = data.maskPad; + if (data.transparentPixel != -1) newData.transparentPixel = 0; + + /* Convert the pixels. */ + int[] scanline = new int[width]; + int[] maskScanline = null; + ImageData mask = null; + if (data.maskData != null) mask = data.getTransparencyMask(); + if (mask != null) maskScanline = new int[width]; + int redMask = palette.redMask; + int greenMask = palette.greenMask; + int blueMask = palette.blueMask; + int redShift = palette.redShift; + int greenShift = palette.greenShift; + int blueShift = palette.blueShift; + for (int y=0; y>> -redShift : red << redShift; + green = pixel & greenMask; + green = (greenShift < 0) ? green >>> -greenShift : green << greenShift; + blue = pixel & blueMask; + blue = (blueShift < 0) ? blue >>> -blueShift : blue << blueShift; + } else { + red = palette.colors[pixel].red; + green = palette.colors[pixel].green; + blue = palette.colors[pixel].blue; + } + int intensity = red * red + green * green + blue * blue; + if (intensity < 98304) { + newData.data[offset] = (byte)1; + } else { + newData.data[offset] = (byte)2; + } + } + offset++; + } + } + return newData; +} + +private ImageData applyGrayImageData(ImageData data, int pHeight, int pWidth) { + PaletteData palette = data.palette; + ImageData newData = data; + if (!palette.isDirect) { + /* Convert the palette entries to gray. */ + RGB [] rgbs = palette.getRGBs(); + for (int i=0; i> 3; + color.red = color.green = color.blue = intensity; + } + } + newData.palette = new PaletteData(rgbs); + } else { + /* Create a 8 bit depth image data with a gray palette. */ + RGB[] rgbs = new RGB[256]; + for (int i=0; i>> -redShift : red << redShift; + int green = pixel & greenMask; + green = (greenShift < 0) ? green >>> -greenShift : green << greenShift; + int blue = pixel & blueMask; + blue = (blueShift < 0) ? blue >>> -blueShift : blue << blueShift; + int intensity = (red+red+green+green+green+green+green+blue) >> 3; + if (newData.transparentPixel == intensity) intensity = 255; + newData.data[offset] = (byte)intensity; + } else { + newData.data[offset] = (byte)254; + } + offset++; + } + } + } + return newData; +} + + /** * IMPORTANT: This method is not part of the public * API for Image. It is marked public only so that it @@ -764,20 +797,22 @@ public static Long win32_getHandle (Image image, int zoom) { if (image.imageFileNameProvider != null) { ElementAtZoom imageCandidate = DPIUtil.validateAndGetImagePathAtZoom (image.imageFileNameProvider, zoom); + ImageData imageData = new ImageData (imageCandidate.element()); if (imageCandidate.zoom() == zoom) { /* Release current native resources */ long handle = image.initNative(imageCandidate.element(), zoom); - if (handle == 0) image.init(new ImageData (imageCandidate.element()), zoom); + if (handle == 0) image.init(imageData, zoom); image.init(); } else { - ImageData resizedData = DPIUtil.scaleImageData (image.device, new ImageData (imageCandidate.element()), zoom, imageCandidate.zoom()); - image.init(resizedData, zoom); - image.init (); + ImageData resizedData = DPIUtil.scaleImageData(image.device, imageData, zoom, imageCandidate.zoom()); + ImageData newData = image.adaptImageDataIfDisabledOrGray(resizedData); + image.init(newData, zoom); } } else if (image.imageDataProvider != null) { ElementAtZoom imageCandidate = DPIUtil.validateAndGetImageDataAtZoom (image.imageDataProvider, zoom); ImageData resizedData = DPIUtil.scaleImageData (image.device, imageCandidate.element(), zoom, imageCandidate.zoom()); - image.init(resizedData, zoom); + ImageData newData = image.adaptImageDataIfDisabledOrGray(resizedData); + image.init(newData, zoom); image.init(); } else { if (image.dataAtBaseZoom == null && image.memGC == null) { @@ -786,7 +821,8 @@ public static Long win32_getHandle (Image image, int zoom) { } if (image.dataAtBaseZoom != null) { ImageData resizedData = image.getImageData(zoom); - image.init(resizedData, zoom); + ImageData newData = image.adaptImageDataIfDisabledOrGray(resizedData); + image.init(newData, zoom); image.init(); } } @@ -944,7 +980,9 @@ long initNative(String filename, int zoom) { ImageData img = new ImageData(width, height, depth, paletteData, scanlinePad, data); img.transparentPixel = transparentPixel; img.alphaData = alphaData; - init(img, zoom); + + ImageData newData = adaptImageDataIfDisabledOrGray(img); + init(newData, zoom); handle = zoomLevelToHandle.get(zoom); } Gdip.Bitmap_UnlockBits(bitmap, lockedBitmapData); diff --git a/examples/org.eclipse.swt.snippets/Snippets.md b/examples/org.eclipse.swt.snippets/Snippets.md index 531641ad9ec..6229a212c8d 100644 --- a/examples/org.eclipse.swt.snippets/Snippets.md +++ b/examples/org.eclipse.swt.snippets/Snippets.md @@ -213,6 +213,7 @@ To contribute a new snippet, [create a snippet contribution as a pull request](h - [draw a reflection of an image](https://github.com/eclipse-platform/eclipse.platform.swt/tree/master/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet279.java) – [(preview)](https://github.com/eclipse-platform/eclipse.platform.swt/blob/master/examples/org.eclipse.swt.snippets/previews/Snippet279.png "Preview for Snippet 279") - [draw an image scaled to half size and double size](https://github.com/eclipse-platform/eclipse.platform.swt/tree/master/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet355.java) – [(preview)](https://github.com/eclipse-platform/eclipse.platform.swt/blob/master/examples/org.eclipse.swt.snippets/previews/Snippet355.png "Preview for Snippet 355") - [draw an image at various zoom/dpi levels](https://github.com/eclipse-platform/eclipse.platform.swt/tree/master/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet367.java) – [(preview)](https://github.com/eclipse-platform/eclipse.platform.swt/blob/master/examples/org.eclipse.swt.snippets/previews/Snippet367.png "Preview for Snippet 367") +- [draw a disabled/grayed image at various zoom levels](https://github.com/eclipse-platform/eclipse.platform.swt/tree/master/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet382.java) – [(preview)](https://github.com/eclipse-platform/eclipse.platform.swt/blob/master/examples/org.eclipse.swt.snippets/previews/Snippet382.png "Preview for Snippet 382") ### **ImageData** - [display an animated GIF](https://github.com/eclipse-platform/eclipse.platform.swt/tree/master/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet141.java) diff --git a/examples/org.eclipse.swt.snippets/previews/Snippet382.png b/examples/org.eclipse.swt.snippets/previews/Snippet382.png new file mode 100644 index 0000000000000000000000000000000000000000..d29d8822655187f32b1df7dff6da80fb090b0962 GIT binary patch literal 26038 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 Fe*n-ds3QOX literal 0 HcmV?d00001 diff --git a/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet382.java b/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet382.java new file mode 100644 index 00000000000..8a1b5273577 --- /dev/null +++ b/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet382.java @@ -0,0 +1,125 @@ +/******************************************************************************* + * Copyright (c) 2024 Yatta Solutions + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Yatta Solutions - initial API and implementation + *******************************************************************************/ +package org.eclipse.swt.snippets; + +import org.eclipse.swt.*; +import org.eclipse.swt.graphics.*; +import org.eclipse.swt.layout.*; +import org.eclipse.swt.widgets.*; + +/** + * Snippet to test the use of the DPI-aware Image constructors with disabled and gray images + * Work in progress in https://bugs.eclipse.org/399786 + *

+ * For a list of all SWT example snippets see + * http://www.eclipse.org/swt/snippets/ + *

+ */ +public class Snippet382 { + private static final String IMAGE_100 = "eclipse16.png"; + private static final String IMAGE_150 = "eclipse24.png"; + private static final String IMAGE_200 = "eclipse32.png"; + private static final String IMAGES_ROOT = "bin/org/eclipse/swt/snippets/"; + + private static final String IMAGE_PATH_100 = IMAGES_ROOT + IMAGE_100; + private static final String IMAGE_PATH_150 = IMAGES_ROOT + IMAGE_150; + private static final String IMAGE_PATH_200 = IMAGES_ROOT + IMAGE_200; + + public static void main (String [] args) { + final ImageFileNameProvider filenameProvider = zoom -> { + switch (zoom) { + case 100: + return IMAGE_PATH_100; + case 150: + return IMAGE_PATH_150; + case 200: + return IMAGE_PATH_200; + default: + return null; + } + }; + final ImageDataProvider imageDataProvider = zoom -> { + switch (zoom) { + case 100: + return new ImageData (IMAGE_PATH_100); + case 150: + return new ImageData (IMAGE_PATH_150); + case 200: + return new ImageData (IMAGE_PATH_200); + default: + return null; + } + }; + + final Display display = new Display (); + final Shell shell = new Shell (display); + shell.setText("Snippet382"); + shell.setLayout (new GridLayout (3, false)); + Listener l = new Listener() { + @Override + public void handleEvent(Event e) { + if (e.type == SWT.Paint) { + GC mainGC = e.gc; + GCData gcData = mainGC.getGCData(); + final Image imageWithFileNameProvider = new Image (display, filenameProvider); + final Image disabledImageWithFileNameProvider = new Image (display,imageWithFileNameProvider, SWT.IMAGE_DISABLE); + final Image greyImageWithFileNameProvider = new Image (display,imageWithFileNameProvider, SWT.IMAGE_GRAY); + + final Image imageWithDataProvider = new Image (display, imageDataProvider); + final Image disabledImageWithDataProvider = new Image (display,imageWithDataProvider, SWT.IMAGE_DISABLE); + final Image greyImageWithDataProvider = new Image (display,imageWithDataProvider, SWT.IMAGE_GRAY); + + final Image imageWithData = new Image (display, IMAGE_PATH_100); + final Image disabledImageWithData = new Image (display,imageWithData, SWT.IMAGE_DISABLE); + final Image greyImageWithData = new Image (display,imageWithData, SWT.IMAGE_GRAY); + + try { + drawImages(mainGC, gcData, "Normal",40, imageWithFileNameProvider); + drawImages(mainGC, gcData, "Disabled",80, disabledImageWithFileNameProvider); + drawImages(mainGC, gcData, "Greyed",120, greyImageWithFileNameProvider); + + drawImages(mainGC, gcData, "Normal",160, imageWithDataProvider); + drawImages(mainGC, gcData, "Disabled",200, disabledImageWithDataProvider); + drawImages(mainGC, gcData, "Greyed",240, greyImageWithDataProvider); + + drawImages(mainGC, gcData, "Normal",280, imageWithDataProvider); + drawImages(mainGC, gcData, "Disabled",320, disabledImageWithData); + drawImages(mainGC, gcData, "Greyed",360, greyImageWithData); + } finally { + mainGC.dispose (); + } + } + } + + private void drawImages(GC mainGC, GCData gcData, String text, int y, final Image imageWithFileNameProvider) { + gcData.nativeZoom = 100; + mainGC.drawText(text, 0, y); + mainGC.drawImage(imageWithFileNameProvider, 50, y); + gcData.nativeZoom = 150; + mainGC.drawImage(imageWithFileNameProvider, 100, (int) (y/1.5)); + gcData.nativeZoom = 200; + mainGC.drawImage(imageWithFileNameProvider, 150, y/2); + } + }; + shell.addListener(SWT.Paint, l); + + shell.setSize(400, 500); + shell.open (); + while (!shell.isDisposed ()) { + if (!display.readAndDispatch ()) display.sleep (); + } + display.dispose (); + } + +}