Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -201,28 +201,33 @@ public String toString() {
}

private class HandleAtSize {

record TemporaryZoomHandleForZoom(DestroyableImageHandle handle, int zoom) {}

private InternalImageHandle handleContainer = null;
private DestroyableImageHandle temporaryHandleContainer = null;
private TemporaryZoomHandleForZoom temporaryHandleContainer = null;
private int requestedWidth = -1;
private int requestedHeight = -1;

public void destroy() {
if (temporaryHandleContainer != null) {
temporaryHandleContainer.destroy();
temporaryHandleContainer = null;
}
public TemporaryZoomHandleForZoom destroy() {
TemporaryZoomHandleForZoom previousHandle = temporaryHandleContainer;
temporaryHandleContainer = null;
handleContainer = null;
requestedWidth = -1;
requestedHeight = -1;
return previousHandle;
}

public ImageHandle refresh(int width, int height) {
if (!isReusable(width, height)) {
destroy();
TemporaryZoomHandleForZoom previousHandle = destroy();
requestedWidth = width;
requestedHeight = height;
handleContainer = createHandleAtExactSize(width, height)
.orElseGet(() -> getOrCreateImageHandleAtClosestSize(width, height));
.orElseGet(() -> getOrCreateImageHandleAtClosestSize(width, height, previousHandle));
if (previousHandle != null && previousHandle.handle() != handleContainer) {
previousHandle.handle().destroy();
}
}
return handleContainer;
}
Expand All @@ -238,21 +243,30 @@ private boolean isReusable(int width, int height) {
private Optional<InternalImageHandle> createHandleAtExactSize(int width, int height) {
Optional<ImageData> imageData = imageProvider.loadImageDataAtExactSize(width, height);
if (imageData.isPresent()) {
temporaryHandleContainer = init(imageData.get(), -1);
return Optional.of(temporaryHandleContainer);
temporaryHandleContainer = new TemporaryZoomHandleForZoom(init(imageData.get(), -1), 0);
return Optional.of(temporaryHandleContainer.handle());
}
return Optional.empty();
}

private InternalImageHandle getOrCreateImageHandleAtClosestSize(int widthHint, int heightHint) {
private InternalImageHandle getOrCreateImageHandleAtClosestSize(int widthHint, int heightHint, TemporaryZoomHandleForZoom previousHandle) {
Rectangle bounds = getBounds(100);
int imageZoomForWidth = 100 * widthHint / bounds.width;
int imageZoomForHeight = 100 * heightHint / bounds.height;
int imageZoom = DPIUtil.getZoomForAutoscaleProperty(Math.max(imageZoomForWidth, imageZoomForHeight));
if (imageZoom == 100) {
return getHandleInternal(100, 100);
}
InternalImageHandle bestFittingHandle = imageHandleManager.get(imageZoom);
if (previousHandle != null && previousHandle.zoom() == imageProvider.nextAvailableZoom(imageZoom)) {
temporaryHandleContainer = previousHandle;
return previousHandle.handle();
}
if (bestFittingHandle == null) {
ImageData bestFittingImageData = imageProvider.loadImageData(imageZoom).element();
bestFittingHandle = temporaryHandleContainer = init(bestFittingImageData, -1);
ElementAtZoom<ImageData> imageData = imageProvider.loadImageData(imageZoom);
ImageData bestFittingImageData = imageData.element();
temporaryHandleContainer = new TemporaryZoomHandleForZoom(init(bestFittingImageData, -1), imageData.zoom());
bestFittingHandle = temporaryHandleContainer.handle();
}
return bestFittingHandle;
}
Expand Down Expand Up @@ -957,6 +971,10 @@ public static long win32_getHandle (Image image, int zoom) {
}

ImageHandle getHandle (int targetZoom, int nativeZoom) {
return getHandleInternal(targetZoom, nativeZoom);
}

private InternalImageHandle getHandleInternal(int targetZoom, int nativeZoom) {
if (isDisposed()) {
return null;
}
Expand Down Expand Up @@ -2090,6 +2108,8 @@ protected boolean isPersistentImageHandleRequriedForImageData() {
return false;
}

abstract int nextAvailableZoom(int zoom);

/**
* Returns image data at the best-fitting available zoom for the given zoom.
* The returned data will have a potential gray/disable style applied.
Expand Down Expand Up @@ -2179,6 +2199,11 @@ protected DestroyableImageHandle newImageHandle(ZoomContext zoomContext) {
ImageData resizedData = newImageData (zoomContext.targetZoom());
return newImageHandle(resizedData, zoomContext);
}

@Override
int nextAvailableZoom(int zoom) {
return zoomForHandle;
}
}

private abstract class ImageFromImageDataProviderWrapper extends AbstractImageProviderWrapper {
Expand Down Expand Up @@ -2216,6 +2241,7 @@ private DestroyableImageHandle initializeHandleFromSource(ZoomContext zoomContex
ImageData imageData = DPIUtil.scaleImageData(device, imageDataAtZoom.element(), zoomContext.targetZoom(), imageDataAtZoom.zoom());
return newImageHandle(imageData, zoomContext);
}

}

private class PlainImageDataProviderWrapper extends ImageFromImageDataProviderWrapper {
Expand Down Expand Up @@ -2249,6 +2275,11 @@ protected ElementAtZoom<ImageData> loadImageData(int zoom) {
AbstractImageProviderWrapper createCopy(Image image) {
return image.new PlainImageDataProviderWrapper(this.imageDataAtBaseZoom);
}

@Override
int nextAvailableZoom(int zoom) {
return baseZoom;
}
}

private class MaskedImageDataProviderWrapper extends ImageFromImageDataProviderWrapper {
Expand Down Expand Up @@ -2281,6 +2312,11 @@ protected ElementAtZoom<ImageData> loadImageData(int zoom) {
AbstractImageProviderWrapper createCopy(Image image) {
return image.new MaskedImageDataProviderWrapper(this.srcAt100, this.maskAt100);
}

@Override
int nextAvailableZoom(int zoom) {
return 100;
}
}

private class ImageDataLoaderStreamProviderWrapper extends ImageFromImageDataProviderWrapper {
Expand Down Expand Up @@ -2325,6 +2361,14 @@ protected Optional<ImageData> loadImageDataAtExactSize(int targetWidth, int targ
}
return Optional.empty();
}

@Override
int nextAvailableZoom(int zoom) {
if (ImageDataLoader.isDynamicallySizable(new ByteArrayInputStream(this.inputStreamData))) {
return zoom;
}
return FileFormat.DEFAULT_ZOOM;
}
}

private class PlainImageProviderWrapper extends AbstractImageProviderWrapper {
Expand Down Expand Up @@ -2388,6 +2432,11 @@ protected ElementAtZoom<ImageData> loadImageData(int zoom) {
return getClosestAvailableImageData(zoom);
}

@Override
int nextAvailableZoom(int zoom) {
return getClosestAvailableImageData(zoom).zoom();
}

@Override
protected DestroyableImageHandle newImageHandle(ZoomContext zoomContext) {
int targetZoom = zoomContext.targetZoom();
Expand Down Expand Up @@ -2533,6 +2582,7 @@ private class ImageFileNameProviderWrapper extends BaseImageProviderWrapper<Imag
newImageData(DPIUtil.getDeviceZoom());
}


@Override
protected ElementAtZoom<ImageData> loadImageData(int zoom) {
ElementAtZoom<String> fileForZoom = DPIUtil.validateAndGetImagePathAtZoom(provider, zoom);
Expand Down Expand Up @@ -2564,6 +2614,14 @@ protected ElementAtZoom<ImageData> loadImageData(int zoom) {
return adaptImageDataIfDisabledOrGray(imageDataAtZoom);
}

@Override
int nextAvailableZoom(int zoom) {
if (provider instanceof ImageDataAtSizeProvider) {
return zoom;
}
return DPIUtil.validateAndGetImagePathAtZoom(provider, zoom).zoom();
}

@Override
public int hashCode() {
return Objects.hash(provider, styleFlag);
Expand Down Expand Up @@ -2807,6 +2865,14 @@ protected Optional<ImageData> loadImageDataAtExactSize(int targetWidth, int targ
}
return Optional.empty();
}

@Override
int nextAvailableZoom(int zoom) {
if (provider instanceof ImageDataAtSizeProvider) {
return zoom;
}
return DPIUtil.validateAndGetImageDataAtZoom (provider, zoom).zoom();
}
}

private class ImageGcDrawerWrapper extends DynamicImageProviderWrapper {
Expand Down Expand Up @@ -2848,6 +2914,11 @@ protected ElementAtZoom<ImageData> loadImageData(int zoom) {
return new ElementAtZoom<>(loadImageData(new ZoomContext(zoom)), zoom);
}

@Override
int nextAvailableZoom(int zoom) {
return zoom;
}

private ImageData loadImageData(ZoomContext zoomContext) {
currentZoom = zoomContext;
int targetZoom = zoomContext.targetZoom();
Expand Down
Loading