You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ap...@apache.org on 2008/01/16 15:13:21 UTC

svn commit: r612466 - in /harmony/enhanced/classlib/trunk: depends/build/ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/ modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/ modules/awt/src/main/java/unix/org/apache/harmo...

Author: apetrenko
Date: Wed Jan 16 06:13:14 2008
New Revision: 612466

URL: http://svn.apache.org/viewvc?rev=612466&view=rev
Log:
Patch for HARMONY-5394 "[classlib][awt] XBlitter improvements"

Modified:
    harmony/enhanced/classlib/trunk/depends/build/defines.mk
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/JavaBlitter.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XBlitter.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XGraphics2D.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XSurface.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XVolatileImage.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxWindowFactory.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/XServerConnection.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/SurfaceDataStructure.cpp
    harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/SurfaceDataStructure.h
    harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/blitter.cpp
    harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/XGraphics2D.cpp
    harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/exports.txt
    harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/makefile

Modified: harmony/enhanced/classlib/trunk/depends/build/defines.mk
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/depends/build/defines.mk?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/depends/build/defines.mk (original)
+++ harmony/enhanced/classlib/trunk/depends/build/defines.mk Wed Jan 16 06:13:14 2008
@@ -27,7 +27,7 @@
 CXX_DLL_LD = $(CXX)
 STDCLIBS = -lstdc++
 OSLIBS = -lc -lm
-XLIBS = -L/usr/X11R6/lib -lX11 -lXft
+XLIBS = -L/usr/X11R6/lib -lX11 -lXft -lXext
 MDLLIBPREFIX = -Xlinker --start-group
 MDLLIBSUFFIX = -Xlinker --end-group
 EXELDFLAGS = $(LDFLAGS)

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/JavaBlitter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/JavaBlitter.java?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/JavaBlitter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/JavaBlitter.java Wed Jan 16 06:13:14 2008
@@ -489,9 +489,9 @@
 
         float[] corners = {
             x, y,
-            x + width, y,
-            x + width, y + height,
-            x, y + height
+            x + width + 1, y,
+            x + width + 1, y + height + 1,
+            x, y + height + 1
         };
 
         at.transform(corners, 0, corners, 0, 4);

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XBlitter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XBlitter.java?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XBlitter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XBlitter.java Wed Jan 16 06:13:14 2008
@@ -36,375 +36,188 @@
 import org.apache.harmony.awt.nativebridge.linux.X11;
 import org.apache.harmony.awt.nativebridge.linux.X11Defs;
 
+import org.apache.harmony.awt.internal.nls.Messages;
+
 public class XBlitter implements Blitter {
+
     static final XBlitter inst = new XBlitter();
 
     public static XBlitter getInstance(){
         return inst;
     }
+    public void blit(int srcX, int srcY, Surface srcSurf, int dstX, int dstY,
+            Surface dstSurf, int width, int height, AffineTransform sysxform,
+            AffineTransform xform, Composite comp, Color bgcolor,
+            MultiRectArea clip) {
+
+        if(xform == null){
+            blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf, width, height,
+                    sysxform, comp, bgcolor, clip);
+        }else{
+            double scaleX = xform.getScaleX();
+            double scaleY = xform.getScaleY();
+            double scaledX = dstX / scaleX;
+            double scaledY = dstY / scaleY;
+            AffineTransform at = new AffineTransform();
+            at.setToTranslation(scaledX, scaledY);
+            xform.concatenate(at);
+            sysxform.concatenate(xform);
+            blit(srcX, srcY, srcSurf, 0, 0, dstSurf, width, height,
+                    sysxform, comp, bgcolor, clip);
+        }
+    }
 
