1/*
2 * Copyright (c) 2010, 2016, 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.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import javax.swing.*;
25import java.awt.*;
26
27/*
28 * @test
29 * @key headful
30 * @summary Check if a per-pixel translucent window shows only the area having
31 *          opaque pixels
32 * Test Description: Check if PERPIXEL_TRANSLUCENT Translucency type is supported
33 *      on the current platform. Proceed if it is supported. Create a swing window
34 *      with some swing components in it and a transparent background (alpha 0.0).
35 *      Bring this window on top of a known background. Do this test for JFrame,
36 *      JWindow and JDialog
37 * Expected Result: Only the components present in the window must be shown. Other
38 *      areas of the window must be transparent so that the background shows
39 * @author mrkam
40 * @library ../../../../lib/testlibrary
41 * @build Common ExtendedRobot
42 * @run main PerPixelTranslucentSwing
43 */
44
45public class PerPixelTranslucentSwing extends Common {
46
47    JButton north;
48
49    public static void main(String[] ignored) throws Exception {
50        FG_COLOR = new Color(200, 0, 0, 0);
51        if (checkTranslucencyMode(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT))
52            for (Class<Window> windowClass: WINDOWS_TO_TEST)
53                new PerPixelTranslucentSwing(windowClass).doTest();
54    }
55
56    public PerPixelTranslucentSwing(Class windowClass) throws Exception {
57        super(windowClass);
58    }
59
60    @Override
61    public void createSwingComponents() {
62        Container contentPane = RootPaneContainer.class.cast(window).getContentPane();
63        BorderLayout bl = new BorderLayout(10, 5);
64        contentPane.setLayout(bl);
65
66        north = new JButton("North");
67        contentPane.add(north, BorderLayout.NORTH);
68
69        JList center = new JList(new String[] {"Center"});
70        contentPane.add(center, BorderLayout.CENTER);
71
72        JTextField south = new JTextField("South");
73        contentPane.add(south, BorderLayout.SOUTH);
74
75        window.pack();
76        window.setVisible(true);
77
78        north.requestFocus();
79    }
80
81    @Override
82    public void doTest() throws Exception {
83        robot.waitForIdle(delay);
84
85        // Check for background translucency
86        Rectangle bounds = north.getBounds();
87        Point loc = north.getLocationOnScreen();
88
89        Color color = robot.getPixelColor(loc.x + bounds.width / 2, loc.y + bounds.height + 3);
90        System.out.println(color);
91        if (FG_COLOR.getRGB() == color.getRGB())
92            throw new RuntimeException("Background is not translucent (" + color + ")");
93
94        EventQueue.invokeAndWait(this::dispose);
95    }
96}
97