--- old/src/macosx/classes/sun/lwawt/macosx/CImage.java 2012-03-27 20:36:27.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CImage.java 2012-03-27 20:36:26.000000000 +0400 @@ -29,10 +29,14 @@ import java.awt.geom.Dimension2D; import java.awt.image.*; +import java.util.Arrays; +import java.util.List; + import sun.awt.image.SunWritableRaster; public class CImage extends CFRetainedResource { private static native long nativeCreateNSImageFromArray(int[] buffer, int w, int h); + private static native long nativeCreateNSImageFromArrays(int[][] buffers, int w[], int h[]); private static native long nativeCreateNSImageFromFileContents(String file); private static native long nativeCreateNSImageOfFileFromLaunchServices(String file); private static native long nativeCreateNSImageFromImageName(String name); @@ -93,8 +97,7 @@ return createImageUsingNativeSize(nativeCreateNSImageFromImageName(name)); } - // This is used to create a CImage from a Image - public CImage createFromImage(final Image image) { + private static int[] imageToArray(Image image) { if (image == null) return null; MediaTracker mt = new MediaTracker(new Label()); @@ -117,8 +120,50 @@ g2.setComposite(AlphaComposite.Src); g2.drawImage(image, 0, 0, null); g2.dispose(); - int[] buffer = ((DataBufferInt)bimg.getRaster().getDataBuffer()).getData(); - return new CImage(nativeCreateNSImageFromArray(buffer, w, h)); + return ((DataBufferInt)bimg.getRaster().getDataBuffer()).getData(); + } + + // This is used to create a CImage from a Image + public CImage createFromImage(final Image image) { + int[] buffer = imageToArray(image); + if (buffer == null) { + return null; + } + return new CImage(nativeCreateNSImageFromArray(buffer, image.getWidth(null), image.getHeight(null))); + } + + public CImage createFromImages(List images) { + if (images == null || images.isEmpty()) { + return null; + } + + int num = images.size(); + + int[][] buffers = new int[num][]; + int[] w = new int[num]; + int[] h = new int[num]; + + num = 0; + + for (Image img : images) { + buffers[num] = imageToArray(img); + if (buffers[num] == null) { + // Unable to process the image + continue; + } + w[num] = img.getWidth(null); + h[num] = img.getHeight(null); + num++; + } + + if (num == 0) { + return null; + } + + return new CImage(nativeCreateNSImageFromArrays( + Arrays.copyOf(buffers, num), + Arrays.copyOf(w, num), + Arrays.copyOf(h, num))); } static int getSelectorAsInt(final String fromString) { --- old/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java 2012-03-27 20:36:28.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java 2012-03-27 20:36:27.000000000 +0400 @@ -734,11 +734,7 @@ if (icons == null || icons.size() == 0) { return null; } - - // TODO: need a walk-through to find the best image. - // The best mean with higher resolution. Otherwise an icon looks bad. - final Image image = icons.get(0); - return CImage.getCreator().createFromImage(image); + return CImage.getCreator().createFromImages(icons); } /* --- old/src/macosx/native/sun/awt/CImage.m 2012-03-27 20:36:29.000000000 +0400 +++ new/src/macosx/native/sun/awt/CImage.m 2012-03-27 20:36:29.000000000 +0400 @@ -70,19 +70,8 @@ [oldContext release]; } -/* - * Class: sun_lwawt_macosx_CImage - * Method: nativeCreateNSImageFromArray - * Signature: ([III)J - */ -JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CImage_nativeCreateNSImageFromArray -(JNIEnv *env, jclass klass, jintArray buffer, jint width, jint height) +static NSBitmapImageRep* CImage_CreateImageRep(JNIEnv *env, jintArray buffer, jint width, jint height) { - jlong result = 0L; - -JNF_COCOA_ENTER(env); -AWT_ASSERT_ANY_THREAD; - NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:width pixelsHigh:height @@ -105,15 +94,83 @@ (*env)->ReleasePrimitiveArrayCritical(env, buffer, src, JNI_ABORT); - NSImage *nsImage = [[NSImage alloc] initWithSize:NSMakeSize(width, height)]; - [nsImage addRepresentation:imageRep]; - [imageRep release]; + return imageRep; +} + +/* + * Class: sun_lwawt_macosx_CImage + * Method: nativeCreateNSImageFromArray + * Signature: ([III)J + */ +JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CImage_nativeCreateNSImageFromArray +(JNIEnv *env, jclass klass, jintArray buffer, jint width, jint height) +{ + jlong result = 0L; - if (nsImage != nil) { - CFRetain(nsImage); // GC +JNF_COCOA_ENTER(env); +AWT_ASSERT_ANY_THREAD; + + NSBitmapImageRep* imageRep = CImage_CreateImageRep(env, buffer, width, height); + if (imageRep) { + NSImage *nsImage = [[NSImage alloc] initWithSize:NSMakeSize(width, height)]; + [nsImage addRepresentation:imageRep]; + [imageRep release]; + + if (nsImage != nil) { + CFRetain(nsImage); // GC + } + + result = ptr_to_jlong(nsImage); } - result = ptr_to_jlong(nsImage); +JNF_COCOA_EXIT(env); + + return result; +} + +/* + * Class: sun_lwawt_macosx_CImage + * Method: nativeCreateNSImageFromArrays + * Signature: ([[I[I[I)J + */ +JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CImage_nativeCreateNSImageFromArrays +(JNIEnv *env, jclass klass, jobjectArray buffers, jintArray widths, jintArray heights) +{ + jlong result = 0L; + +JNF_COCOA_ENTER(env); +AWT_ASSERT_ANY_THREAD; + + jsize num = (*env)->GetArrayLength(env, buffers); + NSMutableArray * reps = [NSMutableArray arrayWithCapacity: num]; + + jint * ws = (*env)->GetIntArrayElements(env, widths, NULL); + jint * hs = (*env)->GetIntArrayElements(env, heights, NULL); + + jsize i; + for (i = 0; i < num; i++) { + jintArray buffer = (*env)->GetObjectArrayElement(env, buffers, i); + + NSBitmapImageRep* imageRep = CImage_CreateImageRep(env, buffer, ws[i], hs[i]); + if (imageRep) { + [reps addObject: imageRep]; + } + } + + (*env)->ReleaseIntArrayElements(env, heights, hs, JNI_ABORT); + (*env)->ReleaseIntArrayElements(env, widths, ws, JNI_ABORT); + + if ([reps count]) { + NSImage *nsImage = [[NSImage alloc] initWithSize:NSMakeSize(0, 0)]; + [nsImage addRepresentations: reps]; + [reps release]; + + if (nsImage != nil) { + CFRetain(nsImage); // GC + } + + result = ptr_to_jlong(nsImage); + } JNF_COCOA_EXIT(env);