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.util.Arrays; 30 import java.util.List; 31 import sun.misc.SoftCache; 32 33 public class MultiResolutionToolkitImage extends ToolkitImage implements MultiResolutionImage { 34 35 Image resolutionVariant; 36 37 public MultiResolutionToolkitImage(Image lowResolutionImage, Image resolutionVariant) { 38 super(lowResolutionImage.getSource()); 39 this.resolutionVariant = resolutionVariant; 40 } 41 42 @Override 43 public Image getResolutionVariant(int width, int height) { 44 return ((width <= getWidth() && height <= getHeight())) 45 ? this : resolutionVariant; 46 } 47 48 public Image getResolutionVariant() { 49 return resolutionVariant; 50 } 51 52 @Override 53 public List<Image> getResolutionVariants() { 54 return Arrays.<Image>asList(this, resolutionVariant); 55 } 56 57 private static final int BITS_INFO = ImageObserver.SOMEBITS 58 | ImageObserver.FRAMEBITS | ImageObserver.ALLBITS; 59 60 private static class ObserverCache { 61 62 @SuppressWarnings("deprecation") 63 static final SoftCache INSTANCE = new SoftCache(); 64 } 65 66 public static ImageObserver getResolutionVariantObserver( 67 final Image image, final ImageObserver observer, 68 final int imgWidth, final int imgHeight, 69 final int rvWidth, final int rvHeight) { 70 return getResolutionVariantObserver(image, observer, 71 imgWidth, imgHeight, rvWidth, rvHeight, false); 72 } 73 74 public static ImageObserver getResolutionVariantObserver( 75 final Image image, final ImageObserver observer, 76 final int imgWidth, final int imgHeight, 77 final int rvWidth, final int rvHeight, boolean concatenateInfo) { 78 79 if (observer == null) { 80 return null; 81 } 82 83 synchronized (ObserverCache.INSTANCE) { 84 ImageObserver o = (ImageObserver) ObserverCache.INSTANCE.get(image); 85 86 if (o == null) { 87 88 o = (Image resolutionVariant, int flags, 89 int x, int y, int width, int height) -> { 90 91 if ((flags & (ImageObserver.WIDTH | BITS_INFO)) != 0) { 92 width = (width + 1) / 2; 93 } 94 95 if ((flags & (ImageObserver.HEIGHT | BITS_INFO)) != 0) { 96 height = (height + 1) / 2; 97 } 98 99 if ((flags & BITS_INFO) != 0) { 100 x /= 2; 101 y /= 2; 102 } 103 104 if(concatenateInfo){ 105 flags &= ((ToolkitImage) image). 106 getImageRep().check(null); 107 } 108 109 return observer.imageUpdate( 110 image, flags, x, y, width, height); 111 }; 112 113 ObserverCache.INSTANCE.put(image, o); 114 } 115 return o; 116 } 117 } 118 }