< 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 >