Skip to content

Commit 2bb3651

Browse files
Create handles for ImageDataProvider and ImageFilenameProvider on demand
1 parent 0768d7e commit 2bb3651

File tree

1 file changed

+95
-72
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics

1 file changed

+95
-72
lines changed

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

Lines changed: 95 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,10 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
552552
super(device);
553553
this.imageProvider = new ImageFileNameProviderWrapper(imageFileNameProvider);
554554
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
555-
imageProvider.getImageMetadata(getZoom());
555+
if (imageProvider.getImageData(100) == null) {
556+
SWT.error(SWT.ERROR_INVALID_ARGUMENT, null,
557+
": ImageFileNameProvider [" + imageFileNameProvider + "] returns null ImageData at 100% zoom.");
558+
}
556559
init();
557560
this.device.registerResourceWithZoomSupport(this);
558561
}
@@ -590,7 +593,10 @@ public Image(Device device, ImageDataProvider imageDataProvider) {
590593
super(device);
591594
this.imageProvider = new ImageDataProviderWrapper(imageDataProvider);
592595
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
593-
imageProvider.getImageMetadata(getZoom());
596+
if (imageDataProvider.getImageData(100) == null) {
597+
SWT.error(SWT.ERROR_INVALID_ARGUMENT, null,
598+
": ImageDataProvider [" + imageDataProvider + "] returns null ImageData at 100% zoom.");
599+
}
594600
init();
595601
this.device.registerResourceWithZoomSupport(this);
596602
}
@@ -1891,18 +1897,23 @@ public static Image win32_new(Device device, int type, long handle, int nativeZo
18911897
}
18921898

18931899
private abstract class AbstractImageProviderWrapper {
1900+
private boolean isDestroyed;
1901+
18941902
protected abstract Rectangle getBounds(int zoom);
18951903
abstract ImageData getImageData(int zoom);
18961904
abstract ImageHandle getImageMetadata(int zoom);
18971905
abstract AbstractImageProviderWrapper createCopy(Image image);
1898-
abstract boolean isDisposed();
1906+
1907+
protected boolean isDisposed() {
1908+
return isDestroyed;
1909+
}
18991910

19001911
protected void destroy() {
1912+
this.isDestroyed = true;
19011913
}
19021914
}
19031915

