< prev index next >

src/java.desktop/share/classes/sun/awt/image/MultiResolutionToolkitImage.java

Print this page

        

*** 23,54 **** * questions. */ 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 sun.misc.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; } private static void checkSize(double width, double height) { if (width <= 0 || height <= 0) { throw new IllegalArgumentException(String.format( "Width (%s) or height (%s) cannot be <= 0", width, height)); } --- 23,85 ---- * questions. */ package sun.awt.image; import java.awt.Image; + import java.awt.image.ImageConsumer; import java.awt.image.ImageObserver; + import java.awt.image.ImageProducer; import java.awt.image.MultiResolutionImage; ! import java.awt.image.ResolutionVariantItem; import java.util.List; + import java.util.stream.Collectors; import sun.misc.SoftCache; public class MultiResolutionToolkitImage extends ToolkitImage implements MultiResolutionImage { ! List<ResolutionVariantItem<Image>> resolutionVariants; ! public MultiResolutionToolkitImage(ImageProducer mriProducer) { ! super(mriProducer); ! this.resolutionVariants = mriProducer.getResolutionVariantItems().stream() ! .map((item) -> new ResolutionVariantItem<Image>( ! new ToolkitImage(item.getValue()), ! item.getScaleX(), ! item.getScaleY())) ! .collect(Collectors.toList()); ! } ! ! public MultiResolutionToolkitImage( ! List<ResolutionVariantItem<Image>> resolutionVariants) { ! super(resolutionVariants.get(0).getValue().getSource()); ! this.resolutionVariants = resolutionVariants; } + @Override public Image getResolutionVariant(double destWidth, double destHeight) { + return getResolutionVariantItem(destWidth, destHeight).getValue(); + } + + public ResolutionVariantItem<Image> getResolutionVariantItem( + double destWidth, double destHeight) { checkSize(destWidth, destHeight); ! int baseWidth = getWidth(); ! int baseHeight = getHeight(); ! ! for (ResolutionVariantItem<Image> 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); } + private static void checkSize(double width, double height) { if (width <= 0 || height <= 0) { throw new IllegalArgumentException(String.format( "Width (%s) or height (%s) cannot be <= 0", width, height)); }
*** 57,73 **** 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; --- 88,116 ---- 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.getValue()) ! .collect(Collectors.toList()); ! } ! ! public List<ResolutionVariantItem<Image>> getResolutionVariantItems() { ! return resolutionVariants; } @Override ! public ImageProducer getSource() { ! return new MultiResolutionImageProducer(resolutionVariants.stream() ! .map(rvItem -> new ResolutionVariantItem<>( ! rvItem.getValue().getSource(), ! rvItem.getScaleX(), ! rvItem.getScaleY())) ! .collect(Collectors.toList())); } private static final int BITS_INFO = ImageObserver.SOMEBITS | ImageObserver.FRAMEBITS | ImageObserver.ALLBITS;
*** 77,120 **** 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); --- 120,157 ---- 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 ResolutionVariantItem<>(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.floor(width / scaleX); } if ((flags & (ImageObserver.HEIGHT | BITS_INFO)) != 0) { ! height = (int) Math.floor(height / scaleY); } if ((flags & BITS_INFO) != 0) { ! x = (int) Math.ceil(x / scaleX); ! y = (int) Math.ceil(y / scaleY); } if(concatenateInfo){ flags &= ((ToolkitImage) image). getImageRep().check(null);
*** 122,132 **** return observer.imageUpdate( image, flags, x, y, width, height); }; ! ObserverCache.INSTANCE.put(observer, o); } return o; } } } --- 159,221 ---- return observer.imageUpdate( image, flags, x, y, width, height); }; ! ObserverCache.INSTANCE.put(key, o); } return o; } } + + public static class MultiResolutionImageProducer implements ImageProducer { + + private final ImageProducer baseImageProducer; + private final List<ResolutionVariantItem<ImageProducer>> rvProducers; + + public MultiResolutionImageProducer( + List<ResolutionVariantItem<ImageProducer>> rvProducers) + { + this.baseImageProducer = rvProducers.get(0).getValue(); + this.rvProducers = rvProducers; + } + + @Override + public void addConsumer(ImageConsumer ic) { + getBaseImageProducer().addConsumer(ic); + } + + @Override + public boolean isConsumer(ImageConsumer ic) { + return getBaseImageProducer().isConsumer(ic); + } + + @Override + public void removeConsumer(ImageConsumer ic) { + getBaseImageProducer().removeConsumer(ic); + } + + @Override + public void startProduction(ImageConsumer ic) { + getBaseImageProducer().startProduction(ic); + } + + @Override + public void requestTopDownLeftRightResend(ImageConsumer ic) { + getBaseImageProducer().requestTopDownLeftRightResend(ic); + } + + private ImageProducer getBaseImageProducer() { + return baseImageProducer; + } + + @Override + public boolean isMultiResolutionImageProducer() { + return true; + } + + @Override + public List<ResolutionVariantItem<ImageProducer>> getResolutionVariantItems() { + return rvProducers; + } + } }
< prev index next >