-    public void blit(
-            int srcX, int srcY, Surface srcSurf,
-            int dstX, int dstY, Surface dstSurf,
-            int width, int height,
-            AffineTransform sysxform, AffineTransform xform,
-            Composite comp, Color bgcolor, MultiRectArea clip
-    ) {
-        int type = xform.getType();
-        switch (type) {
-            case AffineTransform.TYPE_TRANSLATION:
-                dstX += xform.getTranslateX();
-                dstY += xform.getTranslateY();
-            case AffineTransform.TYPE_IDENTITY:
-                 blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf,
-                         width, height, sysxform, comp, bgcolor, clip);
-                break;
-            default:
-                XSurface xDstSurf = (XSurface) dstSurf;
-
-                BufferedImage compIm;
-                int w = srcSurf.getWidth();
-                int h = srcSurf.getHeight();
-
-                if (!(srcSurf instanceof ImageSurface)) {
-                    compIm = xDstSurf.g2d.xConfig.createCompatibleImage(w, h);
-
-                    NativeImageBlitter.getInstance().blit(
-                            srcX, srcY, srcSurf,
-                            srcX, srcY,
-                            AwtImageBackdoorAccessor.getInstance().getImageSurface(compIm),
-                            w, h,
-                            AlphaComposite.Src, null, null
-                    );
-                } else {
-                    ColorModel cm = srcSurf.getColorModel();
-                    compIm = new BufferedImage(
-                            cm,
-                            srcSurf.getRaster(),
-                            cm.isAlphaPremultiplied(),
-                            null
-                    );
-                }
-
-                WritableRaster compRaster = compIm.getRaster();
-
-                AffineTransform at = (AffineTransform) sysxform.clone();
-                at.concatenate(xform);
-
-                // Want to transform without translation to fit into destination image
-                // Translation will be added then when blitting to final dest surface
-                dstX += at.getTranslateX();
-                dstY += at.getTranslateY();
-                AffineTransform untranslated =
-                        AffineTransform.getTranslateInstance(
-                                -at.getTranslateX(),
-                                -at.getTranslateY()
-                        );
-                untranslated.concatenate(at);
-
-                AffineTransformOp atop =
-                        new AffineTransformOp(untranslated, xDstSurf.g2d.getRenderingHints());
-
-                Rectangle r = atop.getBounds2D(compRaster).getBounds();
-                int tWidth = r.width;
-                int tHeight = r.height;
-
-                BufferedImage transformed;
-                if (compIm.getColorModel().getTransparency() == Transparency.OPAQUE) {
-                    transformed = xDstSurf.g2d.xConfig.createCompatibleImage(tWidth, tHeight);
-                } else {
-                    ColorModel cm = compIm.getColorModel();
-                    transformed =
-                            new BufferedImage(
-                                    cm,
-                                    compIm.getRaster().createCompatibleWritableRaster(
-                                            tWidth,
-                                            tHeight
-                                    ),
-                                    cm.isAlphaPremultiplied(),
-                                    null
-                            );
-                }
-
-                atop.filter(compIm, transformed);
-
-                if (dstX < 0){
-                    tWidth += dstX;
-                    dstX = 0;
-                }
+    public void blit(int srcX, int srcY, Surface srcSurf, int dstX, int dstY,
+            Surface dstSurf, int width, int height, AffineTransform sysxform, Composite comp,
+            Color bgcolor, MultiRectArea clip) {
+
+
+        if(srcSurf.isNativeDrawable()){
+            double matrix[] = null;
+            if(sysxform != null){
+                int type = sysxform.getType();
+                switch (type) {
+
+                    case AffineTransform.TYPE_TRANSLATION:
+                        dstX += sysxform.getTranslateX();
+                        dstY += sysxform.getTranslateY();
+                    case AffineTransform.TYPE_IDENTITY:
+                        break;
+
+                    default:
+                        matrix = new double[6];
+                        sysxform.getMatrix(matrix);
+                        Rectangle transDstBounds = JavaBlitter.getBounds2D(sysxform, new Rectangle(dstX, dstY, width, height)).getBounds();
+                        dstX = transDstBounds.x;
+                        dstY = transDstBounds.y;
+ 
+                        Rectangle transSrcBounds = JavaBlitter.getBounds2D(sysxform, new Rectangle(srcX, srcY, width, height)).getBounds();
+                        srcX = transSrcBounds.x;
+                        srcY = transSrcBounds.y;
+                        width = transSrcBounds.width;
+                        height = transSrcBounds.height;
 
-                if (dstY < 0){
-                    tHeight += dstY;
-                    dstY = 0;
                 }
 
-                blit(
-                        0, 0, AwtImageBackdoorAccessor.getInstance().getImageSurface(transformed),
-                        dstX, dstY, dstSurf,
-                        tWidth, tHeight,
-                        comp, bgcolor, clip
-                );
-        }
-    }
 
-    public void blit(
-            int srcX, int srcY, Surface srcSurf,
-            int dstX, int dstY, Surface dstSurf,
-            int width, int height,
-            AffineTransform sysxform,
-            Composite comp, Color bgcolor, MultiRectArea clip
-    ) {
-        int type = sysxform.getType();
-        switch (type) {
-            case AffineTransform.TYPE_TRANSLATION:
-            case AffineTransform.TYPE_IDENTITY:
-                 blit(
-                         srcX, srcY, srcSurf,
-                         dstX + (int) sysxform.getTranslateX(),
-                         dstY + (int) sysxform.getTranslateY(),
-                         dstSurf,
-                         width, height,
-                         comp, bgcolor, clip
-                 );
-                break;
-            default:
-                ColorModel cm = srcSurf.getColorModel();
-                WritableRaster compRaster = srcSurf.getRaster();
-                BufferedImage compIm = new BufferedImage(
-                        cm,
-                        compRaster,
-                        cm.isAlphaPremultiplied(),
-                        null
-                );
-
-                Rectangle transDstBounds = JavaBlitter.getBounds2D(sysxform, new Rectangle(dstX, dstY, width, height)).getBounds();
-                int tWidth = transDstBounds.width;
-                int tHeight = transDstBounds.height;
-                int tX = transDstBounds.x;
-                int tY = transDstBounds.y;
-
-                if(tWidth <= 0 || tHeight <= 0) return;
-                BufferedImage transformed = new BufferedImage(dstSurf.getWidth(), dstSurf.getHeight(), BufferedImage.TYPE_INT_ARGB);
-
-                Surface transfSurf = Surface.getImageSurface(transformed);
-                JavaBlitter.getInstance().blit(srcX, srcY, Surface.getImageSurface(compIm), 
-                        dstX, dstY, transfSurf, width, height, sysxform, AlphaComposite.Src, null, null);
-                blit(
-                        tX, tY, transfSurf,
-                        tX, tY, dstSurf,
-                        tWidth, tHeight,
-                        comp, bgcolor, clip
-                );
+            }
 
-        }
-    }
+            long dstSurfStruct = dstSurf.getSurfaceDataPtr();
+            long srcSurfStruct = srcSurf.getSurfaceDataPtr();
+            int clipRects[] = null;
+            int numVertex = 0;
+            if(clip != null){
+                clipRects = clip.rect;
+                numVertex = clipRects[0] - 1;
+            }
 
-    public void blit(
-            int srcX, int srcY, Surface srcSurf,
-            int dstX, int dstY, Surface dstSurf,
-            int width, int height,
-            Composite comp, Color bgcolor, MultiRectArea clip
-    ) {
-
-        if (clip == null) {
-            clip = new MultiRectArea(new Rectangle(dstX, dstY, width, height));
-        } else {
-            clip = new MultiRectArea(clip);
-        }
-        // XXX - todo - need to do smth with bgcolor
-        ColorModel srcCM = srcSurf.getColorModel();
-        XSurface xDstSurf = (XSurface) dstSurf;
-
-        if (srcSurf.isNativeDrawable() && srcCM.equals(dstSurf.getColorModel())) {
-            if (srcSurf instanceof XSurface) { // Blit from native to native
-                XSurface xSrcSurf = (XSurface) srcSurf;
-
-                XGraphics2D g2d = xDstSurf.g2d;
-
-                if (comp instanceof AlphaComposite) {
-                    switch (((AlphaComposite) comp).getRule()) {
-                        case AlphaComposite.SRC:
-                        case AlphaComposite.SRC_ATOP:
-                        case AlphaComposite.SRC_IN:
-                        case AlphaComposite.SRC_OVER:
-                            break; // GXCopy - is default
-                        case AlphaComposite.DST:
-                        case AlphaComposite.DST_ATOP:
-                        case AlphaComposite.DST_IN:
-                        case AlphaComposite.DST_OVER:
-                            g2d.setImageGCFunction(X11Defs.GXnoop);
-                            break;
-                        case AlphaComposite.SRC_OUT: // Clear
-                        case AlphaComposite.DST_OUT: // Clear
-                        case AlphaComposite.CLEAR:
-                        case AlphaComposite.XOR: // Clear
-                            g2d.setImageGCFunction(X11Defs.GXclear);
-                            break;
-                        default: // Do nothing
+            if(comp instanceof AlphaComposite){
+                AlphaComposite ac = (AlphaComposite) comp;
+                int compType = ac.getRule();
+                float alpha = ac.getAlpha();
+
+                if(srcSurf instanceof ImageSurface){
+                    Object data = srcSurf.getData();
+
+                    int dirtyRegions[] = ((ImageSurface) srcSurf).getDirtyRegions();
+                    int regCount = 0;
+                    if(dirtyRegions != null) regCount = dirtyRegions[0] - 1;
+                    
+                    boolean hasBackground = false;
+                    int bgc = 0;
+
+                    if(bgcolor != null && srcSurf.getTransparency() != Transparency.OPAQUE){
+                        hasBackground = true;
+                        bgc = bgcolor.getRGB();
                     }
-                } else {
-                    imBlit(
-                            srcX, srcY, srcSurf,
-                            dstX, dstY, dstSurf,
-                            width, height,
-                            comp, bgcolor, clip
-                    );
-                    return;
-                }
-
-                // Get translated clip
-                makeClip(dstX, dstY, width, height, clip);
 
-                g2d.setXClip(clip, g2d.imageGC);
-                X11 x11 = X11.getInstance(); 
-                x11.XCopyArea(
-                        g2d.display,
-                        xSrcSurf.g2d.drawable, g2d.drawable,
-                        g2d.imageGC,
-                        srcX, srcY,
-                        width, height,
-                        dstX, dstY
-                );
-                x11.XFlush(g2d.display);
-                g2d.resetXClip(g2d.imageGC);
-
-                g2d.setImageGCFunction(X11Defs.GXcopy);
-            } else if (srcSurf.getSurfaceType() == BufferedImage.TYPE_CUSTOM) {
-                // source is custom image, slow blit
-                imBlit(
-                        srcX, srcY, srcSurf,
-                        dstX, dstY, dstSurf,
-                        width, height,
-                        comp, bgcolor, clip
-                );
-            } else { // source could be compatible image
-                int srcTransp = srcCM.getTransparency();
-                if (srcTransp == Transparency.OPAQUE) {
-                    if (comp instanceof AlphaComposite) {
-                        AlphaComposite acomp = (AlphaComposite) comp;
-                        if (
-                                acomp.getRule() == AlphaComposite.SRC ||
-                                (acomp.getAlpha() == 1 &&
-                                 (acomp.getRule() == AlphaComposite.SRC_OVER ||
-                                  acomp.getRule() == AlphaComposite.SRC_ATOP ||
-                                  acomp.getRule() == AlphaComposite.SRC_IN)
-                                )
-                        ) {
-                            // Get translated clip
-                            makeClip(dstX, dstY, width, height, clip);
-                            xDstSurf.putImage(
-                                    clip,
-                                    srcSurf.getRaster(),
-                                    dstX, dstY,
-                                    width, height
-                            );
-                        } else {
-                            imBlit(
-                                srcX, srcY, srcSurf,
-                                dstX, dstY, dstSurf,
-                                width, height,
-                                comp, bgcolor, clip
-                            );
-                        }
+                    synchronized(data){
+                        bltImage(srcX, srcY, srcSurfStruct, srcSurf.getData(),
+                             dstX, dstY, dstSurfStruct, width, height, 
+                             hasBackground, bgc, compType, alpha, matrix, 
+                             clipRects, numVertex, srcSurf.invalidated(), 
+                             dirtyRegions, regCount);
                     }
-
-                } else if (srcTransp == Transparency.BITMASK) {
-                    // todo - XXX - optimize here - use native clip mask
-                    imBlit(
-                        srcX, srcY, srcSurf,
-                        dstX, dstY, dstSurf,
-                        width, height,
-                        comp, bgcolor, clip
-                    );
-                } else { // have to compose in java - no native alpha composite
-                    imBlit(
-                        srcX, srcY, srcSurf,
-                        dstX, dstY, dstSurf,
-                        width, height,
-                        comp, bgcolor, clip
-                    );
-                }
+                    srcSurf.validate();
+                }else{
+                    bltPixmap(srcX, srcY, srcSurfStruct,
+                            dstX, dstY, dstSurfStruct,
+                            width, height, compType, alpha, matrix,
+                            clipRects, numVertex);
+                }
+            }else if(comp instanceof XORComposite){
+                XORComposite xcomp = (XORComposite) comp;
+                if(srcSurf instanceof ImageSurface){
+                    Object data = srcSurf.getData();
+
+                    int dirtyRegions[] = ((ImageSurface) srcSurf).getDirtyRegions();
+                    int regCount = 0;
+                    if(dirtyRegions != null) regCount = dirtyRegions[0] - 1;
+
+                    synchronized(data){
+                        xorImage(srcX, srcY, srcSurfStruct, data,
+                                dstX, dstY, dstSurfStruct,
+                                width, height, xcomp.getXORColor().getRGB(), matrix,
+                                clipRects, numVertex, 
+                                srcSurf.invalidated(), dirtyRegions, regCount);
+                    }
+                    srcSurf.validate();
+                }else{
+                    xorPixmap(srcX, srcY, srcSurfStruct,
+                            dstX, dstY, dstSurfStruct,
+                            width, height, xcomp.getXORColor().getRGB(), matrix,
+                            clipRects, numVertex);
+                }
+            }else{
+                // awt.17=Unknown Composite type : {0}
+                throw new IllegalArgumentException(Messages.getString("awt.17",  //$NON-NLS-1$
+                        comp.getClass()));
             }
-        } else {
-            imBlit(
-                    srcX, srcY, srcSurf,
-                    dstX, dstY, dstSurf,
-                    width, height,
-                    comp, bgcolor, clip
-            );
+        }else{
+            BufferedImage bi;
+            if(srcSurf.getTransparency() == Transparency.OPAQUE){
+                bi = new BufferedImage(srcSurf.getWidth(), srcSurf.getHeight(), BufferedImage.TYPE_INT_RGB);
+            }else{
+                bi = new BufferedImage(srcSurf.getWidth(), srcSurf.getHeight(), BufferedImage.TYPE_INT_ARGB);
+            }
+            Surface tmpSurf = AwtImageBackdoorAccessor.getInstance().getImageSurface(bi);
+            JavaBlitter.getInstance().blit(0, 0, srcSurf, 0, 0, tmpSurf,
+                    srcSurf.getWidth(), srcSurf.getHeight(),
+                    AlphaComposite.Src, null, null);
+            blit(srcX, srcY, tmpSurf, dstX, dstY, dstSurf,
+                    width, height, comp, bgcolor, clip);
         }
     }
 
-    private static void imBlit(
-            int srcX, int srcY, Surface srcSurf,
-            int dstX, int dstY, Surface dstSurf,
-            int width, int height,
-            Composite comp,
-            Color bgcolor,
-            MultiRectArea clip
-    ) {
-
-        if(dstX < 0){
-            width += dstX;
-            dstX = 0;
-        }
-
-        if(dstY < 0){
-            height += dstY;
-            dstY = 0;
-        }
-
-        if(width <= 0 || height <= 0) return;
+    // Native methods
 
-        XSurface xDstSurf = ((XSurface) dstSurf);
+    public void blit(int srcX, int srcY, Surface srcSurf, int dstX, int dstY,
+            Surface dstSurf, int width, int height,
+            Composite comp, Color bgcolor, MultiRectArea clip) {
 
-        boolean srcNoAlpha =
-                srcSurf.getColorModel().getTransparency() == Transparency.OPAQUE;
+        blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf, width, height,
+                null, comp, bgcolor, clip);
+    }
 
-        if (comp instanceof AlphaComposite) {
-            AlphaComposite acomp = (AlphaComposite) comp;
-            if (
-                    acomp.getRule() == AlphaComposite.SRC ||
-                    (srcNoAlpha && acomp.getAlpha() == 1 &&
-                     (acomp.getRule() == AlphaComposite.SRC_OVER ||
-                      acomp.getRule() == AlphaComposite.SRC_ATOP ||
-                      acomp.getRule() == AlphaComposite.SRC_IN)
-                    )
-            ) {
-                xDstSurf.needServerData = false;
-            }
-        }
+    private native void bltImage(int srcX, int srcY, long srsSurfDataPtr,
+            Object srcData, int dstX, int dstY, long dstSurfDataPtr,
+            int width, int height, boolean hasBackground, int bgcolor, int compType,
+            float alpha, double matrix[], int clip[], int numVertex, 
+            boolean invalidated, int[] dirtyRegions, int regCount);
 
-        Rectangle2D roi = new Rectangle2D.Float(dstX, dstY, width, height); 
-        xDstSurf.setRoi(roi);
-        NativeImageBlitter.getInstance().blit(
-                srcX, srcY, srcSurf,
-                0, 0, xDstSurf.getImageSurface(),
-                width, height,
-                comp, bgcolor, null
-        );
-
-        if (xDstSurf.needServerData) {
-            xDstSurf.putImage(clip,
-                    (int) (roi.getX()),
-                    (int) (roi.getY()),
-                    (int) roi.getWidth(), 
-                    (int) roi.getHeight()
-            );
+    private native void bltPixmap(int srcX, int srcY, long srsSurfDataPtr,
+            int dstX, int dstY, long dstSurfDataPtr,
+            int width, int height, int compType,
+            float alpha, double matrix[], int clip[], int numVertex);
 
-        } else {
-            xDstSurf.putImage(clip, dstX, dstY, width, height);
-        }
+    private native void xorImage(int srcX, int srcY, long srsSurfDataPtr,
+            Object srcData, int dstX, int dstY, long dstSurfDataPtr,
+            int width, int height, int xorcolor, double matrix[], int clip[], 
+            int numVertex, boolean invalidated, int[] dirtyRegions, int regCount);
 
-        xDstSurf.needServerData = true;
-    }
-
-    private static void makeClip(
-            int dstX, int dstY,
-            int width, int height,
-            MultiRectArea clip
-    ) {
-        Rectangle destRect = new Rectangle(dstX, dstY, width, height);
-        clip.intersect(destRect);
-    }
+    private native void xorPixmap(int srcX, int srcY, long srsSurfDataPtr,
+            int dstX, int dstY, long dstSurfDataPtr,
+            int width, int height, int xorcolor, double matrix[],
+            int clip[], int numVertex);
 }
+

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XGraphics2D.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XGraphics2D.java?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XGraphics2D.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XGraphics2D.java Wed Jan 16 06:13:14 2008
@@ -66,10 +66,6 @@
     boolean xor_mode = false;
 
     boolean indexModel = false;
- 
-    static{
-        System.loadLibrary("gl");
-    }
 
     public XGraphics2D(long drawable, int tx, int ty, MultiRectArea clip) {
         super(tx, ty, clip);
@@ -101,6 +97,41 @@
         }
     }
 
+    public XGraphics2D(XVolatileImage image, int tx, int ty, int width, int height) {
+        this(image, tx, ty, new MultiRectArea(new Rectangle(width, height)));
+    }
+
+    public XGraphics2D(XVolatileImage image, int tx, int ty, MultiRectArea clip) {
+        super(tx, ty, clip);
+        drawable = image.getPixmap();
+        xConfig = (XGraphicsConfiguration) getDeviceConfiguration();
+        display = xConfig.dev.display;
+        gc = createGC(display, drawable);
+
+        X11.Visual visual = xConfig.info.get_visual();
+        xftDraw = createXftDraw(display, drawable, visual.lock());
+        visual.unlock();
+
+        imageGC = createGC(display, drawable);
+
+        //xSetForeground(argb); // Set default foregroung to black
+
+        blitter = XBlitter.getInstance();
+        Rectangle bounds = clip.getBounds();
+        dstSurf = image.getImageSurface();
+
+        if (!FontManager.IS_FONTLIB) {
+            jtr = DrawableTextRenderer.inst;
+        }
+
+        //setTransformedClip(clip);
+        setClip(clip);
+
+        if (xConfig.getColorModel() instanceof IndexColorModel) {
+            indexModel = true;
+        }
+    }
+
     public XGraphics2D(long drawable, int tx, int ty, int width, int height) {
         this(drawable, tx, ty, new MultiRectArea(new Rectangle(width, height)));
     }
@@ -214,6 +245,9 @@
             LinuxNativeFont.freeXftDrawNative(this.xftDraw);
             xftDraw = 0;
         }
+
+        if(dstSurf instanceof XSurface) 
+            dstSurf.dispose();
 
         if (gc != 0) {
             freeGC(display, gc);

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XSurface.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XSurface.java?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XSurface.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XSurface.java Wed Jan 16 06:13:14 2008
@@ -32,255 +32,55 @@
 import org.apache.harmony.awt.gl.*;
 
 public class XSurface extends Surface {
-    private static final X11 x11 = X11.getInstance();
-
-    //int width, height; // XXX - todo - use from superclass
-
-    XGraphics2D g2d;
-
-    private BufferedImage lastSnapshot = null;
-    boolean needServerData = true;
-
-    private Rectangle2D roi; // Rectangle of interest
-
-    private ImageSurface imageSurface;
-
-    // Cached parameters for XCreateImage
-    boolean cachedXCIParams = false;
-    int depthXCI;
-    int offsetXCI;
-    int formatXCI;
-    int bitmapPadXCI;
-    int bytesPerLineXCI;
-
 
     XSurface(XGraphics2D g2d, int width, int height) {
-        this.g2d = g2d;
+        surfaceDataPtr = createSurfData(g2d.display, g2d.drawable, g2d.imageGC, g2d.xConfig.info.lock(), width, height);
+        g2d.xConfig.info.unlock();
         this.width = width;
         this.height = height;
-        roi = new Rectangle2D.Float(0, 0, width, height);
-    }
-
-    void setRoi(Rectangle2D roi) {
-        this.roi = roi;
-    }
-
-    public ColorModel getColorModel() {
-        return g2d.xConfig.getColorModel();
     }
-
-    public WritableRaster getRaster() {
-        if (needServerData) {
-            long pixmap = x11.XCreatePixmap(
-                    g2d.display,
-                    x11.XRootWindow(g2d.display, g2d.xConfig.dev.screen),
-                    (int) roi.getWidth(), (int) roi.getHeight(),
-                    g2d.xConfig.info.get_depth()
-            );
-
-            x11.XCopyArea(
-                    g2d.display,
-                    g2d.drawable,
-                    pixmap,
-                    g2d.imageGC,
-                    (int) roi.getX(),
-                    (int) roi.getY(),
-                    (int) roi.getWidth(), (int) roi.getHeight(),
-                    0, 0
-            );
-
-            if (!cachedXCIParams) {
-                long xImagePtr = x11.XGetImage(
-                        g2d.display,
-                        pixmap,
-                        0, 0,
-                        1, 1,
-                        ~(0L), // All bits set to 1, should be same as XAllPlanes() result
-                        X11Defs.ZPixmap
-                );
-
-                if (xImagePtr == 0) // Check obtained XImage pointer
-                    return null;
-
-                X11.XImage xTmpImage = x11.createXImage(xImagePtr);
-                depthXCI = xTmpImage.get_depth();
-                formatXCI = xTmpImage.get_format();
-                offsetXCI = xTmpImage.get_xoffset();
-                bitmapPadXCI = xTmpImage.get_bitmap_pad();
-                bytesPerLineXCI = xTmpImage.get_bytes_per_line();
-                xTmpImage.get_f().destroy_image(xTmpImage);
-
-                cachedXCIParams = true;
-            }
-
-            X11.Visual visual = g2d.xConfig.info.get_visual();
-
-            long xImagePtr = x11.XCreateImage(
-                    g2d.display,
-                    visual.lock(),
-                    depthXCI,
-                    formatXCI,
-                    offsetXCI,
-                    Utils.memaccess.malloc(height*width*bytesPerLineXCI),
-                    width, height,
-                    bitmapPadXCI,
-                    0
-            );
-            visual.unlock();
-
-            X11.XImage xImage = x11.createXImage(xImagePtr);
-            xImage.set_byte_order(X11Defs.LSBFirst);
-
-            xImage = x11.XGetSubImage(
-                    g2d.display,
-                    pixmap,
-                    0, 0,
-                    (int) roi.getWidth(), (int) roi.getHeight(),
-                    ~(0L), // All bits set to 1, should be same as XAllPlanes() result
-                    X11Defs.ZPixmap,
-                    xImage, 0, 0
-            );
-            x11.XFreePixmap(g2d.display, pixmap);
-            lastSnapshot = XVolatileImage.biFromXImage(xImage, g2d.xConfig);
-
-            // Cleanup
-            xImage.get_f().destroy_image(xImage);
-        } else {
-            lastSnapshot = g2d.xConfig.createCompatibleImage(width, height);
-        }
-
-        return lastSnapshot.getRaster();
-    }
-
-    void putImage(MultiRectArea clip, int x, int y, int width, int height) {
-        putImage(
-                clip,
-                lastSnapshot.getRaster(),
-                x, y, width, height 
-        );
-    }
-
-    void putImage(
-            MultiRectArea clip, Raster r,
-            int dstX, int dstY,
-            int dstWidth, int dstHeight
-    ) {
-        if (r == null) // Just blit last snapshot
-            r = lastSnapshot.getRaster();
-
-        Object data;
-        AwtImageBackdoorAccessor dbAccess = AwtImageBackdoorAccessor.getInstance();
-        data = dbAccess.getData(r.getDataBuffer());
-        LockedArray lockedData = Utils.arraccess.lockArrayShort(data);
-
-        SampleModel sm = r.getSampleModel();
-        int scanlineStride;
-        if (sm instanceof ComponentSampleModel) {
-            scanlineStride = ((ComponentSampleModel) sm).getScanlineStride();
-        } else if (sm instanceof SinglePixelPackedSampleModel) {
-            scanlineStride = ((SinglePixelPackedSampleModel) sm).getScanlineStride();
-        } else if (sm instanceof MultiPixelPackedSampleModel) {
-            scanlineStride = ((MultiPixelPackedSampleModel) sm).getScanlineStride();
-        } else {
-            return;
-        }
-
-        int pad;
-        if (data instanceof byte[]) {
-            pad = 8;
-        } else if (data instanceof short[]) {
-            pad = 16;
-            scanlineStride *= 2;
-        } else if (data instanceof int[]) {
-            pad = 32;
-            scanlineStride *= 4;
-        } else {
+    @Override
+    public void dispose() {
+        if (surfaceDataPtr == 0) {
             return;
         }
-
-        X11.Visual visual = g2d.xConfig.info.get_visual();
-
-        long xImagePtr = x11.XCreateImage(
-                g2d.display,
-                visual.lock(),
-                g2d.xConfig.info.get_depth(),
-                X11Defs.ZPixmap,
-                0,
-                lockedData.getAddress(),
-                r.getWidth(),
-                r.getHeight(),
-                pad,
-                scanlineStride
-        );
-        visual.unlock();
-
-        g2d.setXClip(clip, g2d.imageGC);
-
-        X11.XImage xImage = x11.createXImage(xImagePtr);
-        xImage.set_byte_order(X11Defs.LSBFirst); // Set byte order explicitly
-
-        x11.XPutImage(
-                g2d.display,
-                g2d.drawable,
-                g2d.imageGC,
-                xImagePtr,
-                0, 0,
-                dstX, dstY,
-                dstWidth, dstHeight
-        );
-
-        g2d.resetXClip(g2d.imageGC);
-
-        lockedData.release();
-
-        xImage.set_data(NativeBridge.getInstance().createInt8Pointer(0, true));
-        xImage.get_f().destroy_image(xImage);
-    }
-
-    public void dispose() {
-        return;
-    }
-
-    public XGraphics2D getGraphics() {
-        return g2d;
-    }
-
-    /*
-    public int getWidth() { // XXX - todo - use from superclass
-        return this.width;
-    }
-
-    public int getHeight() { // XXX - todo - use from superclass
-        return this.height;
+        
+        dispose(surfaceDataPtr);
+        surfaceDataPtr = 0;
     }
-    */
 
+    @Override
     public long lock() {
         return 0;
     }
 
+    @Override
     public void unlock() {
+
+    }
+
+    @Override
+    public ColorModel getColorModel() {
+        return null;
     }
 
-    public boolean isNativeDrawable() {
-        return true;
+    @Override
+    public WritableRaster getRaster() {
+        return null;
     }
 
+    @Override
     public int getSurfaceType() {
-        return BufferedImage.TYPE_CUSTOM;
+        return 0;
     }
 
+    @Override
     public Surface getImageSurface() {
-        if (imageSurface == null) {
-            imageSurface = new ImageSurface(getColorModel(), getRaster());
-        } else {
-            imageSurface.setRaster(getRaster());
-        }
-
-        return imageSurface;
+        return this;
     }
 
-    protected void finalize() throws Throwable {
-        imageSurface.dispose();
-    }
+    private native long createSurfData(long display, long drawable, long gc, long visual_info, int width, int height);
+
+    private native void dispose(long structPtr);
+
 }

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XVolatileImage.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XVolatileImage.java?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XVolatileImage.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XVolatileImage.java Wed Jan 16 06:13:14 2008
@@ -39,7 +39,7 @@
 
     private long pixmap;
     private XGraphicsConfiguration xconf;
-    private XGraphics2D lastGraphics = null;
+    Surface surface;
 
     int width, height;
 
@@ -54,6 +54,9 @@
                 w, h,
                 xconf.info.get_depth()
         );
+
+        surface = new PixmapSurface(display, pixmap, xconf.info.lock(), w, h);
+        xconf.info.unlock();
     }
 
     public long getPixmap() {
@@ -73,8 +76,7 @@
     }
 
     public Graphics2D createGraphics() {
-        lastGraphics = new XGraphics2D(pixmap, 0, 0, width, height);
-        return lastGraphics;
+        return new XGraphics2D(this, 0, 0, width, height);
     }
 
     public int validate(GraphicsConfiguration graphicsConfiguration) {
@@ -278,13 +280,11 @@
     }
 
     public void finalize() {
+        surface.dispose();
         x11.XFreePixmap(xconf.dev.display, pixmap);
     }
 
     public Surface getImageSurface() {
-        if (lastGraphics == null)
-            createGraphics();
-
-        return lastGraphics.getSurface();
+        return surface;
     }
 }

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxWindowFactory.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxWindowFactory.java?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxWindowFactory.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxWindowFactory.java Wed Jan 16 06:13:14 2008
@@ -43,7 +43,7 @@
     private static final X11 x11 = X11.getInstance();
     private static final NativeBridge bridge = NativeBridge.getInstance();
 
-    private final XServerConnection xConnection = new XServerConnection(x11);
+    private final XServerConnection xConnection = XServerConnection.getInstance();
     private final long display = xConnection.getDisplay();
     private final int screen = xConnection.getScreen();
     final WindowManager wm;

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/XServerConnection.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/XServerConnection.java?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/XServerConnection.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/XServerConnection.java Wed Jan 16 06:13:14 2008
@@ -31,8 +31,10 @@
 
     private final X11 x11;
 
-    public XServerConnection(X11 x11) {
-        this.x11 = x11;
+    private static XServerConnection instance = new XServerConnection();
+
+    private XServerConnection() {
+        this.x11 = X11.getInstance();;
         display = x11.XOpenDisplay(0); //0 - we use default display only
         if (display == 0) {
             String name = System.getProperty("DISPLAY"); //$NON-NLS-1$
@@ -40,7 +42,15 @@
             throw new InternalError(Messages.getString("awt.0F", //$NON-NLS-1$ 
                     (name != null ? name : ""))); //$NON-NLS-1$
         }
+
         screen = x11.XDefaultScreen(display);
+
+        System.loadLibrary("gl");
+        init(display, screen);
+    }
+
+    public static XServerConnection getInstance(){
+        return instance;
     }
 
     public void close() {
@@ -54,4 +64,6 @@
     public int getScreen() {
         return screen;
     }
+
+    private native void init(long display, int screen);
 }

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/SurfaceDataStructure.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/SurfaceDataStructure.cpp?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/SurfaceDataStructure.cpp (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/SurfaceDataStructure.cpp Wed Jan 16 06:13:14 2008
@@ -83,6 +83,10 @@
             {
                 unsigned int *src, *dst;
 
+#ifdef unix
+                unsigned int *s, *d;
+#endif
+
                 src_stride = srcSurf->scanline_stride;
                 dst_stride = srcSurf->width;
 
@@ -92,7 +96,16 @@
                 dst = (unsigned int *)bmpDataPtr + dst_offset;
 
                 for(int _y = 0; _y < h; _y++, src += src_stride, dst += dst_stride){
+#ifdef _WIN32
                     memcpy(dst, src, w * sizeof(int));
+#endif
+
+#ifdef unix
+                    s = src, d = dst;
+                    for(int _x = 0; _x < w; _x++, s++, d++){
+                        *d = 0xff000000 | *s;
+                    }
+#endif
                 }
             }
             break;
@@ -668,10 +681,11 @@
                     env->ReleasePrimitiveArrayCritical(bandOffsets, p, 0);
                     break;
             }
-            surf->bmp_byte_stride = surf->width << 2;
             surf->invalidated = true;
+            surf->bmp_byte_stride = surf->width << 2;
 
 #ifdef _WIN32
+
             surf->bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
             surf->bmpInfo.bmiHeader.biWidth = surf->width;
             surf->bmpInfo.bmiHeader.biHeight = -surf->height;

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/SurfaceDataStructure.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/SurfaceDataStructure.h?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/SurfaceDataStructure.h (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/SurfaceDataStructure.h Wed Jan 16 06:13:14 2008
@@ -27,9 +27,11 @@
 #include <jni.h>
 
 #ifdef _WIN32
-
 #include "gl_GDIPlus.h"
+#endif
 
+#ifdef unix
+#include "XSurfaceInfo.h"
 #endif
 
 // Color Space constants
@@ -146,7 +148,7 @@
     bool isAlphaPre;
 
 #ifdef _WIN32
-    // VolataileImage
+    // WinVolataileImage
     GraphicsInfo *gi;
     GLBITMAPINFO bmpInfo;
 
@@ -154,6 +156,16 @@
     HDC srcDC;
     DWORD rtc;
     BOOL isTrueColor;
+#endif
+
+#ifdef unix
+    // XVolatileImage
+    XImage *ximage;
+
+    Display *display;
+    Drawable drawable;
+    GC gc;
+    XVisualInfo *visual_info;
 #endif
 
 

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/blitter.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/blitter.cpp?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/blitter.cpp (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/blitter.cpp Wed Jan 16 06:13:14 2008
@@ -1489,6 +1489,94 @@
 
 #endif
 
+#ifdef unix
+          if(!srcSurf->ximage){
+              if(XImageByteOrder(srcSurf->display) == LSBFirst){
+                  srcSurf->ximage = XGetImage(srcSurf->display, srcSurf->drawable, 0, 0, 
+                     srcSurf->width, srcSurf->height, ~(0L), ZPixmap);
+              }else{
+                  XImage *tmp = XGetImage(srcSurf->display, srcSurf->drawable, 0, 0, 
+                      1, 1, ~(0L), ZPixmap);
+
+                  srcSurf->ximage = XCreateImage(srcSurf->display, srcSurf->visual_info->visual,
+                      tmp->depth, tmp->format, tmp->xoffset, (char *)malloc(tmp->width * tmp->height * tmp->bytes_per_line),
+                      srcSurf->width, srcSurf->height, tmp->bitmap_pad, 0);
+
+                  XDestroyImage(tmp);
+ 
+                  srcSurf->ximage->byte_order = LSBFirst;
+
+                  XGetSubImage(srcSurf->display, srcSurf->drawable, 0, 0, 
+                      srcSurf->width, srcSurf->height, ~(0L), ZPixmap, srcSurf->ximage, 0, 0);
+              }
+              srcSurf->scanline_stride_byte = srcSurf->ximage->bytes_per_line;
+
+              char *info = (char *)srcSurf->visual_info;
+              int visual_class = (int)*((int *)(info + sizeof(Visual *) + sizeof(VisualID) + sizeof(int) + sizeof(unsigned int)));
+              int bpp = srcSurf->ximage->bits_per_pixel;
+
+              switch(visual_class){ 
+              case TrueColor:
+              case DirectColor:
+                  if(bpp == 32){
+                      srcSurf->scanline_stride = srcSurf->scanline_stride_byte >> 2;
+                      if(srcSurf->visual_info->red_mask == 0xff0000 && srcSurf->visual_info->green_mask == 0xff00 &&
+                          srcSurf->visual_info->blue_mask == 0xff){
+ 
+                          srcSurf->ss_type = INT_RGB;
+                          srcSurf->red_mask = 0xff0000;
+                          srcSurf->green_mask = 0xff00;
+                          srcSurf->blue_mask = 0xff;
+                      } else if (srcSurf->visual_info->red_mask == 0xff && srcSurf->visual_info->green_mask == 0xff00 &&
+                          srcSurf->visual_info->blue_mask == 0xff0000){
+
+                          srcSurf->ss_type = INT_BGR;
+                          srcSurf->red_mask = 0xff;
+                          srcSurf->green_mask = 0xff00;
+                          srcSurf->blue_mask = 0xff0000;
+                      } else {
+                          srcSurf->ss_type = -1;
+                      }
+                  }else if(bpp == 16){
+                      srcSurf->scanline_stride = srcSurf->scanline_stride_byte >> 1;
+                      if(srcSurf->visual_info->red_mask == 0x7c00 && srcSurf->visual_info->green_mask == 0x03e0 &&
+                          srcSurf->visual_info->blue_mask == 0x1f){
+
+                          srcSurf->ss_type = USHORT_555;
+                          srcSurf->red_mask = 0x7c00;
+                          srcSurf->green_mask = 0x03e0;
+                          srcSurf->blue_mask = 0x1f;
+                      } else if (srcSurf->visual_info->red_mask == 0xf800 && srcSurf->visual_info->green_mask == 0x07e0 &&
+                          srcSurf->visual_info->blue_mask == 0x1f){
+
+                          srcSurf->ss_type = USHORT_565;
+                          srcSurf->red_mask = 0xf800;
+                          srcSurf->green_mask = 0x07e0;
+                          srcSurf->blue_mask = 0x1f;
+                      } else {
+                          srcSurf->ss_type = -1;
+                      }
+                  }else{
+                          srcSurf->ss_type = -1;
+                  }
+                  break;
+              case StaticGray:
+              case PseudoColor:
+              case GrayScale:
+              case StaticColor: 
+                  // TODO: Need to implement parsing of others visual types
+                  srcSurf->ss_type = -1;
+                  break;
+              default:
+                  srcSurf->ss_type = -1;
+              }
+          } else {
+                 XGetSubImage(srcSurf->display, srcSurf->drawable, 0, 0, 
+                     srcSurf->width, srcSurf->height, ~(0L), ZPixmap, srcSurf->ximage, 0, 0);
+          }
+          srcDataPtr = srcSurf->ximage->data;
+#endif
+          srcType = srcSurf->ss_type;
       }else{
           srcDataPtr = env->GetPrimitiveArrayCritical((jarray)srcData, 0);
       }

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/XGraphics2D.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/XGraphics2D.cpp?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/XGraphics2D.cpp (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/XGraphics2D.cpp Wed Jan 16 06:13:14 2008
@@ -26,6 +26,7 @@
 #include <X11/Xutil.h>
 #include <X11/Xos.h>
 
+#include "XSurfaceInfo.h"
 #include "org_apache_harmony_awt_gl_linux_XGraphics2D.h"
 
 JNIEXPORT jlong JNICALL 

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/exports.txt
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/exports.txt?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/exports.txt (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/exports.txt Wed Jan 16 06:13:14 2008
@@ -32,3 +32,12 @@
 Java_org_apache_harmony_awt_gl_linux_XGraphics2D_setForeground
 Java_org_apache_harmony_awt_gl_linux_XGraphics2D_setFunction
 Java_org_apache_harmony_awt_gl_linux_XGraphics2D_setStroke
+Java_org_apache_harmony_awt_gl_linux_XSurface_createSurfData
+Java_org_apache_harmony_awt_gl_linux_XSurface_dispose
+Java_org_apache_harmony_awt_gl_linux_PixmapSurface_createSurfData
+Java_org_apache_harmony_awt_gl_linux_PixmapSurface_dispose
+Java_org_apache_harmony_awt_gl_linux_XBlitter_bltImage
+Java_org_apache_harmony_awt_gl_linux_XBlitter_bltPixmap
+Java_org_apache_harmony_awt_gl_linux_XBlitter_xorImage
+Java_org_apache_harmony_awt_gl_linux_XBlitter_xorPixmap
+Java_org_apache_harmony_awt_wtk_linux_XServerConnection_init

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/makefile
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/makefile?rev=612466&r1=612465&r2=612466&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/makefile (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/unix/makefile Wed Jan 16 06:13:14 2008
@@ -25,6 +25,8 @@
   $(SHAREDSUB)/LUTTables.o \
   $(SHAREDSUB)/pngdecoder.o \
   $(SHAREDSUB)/SurfaceDataStructure.o \
+  gl.o \
+  XBlitter.o \
   XGraphics2D.o \
   libpng.a