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