Skip to content

Commit 42db14c

Browse files
committed
Refactoring ImageProviders
This commit refactors usage of ImageDataProvider and ImageFilenameProvider to make the code more readable. contributes to #62 and #127
1 parent 6225eae commit 42db14c

File tree

1 file changed

+110
-45
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics

1 file changed

+110
-45
lines changed

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

Lines changed: 110 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,9 @@ public final class Image extends Resource implements Drawable {
100100
GC memGC;
101101

102102
/**
103-
* ImageFileNameProvider to provide file names at various Zoom levels
104-
*/
105-
private ImageFileNameProvider imageFileNameProvider;
106-
107-
/**
108-
* ImageDataProvider to provide ImageData at various Zoom levels
103+
* AbstractImageProvider to avail right ImageProvider (ImageDataProvider or ImageFileNameProvider)
109104
*/
110-
private ImageDataProvider imageDataProvider;
105+
private AbstractImageProvider imageProvider;
111106

112107
/**
113108
* Style flag used to differentiate normal, gray-scale and disabled images based
@@ -225,8 +220,7 @@ public Image(Device device, Image srcImage, int flag) {
225220
if (srcImage.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
226221
Rectangle rect = srcImage.getBoundsInPixels();
227222
this.type = srcImage.type;
228-
this.imageDataProvider = srcImage.imageDataProvider;
229-
this.imageFileNameProvider = srcImage.imageFileNameProvider;
223+
this.imageProvider = srcImage.imageProvider;
230224
this.styleFlag = srcImage.styleFlag | flag;
231225
initialNativeZoom = srcImage.initialNativeZoom;
232226
long srcImageHandle = win32_getHandle(srcImage, getZoom());
@@ -538,7 +532,7 @@ public Image (Device device, String filename) {
538532
*/
539533
public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
540534
super(device);
541-
this.imageFileNameProvider = imageFileNameProvider;
535+
this.imageProvider = new ImageFileNameProviderWrapper(imageFileNameProvider);
542536
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
543537
ElementAtZoom<String> fileName = DPIUtil.validateAndGetImagePathAtZoom (imageFileNameProvider, getZoom());
544538
if (fileName.zoom() == getZoom()) {
@@ -584,7 +578,7 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
584578
*/
585579
public Image(Device device, ImageDataProvider imageDataProvider) {
586580
super(device);
587-
this.imageDataProvider = imageDataProvider;
581+
this.imageProvider = new ImageDataProviderWrapper(imageDataProvider);
588582
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
589583
ElementAtZoom<ImageData> data = DPIUtil.validateAndGetImageDataAtZoom(imageDataProvider, getZoom());
590584
ImageData resizedData = DPIUtil.scaleImageData(device, data.element(), getZoom(), data.zoom());
@@ -739,26 +733,8 @@ private ImageHandle getImageMetadata(int zoom) {
739733
if (zoomLevelToImageHandle.get(zoom) != null) {
740734
return zoomLevelToImageHandle.get(zoom);
741735
}
742-
743-
if (imageFileNameProvider != null) {
744-
ElementAtZoom<String> imageCandidate = DPIUtil.validateAndGetImagePathAtZoom (imageFileNameProvider, zoom);
745-
ImageData imageData = new ImageData (imageCandidate.element());
746-
if (imageCandidate.zoom() == zoom) {
747-
/* Release current native resources */
748-
ImageHandle imageMetadata = initNative(imageCandidate.element(), zoom);
749-
if (imageMetadata == null) init(imageData, zoom);
750-
init();
751-
} else {
752-
ImageData resizedData = DPIUtil.scaleImageData(device, imageData, zoom, imageCandidate.zoom());
753-
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
754-
init(newData, zoom);
755-
}
756-
} else if (imageDataProvider != null) {
757-
ElementAtZoom<ImageData> imageCandidate = DPIUtil.validateAndGetImageDataAtZoom (imageDataProvider, zoom);
758-
ImageData resizedData = DPIUtil.scaleImageData (device, imageCandidate.element(), zoom, imageCandidate.zoom());
759-
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
760-
init(newData, zoom);
761-
init();
736+
if (imageProvider != null) {
737+
return imageProvider.getImageMetadata(zoom);
762738
} else {
763739
ImageData resizedData = getImageData(zoom);
764740
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
@@ -1180,10 +1156,8 @@ public boolean equals (Object object) {
11801156
if (!(object instanceof Image)) return false;
11811157
Image image = (Image) object;
11821158
if (device != image.device || transparentPixel != image.transparentPixel || getZoom() != image.getZoom()) return false;
1183-
if (imageDataProvider != null && image.imageDataProvider != null) {
1184-
return (styleFlag == image.styleFlag) && imageDataProvider.equals (image.imageDataProvider);
1185-
} else if (imageFileNameProvider != null && image.imageFileNameProvider != null) {
1186-
return (styleFlag == image.styleFlag) && imageFileNameProvider.equals (image.imageFileNameProvider);
1159+
if (imageProvider != null && image.imageProvider != null) {
1160+
return (styleFlag == image.styleFlag) && imageProvider.equals(image.imageProvider);
11871161
} else {
11881162
return win32_getHandle(this, getZoom()) == win32_getHandle(image, getZoom());
11891163
}
@@ -1353,12 +1327,8 @@ public ImageData getImageData (int zoom) {
13531327
int currentZoom = getZoom();
13541328
if (zoom == currentZoom) {
13551329
return getImageDataAtCurrentZoom();
1356-
} else if (imageDataProvider != null) {
1357-
ElementAtZoom<ImageData> data = DPIUtil.validateAndGetImageDataAtZoom (imageDataProvider, zoom);
1358-
return DPIUtil.scaleImageData (device, data.element(), zoom, data.zoom());
1359-
} else if (imageFileNameProvider != null) {
1360-
ElementAtZoom<String> fileName = DPIUtil.validateAndGetImagePathAtZoom (imageFileNameProvider, zoom);
1361-
return DPIUtil.scaleImageData (device, new ImageData (fileName.element()), zoom, fileName.zoom());
1330+
} else if (imageProvider != null) {
1331+
imageProvider.getImageData(zoom);
13621332
}
13631333

13641334
// if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
@@ -1405,10 +1375,8 @@ public ImageData getImageDataAtCurrentZoom() {
14051375
*/
14061376
@Override
14071377
public int hashCode () {
1408-
if (imageDataProvider != null) {
1409-
return imageDataProvider.hashCode();
1410-
} else if (imageFileNameProvider != null) {
1411-
return Objects.hash(imageFileNameProvider, styleFlag, transparentPixel, getZoom());
1378+
if(imageProvider != null) {
1379+
return imageProvider.hashCode();
14121380
} else {
14131381
return (int)win32_getHandle(this, getZoom());
14141382
}
@@ -2030,6 +1998,103 @@ public static Image win32_new(Device device, int type, long handle) {
20301998
return image;
20311999
}
20322000

2001+
private abstract class AbstractImageProvider {
2002+
abstract Object getProvider();
2003+
abstract ImageData getImageData(int zoom);
2004+
abstract ImageHandle getImageMetadata(int zoom);
2005+
2006+
@Override
2007+
public int hashCode() {
2008+
return getProvider().hashCode();
2009+
}
2010+
2011+
@Override
2012+
public boolean equals(Object otherProvider) {
2013+
if(otherProvider != null && otherProvider instanceof AbstractImageProvider) {
2014+
getProvider().equals (((AbstractImageProvider) otherProvider).getProvider());
2015+
}
2016+
return false;
2017+
}
2018+
}
2019+
2020+
private class ImageFileNameProviderWrapper extends AbstractImageProvider {
2021+
2022+
/**
2023+
* ImageFileNameProvider to provide file names at various Zoom levels
2024+
*/
2025+
ImageFileNameProvider provider;
2026+
2027+
public ImageFileNameProviderWrapper(ImageFileNameProvider provider) {
2028+
this.provider = provider;
2029+
}
2030+
2031+
@Override
2032+
ImageData getImageData(int zoom) {
2033+
ElementAtZoom<String> fileName = DPIUtil.validateAndGetImagePathAtZoom (provider, zoom);
2034+
return DPIUtil.scaleImageData (device, new ImageData (fileName.element()), zoom, fileName.zoom());
2035+
}
2036+
2037+
@Override
2038+
ImageHandle getImageMetadata(int zoom) {
2039+
ElementAtZoom<String> imageCandidate = DPIUtil.validateAndGetImagePathAtZoom (provider, zoom);
2040+
ImageData imageData = new ImageData (imageCandidate.element());
2041+
if (imageCandidate.zoom() == zoom) {
2042+
/* Release current native resources */
2043+
ImageHandle imageMetadata = initNative(imageCandidate.element(), zoom);
2044+
if (imageMetadata == null) init(imageData, zoom);
2045+
init();
2046+
} else {
2047+
ImageData resizedData = DPIUtil.scaleImageData(device, imageData, zoom, imageCandidate.zoom());
2048+
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
2049+
init(newData, zoom);
2050+
}
2051+
return zoomLevelToImageHandle.get(zoom);
2052+
}
2053+
2054+
@Override
2055+
Object getProvider() {
2056+
return provider;
2057+
}
2058+
2059+
@Override
2060+
public int hashCode() {
2061+
return Objects.hash(provider, styleFlag, transparentPixel, getZoom());
2062+
}
2063+
}
2064+
2065+
private class ImageDataProviderWrapper extends AbstractImageProvider {
2066+
2067+
/**
2068+
* ImageDataProvider to provide ImageData at various Zoom levels
2069+
*/
2070+
ImageDataProvider provider;
2071+
2072+
public ImageDataProviderWrapper(ImageDataProvider provider) {
2073+
this.provider = provider;
2074+
}
2075+
2076+
@Override
2077+
ImageData getImageData(int zoom) {
2078+
ElementAtZoom<ImageData> data = DPIUtil.validateAndGetImageDataAtZoom (provider, zoom);
2079+
return DPIUtil.scaleImageData (device, data.element(), zoom, data.zoom());
2080+
}
2081+
2082+
@Override
2083+
ImageHandle getImageMetadata(int zoom) {
2084+
ElementAtZoom<ImageData> imageCandidate = DPIUtil.validateAndGetImageDataAtZoom (provider, zoom);
2085+
ImageData resizedData = DPIUtil.scaleImageData (device, imageCandidate.element(), zoom, imageCandidate.zoom());
2086+
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
2087+
init(newData, zoom);
2088+
init();
2089+
return zoomLevelToImageHandle.get(zoom);
2090+
}
2091+
2092+
@Override
2093+
Object getProvider() {
2094+
return provider;
2095+
}
2096+
}
2097+
20332098
private class ImageHandle {
20342099
long handle;
20352100
int zoom;

0 commit comments

Comments
 (0)