Skip to content

Commit 62c2cb0

Browse files
akoch-yattaHeikoKlare
authored andcommitted
[win32] Refactoring as Image#imageProvider != null
This commit refactors Image in the win32 implementation as Image#imageProvider is final and always != null now. With this the handling and creation of new handles and ImageData was unified.
1 parent 9859aae commit 62c2cb0

File tree

1 file changed

+65
-123
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics

1 file changed

+65
-123
lines changed

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java

Lines changed: 65 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -780,23 +780,7 @@ private ImageHandle getImageMetadata(int zoom) {
780780
if (zoomLevelToImageHandle.get(zoom) != null) {
781781
return zoomLevelToImageHandle.get(zoom);
782782
}
783-
if (imageProvider != null) {
784-
return imageProvider.getImageMetadata(zoom);
785-
} else {
786-
ImageData resizedData = getImageData(zoom);
787-
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
788-
if (type == SWT.ICON && newData.getTransparencyType() != SWT.TRANSPARENCY_MASK) {
789-
// If the original type was an icon with transparency mask and re-scaling leads
790-
// to image data without transparency mask, this will create invalid images
791-
// so this fallback will "repair" the image data by explicitly passing
792-
// the transparency mask created from the scaled image data
793-
initIconHandle(this.device, newData, newData.getTransparencyMask(), zoom);
794-
} else {
795-
init(newData, zoom);
796-
}
797-
init();
798-
}
799-
return zoomLevelToImageHandle.get(zoom);
783+
return imageProvider.newImageHandle(zoom);
800784
}
801785

802786

