1 /* 2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package sun.awt.image; 26 27 import java.awt.Image; 28 import java.awt.image.ImageObserver; 29 import java.awt.image.MultiResolutionImage; 30 import java.util.Arrays; 31 import java.util.List; 32 import sun.misc.SoftCache; 33 34 public class MultiResolutionToolkitImage extends ToolkitImage implements MultiResolutionImage { 35 36 Image resolutionVariant; 37 38 public MultiResolutionToolkitImage(Image lowResolutionImage, Image resolutionVariant) { 39 super(lowResolutionImage.getSource()); 40 this.resolutionVariant = resolutionVariant; 41 } 42 43 @Override 44 public Image getResolutionVariant(double destWidth, double destHeight) { 45 checkSize(destWidth, destHeight); 46 return ((destWidth <= getWidth() && destHeight <= getHeight())) 47 ? this : resolutionVariant; 48 } 49 50 private static void checkSize(double width, double height) { 51 if (width <= 0 || height <= 0) { 52 throw new IllegalArgumentException(String.format( 53 "Width (%s) or height (%s) cannot be <= 0", width, height)); 54 } 55 56 if (!Double.isFinite(width) || !Double.isFinite(height)) { 57 throw new IllegalArgumentException(String.format( 58 "Width (%s) or height (%s) is not finite", width, height)); 59 } 60 } 61 62 public Image getResolutionVariant() { 63 return resolutionVariant; 64 } 65 66 @Override 67 public List<Image> getResolutionVariants() { 68 return Arrays.<Image>asList(this, resolutionVariant); 69 } 70 71 private static final int BITS_INFO = ImageObserver.SOMEBITS 72 | ImageObserver.FRAMEBITS | ImageObserver.ALLBITS; 73 74 private static class ObserverCache { 75 76 @SuppressWarnings("deprecation") 77 static final SoftCache INSTANCE = new SoftCache(); 78 } 79 80 public static ImageObserver getResolutionVariantObserver( 81 final Image image, final ImageObserver observer, 82 final int imgWidth, final int imgHeight, 83 final int rvWidth, final int rvHeight) { 84 return getResolutionVariantObserver(image, observer, 85 imgWidth, imgHeight, rvWidth, rvHeight, false); 86 } 87 88 public static ImageObserver getResolutionVariantObserver( 89 final Image image, final ImageObserver observer, 90 final int imgWidth, final int imgHeight, 91 final int rvWidth, final int rvHeight, boolean concatenateInfo) { 92 93 if (observer == null) { 94 return null; 95 } 96 97 synchronized (ObserverCache.INSTANCE) { 98 ImageObserver o = (ImageObserver) ObserverCache.INSTANCE.get(observer); 99 100 if (o == null) { 101 102 o = (Image resolutionVariant, int flags, 103 int x, int y, int width, int height) -> { 104 105 if ((flags & (ImageObserver.WIDTH | BITS_INFO)) != 0) { 106 width = (width + 1) / 2; 107 } 108 109 if ((flags & (ImageObserver.HEIGHT | BITS_INFO)) != 0) { 110 height = (height + 1) / 2; 111 } 112 113 if ((flags & BITS_INFO) != 0) { 114 x /= 2; 115 y /= 2; 116 } 117 118 if(concatenateInfo){ 119 flags &= ((ToolkitImage) image). 120 getImageRep().check(null); 121 } 122 123 return observer.imageUpdate( 124 image, flags, x, y, width, height); 125 }; 126 127 ObserverCache.INSTANCE.put(observer, o); 128 } 129 return o; 130 } 131 } 132 }