Skip to content

Commit 5de2869

Browse files
committed
[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 ab19dd0 commit 5de2869

File tree

1 file changed

+52
-111
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics

1 file changed

+52
-111
lines changed

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

Lines changed: 52 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -787,23 +787,7 @@ private ImageHandle getImageMetadata(int zoom) {
787787
if (zoomLevelToImageHandle.get(zoom) != null) {
788788
return zoomLevelToImageHandle.get(zoom);
789789
}
790-
if (imageProvider != null) {
791-
return imageProvider.getImageMetadata(zoom);
792-
} else {
793-
ImageData resizedData = getImageData(zoom);
794-
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
795-
if (type == SWT.ICON && newData.getTransparencyType() != SWT.TRANSPARENCY_MASK) {
796-
// If the original type was an icon with transparency mask and re-scaling leads
797-
// to image data without transparency mask, this will create invalid images
798-
// so this fallback will "repair" the image data by explicitly passing
799-
// the transparency mask created from the scaled image data
800-
initIconHandle(this.device, newData, newData.getTransparencyMask(), zoom);
801-
} else {
802-
init(newData, zoom);
803-
}
804-
init();
805-
}
806-
return zoomLevelToImageHandle.get(zoom);
790+
return imageProvider.newImageHandle(zoom);
807791
}
808792

809793

@@ -1006,9 +990,7 @@ public static long win32_getHandle (Image image, int zoom) {
1006990
void destroy () {
1007991
device.deregisterResourceWithZoomSupport(this);
1008992
if (memGC != null) memGC.dispose();
1009-
if (this.imageProvider != null) {
1010-
this.imageProvider.destroy();
1011-
}
993+
this.imageProvider.destroy();
1012994
destroyHandle();
1013995
memGC = null;
1014996
}
@@ -1062,11 +1044,7 @@ public boolean equals (Object object) {
10621044
if (!(object instanceof Image)) return false;
10631045
Image image = (Image) object;
10641046
if (device != image.device || transparentPixel != image.transparentPixel || getZoom() != image.getZoom()) return false;
1065-
if (imageProvider != null && image.imageProvider != null) {
1066-
return (styleFlag == image.styleFlag) && imageProvider.equals(image.imageProvider);
1067-
} else {
1068-
return win32_getHandle(this, getZoom()) == win32_getHandle(image, getZoom());
1069-
}
1047+
return (styleFlag == image.styleFlag) && imageProvider.equals(image.imageProvider);
10701048
}
10711049

10721050
/**
@@ -1163,13 +1141,8 @@ Rectangle getBounds(int zoom) {
11631141
ImageHandle imageMetadata = zoomLevelToImageHandle.get(zoom);
11641142
Rectangle rectangle = new Rectangle(0, 0, imageMetadata.width, imageMetadata.height);
11651143
return DPIUtil.scaleBounds(rectangle, zoom, imageMetadata.zoom);
1166-
} else if (this.imageProvider != null) {
1167-
return this.imageProvider.getBounds(zoom);
1168-
} else {
1169-
ImageHandle imageMetadata = zoomLevelToImageHandle.values().iterator().next();
1170-
Rectangle rectangle = new Rectangle(0, 0, imageMetadata.width, imageMetadata.height);
1171-
return DPIUtil.scaleBounds(rectangle, zoom, imageMetadata.zoom);
11721144
}
1145+
return this.imageProvider.getBounds(zoom);
11731146
}
11741147

11751148
/**
@@ -1243,25 +1216,7 @@ public ImageData getImageData() {
12431216
*/
12441217
public ImageData getImageData (int zoom) {
12451218
if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
1246-
if (zoomLevelToImageHandle.containsKey(zoom)) {
1247-
return zoomLevelToImageHandle.get(zoom).getImageData();
1248-
}
1249-
if (imageProvider != null) {
1250-
return imageProvider.getImageData(zoom);
1251-
}
1252-
1253-
return getScaledImageData(zoom);
1254-
}
1255-
1256-
private ImageData getScaledImageData (int zoom) {
1257-
// if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
1258-
// be a destructive operation. Therefor, always the current image data must be returned
1259-
if (memGC != null) {
1260-
return getImageDataAtCurrentZoom();
1261-
}
1262-
TreeSet<Integer> availableZooms = new TreeSet<>(zoomLevelToImageHandle.keySet());
1263-
int closestZoom = Optional.ofNullable(availableZooms.higher(zoom)).orElse(availableZooms.lower(zoom));
1264-
return scaleImageData(getImageMetadata(closestZoom).getImageData(), zoom, closestZoom);
1219+
return imageProvider.getImageData(zoom);
12651220
}
12661221

12671222

@@ -1301,10 +1256,7 @@ public ImageData getImageDataAtCurrentZoom() {
13011256
*/
13021257
@Override
13031258
public int hashCode () {
1304-
if(imageProvider != null) {
1305-
return imageProvider.hashCode();
1306-
}
1307-
return (int)win32_getHandle(this, getZoom());
1259+
return imageProvider.hashCode();
13081260
}
13091261

13101262
static long createDIB(int width, int height, int depth) {
@@ -1801,10 +1753,7 @@ public void internal_dispose_GC (long hDC, GCData data) {
18011753
*/
18021754
@Override
18031755
public boolean isDisposed() {
1804-
if (this.imageProvider != null) {
1805-
return this.imageProvider.isDisposed();
1806-
}
1807-
return zoomLevelToImageHandle.isEmpty();
1756+
return this.imageProvider.isDisposed();
18081757
}
18091758

18101759
/**
@@ -1925,10 +1874,42 @@ private abstract class AbstractImageProviderWrapper {
19251874
private boolean isDestroyed;
19261875

19271876
protected abstract Rectangle getBounds(int zoom);
1928-
abstract ImageData getImageData(int zoom);
1929-
abstract ImageHandle getImageMetadata(int zoom);
1877+
1878+
protected final ImageData getImageData(int zoom) {
1879+
if (zoomLevelToImageHandle.containsKey(zoom)) {
1880+
return zoomLevelToImageHandle.get(zoom).getImageData();
1881+
}
1882+
return newImageData(zoom);
1883+
}
1884+
1885+
abstract ImageData newImageData(int zoom);
1886+
19301887
abstract AbstractImageProviderWrapper createCopy(Image image);
19311888

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

19641945
@Override
1965-
ImageData getImageData(int zoom) {
1966-
if (zoomLevelToImageHandle.isEmpty() || zoomLevelToImageHandle.containsKey(zoom)) {
1967-
return getImageMetadata(zoom).getImageData();
1968-
}
1969-
1946+
ImageData newImageData(int zoom) {
19701947
return getScaledImageData(zoom);
19711948
}
19721949

1973-
@Override
1974-
ImageHandle getImageMetadata(int zoom) {
1975-
if (zoomLevelToImageHandle.containsKey(zoom)) {
1976-
return zoomLevelToImageHandle.get(zoom);
1977-
} else {
1978-
ImageData resizedData = getImageData(zoom);
1979-
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
1980-
init(newData, zoom);
1981-
return zoomLevelToImageHandle.get(zoom);
1982-
}
1983-
}
1984-
19851950
@Override
19861951
AbstractImageProviderWrapper createCopy(Image image) {
19871952
return image.new ExistingImageHandleProviderWrapper(handle, zoomForHandle);
@@ -2001,27 +1966,13 @@ void initImage() {
20011966
}
20021967

20031968
@Override
2004-
ImageData getImageData(int zoom) {
2005-
if (zoomLevelToImageHandle.containsKey(zoom)) {
2006-
return zoomLevelToImageHandle.get(zoom).getImageData();
2007-
}
1969+
ImageData newImageData(int zoom) {
20081970
if (!zoomLevelToImageHandle.isEmpty()) {
20091971
return getScaledImageData(zoom);
20101972
}
20111973
ElementAtZoom<ImageData> loadedImageData = loadImageData(zoom);
20121974
return DPIUtil.scaleImageData(device, loadedImageData, zoom);
20131975
}
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-
}
2024-
}
20251976
}
20261977

20271978
private class PlainImageDataProviderWrapper extends ImageFromImageDataProviderWrapper {
@@ -2133,29 +2084,19 @@ protected Rectangle getBounds(int zoom) {
21332084
}
21342085

21352086
@Override
2136-
ImageData getImageData(int zoom) {
2137-
if (zoomLevelToImageHandle.isEmpty() || zoomLevelToImageHandle.containsKey(zoom)) {
2138-
return getImageMetadata(zoom).getImageData();
2139-
}
2140-
2087+
ImageData newImageData(int zoom) {
21412088
return getScaledImageData(zoom);
21422089
}
21432090

21442091
@Override
2145-
ImageHandle getImageMetadata(int zoom) {
2092+
protected ImageHandle newImageHandle(int zoom) {
21462093
if (zoomLevelToImageHandle.isEmpty()) {
21472094
long handle = initBaseHandle(zoom);
21482095
ImageHandle imageHandle = new ImageHandle(handle, zoom);
21492096
zoomLevelToImageHandle.put(zoom, imageHandle);
21502097
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);
21582098
}
2099+
return super.newImageHandle(zoom);
21592100
}
21602101

21612102
private long initBaseHandle(int zoom) {
@@ -2233,7 +2174,7 @@ Object getProvider() {
22332174
}
22342175

22352176
@Override
2236-
final ImageData getImageData(int zoom) {
2177+
ImageData newImageData(int zoom) {
22372178
Function<Integer, ImageData> imageDataRetrival = zoomToRetrieve -> {
22382179
ImageHandle handle = initializeHandleFromSource(zoomToRetrieve);
22392180
ImageData data = handle.getImageData();
@@ -2243,8 +2184,9 @@ final ImageData getImageData(int zoom) {
22432184
return cachedImageData.computeIfAbsent(zoom, imageDataRetrival);
22442185
}
22452186

2187+
22462188
@Override
2247-
final ImageHandle getImageMetadata(int zoom) {
2189+
protected ImageHandle newImageHandle(int zoom) {
22482190
ImageData cachedData = cachedImageData.remove(zoom);
22492191
if (cachedData != null) {
22502192
return init(cachedData, zoom);
@@ -2539,12 +2481,12 @@ protected Rectangle getBounds(int zoom) {
25392481
}
25402482

25412483
@Override
2542-
ImageData getImageData(int zoom) {
2484+
ImageData newImageData(int zoom) {
25432485
return getImageMetadata(zoom).getImageData();
25442486
}
25452487

25462488
@Override
2547-
ImageHandle getImageMetadata(int zoom) {
2489+
protected ImageHandle newImageHandle(int zoom) {
25482490
initialNativeZoom = zoom;
25492491
Image image = new Image(device, width, height, zoom);
25502492
GC gc = new GC(image, drawer.getGcStyle());
@@ -2554,12 +2496,11 @@ ImageHandle getImageMetadata(int zoom) {
25542496
ImageData imageData = image.getImageMetadata(zoom).getImageData();
25552497
drawer.postProcess(imageData);
25562498
ImageData newData = adaptImageDataIfDisabledOrGray(imageData);
2557-
init(newData, zoom);
2499+
return init(newData, zoom);
25582500
} finally {
25592501
gc.dispose();
25602502
image.dispose();
25612503
}
2562-
return zoomLevelToImageHandle.get(zoom);
25632504
}
25642505

25652506
@Override

0 commit comments

Comments
 (0)