/* * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* @test @bug 8142861 8143062 8147016 @summary Check if multiresolution image behaves properly on HiDPI + non-HiDPI display pair. @author a.stepanov @library /lib/testlibrary @build jdk.testlibrary.OSInfo @run applet/manual=yesno MultiDisplayTest.html */ import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import jdk.testlibrary.OSInfo; public class MultiDisplayTest extends Applet { private static final int W = 200, H = 200; private static final BaseMultiResolutionImage IMG = new BaseMultiResolutionImage(new BufferedImage[]{ generateImage(1, Color.BLACK), generateImage(2, Color.BLUE)}); private static boolean checkOS() { OSInfo.OSType os = OSInfo.getOSType(); return (os.equals(OSInfo.OSType.WINDOWS) || os.equals(OSInfo.OSType.MACOSX)); } public void init() { this.setLayout(new BorderLayout()); } public void start() { Button b = new Button("Start"); b.setEnabled(checkOS()); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ParentFrame p = new ParentFrame(); new ChildDialog(p); } }); add(b, BorderLayout.CENTER); validate(); setVisible(true); } private static BufferedImage generateImage(int scale, Color c) { BufferedImage image = new BufferedImage( scale * W, scale * H, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); g.setColor(c); g.fillRect(0, 0, scale * W, scale * H); g.setColor(Color.WHITE); Font f = g.getFont(); g.setFont(new Font(f.getName(), Font.BOLD, scale * 48)); g.drawChars((scale + "X").toCharArray(), 0, 2, scale * W / 2, scale * H / 2); return image; } private static class ParentFrame extends Frame { public ParentFrame() { EventQueue.invokeLater(this::CreateUI); } private void CreateUI() { addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { dispose(); } }); setSize(W, H); setLocation(50, 50); setTitle("parent"); setResizable(false); setVisible(true); } @Override public void paint(Graphics gr) { Graphics2D g = (Graphics2D) gr; if (g != null) { g.drawImage(IMG, 0, 0, this); } } } private static class ChildDialog extends Dialog { public ChildDialog(Frame f) { super(f); EventQueue.invokeLater(this::CreateUI); } private void CreateUI() { addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { dispose(); } }); setSize(W, H); setTitle("child"); setResizable(false); setModal(true); setVisible(true); } @Override public void paint(Graphics gr) { Graphics2D g = (Graphics2D) gr; if (g != null) { g.drawImage(IMG, 0, 0, this); } } } }