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 710a80623c2..0e322a557c4 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 @@ -172,8 +172,7 @@ private boolean isReusable(int width, int height) { private Optional createHandleAtExactSize(int width, int height) { Optional imageData = imageProvider.loadImageDataAtExactSize(width, height); if (imageData.isPresent()) { - ImageData adaptedData = adaptImageDataIfDisabledOrGray(imageData.get()); - ImageHandle imageHandle = init(adaptedData, -1); + ImageHandle imageHandle = init(imageData.get(), -1); return Optional.of(imageHandle); } return Optional.empty(); @@ -186,9 +185,8 @@ private ImageHandle getOrCreateImageHandleAtClosestSize(int widthHint, int heigh int imageZoom = DPIUtil.getZoomForAutoscaleProperty(Math.max(imageZoomForWidth, imageZoomForHeight)); ImageHandle bestFittingHandle = zoomLevelToImageHandle.get(imageZoom); if (bestFittingHandle == null) { - ImageData bestFittingImageData = imageProvider.loadImageData(imageZoom).element(); - ImageData adaptedData = adaptImageDataIfDisabledOrGray(bestFittingImageData); - bestFittingHandle = init(adaptedData, -1); + ImageData bestFittingImageData = imageProvider.loadImageDataWithGrayOrDisablement(imageZoom).element(); + bestFittingHandle = init(bestFittingImageData, -1); } return bestFittingHandle; } @@ -333,21 +331,10 @@ public Image(Device device, Image srcImage, int flag) { } break; } - case SWT.IMAGE_DISABLE: { - for (ImageHandle imageHandle : srcImage.zoomLevelToImageHandle.values()) { - Rectangle rect = imageHandle.getBounds(); - ImageData data = srcImage.getImageData(imageHandle.zoom); - ImageData newData = applyDisableImageData(data, rect.height, rect.width); - init (newData, imageHandle.zoom); - } - break; - } + case SWT.IMAGE_DISABLE: case SWT.IMAGE_GRAY: { for (ImageHandle imageHandle : srcImage.zoomLevelToImageHandle.values()) { - Rectangle rect = imageHandle.getBounds(); - ImageData data = srcImage.getImageData(imageHandle.zoom); - ImageData newData = applyGrayImageData(data, rect.height, rect.width); - init (newData, imageHandle.zoom); + srcImage.getImageData(imageHandle.zoom); } break; } @@ -698,9 +685,9 @@ public Image(Device device, ImageGcDrawer imageGcDrawer, int width, int height) init(); } -private ImageData adaptImageDataIfDisabledOrGray(ImageData data) { +private static ImageData adaptImageDataIfDisabledOrGray(ImageData data, int styleFlag) { ImageData returnImageData = null; - switch (this.styleFlag) { + switch (styleFlag) { case SWT.IMAGE_DISABLE: { ImageData newData = applyDisableImageData(data, data.height, data.width); returnImageData = newData; @@ -726,7 +713,7 @@ void init() { this.isInitialized = true; } -private ImageData applyDisableImageData(ImageData data, int height, int width) { +private static ImageData applyDisableImageData(ImageData data, int height, int width) { PaletteData palette = data.palette; ImageData newData = new ImageData(width, height, 32, new PaletteData(0xFF, 0xFF00, 0xFF0000)); newData.alpha = data.alpha; @@ -775,7 +762,7 @@ private ImageData applyDisableImageData(ImageData data, int height, int width) { return newData; } -private ImageData applyGrayImageData(ImageData data, int pHeight, int pWidth) { +private static ImageData applyGrayImageData(ImageData data, int pHeight, int pWidth) { PaletteData palette = data.palette; ImageData newData = data; if (!palette.isDirect) { @@ -1456,7 +1443,7 @@ private static ImageData directToDirect(ImageData src, int newDepth, PaletteData private record HandleForImageDataContainer(int type, ImageData imageData, long[] handles) {} -private static HandleForImageDataContainer init(Device device, ImageData i) { +private static HandleForImageDataContainer init(Device device, ImageData i, int styleFlag) { /* Windows does not support 2-bit images. Convert to 4-bit image. */ if (i.depth == 2) { i = indexToIndex(i, 4); @@ -1665,7 +1652,7 @@ private void setImageMetadataForHandle(ImageHandle imageMetadata, int zoom) { private ImageHandle initIconHandle(Device device, ImageData source, ImageData mask, Integer zoom) { ImageData imageData = applyMask(source, mask); - HandleForImageDataContainer imageDataHandle = init(device, imageData); + HandleForImageDataContainer imageDataHandle = init(device, imageData, this.styleFlag); return initIconHandle(imageDataHandle.handles, zoom); } @@ -1690,7 +1677,7 @@ private ImageHandle initBitmapHandle(ImageData imageData, long handle, Integer z static long [] initIcon(Device device, ImageData source, ImageData mask) { ImageData imageData = applyMask(source, mask); - return init(device, imageData).handles; + return init(device, imageData, SWT.NONE).handles; } private static ImageData applyMask(ImageData source, ImageData mask) { @@ -1770,7 +1757,7 @@ private static ImageData applyMask(ImageData source, ImageData mask) { private ImageHandle init(ImageData i, int zoom) { if (i == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - HandleForImageDataContainer imageDataHandle = init(device, i); + HandleForImageDataContainer imageDataHandle = init(device, i, this.styleFlag); switch (imageDataHandle.type()) { case SWT.ICON: { return initIconHandle(imageDataHandle.handles(), zoom); @@ -2007,6 +1994,11 @@ public Collection getPreservedZoomLevels() { protected abstract ElementAtZoom loadImageData(int zoom); + protected ElementAtZoom loadImageDataWithGrayOrDisablement(int zoom) { + ElementAtZoom imageDataAtZoom = loadImageData(zoom); + return new ElementAtZoom<>(adaptImageDataIfDisabledOrGray(imageDataAtZoom.element(), styleFlag), imageDataAtZoom.zoom()); + } + abstract ImageData newImageData(ZoomContext zoomContext); abstract AbstractImageProviderWrapper createCopy(Image image); @@ -2119,9 +2111,8 @@ protected ImageHandle newImageHandle(ZoomContext zoomContext) { } private ImageHandle initializeHandleFromSource(ZoomContext zoomContext) { - ElementAtZoom imageDataAtZoom = loadImageData(zoomContext.targetZoom()); + ElementAtZoom imageDataAtZoom = loadImageDataWithGrayOrDisablement(zoomContext.targetZoom()); ImageData imageData = DPIUtil.scaleImageData(device, imageDataAtZoom.element(), zoomContext.targetZoom(), imageDataAtZoom.zoom()); - imageData = adaptImageDataIfDisabledOrGray(imageData); return newImageHandle(imageData, zoomContext); } } @@ -2271,21 +2262,20 @@ protected Rectangle getBounds(int zoom) { @Override ImageData newImageData(ZoomContext zoomContext) { - int targetZoom = zoomContext.targetZoom(); + return loadImageDataWithGrayOrDisablement(zoomContext.targetZoom()).element(); + } + + @Override + protected ElementAtZoom loadImageData(int targetZoom) { if (zoomLevelToImageHandle.isEmpty()) { - return createBaseHandle(targetZoom).getImageData(); + return new ElementAtZoom<> (createBaseHandle(targetZoom).getImageData(), targetZoom); } // if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would // be a destructive operation. Therefor, a new handle is created for the requested zoom if (memGC != null) { - return newImageHandle(zoomContext).getImageData(); + return new ElementAtZoom<> (newImageHandle(new ZoomContext(targetZoom)).getImageData(), targetZoom); } - return getScaledImageData(targetZoom); - } - - @Override - protected ElementAtZoom loadImageData(int zoom) { - return getClosestAvailableImageData(zoom); + return new ElementAtZoom<> (getScaledImageData(targetZoom), targetZoom); } @Override @@ -2413,9 +2403,8 @@ protected ImageHandle newImageHandle(ZoomContext zoomContext) { } private ImageHandle initializeHandleFromSource(int zoom) { - ElementAtZoom imageDataAtZoom = loadImageData(zoom); + ElementAtZoom imageDataAtZoom = loadImageDataWithGrayOrDisablement(zoom); ImageData imageData = DPIUtil.scaleImageData (device, imageDataAtZoom.element(), zoom, imageDataAtZoom.zoom()); - imageData = adaptImageDataIfDisabledOrGray(imageData); return init(imageData, zoom); } @@ -2736,7 +2725,7 @@ protected long configureGCData(GCData data) { @Override ImageData newImageData(ZoomContext zoomContext) { - return loadImageData(zoomContext.targetZoom).element(); + return loadImageDataWithGrayOrDisablement(zoomContext.targetZoom).element(); } @Override @@ -2765,7 +2754,7 @@ protected ImageHandle newImageHandle(ZoomContext zoomContext) { drawer.drawOn(gc, width, height); ImageData imageData = image.getImageData(targetZoom); drawer.postProcess(imageData); - ImageData newData = adaptImageDataIfDisabledOrGray(imageData); + ImageData newData = adaptImageDataIfDisabledOrGray(imageData, styleFlag); return init(newData, targetZoom); } finally { gc.dispose();