7146550: [macosx] DnD test failure in createCompatibleWritableRaster()
authorbae
Fri, 25 May 2012 12:56:22 +0400
changeset 12808 20329ff2140c
parent 12637 983d636eed7c
child 12809 a6fda26b8430
7146550: [macosx] DnD test failure in createCompatibleWritableRaster() Reviewed-by: kizune, serb
jdk/src/macosx/classes/sun/lwawt/macosx/CDragSourceContextPeer.java
jdk/src/macosx/classes/sun/lwawt/macosx/CImage.java
jdk/src/macosx/native/sun/awt/CDragSource.h
jdk/src/macosx/native/sun/awt/CDragSource.m
jdk/src/macosx/native/sun/awt/CDragSourceContextPeer.m
jdk/test/java/awt/dnd/ImageDecoratedDnDNegative/ImageDecoratedDnDNegative.java
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CDragSourceContextPeer.java	Mon May 21 14:53:51 2012 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CDragSourceContextPeer.java	Fri May 25 12:56:22 2012 +0400
@@ -132,44 +132,31 @@
             this.setDefaultDragImage(component);
 
         // Get drag image (if any) as BufferedImage and convert that to CImage:
-        long  dragImage;
         Point dragImageOffset;
 
         if (fDragImage != null) {
-            BufferedImage bi = (fDragImage instanceof BufferedImage ? (BufferedImage) fDragImage : null);
-
-            if (bi == null) {
-                // Create a new buffered image:
-                int width  = fDragImage.getWidth(null);
-                int height = fDragImage.getHeight(null);
-                bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE);
+            try {
+                fDragCImage = CImage.getCreator().createFromImageImmediately(fDragImage);
+            } catch(Exception e) {
+                // image creation may fail for any reason
+                throw new InvalidDnDOperationException("Drag image can not be created.");
+            }
+            if (fDragCImage == null) {
+                throw new InvalidDnDOperationException("Drag image is not ready.");
+            }
 
-                // Draw drag image into the buffered image:
-                Graphics g = bi.getGraphics();
-                g.drawImage(fDragImage, 0, 0, null);
-                g.dispose();
-            }
-            /*   TODO:BG
-            fDragCImage = CImage.getCreator().createImage(bi);
-            dragImage = fDragCImage.getNSImage(); */
-            fDragCImage = null;
-            dragImage = 0L;
             dragImageOffset = fDragImageOffset;
         } else {
 
             fDragCImage = null;
-            dragImage = 0L;
             dragImageOffset = new Point(0, 0);
         }
 
-        // Get NS drag image instance if we have a drag image:
-        long nsDragImage = 0L; //TODO:BG (fDragCImage != null ? fDragCImage.getNSImage() : 0L);
-
         try {
             // Create native dragging source:
             final long nativeDragSource = createNativeDragSource(component, peer, nativeWindowPtr, transferable, triggerEvent,
                 (int) (dragOrigin.getX() + componentOffset.x), (int) (dragOrigin.getY() + componentOffset.y), extModifiers,
-                clickCount, timestamp, cursor, dragImage, dragImageOffset.x, dragImageOffset.y,
+                clickCount, timestamp, cursor, fDragCImage, dragImageOffset.x, dragImageOffset.y,
                 getDragSourceContext().getSourceActions(), formats, formatMap);
 
             if (nativeDragSource == 0)
@@ -495,7 +482,7 @@
     // Native support:
     private native long createNativeDragSource(Component component, ComponentPeer peer, long nativePeer, Transferable transferable,
         InputEvent triggerEvent, int dragPosX, int dragPosY, int extModifiers, int clickCount, long timestamp,
-        Cursor cursor, long nsDragImage, int dragImageOffsetX, int dragImageOffsetY,
+        Cursor cursor, CImage nsDragImage, int dragImageOffsetX, int dragImageOffsetY,
         int sourceActions, long[] formats, Map formatMap);
 
     private native void doDragging(long nativeDragSource);
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CImage.java	Mon May 21 14:53:51 2012 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CImage.java	Fri May 25 12:56:22 2012 +0400
@@ -97,35 +97,55 @@
             return createImageUsingNativeSize(nativeCreateNSImageFromImageName(name));
         }
 
-        private static int[] imageToArray(Image image) {
+        private static int[] imageToArray(Image image, boolean prepareImage) {
             if (image == null) return null;
 
-            MediaTracker mt = new MediaTracker(new Label());
-            final int id = 0;
-            mt.addImage(image, id);
+            if (prepareImage && !(image instanceof BufferedImage)) {
+                final MediaTracker mt = new MediaTracker(new Label());
+                final int id = 0;
+                mt.addImage(image, id);
 
-            try {
-                mt.waitForID(id);
-            } catch (InterruptedException e) {
-            }
+                try {
+                    mt.waitForID(id);
+                } catch (InterruptedException e) {
+                    return null;
+                }
 
-            if (mt.isErrorID(id)) {
-                return null;
+                if (mt.isErrorID(id)) {
+                    return null;
+                }
             }
 
             int w = image.getWidth(null);
             int h = image.getHeight(null);
+
+            if (w < 0 || h < 0) {
+                return null;
+            }
+
             BufferedImage bimg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
             Graphics2D g2 = bimg.createGraphics();
             g2.setComposite(AlphaComposite.Src);
             g2.drawImage(image, 0, 0, null);
             g2.dispose();
+
             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)));
