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 2007/10/27 21:34:31 UTC
svn commit: r589194 - in
/harmony/enhanced/classlib/trunk/modules/awt/src/main:
java/common/org/apache/harmony/awt/gl/
java/common/org/apache/harmony/awt/gl/image/
java/common/org/apache/harmony/awt/gl/render/
java/windows/org/apache/harmony/awt/gl/win...
Author: apetrenko
Date: Sat Oct 27 12:34:30 2007
New Revision: 589194
URL: http://svn.apache.org/viewvc?rev=589194&view=rev
Log:
Patch for HARMONY-5026 "[classlib][awt] Performance improvement for Big
Image drawing"
Modified:
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/ImageSurface.java
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/Surface.java
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/GifDecoder.java
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/JpegDecoder.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/common/org/apache/harmony/awt/gl/image/PngDecoder.java
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/NativeImageBlitter.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/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.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/windows/GDIBlitter.cpp
harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/GDIBlitter.h
harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_GDIBlitter.h
harmony/enhanced/classlib/trunk/modules/awt/src/main/native/jpegdecoder/shared/JPEGDecoder.h
harmony/enhanced/classlib/trunk/modules/awt/src/main/native/jpegdecoder/shared/JpegDecoder.c
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/ImageSurface.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/ImageSurface.java?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/ImageSurface.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/ImageSurface.java Sat Oct 27 12:34:30 2007
@@ -22,12 +22,14 @@
*/
package org.apache.harmony.awt.gl;
+import java.awt.Rectangle;
import java.awt.color.ColorSpace;
import java.awt.image.BandedSampleModel;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.ComponentSampleModel;
+import java.awt.image.DataBuffer;
import java.awt.image.DirectColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.MultiPixelPackedSampleModel;
@@ -59,6 +61,8 @@
private long cachedDataPtr; // Pointer for cached Image Data
private boolean alphaPre; // Cached Image Data alpha premultiplied
+
+ AwtImageBackdoorAccessor ba = AwtImageBackdoorAccessor.getInstance();
public ImageSurface(ColorModel cm, WritableRaster raster){
this(cm, raster, Surface.getType(cm, raster));
@@ -73,12 +77,14 @@
this.raster = raster;
surfaceType = type;
- data = AwtImageBackdoorAccessor.getInstance().
- getData(raster.getDataBuffer());
+ DataBuffer db = raster.getDataBuffer();
+ data = ba.getData(db);
+ ba.addDataBufferListener(db, this);
ColorSpace cs = cm.getColorSpace();
transparency = cm.getTransparency();
width = raster.getWidth();
height = raster.getHeight();
+ addDirtyRegion(new Rectangle(0, 0, width, height));
// For the moment we can build natively only images which have
// sRGB, Linear_RGB, Linear_Gray Color Space and type different
@@ -97,6 +103,7 @@
if(type == BufferedImage.TYPE_CUSTOM){
nativeDrawable = false;
}
+
}
@Override
@@ -219,6 +226,7 @@
@Override
public synchronized void dispose() {
+ ba.removeDataBufferListener(raster.getDataBuffer());
if(surfaceDataPtr != 0L){
dispose(surfaceDataPtr);
surfaceDataPtr = 0L;
@@ -256,7 +264,9 @@
*/
public void setRaster(WritableRaster r) {
raster = r;
- data = AwtImageBackdoorAccessor.getInstance().getData(r.getDataBuffer());
+ DataBuffer db = r.getDataBuffer();
+ data = ba.getData(db);
+ ba.addDataBufferListener(db, this);
if (surfaceDataPtr != 0) {
setImageSize(surfaceDataPtr, r.getWidth(), r.getHeight());
}
@@ -313,11 +323,12 @@
AwtImageBackdoorAccessor ba = AwtImageBackdoorAccessor.getInstance();
ba.validate(raster.getDataBuffer());
}
+ releaseDurtyRegions();
}
@Override
public boolean invalidated(){
- return needToRefresh;
+ return needToRefresh | dataTaken;
}
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/Surface.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/Surface.java?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/Surface.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/Surface.java Sat Oct 27 12:34:30 2007
@@ -23,6 +23,7 @@
package org.apache.harmony.awt.gl;
import java.awt.Image;
+import java.awt.Rectangle;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
@@ -90,6 +91,8 @@
protected int transparency = OPAQUE;
protected int width;
protected int height;
+
+ protected MultiRectArea dirtyRegions;
/**
* This list contains caches with the data of this surface that are valid at the moment.
@@ -171,6 +174,28 @@
public void validate(){}
public void invalidate(){}
+
+ public void addDirtyRegion(Rectangle r){
+ if (dirtyRegions == null) {
+ dirtyRegions = new MultiRectArea(r);
+ } else {
+ Rectangle rects[] = dirtyRegions.getRectangles();
+ if (rects.length == 1){
+ if (rects[0].contains(r)) return;
+ }
+ dirtyRegions.add(r);
+ }
+ invalidate();
+ }
+
+ public void releaseDurtyRegions(){
+ dirtyRegions = null;
+ }
+
+ public int[] getDirtyRegions(){
+ if(dirtyRegions != null) return dirtyRegions.rect;
+ else return null;
+ }
/**
* Computation type of BufferedImage or Surface
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/GifDecoder.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/GifDecoder.java?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/GifDecoder.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/GifDecoder.java Sat Oct 27 12:34:30 2007
@@ -54,8 +54,10 @@
static final int IMPOSSIBLE_VALUE = 0x0FFFFFFF;
// I/O buffer
- private static final int BUFFER_SIZE = 1024;
- private byte buffer[] = new byte[BUFFER_SIZE];
+ private static final int MIN_BUFFER_SIZE = 1024;
+ private static final int MAX_BUFFER_SIZE = 2097152;
+ private int buffer_size;
+ private byte buffer[];
GifDataStream gifDataStream = new GifDataStream();
GifGraphicBlock currBlock;
@@ -79,6 +81,19 @@
public GifDecoder(DecodingImageSource src, InputStream is) {
super(src, is);
+ try {
+ int available_bytes = is.available();
+ if (available_bytes < MIN_BUFFER_SIZE) {
+ buffer_size = MIN_BUFFER_SIZE;
+ } else if (available_bytes > MAX_BUFFER_SIZE) {
+ buffer_size = MAX_BUFFER_SIZE;
+ } else {
+ buffer_size = available_bytes;
+ }
+ } catch (IOException e) {
+ buffer_size = MIN_BUFFER_SIZE;
+ }
+ buffer = new byte[buffer_size];
}
private static native int[] toRGB(byte imageData[], byte colormap[], int transparentColor);
@@ -168,7 +183,7 @@
// Read from the input stream
for (;;) {
- needBytes = BUFFER_SIZE - bytesInBuffer;
+ needBytes = buffer_size - bytesInBuffer;
offset = bytesInBuffer;
bytesRead = inputStream.read(buffer, offset, needBytes);
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/JpegDecoder.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/JpegDecoder.java?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/JpegDecoder.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/JpegDecoder.java Sat Oct 27 12:34:30 2007
@@ -48,8 +48,10 @@
hintflagsProgressive;
// Buffer for the stream
- private static final int BUFFER_SIZE = 1024;
- private byte buffer[] = new byte[BUFFER_SIZE];
+ private static final int MIN_BUFFER_SIZE = 1024;
+ private static final int MAX_BUFFER_SIZE = 2097152;
+ private int buffer_size;
+ private byte buffer[];
// 3 possible color models only
private static ColorModel cmRGB;
@@ -96,6 +98,19 @@
public JpegDecoder(DecodingImageSource src, InputStream is) {
super(src, is);
+ try {
+ int available_bytes = is.available();
+ if (available_bytes < MIN_BUFFER_SIZE) {
+ buffer_size = MIN_BUFFER_SIZE;
+ } else if (available_bytes > MAX_BUFFER_SIZE) {
+ buffer_size = MAX_BUFFER_SIZE;
+ } else {
+ buffer_size = available_bytes;
+ }
+ } catch (IOException e) {
+ buffer_size = MIN_BUFFER_SIZE;
+ }
+ buffer = new byte[buffer_size];
}
/*
@@ -125,7 +140,7 @@
int intOut[] = null;
// Read from the input stream
for (;;) {
- needBytes = BUFFER_SIZE - bytesInBuffer;
+ needBytes = buffer_size - bytesInBuffer;
offset = bytesInBuffer;
bytesRead = inputStream.read(buffer, offset, needBytes);
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=589194&r1=589193&r2=589194&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 Sat Oct 27 12:34:30 2007
@@ -26,6 +26,7 @@
import java.awt.Graphics;
import java.awt.Image;
+import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
@@ -68,7 +69,6 @@
private boolean producing;
private boolean done;
private ImageSurface imageSurf;
- Object surfData;
AwtImageBackdoorAccessor ba = AwtImageBackdoorAccessor.getInstance();
@@ -134,6 +134,7 @@
synchronized (this) {
imageState = 0;
image = null;
+ imageSurf = null;
cm = null;
raster = null;
hints = 0;
@@ -184,13 +185,16 @@
forceToIntARGB();
}
+ DataBuffer db = raster.getDataBuffer();
+ Object surfData = ba.getData(db);
+
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();
+ DataBufferInt dbi = (DataBufferInt) db;
int rof = dbi.getOffset() + y * scanline + x;
for(int lineOff = off, line = y; line < y + h;
line++, lineOff += scansize, rof += scanline){
@@ -202,7 +206,7 @@
int buff[] = new int[w];
int data[] = (int[])surfData;
int scanline = raster.getWidth();
- DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer();
+ DataBufferInt dbi = (DataBufferInt) db;
int rof = dbi.getOffset() + y * scanline + x;
for (int sy = y, sOff = off; sy < y + h; sy++, sOff += scansize,
rof += scanline) {
@@ -223,9 +227,10 @@
}
}
}
-
+
+ ba.releaseData(db);
if (imageSurf != null) {
- imageSurf.invalidate();
+ imageSurf.addDirtyRegion(new Rectangle(x, y, w, h));
}
imageUpdate(ImageObserver.SOMEBITS);
@@ -251,6 +256,9 @@
forceToIntARGB();
}
+ DataBuffer db = raster.getDataBuffer();
+ Object surfData = ba.getData(db);
+
synchronized(surfData){
if(isIntRGB){
int buff[] = new int[w];
@@ -259,7 +267,7 @@
icm.getRGBs(colorMap);
int data[] = (int[])surfData;
int scanline = raster.getWidth();
- DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer();
+ DataBufferInt dbi = (DataBufferInt) db;
int rof = dbi.getOffset() + y * scanline + x;
if(model instanceof IndexColorModel){
@@ -285,7 +293,7 @@
byte data[] = (byte[])surfData;
int scanline = raster.getWidth();
- DataBufferByte dbb = (DataBufferByte)raster.getDataBuffer();
+ DataBufferByte dbb = (DataBufferByte) db;
int rof = dbb.getOffset() + y * scanline + x;
for(int lineOff = off, line = y; line < y + h;
line++, lineOff += scansize, rof += scanline){
@@ -310,8 +318,9 @@
}
}
+ ba.releaseData(db);
if (imageSurf != null) {
- imageSurf.invalidate();
+ imageSurf.addDirtyRegion(new Rectangle(x, y, w, h));
}
imageUpdate(ImageObserver.SOMEBITS);
@@ -475,7 +484,6 @@
raster = cm.createCompatibleWritableRaster(width, height);
isIntRGB = true;
}
- surfData = ba.getData(raster.getDataBuffer());
}
private void imageUpdate(int state){
@@ -548,7 +556,6 @@
}
cm = rgbCM;
raster = destRaster;
- surfData = ba.getData(raster.getDataBuffer());
isIntRGB = true;
}
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/PngDecoder.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/PngDecoder.java?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/PngDecoder.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/image/PngDecoder.java Sat Oct 27 12:34:30 2007
@@ -57,8 +57,10 @@
// Each pixel is an R,G,B triple, followed by an alpha sample.
private static final int PNG_COLOR_TYPE_RGBA = 6;
- private static final int INPUT_BUFFER_SIZE = 4096;
- private byte buffer[] = new byte[INPUT_BUFFER_SIZE];
+ private static final int MIN_BUFFER_SIZE = 4096;
+ private static final int MAX_BUFFER_SIZE = 2097152;
+ private int buffer_size;
+ private byte buffer[];
// Buffers for decoded image data
byte byteOut[];
@@ -86,6 +88,19 @@
public PngDecoder(DecodingImageSource src, InputStream is) {
super(src, is);
+ try {
+ int available_bytes = is.available();
+ if (available_bytes < MIN_BUFFER_SIZE) {
+ buffer_size = MIN_BUFFER_SIZE;
+ } else if (available_bytes > MAX_BUFFER_SIZE) {
+ buffer_size = MAX_BUFFER_SIZE;
+ } else {
+ buffer_size = available_bytes;
+ }
+ } catch (IOException e) {
+ buffer_size = MIN_BUFFER_SIZE;
+ }
+ buffer = new byte[buffer_size];
}
@Override
@@ -95,7 +110,7 @@
int needBytes, offset, bytesInBuffer = 0;
// Read from the input stream
for (;;) {
- needBytes = INPUT_BUFFER_SIZE - bytesInBuffer;
+ needBytes = buffer_size - bytesInBuffer;
offset = bytesInBuffer;
bytesRead = inputStream.read(buffer, offset, needBytes);
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/NativeImageBlitter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/NativeImageBlitter.java?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/NativeImageBlitter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/org/apache/harmony/awt/gl/render/NativeImageBlitter.java Sat Oct 27 12:34:30 2007
@@ -25,6 +25,7 @@
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
+import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
@@ -151,15 +152,13 @@
dstX, dstY, dstSurfStruct, dstData,
width, height, bgcolor.getRGB(),
compType, alpha, clipRects, srcSurf.invalidated());
- dstSurf.invalidate();
- srcSurf.validate();
+ dstSurf.addDirtyRegion(new Rectangle(dstX, dstY, width, height));
}else{
blt(srcX, srcY, srcSurfStruct, srcData,
dstX, dstY, dstSurfStruct, dstData,
width, height, compType, alpha,
clipRects, srcSurf.invalidated());
- dstSurf.invalidate();
- srcSurf.validate();
+ dstSurf.addDirtyRegion(new Rectangle(dstX, dstY, width, height));
}
}else if(comp instanceof XORComposite){
XORComposite xcomp = (XORComposite) comp;
@@ -167,8 +166,7 @@
dstX, dstY, dstSurfStruct, dstData,
width, height, xcomp.getXORColor().getRGB(),
clipRects, srcSurf.invalidated());
- dstSurf.invalidate();
- srcSurf.validate();
+ dstSurf.addDirtyRegion(new Rectangle(dstX, dstY, width, height));
}else{
if(srcSurf instanceof ImageSurface){
JavaBlitter.inst.blit(srcX, srcY, srcSurf, dstX, dstY,
@@ -189,7 +187,6 @@
tmpSurfStruct, tmpData, w, h,
AlphaComposite.SRC_OVER,
1.0f, tmpClip, srcSurf.invalidated());
- srcSurf.validate();
JavaBlitter.inst.blit(srcX, srcY, tmpSurf, dstX, dstY,
dstSurf, width, height,
comp, bgcolor, clip);
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=589194&r1=589193&r2=589194&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 Sat Oct 27 12:34:30 2007
@@ -102,19 +102,24 @@
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;
+
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());
+ srcSurf.invalidated(), dirtyRegions, regCount);
}else{
bltBGImage(srcX, srcY, srcSurfStruct, srcSurf.getData(),
dstX, dstY, dstSurfStruct,
width, height, bgcolor.getRGB(),
compType, alpha, matrix, clipRects,
- numVertex, srcSurf.invalidated());
+ numVertex, srcSurf.invalidated(), dirtyRegions, regCount);
}
}
srcSurf.validate();
@@ -128,11 +133,17 @@
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());
+ matrix, clipRects, numVertex,
+ srcSurf.invalidated(), dirtyRegions, regCount);
}
srcSurf.validate();
}else{
@@ -175,13 +186,13 @@
Object srcData, int dstX, int dstY, long dstSurfDataPtr,
int width, int height, int bgcolor,
int compType, float alpha, double matrix[],
- int clip[], int numVertex, boolean invalidated);
+ int clip[], int numVertex, boolean invalidated, int[] dirtyRegions, int regCount);
private native void bltImage(int srcX, int srcY, long srsSurfDataPtr,
Object srcData, int dstX, int dstY, long dstSurfDataPtr,
int width, int height, int compType,
float alpha, double matrix[],
- int clip[], int numVertex, boolean invalidated);
+ int clip[], int numVertex, boolean invalidated, int[] dirtyRegions, int regCount);
private native void bltBitmap(int srcX, int srcY, long srsSurfDataPtr,
int dstX, int dstY, long dstSurfDataPtr,
@@ -192,7 +203,7 @@
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 clip[], int numVertex, boolean invalidated, int[] dirtyRegions, int regCount);
private native void xorBitmap(int srcX, int srcY, long srsSurfDataPtr,
int dstX, int dstY, long dstSurfDataPtr,
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinVolatileImage.java Sat Oct 27 12:34:30 2007
@@ -156,6 +156,7 @@
WinGDIPGraphics2D.disposeGraphicsInfo(gi);
gi = 0;
}
+ if (surface != null) surface.dispose();
super.flush();
}
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=589194&r1=589193&r2=589194&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 Sat Oct 27 12:34:30 2007
@@ -68,11 +68,11 @@
}
inline void updateCache
-(SURFACE_STRUCTURE *srcSurf, JNIEnv *env, jobject srcData, bool alphaPre){
+(SURFACE_STRUCTURE *srcSurf, JNIEnv *env, jobject srcData, bool alphaPre, int x, int y, int width, int height){
- unsigned int srcstride, dststride, offset;
- unsigned int h = srcSurf->height;
- unsigned int w = srcSurf->width;
+ int src_stride, dst_stride, src_offset, dst_offset;
+ int h = height;
+ int w = width;
void *bmpDataPtr = srcSurf->bmpData;
void *srcDataPtr = env->GetPrimitiveArrayCritical((jarray)srcData, 0);
@@ -81,22 +81,18 @@
case INT_RGB:
{
- unsigned int *src, *s, *dst, *d;
+ unsigned int *src, *dst;
- srcstride = srcSurf->scanline_stride;
- dststride = w;
+ src_stride = srcSurf->scanline_stride;
+ dst_stride = srcSurf->width;
- offset = w - 1;
- src = (unsigned int *)srcDataPtr + offset;
- dst = (unsigned int *)bmpDataPtr + offset;
+ src_offset = y * src_stride + x;
+ dst_offset = y * dst_stride + x;
+ src = (unsigned int *)srcDataPtr + src_offset;
+ dst = (unsigned int *)bmpDataPtr + dst_offset;
- for(int y = h; y > 0; y--, src += srcstride, dst += dststride){
- s = src;
- d = dst;
-
- for(int x = w; x > 0 ; x--){
- *d-- = 0xff000000 | *s--;
- }
+ for(int _y = 0; _y < h; _y++, src += src_stride, dst += dst_stride){
+ memcpy(dst, src, w * sizeof(int));
}
}
break;
@@ -105,19 +101,20 @@
{
unsigned char *src, *s, *dst, *d, sa;
- offset = (w << 2) - 1;
- src = (unsigned char *)srcDataPtr + offset;
- dst = (unsigned char *)bmpDataPtr + offset;
+ src_stride = srcSurf->scanline_stride_byte;
+ dst_stride = srcSurf->width << 2;
- srcstride = srcSurf->scanline_stride_byte;
- dststride = w << 2;
+ src_offset = y * src_stride + ((x + w) << 2) - 1;
+ dst_offset = y * dst_stride + ((x + w) << 2) - 1;
+ src = (unsigned char *)srcDataPtr + src_offset;
+ dst = (unsigned char *)bmpDataPtr + dst_offset;
if(alphaPre){
- for(int y = h; y > 0 ; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0 ; x--){
+ for(int _x = w; _x > 0; _x--){
sa = *s--;
*d-- = sa;
if(sa != 255){
@@ -134,11 +131,11 @@
}
srcSurf->isAlphaPre = true;
}else{
- for(int y = h; y > 0 ; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0 ; x--){
+ for(int _x = w; _x > 0; _x--){
sa = *s--;
if(sa == 0){
*d-- = 0;
@@ -163,19 +160,20 @@
{
unsigned char *src, *s, *dst, *d, sa;
- offset = (w << 2) - 1;
- src = (unsigned char *)srcDataPtr + offset;
- dst = (unsigned char *)bmpDataPtr + offset;
+ src_stride = srcSurf->scanline_stride_byte;
+ dst_stride = srcSurf->width << 2;
- srcstride = srcSurf->scanline_stride_byte;
- dststride = w << 2;
+ src_offset = y * src_stride + ((x + w) << 2) - 1;
+ dst_offset = y * dst_stride + ((x + w) << 2) - 1;
+ src = (unsigned char *)srcDataPtr + src_offset;
+ dst = (unsigned char *)bmpDataPtr + dst_offset;
if(alphaPre){
- for(int y = h; y > 0; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0 ; x--){
+ for(int _x = w; _x > 0; _x--){
sa = *s--;
*d-- = sa;
*d-- = *s--;
@@ -188,11 +186,11 @@
}
srcSurf->isAlphaPre = true;
}else{
- for(int y = h; y > 0 ; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0 ; x--){
+ for(int _x = w; _x > 0; _x--){
sa = *s--;
*d-- = sa;
*d-- = DIV(sa, *s--);
@@ -209,18 +207,19 @@
{
unsigned char *src, *s, *dst, *d;
- offset = (w << 2) - 1;
- src = (unsigned char *)srcDataPtr + offset;
- dst = (unsigned char *)bmpDataPtr + offset;
+ src_stride = srcSurf->scanline_stride_byte;
+ dst_stride = srcSurf->width << 2;
- srcstride = srcSurf->scanline_stride_byte;
- dststride = w << 2;
-
- for(int y = h; y > 0; y--, src += srcstride, dst += dststride){
+ src_offset = y * src_stride + ((x + w) << 2) - 1;
+ dst_offset = y * dst_stride + ((x + w) << 2) - 1;
+ src = (unsigned char *)srcDataPtr + src_offset;
+ dst = (unsigned char *)bmpDataPtr + dst_offset;
+
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0 ; x--){
+ for(int _x = w; _x > 0; _x--){
*d = 255;
*s--;
*(d - 3) = *s--;
@@ -236,19 +235,19 @@
{
unsigned char *src, *s, *dst, *d;
- offset = (w << 2) - 1;
- unsigned int srcOffset = w * 3 - 1;
- src = (unsigned char *)srcDataPtr + srcOffset;
- dst = (unsigned char *)bmpDataPtr + offset;
+ src_stride = srcSurf->scanline_stride_byte;
+ dst_stride = srcSurf->width << 2;
- srcstride = srcSurf->scanline_stride_byte;
- dststride = w << 2;
+ src_offset = y * src_stride + (x + w) * 3 - 1;
+ dst_offset = y * dst_stride + ((x + w) << 2) - 1;
+ src = (unsigned char *)srcDataPtr + src_offset;
+ dst = (unsigned char *)bmpDataPtr + dst_offset;
- for(int y = srcSurf->height; y > 0; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0 ; x--){
+ for(int _x = w; _x > 0; _x--){
*d-- = 255;
*d-- = *s--;
*d-- = *s--;
@@ -262,19 +261,20 @@
{
unsigned char *src, *s, *dst, *d, a, r, g, b;
- offset = (w << 2) - 1;
- src = (unsigned char *)srcDataPtr + offset;
- dst = (unsigned char *)bmpDataPtr + offset;
+ src_stride = srcSurf->scanline_stride_byte;
+ dst_stride = srcSurf->width << 2;
- srcstride = srcSurf->scanline_stride_byte;
- dststride = w << 2;
+ src_offset = y * src_stride + ((x + w) << 2) - 1;
+ dst_offset = y * dst_stride + ((x + w) << 2) - 1;
+ src = (unsigned char *)srcDataPtr + src_offset;
+ dst = (unsigned char *)bmpDataPtr + dst_offset;
if(alphaPre){
- for(int y = h; y > 0 ; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0 ; x--){
+ for(int _x = w; _x > 0; _x--){
r = *s--;
g = *s--;
b = *s--;
@@ -294,11 +294,11 @@
}
srcSurf->isAlphaPre = true;
}else{
- for(int y = h; y > 0 ; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0 ; x--){
+ for(int _x = w; _x > 0; _x--){
r = *s--;
g = *s--;
b = *s--;
@@ -325,19 +325,20 @@
{
unsigned char *src, *s, *dst, *d, a, r, g, b;
- offset = (w << 2) - 1;
- src = (unsigned char *)srcDataPtr + offset;
- dst = (unsigned char *)bmpDataPtr + offset;
+ src_stride = srcSurf->scanline_stride_byte;
+ dst_stride = srcSurf->width << 2;
- srcstride = srcSurf->scanline_stride_byte;
- dststride = w << 2;
+ src_offset = y * src_stride + ((x + w) << 2) - 1;
+ dst_offset = y * dst_stride + ((x + w) << 2) - 1;
+ src = (unsigned char *)srcDataPtr + src_offset;
+ dst = (unsigned char *)bmpDataPtr + dst_offset;
if(alphaPre){
- for(int y = h; y > 0 ; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0 ; x--){
+ for(int _x = w; _x > 0; _x--){
r = *s--;
g = *s--;
b = *s--;
@@ -353,11 +354,11 @@
}
srcSurf->isAlphaPre = true;
}else{
- for(int y = h; y > 0 ; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0 ; x--){
+ for(int _x = w; _x > 0; _x--){
r = *s--;
g = *s--;
b = *s--;
@@ -385,14 +386,6 @@
unsigned char *dst, *d;
unsigned short *src, *s, pixel;
- offset = (w << 2) - 1;
- unsigned int srcOffset = w - 1;
- src = (unsigned short *)srcDataPtr + srcOffset;
- dst = (unsigned char *)bmpDataPtr + offset;
-
- srcstride = srcSurf->scanline_stride;
- dststride = w << 2;
-
unsigned int mr = srcSurf->max_red;
unsigned int mg = srcSurf->max_green;
unsigned int mb = srcSurf->max_red;
@@ -403,10 +396,18 @@
unsigned int gs = srcSurf->green_sht;
unsigned int bs = srcSurf->blue_sht;
- for(int y = h; y > 0; y--, src += srcstride, dst += dststride){
+ src_stride = srcSurf->scanline_stride;
+ dst_stride = srcSurf->width << 2;
+
+ src_offset = y * src_stride + x + w - 1;
+ dst_offset = y * dst_stride + ((x + w) << 2) - 1;
+ src = (unsigned short *)srcDataPtr + src_offset;
+ dst = (unsigned char *)bmpDataPtr + dst_offset;
+
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
d = dst;
s = src;
- for(int x = w; x > 0; x--){
+ for(int _x = w; _x > 0; _x--){
pixel = *s--;
*d-- = 255;
*d-- = DIV(mb, ((pixel & rm) >> rs));
@@ -422,16 +423,18 @@
unsigned char *dst, *d, pixel;
unsigned short *src, *s;
- src = (unsigned short *)srcDataPtr;
- dst = (unsigned char *)bmpDataPtr;
+ src_stride = srcSurf->scanline_stride;
+ dst_stride = srcSurf->width << 2;
- srcstride = srcSurf->scanline_stride;
- dststride = w << 2;
+ src_offset = y * src_stride + (x << 1);
+ dst_offset = y * dst_stride + (x << 2);
+ src = (unsigned short *)srcDataPtr + src_offset;
+ dst = (unsigned char *)bmpDataPtr + dst_offset;
- for(int y = h; y > 0; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0; x--){
+ for(int _x = w; _x > 0; _x--){
pixel = (unsigned char)(*s++ / 257);
*d++ = pixel;
*d++ = pixel;
@@ -447,19 +450,21 @@
unsigned char *src, *s;
unsigned int *dst, *d, pixel, bitnum, elem, shift, bitMask;
- src = (unsigned char *)srcDataPtr;
- dst = (unsigned int *)bmpDataPtr;
-
- srcstride = srcSurf->scanline_stride;
- dststride = w;
-
unsigned int pixelBits = srcSurf->pixel_stride;
int *cm = srcSurf->colormap;
- for(int y = h; y > 0; y--, src += srcstride, dst += dststride){
+ src_stride = srcSurf->scanline_stride;
+ dst_stride = srcSurf->width;
+
+ src_offset = y * src_stride;
+ dst_offset = y * dst_stride + x;
+ src = (unsigned char *)srcDataPtr + src_offset;
+ dst = (unsigned int *)bmpDataPtr + dst_offset;
+
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
d = dst;
- for(unsigned int x = 0; x < w; x++){
+ for(int _x = 0; _x < w; _x++){
bitnum = x * pixelBits;
s = src + bitnum / 8;
elem = *s;
@@ -477,31 +482,33 @@
int transparency = srcSurf->transparency;
unsigned char *src, *s;
unsigned int *dst, *d, pixel, r, g, b, a;
-
- unsigned int offset = w - 1;
- src = (unsigned char *)srcDataPtr + offset;
- dst = (unsigned int *)bmpDataPtr + offset;
-
- srcstride = srcSurf->scanline_stride;
- dststride = w;
int *cm = srcSurf->colormap;
int tp = srcSurf->transparent_pixel;
+ src_stride = srcSurf->scanline_stride;
+ dst_stride = srcSurf->width;
+
+ src_offset = y * src_stride + x + w - 1;
+ dst_offset = y * dst_stride + x + w - 1;
+ src = (unsigned char *)srcDataPtr + src_offset;
+ dst = (unsigned int *)bmpDataPtr + dst_offset;
+
+
if(transparency == GL_OPAQUE){
- for(int y = h; y > 0; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0; x--){
+ for(int _x = w; _x > 0; _x--){
*d-- = 0xff000000 | *(cm + *s--);
}
}
}else if(transparency == GL_BITMASK){
- for(int y = h; y > 0; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0; x--){
+ for(int _x = w; _x > 0; _x--){
pixel = *s--;
if(pixel != tp){
*d-- = 0xff000000 | *(cm + pixel);
@@ -512,11 +519,11 @@
}
}
}else{
- for(int y = h; y > 0; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = w; x > 0; x--){
+ for(int _x = w; _x > 0; _x--){
pixel = *(cm + *s--);
a = (pixel >> 24) & 0xff;
if(alphaPre){
@@ -546,18 +553,19 @@
case BYTE_GRAY:
{
unsigned char *src, *s, *dst, *d, pixel;
+ src_stride = srcSurf->scanline_stride;
+ dst_stride = srcSurf->width << 2;
- src = (unsigned char *)srcDataPtr;
- dst = (unsigned char *)bmpDataPtr;
-
- srcstride = srcSurf->scanline_stride;
- dststride = w << 2;
+ src_offset = y * src_stride + x;
+ dst_offset = y * dst_stride + (x << 2);
+ src = (unsigned char *)srcDataPtr + src_offset;
+ dst = (unsigned char *)bmpDataPtr + dst_offset;
- for(int y = h; y > 0; y--, src += srcstride, dst += dststride){
+ for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){
s = src;
d = dst;
- for(int x = srcSurf->width; x > 0; x--){
+ for(int _x = w; _x > 0; _x--){
pixel = *s++;
*d++ = pixel;
*d++ = pixel;
@@ -716,7 +724,7 @@
SURFACE_STRUCTURE *surf = (SURFACE_STRUCTURE *)ptr;
jlong cachePtr = 0;
if(surf != NULL){
- updateCache(surf, env, data, alphaPre != 0);
+ updateCache(surf, env, data, alphaPre != 0, 0, 0, surf->width, surf->height);
cachePtr = (jlong)surf->bmpData;
}
return cachePtr;
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=589194&r1=589193&r2=589194&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 Sat Oct 27 12:34:30 2007
@@ -162,6 +162,6 @@
int parseMask(unsigned int, int *, int *);
int getShift(unsigned int);
-extern inline void updateCache(SURFACE_STRUCTURE *, JNIEnv *, jobject, bool);
+extern inline void updateCache(SURFACE_STRUCTURE *, JNIEnv *, jobject, bool, int, int, int, int);
#endif
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/GDIBlitter.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/GDIBlitter.cpp?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/GDIBlitter.cpp (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/GDIBlitter.cpp Sat Oct 27 12:34:30 2007
@@ -39,14 +39,14 @@
JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_windows_GDISurface_dispose
(JNIEnv *env, jobject obj, jlong surfDataPtr){
- free((void *)surfDataPtr);
+ if(surfDataPtr) free((void *)surfDataPtr);
}
JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_windows_GDIBlitter_bltBGImage
(JNIEnv *env, jobject obj, jint srcX, jint srcY, jlong srcSurfStruct, jobject srcData,
jint dstX, jint dstY, jlong dstSurfStruct, jint width, jint height,
- jint bgcolor, jint compType, jfloat alpha, jdoubleArray matrix,
- jintArray clip, jint numVertex, jboolean invalidated){
+ jint bgcolor, jint compType, jfloat alpha, jdoubleArray matrix, jintArray clip,
+ jint numVertex, jboolean invalidated, jintArray dirtyRegions, jint regCount){
SURFACE_STRUCTURE *srcSurf = (SURFACE_STRUCTURE *)srcSurfStruct;
SURFACE_STRUCTURE *dstSurf = (SURFACE_STRUCTURE *)dstSurfStruct;
@@ -69,7 +69,23 @@
HBRUSH brush = CreateSolidBrush(RGB(r, g, b));
SelectObject(tmpDC, brush);
PatBlt(tmpDC, 0, 0, w, h, PATCOPY);
- if(initBitmap(srcSurf, env, srcData, true)){
+
+ int count;
+ int *regions;
+ if(dirtyRegions == 0){
+ regCount = 1;
+ regions = (int *)malloc(4 * sizeof(int));
+ regions[0] = 0;
+ regions[1] = 0;
+ regions[2] = srcSurf->width - 1;
+ regions[3] = srcSurf->height - 1;
+ } else {
+ count = regCount;
+ regions = (int *)malloc(count * sizeof(int));
+ env->GetIntArrayRegion(dirtyRegions, 1, count, regions);
+ }
+
+ if(initBitmap(srcSurf, env, srcData, true, regions, count)){
BLENDFUNCTION bf;
bf.AlphaFormat = AC_SRC_ALPHA;
bf.BlendOp = AC_SRC_OVER;
@@ -184,8 +200,8 @@
JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_windows_GDIBlitter_bltImage
(JNIEnv *env, jobject obj, jint srcX, jint srcY, jlong srcSurfStruct, jobject srcData,
jint dstX, jint dstY, jlong dstSurfStruct, jint width, jint height,
- jint compType, jfloat alpha, jdoubleArray matrix,
- jintArray clip, jint numVertex, jboolean invalidated){
+ jint compType, jfloat alpha, jdoubleArray matrix, jintArray clip,
+ jint numVertex, jboolean invalidated, jintArray dirtyRegions, jint regCount){
SURFACE_STRUCTURE *srcSurf = (SURFACE_STRUCTURE *)srcSurfStruct;
SURFACE_STRUCTURE *dstSurf = (SURFACE_STRUCTURE *)dstSurfStruct;
@@ -196,9 +212,24 @@
memset(&blitStruct, 0, sizeof(BLITSTRUCT));
srcSurf->invalidated = invalidated != 0;
+
+ int count;
+ int *regions;
+ if(dirtyRegions == 0){
+ regCount = 1;
+ regions = (int *)malloc(4 * sizeof(int));
+ regions[0] = 0;
+ regions[1] = 0;
+ regions[2] = srcSurf->width - 1;
+ regions[3] = srcSurf->height - 1;
+ } else {
+ count = regCount;
+ regions = (int *)malloc(count * sizeof(int));
+ env->GetIntArrayRegion(dirtyRegions, 1, count, regions);
+ }
- if(!initBlitData(srcSurf, env, srcData, compType, srca, &blitStruct)){
- return;
+ if(!initBlitData(srcSurf, env, srcData, compType, srca, &blitStruct, regions, count)){
+ return;
}
XFORM currentTransform, transform;
@@ -370,13 +401,29 @@
JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_windows_GDIBlitter_xorImage
(JNIEnv *env, jobject obj, jint srcX, jint srcY, jlong srcSurfStruct, jobject srcData,
jint dstX, jint dstY, jlong dstSurfStruct, jint width, jint height, jint xorcolor,
- jdoubleArray matrix, jintArray clip, jint numVertex, jboolean invalidated){
+ jdoubleArray matrix, jintArray clip, jint numVertex, jboolean invalidated,
+ jintArray dirtyRegions, jint regCount){
SURFACE_STRUCTURE *srcSurf = (SURFACE_STRUCTURE *)srcSurfStruct;
SURFACE_STRUCTURE *dstSurf = (SURFACE_STRUCTURE *)dstSurfStruct;
srcSurf->invalidated = invalidated != 0;
- if(!initBitmap(srcSurf, env, srcData, false)) return;
+
+ int count;
+ int *regions;
+ if(dirtyRegions == 0){
+ regCount = 1;
+ regions = (int *)malloc(4 * sizeof(int));
+ regions[0] = 0;
+ regions[1] = 0;
+ regions[2] = srcSurf->width - 1;
+ regions[3] = srcSurf->height - 1;
+ } else {
+ count = regCount;
+ regions = (int *)malloc(count * sizeof(int));
+ env->GetIntArrayRegion(dirtyRegions, 1, count, regions);
+ }
+ if(!initBitmap(srcSurf, env, srcData, true, regions, count)) return;
BYTE r = (BYTE)((xorcolor >> 16) & 0xff);
BYTE g = (BYTE)((xorcolor >> 8) & 0xff);
@@ -510,7 +557,7 @@
}
BOOL initBlitData
-(SURFACE_STRUCTURE *srcSurf, JNIEnv *env, jobject srcData, UINT compType, UCHAR srcConstAlpha, BLITSTRUCT *blitStruct){
+(SURFACE_STRUCTURE *srcSurf, JNIEnv *env, jobject srcData, UINT compType, UCHAR srcConstAlpha, BLITSTRUCT *blitStruct, int *dirtyRegions, int regCount){
switch(compType){
case COMPOSITE_CLEAR:
@@ -527,7 +574,7 @@
return true;
}
if(srcSurf->invalidated || srcSurf->isAlphaPre != false){
- if(!initBitmap(srcSurf, env, srcData, false)) return false;
+ if(!initBitmap(srcSurf, env, srcData, false, dirtyRegions, regCount)) return false;
}
blitStruct->blitFunctintType = BIT_BLT;
blitStruct->rastOp = SRCCOPY;
@@ -536,7 +583,7 @@
case COMPOSITE_SRC_OVER:
case COMPOSITE_SRC_ATOP:
if(srcSurf->invalidated || srcSurf->isAlphaPre != true){
- if(!initBitmap(srcSurf, env, srcData, true)) return false;
+ if(!initBitmap(srcSurf, env, srcData, true, dirtyRegions, regCount)) return false;
}
if(srcSurf->transparency != GL_OPAQUE || srcConstAlpha != 255){
blitStruct->blitFunctintType = ALPHA_BLEND;
@@ -581,17 +628,23 @@
}
BOOL initBitmap
-(SURFACE_STRUCTURE *srcSurf, JNIEnv *env, jobject srcData, bool alphaPre){
+(SURFACE_STRUCTURE *srcSurf, JNIEnv *env, jobject srcData, bool alphaPre, int *dirtyRegions, int regCount){
HBITMAP srcBmp = srcSurf->bitmap;
if(!srcBmp){
return false;
}
- updateCache(srcSurf, env, srcData, alphaPre);
- if(srcSurf->isTrueColor){
- SetDIBits(srcSurf->srcDC, srcSurf->bitmap, 0, srcSurf->height, srcSurf->bmpData, (BITMAPINFO *)&srcSurf->bmpInfo, DIB_RGB_COLORS);
- }else{
- GdiFlush();
+ for(int i = 0; i < regCount;){
+ int x = dirtyRegions[i++];
+ int y = dirtyRegions[i++];
+ int w = dirtyRegions[i++] - x + 1;
+ int h = dirtyRegions[i++] - y + 1;
+ updateCache(srcSurf, env, srcData, alphaPre, x, y, w, h);
+ if(srcSurf->isTrueColor){
+ SetDIBits(srcSurf->srcDC, srcSurf->bitmap, srcSurf->height - y - h, h, (int *)srcSurf->bmpData + y * srcSurf->width, (BITMAPINFO *)&srcSurf->bmpInfo, DIB_RGB_COLORS);
+ }else{
+ GdiFlush();
+ }
}
return true;
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/GDIBlitter.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/GDIBlitter.h?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/GDIBlitter.h (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/GDIBlitter.h Sat Oct 27 12:34:30 2007
@@ -38,10 +38,11 @@
void findNonExistColor(DWORD &, DWORD *, UINT);
BOOL isRepeatColor(UINT , DWORD *, UINT);
+
BOOL initBlitData(SURFACE_STRUCTURE *srcSurf, JNIEnv *env, jobject srcData, UINT compType,
- UCHAR srcConstAlpha, BLITSTRUCT *blitStruct);
+ UCHAR srcConstAlpha, BLITSTRUCT *blitStruct, int *, int);
-BOOL initBitmap(SURFACE_STRUCTURE *srcSurf, JNIEnv *env, jobject srcData, bool alphaPre);
+BOOL initBitmap(SURFACE_STRUCTURE *srcSurf, JNIEnv *env, jobject srcData, bool alphaPre, int *, int);
void CompositeBlt(HDC, jint, jint, jint, jint, SURFACE_STRUCTURE *, void *, jint, jint, UINT, UCHAR, PXFORM, PXFORM);
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_GDIBlitter.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_GDIBlitter.h?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_GDIBlitter.h (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/gl/windows/include/org_apache_harmony_awt_gl_windows_GDIBlitter.h Sat Oct 27 12:34:30 2007
@@ -47,11 +47,11 @@
jint, jint, jlong, jint, jint, jlong, jint, jint, jint, jdoubleArray, jintArray, jint);
/*
- * Method: org.apache.harmony.awt.gl.windows.GDIBlitter.xorImage(IIJLjava/lang/Object;IIJIII[D[IIZ)V
+ * Method: org.apache.harmony.awt.gl.windows.GDIBlitter.xorImage(IIJLjava/lang/Object;IIJIII[D[IIZ[II)V
*/
JNIEXPORT void JNICALL
Java_org_apache_harmony_awt_gl_windows_GDIBlitter_xorImage(JNIEnv *, jobject,
- jint, jint, jlong, jobject, jint, jint, jlong, jint, jint, jint, jdoubleArray, jintArray, jint, jboolean);
+ jint, jint, jlong, jobject, jint, jint, jlong, jint, jint, jint, jdoubleArray, jintArray, jint, jboolean, jintArray, jint);
/*
* Method: org.apache.harmony.awt.gl.windows.GDIBlitter.bltBitmap(IIJIIJIIIF[D[II)V
@@ -61,18 +61,18 @@
jint, jint, jlong, jint, jint, jlong, jint, jint, jint, jfloat, jdoubleArray, jintArray, jint);
/*
- * Method: org.apache.harmony.awt.gl.windows.GDIBlitter.bltImage(IIJLjava/lang/Object;IIJIIIF[D[IIZ)V
+ * Method: org.apache.harmony.awt.gl.windows.GDIBlitter.bltImage(IIJLjava/lang/Object;IIJIIIF[D[IIZ[II)V
*/
JNIEXPORT void JNICALL
Java_org_apache_harmony_awt_gl_windows_GDIBlitter_bltImage(JNIEnv *, jobject,
- jint, jint, jlong, jobject, jint, jint, jlong, jint, jint, jint, jfloat, jdoubleArray, jintArray, jint, jboolean);
+ jint, jint, jlong, jobject, jint, jint, jlong, jint, jint, jint, jfloat, jdoubleArray, jintArray, jint, jboolean, jintArray, jint);
/*
- * Method: org.apache.harmony.awt.gl.windows.GDIBlitter.bltBGImage(IIJLjava/lang/Object;IIJIIIIF[D[IIZ)V
+ * Method: org.apache.harmony.awt.gl.windows.GDIBlitter.bltBGImage(IIJLjava/lang/Object;IIJIIIIF[D[IIZ[II)V
*/
JNIEXPORT void JNICALL
Java_org_apache_harmony_awt_gl_windows_GDIBlitter_bltBGImage(JNIEnv *, jobject,
- jint, jint, jlong, jobject, jint, jint, jlong, jint, jint, jint, jint, jfloat, jdoubleArray, jintArray, jint, jboolean);
+ jint, jint, jlong, jobject, jint, jint, jlong, jint, jint, jint, jint, jfloat, jdoubleArray, jintArray, jint, jboolean, jintArray, jint);
#ifdef __cplusplus
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/jpegdecoder/shared/JPEGDecoder.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/jpegdecoder/shared/JPEGDecoder.h?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/jpegdecoder/shared/JPEGDecoder.h (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/jpegdecoder/shared/JPEGDecoder.h Sat Oct 27 12:34:30 2007
@@ -33,7 +33,8 @@
#include "exceptions.h"
-#define MAX_BUFFER 32768
+#define MIN_BUFFER 32768
+#define MAX_BUFFER 33554432
jfieldID img_JPEG_imageWidthID;
jfieldID img_JPEG_imageHeightID;
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/native/jpegdecoder/shared/JpegDecoder.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/native/jpegdecoder/shared/JpegDecoder.c?rev=589194&r1=589193&r2=589194&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/native/jpegdecoder/shared/JpegDecoder.c (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/native/jpegdecoder/shared/JpegDecoder.c Sat Oct 27 12:34:30 2007
@@ -107,7 +107,10 @@
cinfo->src->bytes_in_buffer = (size_t) srcmgr->valid_buffer_length;
}
-GLOBAL(boolean) gl_jpeg_init_source_mgr(j_decompress_ptr cinfo) {
+GLOBAL(boolean) gl_jpeg_init_source_mgr(j_decompress_ptr cinfo, int bufferSize) {
+
+ int perfBufferSize;
+
gl_jpeg_source_mgr* mgr = (gl_jpeg_source_mgr*) cinfo->src;
// jpeg_source_mgr fields
mgr->base.init_source = gl_jpeg_dummy_decompress;
@@ -116,7 +119,15 @@
mgr->base.resync_to_restart = jpeg_resync_to_restart; // Use default
mgr->base.term_source = gl_jpeg_dummy_decompress;
- mgr->buffer_size = MAX_BUFFER;
+ perfBufferSize = bufferSize * 8;
+
+ if (perfBufferSize < MIN_BUFFER) {
+ mgr->buffer_size = MIN_BUFFER;
+ } else if (perfBufferSize > MAX_BUFFER){
+ mgr->buffer_size = MAX_BUFFER;
+ } else {
+ mgr->buffer_size = perfBufferSize;
+ }
mgr->jpeg_buffer = malloc(mgr->buffer_size);
if(!mgr->jpeg_buffer) {
return FALSE;
@@ -162,7 +173,7 @@
throwNewExceptionByName(env, "java/lang/OutOfMemoryError", "Out of memory");
}
-GLOBAL(void) gl_decompress_struct_init(gl_decompress_struct** glDecompressPtr) {
+GLOBAL(void) gl_decompress_struct_init(gl_decompress_struct** glDecompressPtr, int bufferSize) {
gl_decompress_struct* glDecompress = *glDecompressPtr;
if(glDecompress == NULL) { // Allocate new decompress struct
@@ -186,7 +197,7 @@
// Set up source manager
glDecompress->decompress.src = &(glDecompress->srcMgr.base);
- if(!gl_jpeg_init_source_mgr(&glDecompress->decompress)) { // Out of memory
+ if(!gl_jpeg_init_source_mgr(&glDecompress->decompress, bufferSize)) { // Out of memory
free(glDecompress);
*glDecompressPtr = NULL;
return;
@@ -314,7 +325,7 @@
(gl_decompress_struct*) ((IDATA)hglDecompress);
if(glDecompress == NULL) {
- gl_decompress_struct_init(&glDecompress);
+ gl_decompress_struct_init(&glDecompress, bytesInBuffer);
if(glDecompress == NULL) { // Out of memory
outOfMemory(env, obj, NULL);
return 0;