@@ -999,9 +983,7 @@ public static long win32_getHandle (Image image, int zoom) {
999983
void destroy () {
1000984
device.deregisterResourceWithZoomSupport(this);
1001985
if (memGC != null) memGC.dispose();
1002-
if (this.imageProvider != null) {
1003-
this.imageProvider.destroy();
1004-
}
986+
this.imageProvider.destroy();
1005987
destroyHandle();
1006988
memGC = null;
1007989
}
@@ -1055,11 +1037,7 @@ public boolean equals (Object object) {
10551037
if (!(object instanceof Image)) return false;
10561038
Image image = (Image) object;
10571039
if (device != image.device || transparentPixel != image.transparentPixel || getZoom() != image.getZoom()) return false;
1058-
if (imageProvider != null && image.imageProvider != null) {
1059-
return (styleFlag == image.styleFlag) && imageProvider.equals(image.imageProvider);
1060-
} else {
1061-
return win32_getHandle(this, getZoom()) == win32_getHandle(image, getZoom());
1062-
}
1040+
return (styleFlag == image.styleFlag) && imageProvider.equals(image.imageProvider);
10631041
}
10641042

10651043
/**
@@ -1156,13 +1134,8 @@ Rectangle getBounds(int zoom) {
11561134
ImageHandle imageMetadata = zoomLevelToImageHandle.get(zoom);
11571135
Rectangle rectangle = new Rectangle(0, 0, imageMetadata.width, imageMetadata.height);
11581136
return DPIUtil.scaleBounds(rectangle, zoom, imageMetadata.zoom);
1159-
} else if (this.imageProvider != null) {
1160-
return this.imageProvider.getBounds(zoom);
1161-
} else {
1162-
ImageHandle imageMetadata = zoomLevelToImageHandle.values().iterator().next();
1163-
Rectangle rectangle = new Rectangle(0, 0, imageMetadata.width, imageMetadata.height);
1164-
return DPIUtil.scaleBounds(rectangle, zoom, imageMetadata.zoom);
11651137
}
1138+
return this.imageProvider.getBounds(zoom);
11661139
}
11671140

11681141
/**
@@ -1236,25 +1209,7 @@ public ImageData getImageData() {
12361209
*/
12371210
public ImageData getImageData (int zoom) {
12381211
if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
1239-
if (zoomLevelToImageHandle.containsKey(zoom)) {
1240-
return zoomLevelToImageHandle.get(zoom).getImageData();
1241-
}
1242-
if (imageProvider != null) {
1243-
return imageProvider.getImageData(zoom);
1244-
}
1245-
1246-
return getScaledImageData(zoom);
1247-
}
1248-
1249-
private ImageData getScaledImageData (int zoom) {
1250-
// if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
1251-
// be a destructive operation. Therefor, always the current image data must be returned
1252-
if (memGC != null) {
1253-
return getImageDataAtCurrentZoom();
1254-
}
1255-
TreeSet<Integer> availableZooms = new TreeSet<>(zoomLevelToImageHandle.keySet());
1256-
int closestZoom = Optional.ofNullable(availableZooms.higher(zoom)).orElse(availableZooms.lower(zoom));
1257-
return scaleImageData(getImageMetadata(closestZoom).getImageData(), zoom, closestZoom);
1212+
return imageProvider.getImageData(zoom);
12581213
}
12591214

12601215

@@ -1294,10 +1249,7 @@ public ImageData getImageDataAtCurrentZoom() {
12941249
*/
12951250
@Override
12961251
public int hashCode () {
1297-
if(imageProvider != null) {
1298-
return imageProvider.hashCode();
1299-
}
1300-
return (int)win32_getHandle(this, getZoom());
1252+
return imageProvider.hashCode();
13011253
}
13021254

13031255
static long createDIB(int width, int height, int depth) {
@@ -1794,10 +1746,7 @@ public void internal_dispose_GC (long hDC, GCData data) {
17941746
*/
17951747
@Override
17961748
public boolean isDisposed() {
1797-
if (this.imageProvider != null) {
1798-
return this.imageProvider.isDisposed();
1799-
}
1800-
return zoomLevelToImageHandle.isEmpty();
1749+
return this.imageProvider.isDisposed();
18011750
}
18021751

18031752
/**
@@ -1918,10 +1867,42 @@ private abstract class AbstractImageProviderWrapper {
19181867
private boolean isDestroyed;
19191868

19201869
protected abstract Rectangle getBounds(int zoom);
1921-
abstract ImageData getImageData(int zoom);
1922-
abstract ImageHandle getImageMetadata(int zoom);
1870+
1871+
protected final ImageData getImageData(int zoom) {
1872+
if (zoomLevelToImageHandle.containsKey(zoom)) {
1873+
return zoomLevelToImageHandle.get(zoom).getImageData();
1874+
}
1875+
return newImageData(zoom);
1876+
}
1877+
1878+
abstract ImageData newImageData(int zoom);
1879+
19231880
abstract AbstractImageProviderWrapper createCopy(Image image);
19241881

1882+
ImageData getScaledImageData (int zoom) {
1883+
// if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
1884+
// be a destructive operation. Therefor, always the current image data must be returned
1885+
if (memGC != null) {
1886+
return getImageDataAtCurrentZoom();
1887+
}
1888+
TreeSet<Integer> availableZooms = new TreeSet<>(zoomLevelToImageHandle.keySet());
1889+
int closestZoom = Optional.ofNullable(availableZooms.higher(zoom)).orElse(availableZooms.lower(zoom));
1890+
return scaleImageData(getImageMetadata(closestZoom).getImageData(), zoom, closestZoom);
1891+
}
1892+
1893+
protected ImageHandle newImageHandle(int zoom) {
1894+
ImageData resizedData = getImageData(zoom);
1895+
if (type == SWT.ICON && resizedData.getTransparencyType() != SWT.TRANSPARENCY_MASK) {
1896+
// If the original type was an icon with transparency mask and re-scaling leads
1897+
// to image data without transparency mask, this will create invalid images
1898+
// so this fallback will "repair" the image data by explicitly passing
1899+
// the transparency mask created from the scaled image data
1900+
return initIconHandle(device, resizedData, resizedData.getTransparencyMask(), zoom);
1901+
} else {
1902+
return init(resizedData, zoom);
1903+
}
1904+
}
1905+
19251906
protected boolean isDisposed() {
19261907
return !isInitialized || isDestroyed;
19271908
}
@@ -1955,33 +1936,10 @@ protected Rectangle getBounds(int zoom) {
19551936
}
19561937

19571938
@Override
1958-
ImageData getImageData(int zoom) {
1959-
if (zoomLevelToImageHandle.isEmpty() || zoomLevelToImageHandle.containsKey(zoom)) {
1960-
return getImageMetadata(zoom).getImageData();
1961-
}
1962-
1939+
ImageData newImageData(int zoom) {
19631940
return getScaledImageData(zoom);
19641941
}
19651942

1966-
@Override
1967-
ImageHandle getImageMetadata(int zoom) {
1968-
if (zoomLevelToImageHandle.containsKey(zoom)) {
1969-
return zoomLevelToImageHandle.get(zoom);
1970-
} else {
1971-
ImageData resizedData = getImageData(zoom);
1972-
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
1973-
if (type == SWT.ICON && newData.getTransparencyType() != SWT.TRANSPARENCY_MASK) {
1974-
// If the original type was an icon with transparency mask and re-scaling leads
1975-
// to image data without transparency mask, this will create invalid images
1976-
// so this fallback will "repair" the image data by explicitly passing
1977-
// the transparency mask created from the scaled image data
1978-
return initIconHandle(device, newData, newData.getTransparencyMask(), zoom);
1979-
} else {
1980-
return init(newData, zoom);
1981-
}
1982-
}
1983-
}
1984-
19851943
@Override
19861944
AbstractImageProviderWrapper createCopy(Image image) {
19871945
return image.new ExistingImageHandleProviderWrapper(handle, zoomForHandle);
@@ -2001,26 +1959,13 @@ void initImage() {
20011959
}
20021960

20031961
@Override
2004-
ImageData getImageData(int zoom) {
2005-
if (zoomLevelToImageHandle.containsKey(zoom)) {
2006-
return zoomLevelToImageHandle.get(zoom).getImageData();
2007-
}
1962+
ImageData newImageData(int zoom) {
20081963
if (!zoomLevelToImageHandle.isEmpty()) {
20091964
return getScaledImageData(zoom);
20101965
}
20111966
ElementAtZoom<ImageData> loadedImageData = loadImageData(zoom);
2012-
return DPIUtil.scaleImageData(device, loadedImageData, zoom);
2013-
}
2014-
2015-
@Override
2016-
ImageHandle getImageMetadata(int zoom) {
2017-
if (zoomLevelToImageHandle.containsKey(zoom)) {
2018-
return zoomLevelToImageHandle.get(zoom);
2019-
} else {
2020-
ImageData scaledImageData = getImageData(zoom);
2021-
ImageHandle imageHandle = init(scaledImageData, zoom);
2022-
return imageHandle;
2023-
}
1967+
ImageData scaledImageData = DPIUtil.scaleImageData(device, loadedImageData, zoom);
1968+
return adaptImageDataIfDisabledOrGray(scaledImageData);
20241969
}
20251970
}
20261971

@@ -2133,29 +2078,26 @@ protected Rectangle getBounds(int zoom) {
21332078
}
21342079

21352080
@Override
2136-
ImageData getImageData(int zoom) {
2137-
if (zoomLevelToImageHandle.isEmpty() || zoomLevelToImageHandle.containsKey(zoom)) {
2138-
return getImageMetadata(zoom).getImageData();
2081+
ImageData newImageData(int zoom) {
2082+
if (zoomLevelToImageHandle.isEmpty()) {
2083+
return createBaseHandle(zoom).getImageData();
21392084
}
2140-
21412085
return getScaledImageData(zoom);
21422086
}
21432087

21442088
@Override
2145-
ImageHandle getImageMetadata(int zoom) {
2089+
protected ImageHandle newImageHandle(int zoom) {
21462090
if (zoomLevelToImageHandle.isEmpty()) {
2147-
long handle = initBaseHandle(zoom);
2148-
ImageHandle imageHandle = new ImageHandle(handle, zoom);
2149-
zoomLevelToImageHandle.put(zoom, imageHandle);
2150-
return imageHandle;
2151-
} else if(zoomLevelToImageHandle.containsKey(zoom)) {
2152-
return zoomLevelToImageHandle.get(zoom);
2153-
} else {
2154-
ImageData resizedData = getImageData(zoom);
2155-
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
2156-
init(newData, zoom);
2157-
return zoomLevelToImageHandle.get(zoom);
2091+
return createBaseHandle(zoom);
21582092
}
2093+
return super.newImageHandle(zoom);
2094+
}
2095+
2096+
private ImageHandle createBaseHandle(int zoom) {
2097+
long handle = initBaseHandle(zoom);
2098+
ImageHandle imageHandle = new ImageHandle(handle, zoom);
2099+
zoomLevelToImageHandle.put(zoom, imageHandle);
2100+
return imageHandle;
21592101
}
21602102

21612103
private long initBaseHandle(int zoom) {
@@ -2233,7 +2175,7 @@ Object getProvider() {
22332175
}
22342176

22352177
@Override
2236-
final ImageData getImageData(int zoom) {
2178+
ImageData newImageData(int zoom) {
22372179
Function<Integer, ImageData> imageDataRetrival = zoomToRetrieve -> {
22382180
ImageHandle handle = initializeHandleFromSource(zoomToRetrieve);
22392181
ImageData data = handle.getImageData();
@@ -2243,8 +2185,9 @@ final ImageData getImageData(int zoom) {
22432185
return cachedImageData.computeIfAbsent(zoom, imageDataRetrival);
22442186
}
22452187

2188+
22462189
@Override
2247-
final ImageHandle getImageMetadata(int zoom) {
2190+
protected ImageHandle newImageHandle(int zoom) {
22482191
ImageData cachedData = cachedImageData.remove(zoom);
22492192
if (cachedData != null) {
22502193
return init(cachedData, zoom);
@@ -2280,7 +2223,7 @@ protected ElementAtZoom<ImageData> loadImageData(int zoom) {
22802223
// Load at appropriate zoom via loader
22812224
if (fileForZoom.zoom() != zoom && ImageDataLoader.canLoadAtZoom(fileForZoom.element(), fileForZoom.zoom(), zoom)) {
22822225
ElementAtZoom<ImageData> imageDataAtZoom = ImageDataLoader.load(fileForZoom.element(), fileForZoom.zoom(), zoom);
2283-
return new ElementAtZoom<>(adaptImageDataIfDisabledOrGray(imageDataAtZoom.element()), zoom);
2226+
return new ElementAtZoom<>(imageDataAtZoom.element(), zoom);
22842227
}
22852228

22862229
// Load at file zoom (native or via loader) and rescale
@@ -2539,12 +2482,12 @@ protected Rectangle getBounds(int zoom) {
25392482
}
25402483

25412484
@Override
2542-
ImageData getImageData(int zoom) {
2485+
ImageData newImageData(int zoom) {
25432486
return getImageMetadata(zoom).getImageData();
25442487
}
25452488

25462489
@Override
2547-
ImageHandle getImageMetadata(int zoom) {
2490+
protected ImageHandle newImageHandle(int zoom) {
25482491
initialNativeZoom = zoom;
25492492
Image image = new Image(device, width, height, zoom);
25502493
GC gc = new GC(image, drawer.getGcStyle());
@@ -2554,12 +2497,11 @@ ImageHandle getImageMetadata(int zoom) {
25542497
ImageData imageData = image.getImageMetadata(zoom).getImageData();
25552498
drawer.postProcess(imageData);
25562499
ImageData newData = adaptImageDataIfDisabledOrGray(imageData);
2557-
init(newData, zoom);
2500+
return init(newData, zoom);
25582501
} finally {
25592502
gc.dispose();
25602503
image.dispose();
25612504
}
2562-
return zoomLevelToImageHandle.get(zoom);
25632505
}
25642506

25652507
@Override

0 commit comments

Comments
 (0)