You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ay...@apache.org on 2007/10/12 18:38:47 UTC

svn commit: r584197 - in /harmony/enhanced/classlib/trunk/modules/awt/src/main: java/windows/org/apache/harmony/awt/gl/windows/ native/gl/windows/ native/gl/windows/include/

Author: ayza
Date: Fri Oct 12 09:38:29 2007
New Revision: 584197

URL: http://svn.apache.org/viewvc?rev=584197&view=rev
Log:
Applying patch from HARMONY-4902 ([classlib][awt] GraphicsConfiguration.getColorModel(int transparency) returns wrong ColorModel)

Modified:
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGraphicsConfiguration.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/WinGraphicsEnvironment.cpp
    harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment.h

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java?rev=584197&r1=584196&r2=584197&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java Fri Oct 12 09:38:29 2007
@@ -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();
+                }
             }
         }
 

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGraphicsConfiguration.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGraphicsConfiguration.java?rev=584197&r1=584196&r2=584197&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGraphicsConfiguration.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGraphicsConfiguration.java Fri Oct 12 09:38:29 2007
@@ -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();
+
         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;
-
-        blueBits = pfd.get_cBlueBits();
-        blueShift = pfd.get_cBlueShift();
-        bmask = (int)(Math.pow(2,blueBits)-1) << blueShift;
-
-        alphaBits = pfd.get_cAlphaBits();
-        alphaShift = pfd.get_cAlphaShift();
-        amask = (int)(Math.pow(2,alphaBits)-1) << alphaShift;
 
-        cm = new DirectColorModel(bits, rmask, gmask, bmask, amask);
+        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;
+
+            greenBits = pfd.get_cGreenBits();
+            greenShift = pfd.get_cGreenShift();
+            gmask = (int)(Math.pow(2,greenBits)-1) << greenShift;
+
+            blueBits = pfd.get_cBlueBits();
+            blueShift = pfd.get_cBlueShift();
+            bmask = (int)(Math.pow(2,blueBits)-1) << blueShift;
+
+            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);
 }

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java?rev=584197&r1=584196&r2=584197&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java Fri Oct 12 09:38:29 2007
@@ -158,4 +158,12 @@
         }
         super.flush();
     }
+    
+    long getHWND(){
+        return hwnd;
+    }
+    
+    WinGraphicsConfiguration getGraphicsConfiguration(){
+        return gc;
+    }
 }

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/WinGraphicsEnvironment.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/WinGraphicsEnvironment.cpp?rev=584197&r1=584196&r2=584197&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/WinGraphicsEnvironment.cpp (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/WinGraphicsEnvironment.cpp Fri Oct 12 09:38:29 2007
@@ -22,6 +22,7 @@
 
 #include <windows.h>
 #include "org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment.h"
+#include "gl_GDIPlus.h"
 
 #define MAX_MONITOR_NUMBER 256
 
@@ -77,4 +78,151 @@
         env->SetObjectArrayElement(array, i, monitors.monitors[i]); 
     
     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, "<init>", "(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, "<init>", "(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, "<init>", "(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, "<init>", "(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;
 }

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment.h?rev=584197&r1=584196&r2=584197&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment.h (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_WinGraphicsEnvironment.h Fri Oct 12 09:38:29 2007
@@ -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
 }