Skip to content
Draft
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,7 @@ private boolean isReusable(int width, int height) {
private Optional<ImageHandle> createHandleAtExactSize(int width, int height) {
Optional<ImageData> 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();
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
}
Comment on lines +334 to 338
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now we only need to reload the data for other handle if exist in order to apply gray or disable image data.

break;
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}

Expand All @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -2007,6 +1994,11 @@ public Collection<Integer> getPreservedZoomLevels() {

protected abstract ElementAtZoom<ImageData> loadImageData(int zoom);

protected ElementAtZoom<ImageData> loadImageDataWithGrayOrDisablement(int zoom) {
ElementAtZoom<ImageData> imageDataAtZoom = loadImageData(zoom);
return new ElementAtZoom<>(adaptImageDataIfDisabledOrGray(imageDataAtZoom.element(), styleFlag), imageDataAtZoom.zoom());
}

abstract ImageData newImageData(ZoomContext zoomContext);

abstract AbstractImageProviderWrapper createCopy(Image image);
Expand Down Expand Up @@ -2119,9 +2111,8 @@ protected ImageHandle newImageHandle(ZoomContext zoomContext) {
}

private ImageHandle initializeHandleFromSource(ZoomContext zoomContext) {
ElementAtZoom<ImageData> imageDataAtZoom = loadImageData(zoomContext.targetZoom());
ElementAtZoom<ImageData> imageDataAtZoom = loadImageDataWithGrayOrDisablement(zoomContext.targetZoom());
ImageData imageData = DPIUtil.scaleImageData(device, imageDataAtZoom.element(), zoomContext.targetZoom(), imageDataAtZoom.zoom());
imageData = adaptImageDataIfDisabledOrGray(imageData);
return newImageHandle(imageData, zoomContext);
}
}
Expand Down Expand Up @@ -2413,9 +2404,8 @@ protected ImageHandle newImageHandle(ZoomContext zoomContext) {
}

private ImageHandle initializeHandleFromSource(int zoom) {
ElementAtZoom<ImageData> imageDataAtZoom = loadImageData(zoom);
ElementAtZoom<ImageData> imageDataAtZoom = loadImageDataWithGrayOrDisablement(zoom);
ImageData imageData = DPIUtil.scaleImageData (device, imageDataAtZoom.element(), zoom, imageDataAtZoom.zoom());
imageData = adaptImageDataIfDisabledOrGray(imageData);
return init(imageData, zoom);
}

Expand Down Expand Up @@ -2736,7 +2726,7 @@ protected long configureGCData(GCData data) {

@Override
ImageData newImageData(ZoomContext zoomContext) {
return loadImageData(zoomContext.targetZoom).element();
return loadImageDataWithGrayOrDisablement(zoomContext.targetZoom).element();
}

@Override
Expand Down Expand Up @@ -2765,7 +2755,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);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I still have to keep it because a new image is created here with plainImageDataProvider which loads the data directly from handle. I am open to suggestions here.

return init(newData, targetZoom);
} finally {
gc.dispose();
Expand Down
Loading