Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/DecodingImageSource.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/DecodingImageSource.java (revision 581521) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/DecodingImageSource.java (working copy) @@ -28,7 +28,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; /** @@ -40,7 +39,6 @@ */ public abstract class DecodingImageSource implements ImageProducer { List consumers = new ArrayList(5); - List decoders = new ArrayList(5); boolean loading; ImageDecoder decoder; @@ -54,78 +52,18 @@ ic.imageComplete(ImageConsumer.IMAGEERROR); return; } - - ImageConsumer cons = findConsumer(consumers, ic); - - if (cons == null) { // Try to look in the decoders - ImageDecoder d = null; - - // Check for all existing decoders - for (Iterator i = decoders.iterator(); i.hasNext();) { - d = i.next(); - cons = findConsumer(d.consumers, ic); - if (cons != null) { - break; - } - } - } - - if (cons == null) { // Not found, add this consumer + if (!consumers.contains(ic)) { // Not found, add this consumer consumers.add(ic); } } - - /** - * This method stops sending data to the given consumer - * @param ic - consumer - */ - private void abortConsumer(ImageConsumer ic) { - ic.imageComplete(ImageConsumer.IMAGEERROR); - consumers.remove(ic); - } - - /** - * This method stops sending data to the list of consumers. - * @param consumersList - list of consumers - */ - private void abortAllConsumers(List consumersList) { - for (ImageConsumer imageConsumer : consumersList) { - abortConsumer(imageConsumer); - } - } - public synchronized void removeConsumer(ImageConsumer ic) { - ImageDecoder d = null; + consumers.remove(ic); + } - // Remove in all existing decoders - for (Iterator i = decoders.iterator(); i.hasNext();) { - d = i.next(); - removeConsumer(d.consumers, ic); - if (d.consumers.size() <= 0) { - d.terminate(); - } - } - - // Remove in the current queue of consumers - removeConsumer(consumers, ic); + private synchronized void removeAllConsumers() { + consumers.clear(); } - /** - * Static implementation of removeConsumer method - * @param consumersList - list of consumers - * @param ic - consumer to be removed - */ - private static void removeConsumer(List consumersList, ImageConsumer ic) { - ImageConsumer cons = null; - - for (Iterator i = consumersList.iterator(); i.hasNext();) { - cons = i.next(); - if (cons.equals(ic)) { - i.remove(); - } - } - } - public void requestTopDownLeftRightResend(ImageConsumer consumer) { // Do nothing } @@ -142,56 +80,9 @@ } public synchronized boolean isConsumer(ImageConsumer ic) { - ImageDecoder d = null; - - // Check for all existing decoders - for (Iterator i = decoders.iterator(); i.hasNext();) { - d = i.next(); - if (findConsumer(d.consumers, ic) != null) { - return true; - } - } - - // Check current queue of consumers - return findConsumer(consumers, ic) != null; + return consumers.contains(ic); } - /** - * Checks if the consumer is in the list and returns it it is there - * @param consumersList - list of consumers - * @param ic - consumer - * @return consumer if found, null otherwise - */ - private static ImageConsumer findConsumer(List consumersList, ImageConsumer ic) { - ImageConsumer res = null; - - for (Iterator i = consumersList.iterator(); i.hasNext();) { - res = i.next(); - if (res.equals(ic)) { - return res; - } - } - - return null; - } - - /** - * Use this method to finish decoding or lock the list of consumers - * for a particular decoder - * @param d - decoder - */ - synchronized void lockDecoder(ImageDecoder d) { - if (d == decoder) { - decoder = null; - startProduction(null); - } - } - - /** - * Tries to find an appropriate decoder for the input stream and adds it - * to the list of decoders - * @return created decoder - */ private ImageDecoder createDecoder() { InputStream is = getInputStream(); @@ -205,36 +96,22 @@ if (decoder != null) { synchronized (this) { - decoders.add(decoder); this.decoder = decoder; loading = false; - consumers = new ArrayList(5); // Reset queue } return decoder; } // We were not able to find appropriate decoder - List cs; synchronized (this) { - cs = consumers; - consumers = new ArrayList(5); loading = false; } - abortAllConsumers(cs); + removeAllConsumers(); return null; } /** - * Stop the given decoder and remove it from the list - * @param dr - decoder - */ - private synchronized void removeDecoder(ImageDecoder dr) { - lockDecoder(dr); - decoders.remove(dr); - } - - /** * This method serves as an entry point. * It starts the decoder and loads the image data. */ @@ -246,15 +123,14 @@ } } - ImageDecoder d = createDecoder(); - if (d != null) { + createDecoder(); + if (decoder != null) { try { decoder.decodeImage(); } catch (IOException e) { e.printStackTrace(); } finally { - removeDecoder(d); - abortAllConsumers(d.consumers); + removeAllConsumers(); } } } Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/ImageDecoder.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/ImageDecoder.java (revision 581521) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/ImageDecoder.java (working copy) @@ -28,8 +28,6 @@ import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.ConcurrentModificationException; import java.util.Hashtable; import java.util.Iterator; @@ -118,7 +116,6 @@ * run the decoder. */ public void terminate() { - src.lockDecoder(this); closeStream(); terminated = true; } @@ -174,8 +171,6 @@ return; } - src.lockDecoder(this); - for (ImageConsumer ic : consumers) { ic.setPixels(x, y, w, h, model, pix, off, scansize); } @@ -192,8 +187,6 @@ return; } - src.lockDecoder(this); - for (ImageConsumer ic : consumers) { ic.setPixels(x, y, w, h, model, pix, off, scansize); } @@ -204,8 +197,6 @@ return; } - src.lockDecoder(this); - ImageConsumer ic = null; for (Iterator i = consumers.iterator(); i.hasNext();) { Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/ImageLoader.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/ImageLoader.java (revision 581521) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/ImageLoader.java (working copy) @@ -43,9 +43,8 @@ List queue = new LinkedList(); List loaders = new ArrayList(MAX_THREADS); + List freeLoaders = new ArrayList(MAX_THREADS); - private int freeLoaders; - private ImageLoadersStorage() {} static ImageLoadersStorage getStorage() { @@ -96,11 +95,16 @@ if (!storage.queue.contains(imgSrc)) { storage.queue.add(imgSrc); } - if (storage.freeLoaders == 0) { - createLoader(); + } + if(storage.freeLoaders.size() == 0){ + createLoader(); + } else { + synchronized(storage.freeLoaders) { + Thread loader = storage.freeLoaders.get(0); + synchronized(loader) { + loader.notify(); + } } - - storage.queue.notify(); } } @@ -116,17 +120,6 @@ synchronized(storage.queue) { DecodingImageSource isrc = null; - if (storage.queue.size() == 0) { - try { - storage.freeLoaders++; - storage.queue.wait(ImageLoadersStorage.TIMEOUT); - } catch (InterruptedException e) { - return null; - } finally { - storage.freeLoaders--; - } - } - if (storage.queue.size() > 0) { isrc = storage.queue.get(0); storage.queue.remove(0); @@ -149,13 +142,28 @@ while (storage.loaders.contains(this)) { DecodingImageSource isrc = getWaitingImageSource(); if (isrc != null) { + synchronized (storage.freeLoaders) { + if(storage.freeLoaders.contains(this)){ + storage.freeLoaders.remove(this); + } + } try { isrc.load(); } catch (Exception e) { e.printStackTrace(); } } else { - break; // Don't wait if timeout expired - terminate loader + synchronized (storage.freeLoaders) { + if(storage.freeLoaders.contains(this)){ + storage.freeLoaders.remove(this); + break; + } else { + storage.freeLoaders.add(this); + } + } + synchronized(this){ + wait(ImageLoadersStorage.TIMEOUT); + } } } } catch (Exception e) { @@ -178,7 +186,7 @@ synchronized(storage) { storage.loaders.remove(currThread); - if (storage.freeLoaders < storage.queue.size()) { + if (storage.freeLoaders.size() < storage.queue.size()) { createLoader(); } } Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/OffscreenImage.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/OffscreenImage.java (revision 581521) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/OffscreenImage.java (working copy) @@ -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,8 +66,13 @@ int imageState; int hints; private boolean producing; + private boolean done; private ImageSurface imageSurf; + Object surfData; + Object lock = new Object(); + AwtImageBackdoorAccessor ba = AwtImageBackdoorAccessor.getInstance(); + public OffscreenImage(ImageProducer ip){ imageState = 0; src = ip; @@ -72,6 +80,7 @@ height = -1; observers = new Vector(); producing = false; + done = false; } @Override @@ -80,13 +89,12 @@ // 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) { prop = UndefinedProperty; @@ -101,24 +109,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 +131,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 +166,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 +185,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){ - 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){ + 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){ - System.arraycopy(pixels, lineOff, data, rof, w); - } + 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) { + }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 +229,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,61 +252,62 @@ 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]; + 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); } - System.arraycopy(buff, 0, data, rof, w); - } - }else{ + }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] = model.getRGB(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 if(model == cm && model.getTransferType() == DataBuffer.TYPE_BYTE && - raster.getNumDataElements() == 1){ + }else if(model == cm && model.getTransferType() == DataBuffer.TYPE_BYTE && + raster.getNumDataElements() == 1){ - 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){ + 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 && + 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 +315,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 +356,12 @@ // 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 | - ImageObserver.ALLBITS)) != 0 ) { - stopProduction(); - observers.removeAllElements(); - } + imageUpdate(flag); + } - public /*synchronized*/ BufferedImage getBufferedImage(){ + public BufferedImage getBufferedImage(){ if(image == null){ ColorModel model = getColorModel(); WritableRaster wr = getRaster(); @@ -367,37 +372,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 +412,47 @@ return imageState; } - private /*synchronized*/ void addObserver(ImageObserver observer){ + private void addObserver(ImageObserver observer){ if(observer != null){ - if(observers.contains(observer)) { - return; + 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); + } } - 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); - } } - 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); + private void stopProduction(){ + synchronized(this){ + producing = false; + synchronized (observers) { + observers.clear(); + } + src.removeConsumer(this); + } } private void createRaster(){ @@ -455,17 +473,37 @@ 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 i = observers.iterator(); i.hasNext();) { + try { + observer = i.next(); + } catch (ConcurrentModificationException e) { + i = observers.iterator(); + continue; + } + observer.imageUpdate(this, imageState, x, y, width, height); } + if((imageState & (ImageObserver.ERROR | ImageObserver.ABORT | + ImageObserver.ALLBITS)) != 0 ) { + + stopProduction(); + } -// notifyAll(); } private void forceToIntARGB(){ @@ -513,6 +551,7 @@ } cm = rgbCM; raster = destRaster; + surfData = ba.getData(raster.getDataBuffer()); isIntRGB = true; } } Index: modules/awt/src/main/java/common/java/awt/Component.java =================================================================== --- modules/awt/src/main/java/common/java/awt/Component.java (revision 578006) +++ modules/awt/src/main/java/common/java/awt/Component.java (working copy) @@ -3689,9 +3689,9 @@ if (g == null) { return; } - initGraphics(g, event); if (!getIgnoreRepaint()) { if (event.getID() == PaintEvent.PAINT) { + initGraphics(g, event); paint(g); } else { update(g); Index: modules/awt/src/main/native/gl/shared/pngdecoder.c =================================================================== --- modules/awt/src/main/native/gl/shared/pngdecoder.c (revision 577673) +++ modules/awt/src/main/native/gl/shared/pngdecoder.c (working copy) @@ -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 || Index: modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/GDIBlitter.java =================================================================== --- modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/GDIBlitter.java (revision 582226) +++ modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/GDIBlitter.java (working copy) @@ -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,