jdk/test/java/awt/image/DrawImage/ScaledImageAlphaTest.java
author goetz
Tue, 14 Jun 2016 10:44:59 +0200
changeset 39056 d99e63b6d962
parent 36864 b05a43581a5a
permissions -rw-r--r--
8159690: [TESTBUG] Mark headful tests with @key headful. Reviewed-by: simonis, alexsch
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36864
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
     1
/*
39056
d99e63b6d962 8159690: [TESTBUG] Mark headful tests with @key headful.
goetz
parents: 36864
diff changeset
     2
 * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved.
36864
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
     4
 *
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
     7
 * published by the Free Software Foundation.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
     8
 *
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    13
 * accompanied this code).
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    14
 *
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    18
 *
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    21
 * questions.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    22
 */
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    23
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    24
/*
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    25
 * @test
39056
d99e63b6d962 8159690: [TESTBUG] Mark headful tests with @key headful.
goetz
parents: 36864
diff changeset
    26
 * @key headful
36864
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    27
 * @bug     8139183
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    28
 * @summary Test verifies whether alpha channel of a translucent
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    29
 *          image is proper or not after scaling through drawImage.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    30
 * @run     main ScaledImageAlphaTest
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    31
 */
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    32
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    33
import java.awt.AlphaComposite;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    34
import java.awt.Color;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    35
import java.awt.Graphics2D;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    36
import java.awt.GraphicsConfiguration;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    37
import java.awt.GraphicsEnvironment;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    38
import java.awt.Transparency;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    39
import java.awt.image.BufferedImage;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    40
import java.awt.image.VolatileImage;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    41
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    42
public class ScaledImageAlphaTest {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    43
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    44
    static final int translucentAlpha = 128, opaqueAlpha = 255;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    45
    static final int[] translucentVariants = new int[] {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    46
        BufferedImage.TYPE_INT_ARGB,
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    47
        BufferedImage.TYPE_INT_ARGB_PRE,
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    48
        BufferedImage.TYPE_4BYTE_ABGR,
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    49
        BufferedImage.TYPE_4BYTE_ABGR_PRE
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    50
    };
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    51
    static final int[] alphaValues = new int[] {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    52
        translucentAlpha,
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    53
        opaqueAlpha
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    54
    };
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    55
    static int width = 50, height = 50;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    56
    static int scaleX = 5, scaleY = 5, scaleWidth = 40, scaleHeight = 40;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    57
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    58
    private static void verifyAlpha(Color color, int alpha) {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    59
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    60
        /* if extracted alpha value is equal alpha that we set
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    61
         * for background color, alpha channel is not lost
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    62
         * while scaling otherwise we have lost alpha channel.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    63
         */
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    64
        int extractedAlpha = color.getAlpha();
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    65
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    66
        if (extractedAlpha != alpha) {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    67
            throw new RuntimeException("Alpha channel for background"
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    68
                    + " is lost while scaling");
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    69
        }
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    70
    }
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    71
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    72
    private static void validateBufferedImageAlpha() {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    73
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    74
        Color backgroundColor, extractedColor;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    75
        // verify for all translucent buffered image types
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    76
        for (int type : translucentVariants) {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    77
            // verify for both opaque and translucent background color
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    78
            for (int alpha : alphaValues) {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    79
                // create BufferedImage of dimension (50,50)
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    80
                BufferedImage img = new
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    81
                    BufferedImage(width, height, type);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    82
                Graphics2D imgGraphics = (Graphics2D)img.getGraphics();
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    83
                /* scale image to smaller dimension and set any
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    84
                 * background color with alpha.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    85
                 */
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    86
                backgroundColor = new Color(0, 255, 0, alpha);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    87
                imgGraphics.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    88
                    drawImage(img, scaleX, scaleY, scaleWidth, scaleHeight,
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    89
                              backgroundColor, null);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    90
                imgGraphics.dispose();
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    91
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    92
                /* get pixel information for background color with
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    93
                 * scaled coordinates.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    94
                 */
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    95
                extractedColor = new Color(img.getRGB(scaleX, scaleY), true);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    96
                verifyAlpha(extractedColor, alpha);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    97
            }
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    98
        }
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
    99
    }
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   100
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   101
    private static void validateVolatileImageAlpha() {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   102
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   103
        Color backgroundColor, extractedColor;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   104
        VolatileImage img;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   105
        BufferedImage bufImg = new
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   106
                    BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   107
        for (int alpha : alphaValues) {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   108
            backgroundColor = new Color(0, 255, 0, alpha);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   109
            do {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   110
                img = createVolatileImage(width, height,
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   111
                                          Transparency.TRANSLUCENT);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   112
                Graphics2D imgGraphics = (Graphics2D)img.getGraphics();
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   113
                // clear VolatileImage as by default it has white opaque image
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   114
                imgGraphics.setComposite(AlphaComposite.Clear);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   115
                imgGraphics.fillRect(0,0, width, height);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   116
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   117
                imgGraphics.setComposite(AlphaComposite.SrcOver);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   118
                /* scale image to smaller dimension and set background color
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   119
                 * to green with translucent alpha.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   120
                 */
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   121
                imgGraphics.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   122
                    drawImage(img, scaleX, scaleY, scaleWidth, scaleHeight,
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   123
                              backgroundColor, null);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   124
                //get BufferedImage out of VolatileImage
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   125
                bufImg = img.getSnapshot();
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   126
                imgGraphics.dispose();
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   127
            } while (img.contentsLost());
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   128
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   129
            /* get pixel information for background color with
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   130
             * scaled coordinates.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   131
             */
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   132
            extractedColor = new Color(bufImg.getRGB(scaleX, scaleY), true);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   133
            verifyAlpha(extractedColor, alpha);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   134
        }
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   135
    }
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   136
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   137
    private static VolatileImage createVolatileImage(int width, int height,
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   138
                                                     int transparency) {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   139
        GraphicsEnvironment ge = GraphicsEnvironment.
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   140
                                 getLocalGraphicsEnvironment();
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   141
        GraphicsConfiguration gc = ge.getDefaultScreenDevice().
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   142
                                   getDefaultConfiguration();
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   143
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   144
        VolatileImage image = gc.createCompatibleVolatileImage(width, height,
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   145
                                                               transparency);
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   146
        return image;
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   147
    }
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   148
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   149
    public static void main(String[] args) {
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   150
        // test alpha channel with different types of BufferedImage
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   151
        validateBufferedImageAlpha();
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   152
        // test alpha channel with VolatileImage
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   153
        validateVolatileImageAlpha();
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   154
    }
b05a43581a5a 8139183: drawImage misses background's alpha channel
jdv
parents:
diff changeset
   155
}