src/java.desktop/share/classes/java/awt/image/BaseMultiResolutionImage.java
author tvaleev
Thu, 04 Oct 2018 12:40:55 -0700
changeset 52248 2e330da7cbf4
parent 47216 71c04702a3d5
permissions -rw-r--r--
8211300: Convert C-style array declarations in JDK client code Reviewed-by: prr, serb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32682
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
     1
/*
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
     2
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
     4
 *
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    10
 *
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    15
 * accompanied this code).
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    16
 *
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    20
 *
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    23
 * questions.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    24
 */
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    25
package java.awt.image;
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    26
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    27
import java.awt.Image;
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    28
import java.util.List;
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    29
import java.util.Arrays;
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    30
import java.util.Collections;
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    31
import java.util.Objects;
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    32
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    33
/**
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    34
 * This class is an array-based implementation of
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    35
 * the {@code AbstractMultiResolutionImage} class.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    36
 *
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    37
 * This class will implement the
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    38
 * {@code getResolutionVariant(double destImageWidth, double destImageHeight)}
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    39
 * method using a simple algorithm which will return the first image variant
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    40
 * in the array that is large enough to satisfy the rendering request. The
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    41
 * last image in the array will be returned if no suitable image is found
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    42
 * that is as large as the rendering request.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    43
 * <p>
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    44
 * For best effect the array of images should be sorted with each image being
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    45
 * both wider and taller than the previous image.  The base image need not be
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    46
 * the first image in the array. No exception will be thrown if the images
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    47
 * are not sorted as suggested.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    48
 *
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    49
 * @see java.awt.Image
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    50
 * @see java.awt.image.MultiResolutionImage
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    51
 * @see java.awt.image.AbstractMultiResolutionImage
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    52
 *
35302
e4d2275861c3 8136494: Update "@since 1.9" to "@since 9" to match java.version.specification
iris
parents: 32682
diff changeset
    53
 * @since 9
32682
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    54
 */
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    55
public class BaseMultiResolutionImage extends AbstractMultiResolutionImage {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    56
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    57
    private final int baseImageIndex;
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    58
    private final Image[] resolutionVariants;
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    59
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    60
    /**
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    61
     * Creates a multi-resolution image with the given resolution variants.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    62
     * The first resolution variant is used as the base image.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    63
     *
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    64
     * @param resolutionVariants array of resolution variants sorted by image size
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    65
     * @throws IllegalArgumentException if null or zero-length array is passed
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    66
     * @throws NullPointerException if the specified {@code resolutionVariants}
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    67
     *          contains one or more null elements
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    68
     *
35302
e4d2275861c3 8136494: Update "@since 1.9" to "@since 9" to match java.version.specification
iris
parents: 32682
diff changeset
    69
     * @since 9
32682
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    70
     */
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    71
    public BaseMultiResolutionImage(Image... resolutionVariants) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    72
        this(0, resolutionVariants);
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    73
    }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    74
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    75
    /**
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    76
     * Creates a multi-resolution image with the given base image index and
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    77
     * resolution variants.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    78
     *
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    79
     * @param baseImageIndex the index of base image in the resolution variants
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    80
     *        array
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    81
     * @param resolutionVariants array of resolution variants sorted by image size
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    82
     * @throws IllegalArgumentException if null or zero-length array is passed
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    83
     * @throws NullPointerException if the specified {@code resolutionVariants}
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    84
     *          contains one or more null elements
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    85
     * @throws IndexOutOfBoundsException if {@code baseImageIndex} is
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    86
     *          negative or greater than or equal to {@code resolutionVariants}
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    87
     *          length.
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    88
     *
35302
e4d2275861c3 8136494: Update "@since 1.9" to "@since 9" to match java.version.specification
iris
parents: 32682
diff changeset
    89
     * @since 9
32682
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    90
     */
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    91
    public BaseMultiResolutionImage(int baseImageIndex,
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    92
                                    Image... resolutionVariants) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    93
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    94
        if (resolutionVariants == null || resolutionVariants.length == 0) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    95
            throw new IllegalArgumentException(
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    96
                    "Null or zero-length array is passed");
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    97
        }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    98
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
    99
        if (baseImageIndex < 0 || baseImageIndex >= resolutionVariants.length) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   100
            throw new IndexOutOfBoundsException("Invalid base image index: "
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   101
                    + baseImageIndex);
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   102
        }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   103
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   104
        this.baseImageIndex = baseImageIndex;
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   105
        this.resolutionVariants = Arrays.copyOf(resolutionVariants,
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   106
                                                resolutionVariants.length);
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   107
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   108
        for (Image resolutionVariant : this.resolutionVariants) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   109
            Objects.requireNonNull(resolutionVariant,
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   110
                                   "Resolution variant can't be null");
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   111
        }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   112
    }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   113
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   114
    @Override
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   115
    public Image getResolutionVariant(double destImageWidth,
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   116
                                      double destImageHeight) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   117
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   118
        checkSize(destImageWidth, destImageHeight);
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   119
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   120
        for (Image rvImage : resolutionVariants) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   121
            if (destImageWidth <= rvImage.getWidth(null)
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   122
                    && destImageHeight <= rvImage.getHeight(null)) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   123
                return rvImage;
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   124
            }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   125
        }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   126
        return resolutionVariants[resolutionVariants.length - 1];
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   127
    }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   128
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   129
    private static void checkSize(double width, double height) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   130
        if (width <= 0 || height <= 0) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   131
            throw new IllegalArgumentException(String.format(
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   132
                    "Width (%s) or height (%s) cannot be <= 0", width, height));
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   133
        }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   134
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   135
        if (!Double.isFinite(width) || !Double.isFinite(height)) {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   136
            throw new IllegalArgumentException(String.format(
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   137
                    "Width (%s) or height (%s) is not finite", width, height));
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   138
        }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   139
    }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   140
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   141
    @Override
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   142
    public List<Image> getResolutionVariants() {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   143
        return Collections.unmodifiableList(Arrays.asList(resolutionVariants));
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   144
    }
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   145
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   146
    @Override
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   147
    protected Image getBaseImage() {
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   148
        return resolutionVariants[baseImageIndex];
6f1200d8999d 8029339: Custom MultiResolution image support on HiDPI displays
alexsch
parents:
diff changeset
   149
    }
35667
ed476aba94de 8138838: docs cleanup for java.desktop
avstepan
parents: 32682
diff changeset
   150
}