Index: modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java =================================================================== --- modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java (revision 582226) +++ modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java (working copy) @@ -158,4 +158,12 @@ } super.flush(); } + + long getHWND(){ + return hwnd; + } + + WinGraphicsConfiguration getGraphicsConfiguration(){ + return gc; + } } Index: modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGraphicsConfiguration.java =================================================================== --- modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGraphicsConfiguration.java (revision 582226) +++ modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGraphicsConfiguration.java (working copy) @@ -23,6 +23,7 @@ import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.Rectangle; +import java.awt.Transparency; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; @@ -68,12 +69,7 @@ } public WinGraphicsConfiguration(long hwnd, long hdc) { - this(hdc); this.device = new WinGraphicsDevice(hwnd); - } - - public WinGraphicsConfiguration(long hdc) { - this.device = null; this.index = -1; int dci = win32.GetPixelFormat(hdc); @@ -93,34 +89,34 @@ private void init(Win32.PIXELFORMATDESCRIPTOR pfd) { flags = pfd.get_dwFlags(); pixelType = pfd.get_iPixelType(); - if ((pixelType & WindowsDefs.PFD_TYPE_COLORINDEX) == WindowsDefs.PFD_TYPE_COLORINDEX) { - cm = null; - return; - } + bits = pfd.get_cColorBits(); - bits = pfd.get_cColorBits(); if (bits == 0) { - cm = null; return; } - - redBits = pfd.get_cRedBits(); - redShift = pfd.get_cRedShift(); - rmask = (int)(Math.pow(2,redBits)-1) << redShift; - greenBits = pfd.get_cGreenBits(); - greenShift = pfd.get_cGreenShift(); - gmask = (int)(Math.pow(2,greenBits)-1) << greenShift; + if ((pixelType & WindowsDefs.PFD_TYPE_COLORINDEX) != WindowsDefs.PFD_TYPE_COLORINDEX) { + redBits = pfd.get_cRedBits(); + redShift = pfd.get_cRedShift(); + rmask = (int)(Math.pow(2,redBits)-1) << redShift; - blueBits = pfd.get_cBlueBits(); - blueShift = pfd.get_cBlueShift(); - bmask = (int)(Math.pow(2,blueBits)-1) << blueShift; + greenBits = pfd.get_cGreenBits(); + greenShift = pfd.get_cGreenShift(); + gmask = (int)(Math.pow(2,greenBits)-1) << greenShift; - alphaBits = pfd.get_cAlphaBits(); - alphaShift = pfd.get_cAlphaShift(); - amask = (int)(Math.pow(2,alphaBits)-1) << alphaShift; + blueBits = pfd.get_cBlueBits(); + blueShift = pfd.get_cBlueShift(); + bmask = (int)(Math.pow(2,blueBits)-1) << blueShift; - cm = new DirectColorModel(bits, rmask, gmask, bmask, amask); + alphaBits = pfd.get_cAlphaBits(); + alphaShift = pfd.get_cAlphaShift(); + amask = (int)(Math.pow(2,alphaBits)-1) << alphaShift; + } + + long hdc = win32.CreateDCW(null, device.getIDstring(), null, null); + cm = createColorModel(hdc); + win32.DeleteDC(hdc); + } @Override @@ -166,7 +162,14 @@ @Override public ColorModel getColorModel(int transparency) { - return cm; + switch(transparency){ + case Transparency.BITMASK: + return new DirectColorModel(25, 0xFF0000, 0xFF00, 0xFF, 0x1000000); + case Transparency.TRANSLUCENT: + return ColorModel.getRGBdefault(); + default: + return cm; + } } @Override @@ -242,4 +245,6 @@ public int getIndex() { return index; } + + private native ColorModel createColorModel(long hdc); } Index: modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java =================================================================== --- modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java (revision 582226) +++ modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java (working copy) @@ -186,7 +186,12 @@ if (img == null) { config = new WinGraphicsConfiguration(nw.getId(), getDC()); } else { - config = new WinGraphicsConfiguration(getDC()); + long hwnd = img.getHWND(); + if(hwnd != 0){ + config = new WinGraphicsConfiguration(hwnd, getDC()); + }else{ + config = img.getGraphicsConfiguration(); + } } } Index: modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment.h =================================================================== --- modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment.h (revision 581507) +++ modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment.h (working copy) @@ -45,6 +45,11 @@ JNIEXPORT jobjectArray JNICALL Java_org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment_enumerateDisplayDevices(JNIEnv *, jobject); +/* + * Method: org.apache.harmony.awt.gl.windows.WinGraphicsConfiguration.createColorModel(J)Ljava/awt/ColorModel; + */ +JNIEXPORT jobject JNICALL +Java_org_apache_harmony_awt_gl_windows_WinGraphicsConfiguration_createColorModel(JNIEnv *, jobject, jlong); #ifdef __cplusplus } Index: modules/awt/src/main/native/gl/windows/WinGraphicsEnvironment.cpp =================================================================== --- modules/awt/src/main/native/gl/windows/WinGraphicsEnvironment.cpp (revision 581507) +++ modules/awt/src/main/native/gl/windows/WinGraphicsEnvironment.cpp (working copy) @@ -22,6 +22,7 @@ #include #include "org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment.h" +#include "gl_GDIPlus.h" #define MAX_MONITOR_NUMBER 256 @@ -78,3 +79,150 @@ return array; } + +#define PF_32RGB888 1 +#define PF_16RGB565 2 +#define PF_16RGB555 3 +#define PF_24BGR888 4 +#define PF_8BPP 5 +#define PF_4BPP 6 +#define PF_2BPP 7 +#define PF_1BPP 8 +#define PF_UNKNOWN 0 + +/* + * Class: org_apache_harmony_awt_gl_windows_WinGraphicsConfiguration + * Method: createColorModel + * Signature: (J)Ljava/awt/ColorModel; + */ +JNIEXPORT jobject JNICALL Java_org_apache_harmony_awt_gl_windows_WinGraphicsConfiguration_createColorModel + (JNIEnv *env, jobject obj, jlong hdc) +{ + jclass cmClass; + jmethodID cmInit; + jobject colorModel; + + GLBITMAPINFO bmpInfo; + HBITMAP bmp; + + int pfType; + int bits; + + DWORD *mask; + + HDC dc = (HDC)hdc; + bmp = CreateCompatibleBitmap(dc, 1, 1); + + memset(&bmpInfo, 0, sizeof(GLBITMAPINFO)); + + bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + GetDIBits(dc, bmp, 0, 1, NULL, (BITMAPINFO *)&bmpInfo, DIB_RGB_COLORS); + GetDIBits(dc, bmp, 0, 1, NULL, (BITMAPINFO *)&bmpInfo, DIB_RGB_COLORS); + + DeleteObject(bmp); + + bits = bmpInfo.bmiHeader.biBitCount; + + if(bmpInfo.bmiHeader.biCompression == BI_BITFIELDS){ + mask = (DWORD *)bmpInfo.bmiColors; + + if(mask[0] == 0x7c00 && mask[1] == 0x03e0 && mask[2] == 0x1f){ + + pfType = PF_16RGB555; + + }else if(mask[0] == 0xf800 && mask[1] == 0x07e0 && mask[2] == 0x1f){ + + pfType = PF_16RGB565; + + }else if(mask[0] == 0xff0000 && mask[1] == 0xff00 && mask[2] == 0xff){ + + pfType = PF_32RGB888; + + }else{ + + pfType = PF_UNKNOWN; + + } + }else{ + switch(bits){ + + case 1: + pfType = PF_1BPP; + break; + case 2: + pfType = PF_2BPP; + break; + case 4: + pfType = PF_4BPP; + break; + case 8: + pfType = PF_8BPP; + break; + case 16: + pfType = PF_16RGB555; + break; + case 24: + pfType = PF_24BGR888; + break; + case 32: + pfType = PF_32RGB888; + break; + default: + pfType = PF_UNKNOWN; + } + } + + switch(pfType){ + + case PF_1BPP: + case PF_2BPP: + case PF_4BPP: + case PF_8BPP: + { + int cmapSize = 1 << bits; + int cmapByteSize = cmapSize << 2; + jbyteArray cmap = env->NewByteArray(cmapByteSize); + void *cmapPtr = env->GetPrimitiveArrayCritical(cmap, 0); + memcpy(cmapPtr, bmpInfo.bmiColors, cmapByteSize); + env->ReleasePrimitiveArrayCritical(cmap, cmapPtr, 0); + cmClass = env->FindClass("java/awt/image/IndexColorModel"); + cmInit = env->GetMethodID(cmClass, "", "(II[BIZ)V"); + colorModel = env->NewObject(cmClass, cmInit, bits, cmapSize, cmap, 0, 0); + } + break; + + case PF_16RGB555: + case PF_16RGB565: + cmClass = env->FindClass("java/awt/image/DirectColorModel"); + cmInit = env->GetMethodID(cmClass, "", "(IIII)V"); + colorModel = env->NewObject(cmClass, cmInit, bits, mask[0], mask[1], mask[2]); + break; + + case PF_32RGB888: + cmClass = env->FindClass("java/awt/image/DirectColorModel"); + cmInit = env->GetMethodID(cmClass, "", "(IIII)V"); + colorModel = env->NewObject(cmClass, cmInit, 24, mask[0], mask[1], mask[2]); + break; + + case PF_24BGR888: + { + cmClass = env->FindClass("java/awt/image/ComponentColorModel"); + cmInit = env->GetMethodID(cmClass, "", "(Ljava/awt/color/ColorSpace;ZZII)V"); + + jclass csClass = env->FindClass("java/awt/color/ColorSpace"); + jmethodID csInit = env->GetStaticMethodID(csClass, "getInstance", "(I)Ljava/awt/color/ColorSpace"); + jfieldID csFiled = env->GetStaticFieldID(csClass, "CS_sRGB", "I"); + jint csType = env->GetStaticIntField(csClass, csFiled); + + jobject cs = env->CallStaticObjectMethod(csClass, csInit, csType); + colorModel = env->NewObject(cmClass, cmInit, cs, 0, 0, 1, 0); + } + break; + + default: + cmClass = env->FindClass("java/lang/RuntimeException"); + env->ThrowNew(cmClass, "Unknown Graphics Device Pixel Format"); + + } + return colorModel; +}