+        }
+
         // This is used to create a CImage from a Image
         public CImage createFromImage(final Image image) {
-            int[] buffer = imageToArray(image);
+            int[] buffer = imageToArray(image, true);
             if (buffer == null) {
                 return null;
             }
@@ -146,7 +166,7 @@
             num = 0;
 
             for (Image img : images) {
-                buffers[num] = imageToArray(img);
+                buffers[num] = imageToArray(img, true);
                 if (buffers[num] == null) {
                     // Unable to process the image
                     continue;
--- a/jdk/src/macosx/native/sun/awt/CDragSource.h	Mon May 21 14:53:51 2012 +0400
+++ b/jdk/src/macosx/native/sun/awt/CDragSource.h	Fri May 25 12:56:22 2012 +0400
@@ -63,7 +63,7 @@
     transferable:(jobject)jtransferable triggerEvent:(jobject)jtrigger
     dragPosX:(jint)dragPosX dragPosY:(jint)dragPosY modifiers:(jint)extModifiers clickCount:(jint)clickCount timeStamp:(jlong)timeStamp
     cursor:(jobject)jcursor
-    dragImage:(jlong)jnsdragimage dragImageOffsetX:(jint)jdragimageoffsetx dragImageOffsetY:(jint)jdragimageoffsety
+    dragImage:(jobject)jnsdragimage dragImageOffsetX:(jint)jdragimageoffsetx dragImageOffsetY:(jint)jdragimageoffsety
     sourceActions:(jint)jsourceactions formats:(jlongArray)jformats formatMap:(jobject)jformatmap;
 
 - (void)removeFromView:(JNIEnv *)env;
--- a/jdk/src/macosx/native/sun/awt/CDragSource.m	Mon May 21 14:53:51 2012 +0400
+++ b/jdk/src/macosx/native/sun/awt/CDragSource.m	Fri May 25 12:56:22 2012 +0400
@@ -70,6 +70,7 @@
 
 JNF_CLASS_CACHE(DataTransfererClass, "sun/awt/datatransfer/DataTransferer");
 JNF_CLASS_CACHE(CDragSourceContextPeerClass, "sun/lwawt/macosx/CDragSourceContextPeer");
+JNF_CLASS_CACHE(CImageClass, "sun/lwawt/macosx/CImage");
 
 static NSDragOperation    sDragOperation;
 static NSPoint            sDraggingLocation;
@@ -87,7 +88,7 @@
     transferable:(jobject)jtransferable triggerEvent:(jobject)jtrigger
     dragPosX:(jint)dragPosX dragPosY:(jint)dragPosY modifiers:(jint)extModifiers clickCount:(jint)clickCount
     timeStamp:(jlong)timeStamp cursor:(jobject)jcursor
-    dragImage:(jlong)jnsdragimage dragImageOffsetX:(jint)jdragimageoffsetx dragImageOffsetY:(jint)jdragimageoffsety
+    dragImage:(jobject)jnsdragimage dragImageOffsetX:(jint)jdragimageoffsetx dragImageOffsetY:(jint)jdragimageoffsety
     sourceActions:(jint)jsourceactions formats:(jlongArray)jformats formatMap:(jobject)jformatmap
 {
     self = [super init];
@@ -107,8 +108,14 @@
         fTriggerEvent = JNFNewGlobalRef(env, jtrigger);
         fCursor = JNFNewGlobalRef(env, jcursor);
 
-        fDragImage = (NSImage*) jlong_to_ptr(jnsdragimage); // Double-casting prevents compiler 'different size' warning.
-        [fDragImage retain];
+        if (jnsdragimage) {
+            JNF_MEMBER_CACHE(nsImagePtr, CImageClass, "ptr", "J");
+            jlong imgPtr = JNFGetLongField(env, jnsdragimage, nsImagePtr);
+            fDragImage = (NSImage*) jlong_to_ptr(imgPtr); // Double-casting prevents compiler 'd$|//
+
+            [fDragImage retain];
+        }
+
         fDragImageOffset = NSMakePoint(jdragimageoffsetx, jdragimageoffsety);
 
         fSourceActions = jsourceactions;
--- a/jdk/src/macosx/native/sun/awt/CDragSourceContextPeer.m	Mon May 21 14:53:51 2012 +0400
+++ b/jdk/src/macosx/native/sun/awt/CDragSourceContextPeer.m	Fri May 25 12:56:22 2012 +0400
@@ -39,7 +39,7 @@
 JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CDragSourceContextPeer_createNativeDragSource
   (JNIEnv *env, jobject jthis, jobject jcomponent, jobject jpeer, jlong jnativepeer, jobject jtransferable,
    jobject jtrigger, jint jdragposx, jint jdragposy, jint jextmodifiers, jint jclickcount, jlong jtimestamp,
-   jobject jcursor, jlong jnsdragimage, jint jdragimageoffsetx, jint jdragimageoffsety,
+   jobject jcursor, jobject jnsdragimage, jint jdragimageoffsetx, jint jdragimageoffsety,
    jint jsourceactions, jlongArray jformats, jobject jformatmap)
 {
     id controlObj = (id) jlong_to_ptr(jnativepeer);
--- a/jdk/test/java/awt/dnd/ImageDecoratedDnDNegative/ImageDecoratedDnDNegative.java	Mon May 21 14:53:51 2012 +0400
+++ b/jdk/test/java/awt/dnd/ImageDecoratedDnDNegative/ImageDecoratedDnDNegative.java	Fri May 25 12:56:22 2012 +0400
@@ -25,7 +25,7 @@
 
 /*
   test %W% %E%
-  @bug 4874070
+  @bug 4874070 7146550
   @summary Tests basic DnD functionality
   @author Your Name: Alexey Utkin area=dnd
   @run applet ImageDecoratedDnDNegative.html