--- old/src/java.desktop/macosx/classes/sun/lwawt/macosx/CImage.java 2015-04-01 18:09:12.000000000 +0400 +++ new/src/java.desktop/macosx/classes/sun/lwawt/macosx/CImage.java 2015-04-01 18:09:12.000000000 +0400 @@ -138,17 +138,6 @@ return ((DataBufferInt)bimg.getRaster().getDataBuffer()).getData(); } - public CImage createFromImageImmediately(final Image image) { - int[] buffer = imageToArray(image, false); - - if (buffer == null) { - return null; - } - - return new CImage(nativeCreateNSImageFromArray(buffer, image.getWidth(null), - image.getHeight(null))); - } - public byte[] getPlatformImageBytes(final Image image) { int[] buffer = imageToArray(image, false); @@ -168,20 +157,33 @@ // This is used to create a CImage from a Image public CImage createFromImage(final Image image) { + return createFromImage(image, true); + } + + public CImage createFromImageImmediately(final Image image) { + return createFromImage(image, false); + } + + // This is used to create a CImage from a Image + private CImage createFromImage(final Image image, final boolean prepareImage) { if (image instanceof MultiResolutionImage) { List resolutionVariants = ((MultiResolutionImage) image).getResolutionVariants(); - return createFromImages(resolutionVariants); + return createFromImages(resolutionVariants, prepareImage); } - int[] buffer = imageToArray(image, true); + int[] buffer = imageToArray(image, prepareImage); if (buffer == null) { return null; } return new CImage(nativeCreateNSImageFromArray(buffer, image.getWidth(null), image.getHeight(null))); } - public CImage createFromImages(List images) { + public CImage createFromImages(final List images) { + return createFromImages(images, true); + } + + private CImage createFromImages(final List images, final boolean prepareImage) { if (images == null || images.isEmpty()) { return null; } @@ -194,8 +196,8 @@ num = 0; - for (Image img : images) { - buffers[num] = imageToArray(img, true); + for (final Image img : images) { + buffers[num] = imageToArray(img, prepareImage); if (buffers[num] == null) { // Unable to process the image continue; @@ -210,9 +212,9 @@ } return new CImage(nativeCreateNSImageFromArrays( - Arrays.copyOf(buffers, num), - Arrays.copyOf(w, num), - Arrays.copyOf(h, num))); + Arrays.copyOf(buffers, num), + Arrays.copyOf(w, num), + Arrays.copyOf(h, num))); } static int getSelectorAsInt(final String fromString) { --- /dev/null 2015-04-01 18:09:12.000000000 +0400 +++ new/test/java/awt/datatransfer/DragImage/MultiResolutionDragImageTest.java 2015-04-01 18:09:12.000000000 +0400 @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2015, 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. + */ + +import sun.awt.image.MultiResolutionToolkitImage; +import sun.java2d.SunGraphics2D; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; + +import static java.awt.event.InputEvent.BUTTON1_DOWN_MASK; + +/** + * @test + * @bug 8076106 + * @author Hendrik Schreiber + * @summary [macosx] Drag image of TransferHandler does not honor + * MultiResolutionImage + * @run main MultiResolutionDragImageTest TEST_DRAG + */ +public class MultiResolutionDragImageTest { + + private static final Color COLOR_1X = Color.BLUE; + private static final Color COLOR_2X = Color.RED; + private static JFrame frame; + private static JTextField field; + private static Point p; + + public static void main(String[] args) throws Exception { + + final String test = args[0]; + + switch (test) { + case "TEST_DRAG": + testDrag(); + break; + default: + throw new RuntimeException("Unknown test: " + test); + } + } + + private static void testDrag() throws Exception { + + + SwingUtilities.invokeAndWait(() -> { + + frame = new JFrame(); + field = new JTextField("Drag Me"); + setupFrame(frame, field); + frame.setVisible(true); + }); + + final Robot robot = new Robot(); + robot.setAutoDelay(500); + robot.setAutoWaitForIdle(true); + robot.waitForIdle(); + + // get mouse into position + SwingUtilities.invokeAndWait(() -> { + + p = new Point(field.getWidth() / 2, field.getHeight() / 2); + SwingUtilities.convertPointToScreen(p, field); + }); + + robot.mouseMove(p.x, p.y); + // simulate dragging + robot.mousePress(BUTTON1_DOWN_MASK); + p.translate(10, 10); + robot.mouseMove(p.x, p.y); + + p.translate(5, 5); + final Color color = robot.getPixelColor(p.x, p.y); + robot.mouseRelease(BUTTON1_DOWN_MASK); + + SwingUtilities.invokeAndWait(frame::dispose); + + final float scaleFactor = getScaleFactor(); + final Color testColor = (1 < scaleFactor) ? COLOR_2X : COLOR_1X; + + if (!similar(testColor, color)) { + throw new RuntimeException( + "TEST FAILED: Image with wrong resolution is used for drag image!"); + } + System.out.println("TEST PASSED!"); + } + + private static void setupFrame(final JFrame frame, final JTextField field) { + + frame.setBounds(0, 0, 50, 50); + frame.setLayout(new BorderLayout()); + field.setDragEnabled(true); + final TransferHandler transferHandler = field.getTransferHandler(); + transferHandler.setDragImage(createMultiResolutionImage()); + frame.getContentPane().add(field, BorderLayout.CENTER); + } + + private static boolean similar(Color c1, Color c2){ + return similar(c1.getRed(), c2.getRed()) + && similar(c1.getGreen(), c2.getGreen()) + && similar(c1.getBlue(), c2.getBlue()); + } + + private static boolean similar(int n, int m){ + return Math.abs(n - m) <= 50; + } + + private static float getScaleFactor() { + + final Dialog dialog = new Dialog((Window) null); + dialog.setSize(100, 100); + dialog.setModal(true); + final float[] scaleFactors = new float[1]; + Panel panel = new Panel() { + + @Override + public void paint(Graphics g) { + float scaleFactor = 1; + if (g instanceof SunGraphics2D) { + scaleFactor = ((SunGraphics2D) g).surfaceData.getDefaultScale(); + } + scaleFactors[0] = scaleFactor; + dialog.setVisible(false); + } + }; + + dialog.add(panel); + dialog.setVisible(true); + dialog.dispose(); + + return scaleFactors[0]; + } + + private static Image createMultiResolutionImage() { + + return new MultiResolutionToolkitImage( + createImage(50, COLOR_1X), + createImage(100, COLOR_2X) + ); + + } + + private static Image createImage(final int length, final Color color) { + + final BufferedImage image = new BufferedImage(length, length, + BufferedImage.TYPE_INT_ARGB_PRE); + final Graphics graphics = image.getGraphics(); + graphics.setColor(color); + graphics.fillRect(0, 0, length, length); + graphics.dispose(); + return image; + } +} \ No newline at end of file