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/23 14:00:26 UTC

svn commit: r587465 - in /harmony/enhanced/classlib/trunk/modules/awt/src/main: java/common/java/awt/ java/common/org/apache/harmony/awt/gl/image/ java/windows/org/apache/harmony/awt/gl/windows/ native/gl/shared/

Author: ayza
Date: Tue Oct 23 05:00:25 2007
New Revision: 587465

URL: http://svn.apache.org/viewvc?rev=587465&view=rev
Log:
Applying patch from HARMONY-4791 ([classlib][awt][image] Harmony has problem in drawing medium-or-large size of png file if not guarded by MediaTracker)

Modified:
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Component.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/OffscreenImage.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/GDIBlitter.java
    harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/pngdecoder.c

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Component.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Component.java?rev=587465&r1=587464&r2=587465&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Component.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Component.java Tue Oct 23 05:00:25 2007
@@ -3706,9 +3706,9 @@
         if (g == null) {
             return;
         }
-        initGraphics(g, event);
         if (!getIgnoreRepaint()) {
             if (event.getID() == PaintEvent.PAINT) {
+                initGraphics(g, event);
                 paint(g);
             } else {
                 update(g);

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/OffscreenImage.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/OffscreenImage.java?rev=587465&r1=587464&r2=587465&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/OffscreenImage.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/OffscreenImage.java Tue Oct 23 05:00:25 2007
@@ -38,9 +38,12 @@
 import java.awt.image.ImageProducer;
 import java.awt.image.IndexColorModel;
 import java.awt.image.WritableRaster;
+import java.util.ConcurrentModificationException;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.Vector;
 
+import org.apache.harmony.awt.gl.AwtImageBackdoorAccessor;
 import org.apache.harmony.awt.gl.ImageSurface;
 import org.apache.harmony.awt.internal.nls.Messages;
 
@@ -63,7 +66,11 @@
     int imageState;
     int hints;
     private boolean producing;
+    private boolean done;
     private ImageSurface imageSurf;
+    Object surfData;
+    AwtImageBackdoorAccessor ba = AwtImageBackdoorAccessor.getInstance();
+
 
     public OffscreenImage(ImageProducer ip){
         imageState = 0;
@@ -72,6 +79,7 @@
         height = -1;
         observers = new Vector<ImageObserver>();
         producing = false;
+        done = false;
     }
 
     @Override
@@ -80,12 +88,11 @@
             // awt.38=Property name is not defined
             throw new NullPointerException(Messages.getString("awt.38")); //$NON-NLS-1$
         }
-        if(properties == null){
-            addObserver(observer);
-            startProduction();
-            if(properties == null) {
-                return null;
-            }
+        if(!done && properties == null){
+            startProduction(observer);
+        }
+        if(properties == null) {
+            return null;
         }
         Object prop = properties.get(name);
         if(prop == null) {
@@ -101,24 +108,16 @@
 
     @Override
     public int getWidth(ImageObserver observer) {
-        if((imageState & ImageObserver.WIDTH) == 0){
-            addObserver(observer);
-            startProduction();
-            if((imageState & ImageObserver.WIDTH) == 0) {
-                return -1;
-            }
+        if(!done && (imageState & ImageObserver.WIDTH) == 0){
+            startProduction(observer);
         }
         return width;
     }
 
     @Override
     public int getHeight(ImageObserver observer) {
-        if((imageState & ImageObserver.HEIGHT) == 0){
-            addObserver(observer);
-            startProduction();
-            if((imageState & ImageObserver.HEIGHT) == 0) {
-                return -1;
-            }
+        if(!done && (imageState & ImageObserver.HEIGHT) == 0){
+            startProduction(observer);
         }
         return height;
     }
@@ -131,24 +130,26 @@
 
     @Override
     public void flush() {
-        stopProduction();
-        imageUpdate(this, ImageObserver.ABORT, -1, -1, -1, -1);
-        imageState &= ~ImageObserver.ERROR;
-        imageState = 0;
-        image = null;
-        cm = null;
-        raster = null;
-        hints = 0;
-        width = -1;
-        height = -1;
+        imageUpdate(ImageObserver.ABORT, -1, -1, -1, -1);
+        synchronized (this) {
+            imageState = 0;
+            image = null;
+            cm = null;
+            raster = null;
+            hints = 0;
+            width = -1;
+            height = -1;
+        }
     }
 
-    public void setProperties(Hashtable<?, ?> properties) {
-        this.properties = properties;
-        imageUpdate(this, ImageObserver.PROPERTIES, 0, 0, width, height);
+    public  void setProperties(Hashtable<?, ?> properties) {
+        synchronized (this) {
+            this.properties = properties;
+        }
+        imageUpdate(ImageObserver.PROPERTIES);
     }
 
-    public void setColorModel(ColorModel cm) {
+    public synchronized void setColorModel(ColorModel cm) {
         this.cm = cm;
     }
 
@@ -164,6 +165,7 @@
      */
     public void setPixels(int x, int y, int w, int h, ColorModel model,
             int[] pixels, int off, int scansize) {
+
         if(raster == null){
             if(cm == null){
                 if(model == null) {
@@ -182,40 +184,42 @@
             forceToIntARGB();
         }
 
-        if(cm == model && model.getTransferType() == DataBuffer.TYPE_INT &&
-                raster.getNumDataElements() == 1){
+        synchronized(surfData){
+            if(cm == model && model.getTransferType() == DataBuffer.TYPE_INT &&
+                    raster.getNumDataElements() == 1){
+
+                int data[] = (int[])surfData;
+                int scanline = raster.getWidth();
+                DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer();
+                int rof = dbi.getOffset() + y * scanline + x;
+                for(int lineOff = off, line = y; line < y + h;
+                    line++, lineOff += scansize, rof += scanline){
 
-            DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer();
-            int data[] = dbi.getData();
-            int scanline = raster.getWidth();
-            int rof = dbi.getOffset() + y * scanline + x;
-            for(int lineOff = off, line = y; line < y + h;
-                line++, lineOff += scansize, rof += scanline){
-
-                System.arraycopy(pixels, lineOff, data, rof, w);
-            }
-
-        }else if(isIntRGB){
-            int buff[] = new int[w];
-            DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer();
-            int data[] = dbi.getData();
-            int scanline = raster.getWidth();
-            int rof = dbi.getOffset() + y * scanline + x;
-            for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize,
-                rof += scanline) {
+                    System.arraycopy(pixels, lineOff, data, rof, w);
+                }
+
+            }else if(isIntRGB){
+                int buff[] = new int[w];
+                int data[] = (int[])surfData;
+                int scanline = raster.getWidth();
+                DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer();
+                int rof = dbi.getOffset() + y * scanline + x;
+                for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize,
+                    rof += scanline) {
 
-                for (int sx = x, idx = 0; sx < x + w; sx++, idx++) {
-                    buff[idx] = model.getRGB(pixels[sOff + idx]);
+                    for (int sx = x, idx = 0; sx < x + w; sx++, idx++) {
+                        buff[idx] = model.getRGB(pixels[sOff + idx]);
+                    }
+                    System.arraycopy(buff, 0, data, rof, w);
                 }
-                System.arraycopy(buff, 0, data, rof, w);
-            }
-        }else{
-            Object buf = null;
-            for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize) {
-                for (int sx = x, idx = 0; sx < x + w; sx++, idx++) {
-                    int rgb = model.getRGB(pixels[sOff + idx]);
-                    buf = cm.getDataElements(rgb, buf);
-                    raster.setDataElements(sx, sy, buf);
+            }else{
+                Object buf = null;
+                for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize) {
+                    for (int sx = x, idx = 0; sx < x + w; sx++, idx++) {
+                        int rgb = model.getRGB(pixels[sOff + idx]);
+                        buf = cm.getDataElements(rgb, buf);
+                        raster.setDataElements(sx, sy, buf);
+                    }
                 }
             }
         }
@@ -224,7 +228,7 @@
             imageSurf.invalidate();
         }
 
-        imageUpdate(this, ImageObserver.SOMEBITS, 0, 0, width, height);
+        imageUpdate(ImageObserver.SOMEBITS);
     }
 
     public void setPixels(int x, int y, int w, int h, ColorModel model,
@@ -247,60 +251,61 @@
             forceToIntARGB();
         }
 
-        if(isIntRGB){
-            int buff[] = new int[w];
-            IndexColorModel icm = (IndexColorModel) model;
-            int colorMap[] = new int[icm.getMapSize()];
-            icm.getRGBs(colorMap);
-            DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer();
-            int data[] = dbi.getData();
-            int scanline = raster.getWidth();
-            int rof = dbi.getOffset() + y * scanline + x;
-            if(model instanceof IndexColorModel){
+        synchronized(surfData){
+            if(isIntRGB){
+                int buff[] = new int[w];
+                IndexColorModel icm = (IndexColorModel) model;
+                int colorMap[] = new int[icm.getMapSize()];
+                icm.getRGBs(colorMap);
+                int data[] = (int[])surfData;
+                int scanline = raster.getWidth();
+                DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer();
+                int rof = dbi.getOffset() + y * scanline + x;
+                if(model instanceof IndexColorModel){
+
+                    for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize,
+                        rof += scanline) {
+                        for (int sx = x, idx = 0; sx < x + w; sx++, idx++) {
+                            buff[idx] = colorMap[pixels[sOff + idx] & 0xff];
+                        }
+                        System.arraycopy(buff, 0, data, rof, w);
+                    }
+                }else{
 
-                for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize,
-                    rof += scanline) {
-                    for (int sx = x, idx = 0; sx < x + w; sx++, idx++) {
-                        buff[idx] = colorMap[pixels[sOff + idx] & 0xff];
+                    for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize,
+                        rof += scanline) {
+                        for (int sx = x, idx = 0; sx < x + w; sx++, idx++) {
+                            buff[idx] = model.getRGB(pixels[sOff + idx] & 0xff);
+                        }
+                        System.arraycopy(buff, 0, data, rof, w);
                     }
-                    System.arraycopy(buff, 0, data, rof, w);
                 }
-            }else{
+            }else if(model == cm && model.getTransferType() == DataBuffer.TYPE_BYTE &&
+                    raster.getNumDataElements() == 1){
 
-                for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize,
-                    rof += scanline) {
-                    for (int sx = x, idx = 0; sx < x + w; sx++, idx++) {
-                        buff[idx] = model.getRGB(pixels[sOff + idx] & 0xff);
-                    }
-                    System.arraycopy(buff, 0, data, rof, w);
+                byte data[] = (byte[])surfData;
+                int scanline = raster.getWidth();
+                DataBufferByte dbb = (DataBufferByte)raster.getDataBuffer();
+                int rof = dbb.getOffset() + y * scanline + x;
+                for(int lineOff = off, line = y; line < y + h;
+                    line++, lineOff += scansize, rof += scanline){
+                    System.arraycopy(pixels, lineOff, data, rof, w);
                 }
-            }
-        }else if(model == cm && model.getTransferType() == DataBuffer.TYPE_BYTE &&
-                raster.getNumDataElements() == 1){
+            }else if(model == cm && model.getTransferType() == DataBuffer.TYPE_BYTE &&
+                    cm instanceof ComponentColorModel){
 
-            DataBufferByte dbb = (DataBufferByte)raster.getDataBuffer();
-            byte data[] = dbb.getData();
-            int scanline = raster.getWidth();
-            int rof = dbb.getOffset() + y * scanline + x;
-            for(int lineOff = off, line = y; line < y + h;
-                line++, lineOff += scansize, rof += scanline){
-                System.arraycopy(pixels, lineOff, data, rof, w);
-            }
-        }else if(model == cm && model.getTransferType() == DataBuffer.TYPE_BYTE &&
-                cm instanceof ComponentColorModel){
-
-            int nc = cm.getNumComponents();
-            byte stride[] = new byte[scansize];
-            for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize) {
-                System.arraycopy(pixels, sOff, stride, 0, scansize);
-                
-                raster.setDataElements(x, sy, w, 1, stride);
-            }
-        }else {
-            for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize) {
-                for (int sx = x, idx = 0; sx < x + w; sx++, idx++) {
-                    int rgb = model.getRGB(pixels[sOff + idx] & 0xff);
-                    raster.setDataElements(sx, sy, cm.getDataElements(rgb, null));
+                byte stride[] = new byte[scansize];
+                for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize) {
+                    System.arraycopy(pixels, sOff, stride, 0, scansize);
+                    
+                    raster.setDataElements(x, sy, w, 1, stride);
+                }
+            }else {
+                for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize) {
+                    for (int sx = x, idx = 0; sx < x + w; sx++, idx++) {
+                        int rgb = model.getRGB(pixels[sOff + idx] & 0xff);
+                        raster.setDataElements(sx, sy, cm.getDataElements(rgb, null));
+                    }
                 }
             }
         }
@@ -309,23 +314,26 @@
             imageSurf.invalidate();
         }
 
-        imageUpdate(this, ImageObserver.SOMEBITS, 0, 0, width, height);
+        imageUpdate(ImageObserver.SOMEBITS);
     }
 
     public void setDimensions(int width, int height) {
         if(width <= 0 || height <= 0){
-            imageComplete(ImageObserver.ERROR);
+            imageComplete(IMAGEERROR);
             return;
         }
+        synchronized (this) {
+            this.width = width;
+            this.height = height;
+        }
+        imageUpdate(ImageObserver.WIDTH | ImageObserver.HEIGHT);
 
-        this.width = width;
-        this.height = height;
-        imageUpdate(this, (ImageObserver.HEIGHT | ImageObserver.WIDTH),
-                0, 0, width, height);
     }
 
     public void setHints(int hints) {
-        this.hints = hints;
+        synchronized (this) {
+            this.hints = hints;
+        }
     }
 
     public void imageComplete(int state) {
@@ -347,16 +355,17 @@
             // awt.3B=Incorrect ImageConsumer completion status
             throw new IllegalArgumentException(Messages.getString("awt.3B")); //$NON-NLS-1$
         }
-        imageUpdate(this, flag, 0, 0, width, height);
 
-        if((flag & (ImageObserver.ERROR | ImageObserver.ABORT |
+        imageUpdate(flag);
+        if((imageState & (ImageObserver.ERROR | ImageObserver.ABORT |
                 ImageObserver.ALLBITS)) != 0 ) {
+            
             stopProduction();
-            observers.removeAllElements();
         }
+
     }
 
-    public /*synchronized*/ BufferedImage getBufferedImage(){
+    public BufferedImage getBufferedImage(){
         if(image == null){
             ColorModel model = getColorModel();
             WritableRaster wr = getRaster();
@@ -367,37 +376,38 @@
         return image;
     }
 
-    public /*synchronized*/ int checkImage(ImageObserver observer){
-        addObserver(observer);
+    public int checkImage(ImageObserver observer){
+        synchronized (this) {
+            addObserver(observer);
+        }
         return imageState;
     }
 
-    public /*synchronized*/ boolean prepareImage(ImageObserver observer){
-        if((imageState & ImageObserver.ERROR) != 0){
-            if(observer != null){
-                observer.imageUpdate(this, ImageObserver.ERROR |
-                        ImageObserver.ABORT, -1, -1, -1, -1);
+    public boolean prepareImage(ImageObserver observer){
+        if(!done){
+            if((imageState & ImageObserver.ERROR) != 0){
+                if(observer != null){
+                    observer.imageUpdate(this, ImageObserver.ERROR |
+                            ImageObserver.ABORT, -1, -1, -1, -1);
+                }
+                return false;
             }
-            return false;
+            startProduction(observer);
         }
-        if((imageState & ImageObserver.ALLBITS) != 0) {
-            return true;
-        }
-        addObserver(observer);
-        startProduction();
+        
         return ((imageState & ImageObserver.ALLBITS) != 0);
     }
 
-    public /*synchronized*/ ColorModel getColorModel(){
+    public ColorModel getColorModel(){
         if(cm == null) {
-            startProduction();
+            startProduction(null);
         }
         return cm;
     }
 
-    public /*synchronized*/ WritableRaster getRaster(){
+    public WritableRaster getRaster(){
         if(raster == null) {
-            startProduction();
+            startProduction(null);
         }
         return raster;
     }
@@ -406,35 +416,45 @@
         return imageState;
     }
 
-    private /*synchronized*/ void addObserver(ImageObserver observer){
+    private void addObserver(ImageObserver observer){
         if(observer != null){
-          if(observers.contains(observer)) {
-            return;
-        }
-          if((imageState & ImageObserver.ERROR) != 0){
-              observer.imageUpdate(this, ImageObserver.ERROR |
-                      ImageObserver.ABORT, -1, -1, -1, -1);
-              return;
-          }
-          if((imageState & ImageObserver.ALLBITS) != 0){
-              observer.imageUpdate(this, imageState, 0, 0, width, height);
-              return;
-          }
-          observers.addElement(observer);
+            if(observers.contains(observer)) return;
+
+            if((imageState & ImageObserver.ERROR) != 0){
+                observer.imageUpdate(this, ImageObserver.ERROR |
+                    ImageObserver.ABORT, -1, -1, -1, -1);
+          
+                return;
+            }
+
+            if((imageState & ImageObserver.ALLBITS) != 0){
+                observer.imageUpdate(this, imageState, 0, 0, width, height);
+
+                return;
+            }
+            synchronized (observers) {
+                observers.add(observer);
+            }
         }
     }
 
-    private synchronized void startProduction(){
-        if(!producing){
-            imageState &= ~ImageObserver.ABORT;
-            producing = true;
-            src.startProduction(this);
+    private void startProduction(ImageObserver observer){
+        addObserver(observer);
+        if(!producing && !done){
+            synchronized(this){
+                imageState &= ~ImageObserver.ABORT;
+                producing = true;
+                src.startProduction(this);
+            }
         }
     }
 
     private synchronized void stopProduction(){
         producing = false;
         src.removeConsumer(this);
+        synchronized (observers) {
+            observers.clear();
+        }
     }
 
     private void createRaster(){
@@ -455,17 +475,32 @@
             raster = cm.createCompatibleWritableRaster(width, height);
             isIntRGB = true;
         }
+        surfData = ba.getData(raster.getDataBuffer());
     }
 
-    private /*synchronized*/ void imageUpdate(Image img, int infoflags, int x, int y,
-            int width, int height){
+    private void imageUpdate(int state){
+        imageUpdate(state, 0, 0, width, height);
+    }
+    
+    private void imageUpdate(int state, int x, int y, int width, int height){
+        synchronized(this){
+            imageState |= state;
+            if((imageState & (ImageObserver.ALLBITS)) != 0 ) {
+                done = true;
+            }
+        }
+        ImageObserver observer = null;
 
-        imageState |= infoflags;
-        for (ImageObserver observer : observers) {
-            observer.imageUpdate(this, infoflags, x, y, width, height);
+        for (Iterator<ImageObserver> i = observers.iterator(); i.hasNext();) {
+            try {
+                observer = i.next();
+            } catch (ConcurrentModificationException e) {
+                i = observers.iterator();
+                continue;
+            }
+            observer.imageUpdate(this, imageState, x, y, width, height);
         }
 
-//            notifyAll();
     }
 
     private void forceToIntARGB(){
@@ -513,6 +548,7 @@
             }
             cm = rgbCM;
             raster = destRaster;
+            surfData = ba.getData(raster.getDataBuffer());
             isIntRGB = true;
         }
     }

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/GDIBlitter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/GDIBlitter.java?rev=587465&r1=587464&r2=587465&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/GDIBlitter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/GDIBlitter.java Tue Oct 23 05:00:25 2007
@@ -101,18 +101,21 @@
                 int compType = ac.getRule();
                 float alpha = ac.getAlpha();
                 if(srcSurf instanceof ImageSurface){
-                    if(bgcolor == null || srcSurf.getTransparency() == Transparency.OPAQUE){
-                        bltImage(srcX, srcY, srcSurfStruct, srcSurf.getData(),
-                                dstX, dstY, dstSurfStruct,
-                                width, height, compType, alpha,
-                                matrix, clipRects, numVertex, 
-                                srcSurf.invalidated());
-                    }else{
-                        bltBGImage(srcX, srcY, srcSurfStruct, srcSurf.getData(),
-                                dstX, dstY, dstSurfStruct,
-                                width, height, bgcolor.getRGB(),
-                                compType, alpha, matrix, clipRects, 
-                                numVertex, srcSurf.invalidated());
+                    Object data = srcSurf.getData();
+                    synchronized(data){
+                        if(bgcolor == null || srcSurf.getTransparency() == Transparency.OPAQUE){
+                            bltImage(srcX, srcY, srcSurfStruct, srcSurf.getData(),
+                                    dstX, dstY, dstSurfStruct,
+                                    width, height, compType, alpha,
+                                    matrix, clipRects, numVertex, 
+                                    srcSurf.invalidated());
+                        }else{
+                            bltBGImage(srcX, srcY, srcSurfStruct, srcSurf.getData(),
+                                    dstX, dstY, dstSurfStruct,
+                                    width, height, bgcolor.getRGB(),
+                                    compType, alpha, matrix, clipRects, 
+                                    numVertex, srcSurf.invalidated());
+                        }
                     }
                     srcSurf.validate();
                 }else{
@@ -124,10 +127,13 @@
             }else if(comp instanceof XORComposite){
                 XORComposite xcomp = (XORComposite) comp;
                 if(srcSurf instanceof ImageSurface){
-                    xorImage(srcX, srcY, srcSurfStruct, srcSurf.getData(),
-                            dstX, dstY, dstSurfStruct,
-                            width, height, xcomp.getXORColor().getRGB(),
-                            matrix, clipRects, numVertex, srcSurf.invalidated());
+                    Object data = srcSurf.getData();
+                    synchronized(data){
+                        xorImage(srcX, srcY, srcSurfStruct, data,
+                                dstX, dstY, dstSurfStruct,
+                                width, height, xcomp.getXORColor().getRGB(),
+                                matrix, clipRects, numVertex, srcSurf.invalidated());
+                    }
                     srcSurf.validate();
                 }else{
                     xorBitmap(srcX, srcY, srcSurfStruct,

Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/pngdecoder.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/pngdecoder.c?rev=587465&r1=587464&r2=587465&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/pngdecoder.c (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/shared/pngdecoder.c Tue Oct 23 05:00:25 2007
@@ -250,6 +250,9 @@
   }
 
   (*env)->CallVoidMethod(env, obj, img_PNG_returnHeaderID);
+  if ((*env)->ExceptionCheck(env))
+    longjmp(decoderInfo->jmpBuf, 1);
+
  
   // Get java array for image data
   if(decoderInfo->colorType == PNG_COLOR_TYPE_RGB ||