< prev index next >
src/java.desktop/share/classes/sun/awt/image/MultiResolutionToolkitImage.java
Print this page
*** 25,60 ****
package sun.awt.image;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.awt.image.MultiResolutionImage;
- import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import sun.awt.SoftCache;
public class MultiResolutionToolkitImage extends ToolkitImage implements MultiResolutionImage {
! Image resolutionVariant;
! public MultiResolutionToolkitImage(Image lowResolutionImage, Image resolutionVariant) {
! super(lowResolutionImage.getSource());
! this.resolutionVariant = resolutionVariant;
}
@Override
public Image getResolutionVariant(double destWidth, double destHeight) {
checkSize(destWidth, destHeight);
! return ((destWidth <= getWidth() && destHeight <= getHeight()))
! ? this : resolutionVariant;
}
public static Image map(MultiResolutionToolkitImage mrImage,
Function<Image, Image> mapper) {
Image baseImage = mapper.apply(mrImage);
! Image rvImage = mapper.apply(mrImage.resolutionVariant);
! return new MultiResolutionToolkitImage(baseImage, rvImage);
}
private static void checkSize(double width, double height) {
if (width <= 0 || height <= 0) {
throw new IllegalArgumentException(String.format(
--- 25,79 ----
package sun.awt.image;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.awt.image.MultiResolutionImage;
import java.util.List;
import java.util.function.Function;
+ import java.util.stream.Collectors;
import sun.awt.SoftCache;
public class MultiResolutionToolkitImage extends ToolkitImage implements MultiResolutionImage {
! final List<ResolutionVariantItem> resolutionVariants;
! public MultiResolutionToolkitImage(Image baseImage,
! List<ResolutionVariantItem> resolutionVariants) {
! super(baseImage.getSource());
! this.resolutionVariants = resolutionVariants;
}
@Override
public Image getResolutionVariant(double destWidth, double destHeight) {
+ return getResolutionVariantItem(destWidth, destHeight).getImage();
+ }
+
+ public ResolutionVariantItem getResolutionVariantItem(
+ double destWidth, double destHeight) {
checkSize(destWidth, destHeight);
! int baseWidth = getWidth();
! int baseHeight = getHeight();
!
! for (ResolutionVariantItem rvItem : resolutionVariants) {
! double sx = rvItem.getScaleX();
! double sy = rvItem.getScaleY();
! if (destWidth <= baseWidth * sx && destHeight <= baseHeight * sy) {
! return rvItem;
! }
! }
!
! return resolutionVariants.get(resolutionVariants.size() - 1);
}
public static Image map(MultiResolutionToolkitImage mrImage,
Function<Image, Image> mapper) {
Image baseImage = mapper.apply(mrImage);
! List<ResolutionVariantItem> rvItems = mrImage.resolutionVariants.stream()
! .map(new RVItemMapper(mapper))
! .collect(Collectors.toList());
!
! return new MultiResolutionToolkitImage(baseImage, rvItems);
}
private static void checkSize(double width, double height) {
if (width <= 0 || height <= 0) {
throw new IllegalArgumentException(String.format(
*** 65,81 ****
throw new IllegalArgumentException(String.format(
"Width (%s) or height (%s) is not finite", width, height));
}
}
- public Image getResolutionVariant() {
- return resolutionVariant;
- }
-
@Override
public List<Image> getResolutionVariants() {
! return Arrays.<Image>asList(this, resolutionVariant);
}
private static final int BITS_INFO = ImageObserver.SOMEBITS
| ImageObserver.FRAMEBITS | ImageObserver.ALLBITS;
--- 84,102 ----
throw new IllegalArgumentException(String.format(
"Width (%s) or height (%s) is not finite", width, height));
}
}
@Override
public List<Image> getResolutionVariants() {
! return resolutionVariants.stream()
! .map(rvItem -> rvItem.getImage())
! .collect(Collectors.toList());
! }
!
! public List<ResolutionVariantItem> getResolutionVariantItems() {
! return resolutionVariants;
}
private static final int BITS_INFO = ImageObserver.SOMEBITS
| ImageObserver.FRAMEBITS | ImageObserver.ALLBITS;
*** 85,128 ****
static final SoftCache INSTANCE = new SoftCache();
}
public static ImageObserver getResolutionVariantObserver(
final Image image, final ImageObserver observer,
! final int imgWidth, final int imgHeight,
! final int rvWidth, final int rvHeight) {
! return getResolutionVariantObserver(image, observer,
! imgWidth, imgHeight, rvWidth, rvHeight, false);
! }
!
! public static ImageObserver getResolutionVariantObserver(
! final Image image, final ImageObserver observer,
! final int imgWidth, final int imgHeight,
! final int rvWidth, final int rvHeight, boolean concatenateInfo) {
if (observer == null) {
return null;
}
synchronized (ObserverCache.INSTANCE) {
! ImageObserver o = (ImageObserver) ObserverCache.INSTANCE.get(observer);
if (o == null) {
o = (Image resolutionVariant, int flags,
int x, int y, int width, int height) -> {
if ((flags & (ImageObserver.WIDTH | BITS_INFO)) != 0) {
! width = (width + 1) / 2;
}
if ((flags & (ImageObserver.HEIGHT | BITS_INFO)) != 0) {
! height = (height + 1) / 2;
}
if ((flags & BITS_INFO) != 0) {
! x /= 2;
! y /= 2;
}
if(concatenateInfo){
flags &= ((ToolkitImage) image).
getImageRep().check(null);
--- 106,143 ----
static final SoftCache INSTANCE = new SoftCache();
}
public static ImageObserver getResolutionVariantObserver(
final Image image, final ImageObserver observer,
! final double scaleX, final double scaleY,
! boolean concatenateInfo) {
if (observer == null) {
return null;
}
synchronized (ObserverCache.INSTANCE) {
!
! Object key = new ObserverKey(observer, scaleX, scaleY);
! ImageObserver o = (ImageObserver) ObserverCache.INSTANCE.get(key);
if (o == null) {
o = (Image resolutionVariant, int flags,
int x, int y, int width, int height) -> {
if ((flags & (ImageObserver.WIDTH | BITS_INFO)) != 0) {
! width = (int) Math.ceil(width / scaleX);
}
if ((flags & (ImageObserver.HEIGHT | BITS_INFO)) != 0) {
! height = (int) Math.ceil(height / scaleY);
}
if ((flags & BITS_INFO) != 0) {
! x = (int) Math.floor(x / scaleX);
! y = (int) Math.floor(y / scaleY);
}
if(concatenateInfo){
flags &= ((ToolkitImage) image).
getImageRep().check(null);
*** 130,140 ****
return observer.imageUpdate(
image, flags, x, y, width, height);
};
! ObserverCache.INSTANCE.put(observer, o);
}
return o;
}
}
}
--- 145,237 ----
return observer.imageUpdate(
image, flags, x, y, width, height);
};
! ObserverCache.INSTANCE.put(key, o);
}
return o;
}
}
+
+ public static class ResolutionVariantItem {
+
+ final Image image;
+ final double scaleX;
+ final double scaleY;
+
+ public ResolutionVariantItem(Image image, double scaleX, double scaleY) {
+ this.image = image;
+ this.scaleX = scaleX;
+ this.scaleY = scaleY;
+ }
+
+ public Image getImage() {
+ return image;
+ }
+
+ public double getScaleX() {
+ return scaleX;
+ }
+
+ public double getScaleY() {
+ return scaleY;
+ }
+
+ public ResolutionVariantItem map(Function<Image, Image> mapper) {
+ return new ResolutionVariantItem(mapper.apply(image), scaleX, scaleY);
+ }
+ }
+
+ static class RVItemMapper
+ implements Function<ResolutionVariantItem, ResolutionVariantItem> {
+
+ final Function<Image, Image> mapper;
+
+ public RVItemMapper(Function<Image, Image> mapper) {
+ this.mapper = mapper;
+ }
+
+ @Override
+ public ResolutionVariantItem apply(ResolutionVariantItem rvItem) {
+ return new ResolutionVariantItem(mapper.apply(rvItem.getImage()),
+ rvItem.getScaleX(), rvItem.getScaleY());
+ }
+ }
+
+ static class ObserverKey {
+
+ final ImageObserver observer;
+ final double scaleX;
+ final double scaleY;
+
+ public ObserverKey(ImageObserver observer, double scaleX, double scaleY) {
+ this.observer = observer;
+ this.scaleX = scaleX;
+ this.scaleY = scaleY;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if (!(obj instanceof ObserverKey)) {
+ return false;
+ }
+
+ ObserverKey observerKey = (ObserverKey) obj;
+ return scaleX == observerKey.scaleX
+ && scaleY == observerKey.scaleY
+ && observer.equals(observerKey.observer);
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = observer.hashCode();
+ hash = 31 * hash + Double.hashCode(scaleX);
+ hash = 31 * hash + Double.hashCode(scaleY);
+ return hash;
+ }
+ }
}
\ No newline at end of file
< prev index next >