src/macosx/classes/sun/lwawt/macosx/CImage.java
Print this page
@@ -30,24 +30,26 @@
import java.awt.image.*;
import java.util.Arrays;
import java.util.List;
import sun.awt.image.MultiResolutionImage;
+import sun.awt.image.MultiResolutionBufferedImage;
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);
private static native long nativeCreateNSImageFromIconSelector(int selector);
- private static native void nativeCopyNSImageIntoArray(long image, int[] buffer, int w, int h);
+ private static native void nativeCopyNSImageIntoArray(long image, int[] buffer, int sw, int sh, int dw, int dh);
private static native Dimension2D nativeGetNSImageSize(long image);
private static native void nativeSetNSImageSize(long image, double w, double h);
private static native void nativeResizeNSImageRepresentations(long image, double w, double h);
+ private static native Dimension2D[] nativeGetNSImageRepresentationSizes(long image, double w, double h);
static Creator creator = new Creator();
static Creator getCreator() {
return creator;
}
@@ -208,22 +210,47 @@
CImage(long nsImagePtr) {
super(nsImagePtr, true);
}
- /** @return A BufferedImage created from nsImagePtr, or null. */
- public BufferedImage toImage() {
+ /** @return A MultiResolution image created from nsImagePtr, or null. */
+ private BufferedImage toImage() {
if (ptr == 0) return null;
final Dimension2D size = nativeGetNSImageSize(ptr);
final int w = (int)size.getWidth();
final int h = (int)size.getHeight();
- final BufferedImage bimg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
+ Dimension2D[] sizes
+ = nativeGetNSImageRepresentationSizes(ptr,
+ size.getWidth(), size.getHeight());
+
+ if (sizes == null || sizes.length < 2) {
+ return toImage(w, h, w, h);
+ }
+
+ BufferedImage[] images = new BufferedImage[sizes.length];
+ int currentImageIndex = 0;
+
+ for (int i = 0; i < sizes.length; i++) {
+ int imageRepWidth = (int) sizes[i].getWidth();
+ int imageRepHeight = (int) sizes[i].getHeight();
+
+ if(imageRepHeight <= w && imageRepHeight <= h){
+ currentImageIndex = i;
+ }
+ images[i] = toImage(w, h, imageRepWidth, imageRepHeight);
+ }
+ return new MultiResolutionBufferedImage(BufferedImage.TYPE_INT_ARGB_PRE,
+ currentImageIndex, images);
+ }
+
+ private BufferedImage toImage(int srcWidth, int srcHeight, int dstWidth, int dstHeight) {
+ final BufferedImage bimg = new BufferedImage(dstWidth, dstHeight, BufferedImage.TYPE_INT_ARGB_PRE);
final DataBufferInt dbi = (DataBufferInt)bimg.getRaster().getDataBuffer();
final int[] buffer = SunWritableRaster.stealData(dbi, 0);
- nativeCopyNSImageIntoArray(ptr, buffer, w, h);
+ nativeCopyNSImageIntoArray(ptr, buffer, srcWidth, srcHeight, dstWidth, dstHeight);
SunWritableRaster.markDirty(dbi);
return bimg;
}
/** If nsImagePtr != 0 then scale this NSImage. @return *this* */