19041916
private class PlainImageProviderWrapper extends AbstractImageProviderWrapper {
1905-
private boolean isDestroyed;
19061917
private final int width;
19071918
private final int height;
19081919

@@ -1984,16 +1995,6 @@ private long initBaseHandle(int zoom) {
19841995
AbstractImageProviderWrapper createCopy(Image image) {
19851996
return image.new PlainImageProviderWrapper(width, height);
19861997
}
1987-
1988-
@Override
1989-
protected void destroy() {
1990-
this.isDestroyed = true;
1991-
}
1992-
1993-
@Override
1994-
boolean isDisposed() {
1995-
return isDestroyed;
1996-
}
19971998
}
19981999

19992000
private abstract class DynamicImageProviderWrapper extends AbstractImageProviderWrapper {
@@ -2016,28 +2017,43 @@ public boolean equals(Object otherProvider) {
20162017
}
20172018
}
20182019

2019-
private class ImageFileNameProviderWrapper extends DynamicImageProviderWrapper {
2020+
private abstract class BaseImageProviderWrapper<T> extends DynamicImageProviderWrapper {
2021+
protected final T provider;
2022+
private final Map<Integer, Rectangle> zoomToBounds = new HashMap<>();
20202023

2021-
/**
2022-
* ImageFileNameProvider to provide file names at various Zoom levels
2023-
*/
2024-
private final ImageFileNameProvider provider;
2025-
2026-
ImageFileNameProviderWrapper(ImageFileNameProvider provider) {
2027-
checkProvider(provider, ImageFileNameProvider.class);
2024+
BaseImageProviderWrapper(T provider, Class<T> expectedClass) {
2025+
checkProvider(provider, expectedClass);
20282026
this.provider = provider;
20292027
}
20302028

2029+
@Override
2030+
Object getProvider() {
2031+
return provider;
2032+
}
2033+
20312034
@Override
20322035
protected Rectangle getBounds(int zoom) {
2033-
ImageHandle imageHandle = zoomLevelToImageHandle.values().iterator().next();
2034-
Rectangle rectangle = new Rectangle(0, 0, imageHandle.width, imageHandle.height);
2035-
return DPIUtil.scaleBounds(rectangle, zoom, imageHandle.zoom);
2036+
if (zoomLevelToImageHandle.containsKey(zoom)) {
2037+
ImageHandle imgHandle = zoomLevelToImageHandle.get(zoom);
2038+
return new Rectangle(0, 0, imgHandle.width, imgHandle.height);
2039+
}
2040+
if (!zoomToBounds.containsKey(zoom)) {
2041+
ImageData imageData = getImageData(zoom);
2042+
Rectangle rectangle = new Rectangle(0, 0, imageData.width, imageData.height);
2043+
zoomToBounds.put(zoom, rectangle);
2044+
}
2045+
return zoomToBounds.get(zoom);
2046+
}
2047+
}
2048+
2049+
private class ImageFileNameProviderWrapper extends BaseImageProviderWrapper<ImageFileNameProvider> {
2050+
ImageFileNameProviderWrapper(ImageFileNameProvider provider) {
2051+
super(provider, ImageFileNameProvider.class);
20362052
}
20372053

20382054
@Override
20392055
ImageData getImageData(int zoom) {
2040-
ElementAtZoom<String> fileForZoom = DPIUtil.validateAndGetImagePathAtZoom (provider, zoom);
2056+
ElementAtZoom<String> fileForZoom = DPIUtil.validateAndGetImagePathAtZoom(provider, zoom);
20412057
ImageHandle nativeInitializedImage;
20422058
if (zoomLevelToImageHandle.containsKey(fileForZoom.zoom())) {
20432059
nativeInitializedImage = zoomLevelToImageHandle.get(fileForZoom.zoom());
@@ -2072,16 +2088,6 @@ ImageHandle getImageMetadata(int zoom) {
20722088
return zoomLevelToImageHandle.get(zoom);
20732089
}
20742090

2075-
@Override
2076-
boolean isDisposed() {
2077-
return zoomLevelToImageHandle.isEmpty();
2078-
}
2079-
2080-
@Override
2081-
Object getProvider() {
2082-
return provider;
2083-
}
2084-
20852091
@Override
20862092
public int hashCode() {
20872093
return Objects.hash(provider, styleFlag, transparentPixel, getZoom());
@@ -2284,25 +2290,63 @@ private long extractHandleForPixelFormat(int width, int height, int pixelFormat)
22842290
}
22852291
return handle;
22862292
}
2287-
}
2288-
2289-
private class ImageDataProviderWrapper extends DynamicImageProviderWrapper {
22902293

2291-
/**
2292-
* ImageDataProvider to provide ImageData at various Zoom levels
2293-
*/
2294-
private final ImageDataProvider provider;
2294+
private int extractDepthForPixelFormat(BitmapData bitmapData) {
2295+
int depth = 0;
2296+
switch (bitmapData.PixelFormat) {
2297+
case Gdip.PixelFormat1bppIndexed:
2298+
depth = 1;
2299+
break;
2300+
case Gdip.PixelFormat4bppIndexed:
2301+
depth = 4;
2302+
break;
2303+
case Gdip.PixelFormat8bppIndexed:
2304+
depth = 8;
2305+
break;
2306+
case Gdip.PixelFormat16bppARGB1555:
2307+
case Gdip.PixelFormat16bppRGB555:
2308+
case Gdip.PixelFormat16bppRGB565:
2309+
depth = 16;
2310+
break;
2311+
case Gdip.PixelFormat24bppRGB:
2312+
depth = 24;
2313+
break;
2314+
case Gdip.PixelFormat32bppRGB:
2315+
case Gdip.PixelFormat32bppARGB:
2316+
depth = 32;
2317+
break;
2318+
}
2319+
return depth;
2320+
}
22952321

2296-
ImageDataProviderWrapper(ImageDataProvider provider) {
2297-
checkProvider(provider, ImageDataProvider.class);
2298-
this.provider = provider;
2322+
private long extractHandleForPixelFormat(int width, int height, int pixelFormat) {
2323+
long handle = 0;
2324+
switch (pixelFormat) {
2325+
case Gdip.PixelFormat16bppRGB555:
2326+
case Gdip.PixelFormat16bppRGB565:
2327+
handle = createDIB(width, height, 16);
2328+
break;
2329+
case Gdip.PixelFormat24bppRGB:
2330+
case Gdip.PixelFormat32bppCMYK:
2331+
handle = createDIB(width, height, 24);
2332+
break;
2333+
case Gdip.PixelFormat32bppRGB:
2334+
// These will lose either precision or transparency
2335+
case Gdip.PixelFormat16bppGrayScale:
2336+
case Gdip.PixelFormat48bppRGB:
2337+
case Gdip.PixelFormat32bppPARGB:
2338+
case Gdip.PixelFormat64bppARGB:
2339+
case Gdip.PixelFormat64bppPARGB:
2340+
handle = createDIB(width, height, 32);
2341+
break;
2342+
}
2343+
return handle;
22992344
}
2345+
}
23002346

2301-
@Override
2302-
protected Rectangle getBounds(int zoom) {
2303-
ImageHandle imageHandle = zoomLevelToImageHandle.values().iterator().next();
2304-
Rectangle rectangle = new Rectangle(0, 0, imageHandle.width, imageHandle.height);
2305-
return DPIUtil.scaleBounds(rectangle, zoom, imageHandle.zoom);
2347+
private class ImageDataProviderWrapper extends BaseImageProviderWrapper<ImageDataProvider> {
2348+
ImageDataProviderWrapper(ImageDataProvider provider) {
2349+
super(provider, ImageDataProvider.class);
23062350
}
23072351

23082352
@Override
@@ -2320,16 +2364,6 @@ ImageHandle getImageMetadata(int zoom) {
23202364
return zoomLevelToImageHandle.get(zoom);
23212365
}
23222366

2323-
@Override
2324-
boolean isDisposed() {
2325-
return zoomLevelToImageHandle.isEmpty();
2326-
}
2327-
2328-
@Override
2329-
Object getProvider() {
2330-
return provider;
2331-
}
2332-
23332367
@Override
23342368
ImageDataProviderWrapper createCopy(Image image) {
23352369
return image.new ImageDataProviderWrapper(provider);
@@ -2340,7 +2374,6 @@ private class ImageGcDrawerWrapper extends DynamicImageProviderWrapper {
23402374
private ImageGcDrawer drawer;
23412375
private int width;
23422376
private int height;
2343-
private boolean isDestroyed;
23442377

23452378
ImageGcDrawerWrapper(ImageGcDrawer imageGcDrawer, int width, int height) {
23462379
checkProvider(imageGcDrawer, ImageGcDrawer.class);
@@ -2379,16 +2412,6 @@ ImageHandle getImageMetadata(int zoom) {
23792412
return zoomLevelToImageHandle.get(zoom);
23802413
}
23812414

2382-
@Override
2383-
protected void destroy() {
2384-
isDestroyed = true;
2385-
}
2386-
2387-
@Override
2388-
boolean isDisposed() {
2389-
return isDestroyed;
2390-
}
2391-
23922415
@Override
23932416
Object getProvider() {
23942417
return drawer;

0 commit comments

Comments
 (0)