Skip to content

Commit ea52af4

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 83bd8d7 commit ea52af4

File tree

1 file changed

+121
-50
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics

1 file changed

+121
-50
lines changed

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

Lines changed: 121 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,9 @@ public final class Image extends Resource implements Drawable {
101101
GC memGC;
102102

103103
/**
104-
* ImageFileNameProvider to provide file names at various Zoom levels
105-
*/
106-
private ImageFileNameProvider imageFileNameProvider;
107-
108-
/**
109-
* ImageDataProvider to provide ImageData at various Zoom levels
104+
* AbstractImageProvider to avail right ImageProvider (ImageDataProvider or ImageFileNameProvider)
110105
*/
111-
private ImageDataProvider imageDataProvider;
106+
private AbstractImageProvider imageProvider;
112107

113108
/**
114109
* Style flag used to differentiate normal, gray-scale and disabled images based
@@ -228,8 +223,7 @@ public Image(Device device, Image srcImage, int flag) {
228223
if (srcImage.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
229224
Rectangle rect = srcImage.getBoundsInPixels();
230225
this.type = srcImage.type;
231-
this.imageDataProvider = srcImage.imageDataProvider;
232-
this.imageFileNameProvider = srcImage.imageFileNameProvider;
226+
this.imageProvider = AbstractImageProvider.createCopy(srcImage.imageProvider, this);
233227
this.styleFlag = srcImage.styleFlag | flag;
234228
initialNativeZoom = srcImage.initialNativeZoom;
235229
long srcImageHandle = win32_getHandle(srcImage, getZoom());
@@ -547,7 +541,7 @@ public Image (Device device, String filename) {
547541
*/
548542
public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
549543
super(device);
550-
this.imageFileNameProvider = imageFileNameProvider;
544+
this.imageProvider = new ImageFileNameProviderWrapper(imageFileNameProvider);
551545
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
552546
ElementAtZoom<String> fileName = DPIUtil.validateAndGetImagePathAtZoom (imageFileNameProvider, getZoom());
553547
if (fileName.zoom() == getZoom()) {
@@ -594,7 +588,7 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
594588
*/
595589
public Image(Device device, ImageDataProvider imageDataProvider) {
596590
super(device);
597-
this.imageDataProvider = imageDataProvider;
591+
this.imageProvider = new ImageDataProviderWrapper(imageDataProvider);
598592
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
599593
ElementAtZoom<ImageData> data = DPIUtil.validateAndGetImageDataAtZoom(imageDataProvider, getZoom());
600594
ImageData resizedData = DPIUtil.scaleImageData(device, data.element(), getZoom(), data.zoom());
@@ -750,26 +744,8 @@ private ImageHandle getImageMetadata(int zoom) {
750744
if (zoomLevelToImageHandle.get(zoom) != null) {
751745
return zoomLevelToImageHandle.get(zoom);
752746
}
753-
754-
if (imageFileNameProvider != null) {
755-
ElementAtZoom<String> imageCandidate = DPIUtil.validateAndGetImagePathAtZoom (imageFileNameProvider, zoom);
756-
ImageData imageData = new ImageData (imageCandidate.element());
757-
if (imageCandidate.zoom() == zoom) {
758-
/* Release current native resources */
759-
ImageHandle imageMetadata = initNative(imageCandidate.element(), zoom);
760-
if (imageMetadata == null) init(imageData, zoom);
761-
init();
762-
} else {
763-
ImageData resizedData = DPIUtil.scaleImageData(device, imageData, zoom, imageCandidate.zoom());
764-
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
765-
init(newData, zoom);
766-
}
767-
} else if (imageDataProvider != null) {
768-
ElementAtZoom<ImageData> imageCandidate = DPIUtil.validateAndGetImageDataAtZoom (imageDataProvider, zoom);
769-
ImageData resizedData = DPIUtil.scaleImageData (device, imageCandidate.element(), zoom, imageCandidate.zoom());
770-
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
771-
init(newData, zoom);
772-
init();
747+
if (imageProvider != null) {
748+
return imageProvider.getImageMetadata(zoom);
773749
} else {
774750
ImageData resizedData = getImageData(zoom);
775751
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
@@ -1208,10 +1184,8 @@ public boolean equals (Object object) {
12081184
if (!(object instanceof Image)) return false;
12091185
Image image = (Image) object;
12101186
if (device != image.device || transparentPixel != image.transparentPixel || getZoom() != image.getZoom()) return false;
1211-
if (imageDataProvider != null && image.imageDataProvider != null) {
1212-
return (styleFlag == image.styleFlag) && imageDataProvider.equals (image.imageDataProvider);
1213-
} else if (imageFileNameProvider != null && image.imageFileNameProvider != null) {
1214-
return (styleFlag == image.styleFlag) && imageFileNameProvider.equals (image.imageFileNameProvider);
1187+
if (imageProvider != null && image.imageProvider != null) {
1188+
return (styleFlag == image.styleFlag) && imageProvider.equals(image.imageProvider);
12151189
} else {
12161190
return win32_getHandle(this, getZoom()) == win32_getHandle(image, getZoom());
12171191
}
@@ -1381,15 +1355,8 @@ public ImageData getImageData (int zoom) {
13811355
int currentZoom = getZoom();
13821356
if (zoom == currentZoom) {
13831357
return getImageDataAtCurrentZoom();
1384-
} else if (imageDataProvider != null) {
1385-
ElementAtZoom<ImageData> data;
1386-
try (StaticZoomUpdater unused = new StaticZoomUpdater(zoom)) {
1387-
data = DPIUtil.validateAndGetImageDataAtZoom (imageDataProvider, zoom);
1388-
}
1389-
return DPIUtil.scaleImageData (device, data.element(), zoom, data.zoom());
1390-
} else if (imageFileNameProvider != null) {
1391-
ElementAtZoom<String> fileName = DPIUtil.validateAndGetImagePathAtZoom (imageFileNameProvider, zoom);
1392-
return DPIUtil.scaleImageData (device, new ImageData (fileName.element()), zoom, fileName.zoom());
1358+
} else if (imageProvider != null) {
1359+
imageProvider.getImageData(zoom);
13931360
}
13941361

13951362
// if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
@@ -1436,13 +1403,10 @@ public ImageData getImageDataAtCurrentZoom() {
14361403
*/
14371404
@Override
14381405
public int hashCode () {
1439-
if (imageDataProvider != null) {
1440-
return imageDataProvider.hashCode();
1441-
} else if (imageFileNameProvider != null) {
1442-
return Objects.hash(imageFileNameProvider, styleFlag, transparentPixel, getZoom());
1443-
} else {
1444-
return (int)win32_getHandle(this, getZoom());
1406+
if(imageProvider != null) {
1407+
return imageProvider.hashCode();
14451408
}
1409+
return (int)win32_getHandle(this, getZoom());
14461410
}
14471411

14481412
void init(int width, int height) {
@@ -2082,6 +2046,113 @@ public void close() {
20822046
}
20832047
}
20842048

2049+
private abstract class AbstractImageProvider {
2050+
abstract Object getProvider();
2051+
abstract ImageData getImageData(int zoom);
2052+
abstract ImageHandle getImageMetadata(int zoom);
2053+
2054+
@Override
2055+
public int hashCode() {
2056+
return getProvider().hashCode();
2057+
}
2058+
2059+
@Override
2060+
public boolean equals(Object otherProvider) {
2061+
if(otherProvider != null && otherProvider instanceof AbstractImageProvider) {
2062+
return getProvider().equals (((AbstractImageProvider) otherProvider).getProvider());
2063+
}
2064+
return false;
2065+
}
2066+
2067+
private static AbstractImageProvider createCopy(AbstractImageProvider abstractImageProvider, Image image) {
2068+
AbstractImageProvider imageProviderCopy = null;
2069+
if(abstractImageProvider instanceof ImageFileNameProviderWrapper) {
2070+
imageProviderCopy = image.new ImageFileNameProviderWrapper((ImageFileNameProvider) abstractImageProvider.getProvider());
2071+
} else if (abstractImageProvider instanceof ImageDataProviderWrapper) {
2072+
imageProviderCopy = image.new ImageDataProviderWrapper((ImageDataProvider) abstractImageProvider.getProvider());
2073+
}
2074+
return imageProviderCopy;
2075+
}
2076+
}
2077+
2078+
private class ImageFileNameProviderWrapper extends AbstractImageProvider {
2079+
2080+
/**
2081+
* ImageFileNameProvider to provide file names at various Zoom levels
2082+
*/
2083+
final ImageFileNameProvider provider;
2084+
2085+
public ImageFileNameProviderWrapper(ImageFileNameProvider provider) {
2086+
this.provider = provider;
2087+
}
2088+
2089+
@Override
2090+
ImageData getImageData(int zoom) {
2091+
ElementAtZoom<String> fileName = DPIUtil.validateAndGetImagePathAtZoom (provider, zoom);
2092+
return DPIUtil.scaleImageData (device, new ImageData (fileName.element()), zoom, fileName.zoom());
2093+
}
2094+
2095+
@Override
2096+
ImageHandle getImageMetadata(int zoom) {
2097+
ElementAtZoom<String> imageCandidate = DPIUtil.validateAndGetImagePathAtZoom (provider, zoom);
2098+
ImageData imageData = new ImageData (imageCandidate.element());
2099+
if (imageCandidate.zoom() == zoom) {
2100+
/* Release current native resources */
2101+
ImageHandle imageMetadata = initNative(imageCandidate.element(), zoom);
2102+
if (imageMetadata == null) init(imageData, zoom);
2103+
init();
2104+
} else {
2105+
ImageData resizedData = DPIUtil.scaleImageData(device, imageData, zoom, imageCandidate.zoom());
2106+
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
2107+
init(newData, zoom);
2108+
}
2109+
return zoomLevelToImageHandle.get(zoom);
2110+
}
2111+
2112+
@Override
2113+
Object getProvider() {
2114+
return provider;
2115+
}
2116+
2117+
@Override
2118+
public int hashCode() {
2119+
return Objects.hash(provider, styleFlag, transparentPixel, getZoom());
2120+
}
2121+
}
2122+
2123+
private class ImageDataProviderWrapper extends AbstractImageProvider {
2124+
2125+
/**
2126+
* ImageDataProvider to provide ImageData at various Zoom levels
2127+
*/
2128+
final ImageDataProvider provider;
2129+
2130+
public ImageDataProviderWrapper(ImageDataProvider provider) {
2131+
this.provider = provider;
2132+
}
2133+
2134+
@Override
2135+
ImageData getImageData(int zoom) {
2136+
ElementAtZoom<ImageData> data = DPIUtil.validateAndGetImageDataAtZoom (provider, zoom);
2137+
return DPIUtil.scaleImageData (device, data.element(), zoom, data.zoom());
2138+
}
2139+
2140+
@Override
2141+
ImageHandle getImageMetadata(int zoom) {
2142+
ElementAtZoom<ImageData> imageCandidate = DPIUtil.validateAndGetImageDataAtZoom (provider, zoom);
2143+
ImageData resizedData = DPIUtil.scaleImageData (device, imageCandidate.element(), zoom, imageCandidate.zoom());
2144+
ImageData newData = adaptImageDataIfDisabledOrGray(resizedData);
2145+
init(newData, zoom);
2146+
init();
2147+
return zoomLevelToImageHandle.get(zoom);
2148+
}
2149+
2150+
@Override
2151+
Object getProvider() {
2152+
return provider;
2153+
}
2154+
}
2155+
20852156
private class ImageHandle {
20862157
final long handle;
20872158
final int height;

0 commit comments

Comments
 (0)