deweese 01/11/09 14:53:44 Modified: sources/org/apache/batik/ext/awt/image/rendered GaussianBlurRed8Bit.java Log: 1) Box filter is now approx twice as fast. Revision Changes Path 1.3 +71 -66 xml-batik/sources/org/apache/batik/ext/awt/image/rendered/GaussianBlurRed8Bit.java Index: GaussianBlurRed8Bit.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/rendered/GaussianBlurRed8Bit.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- GaussianBlurRed8Bit.java 2001/04/30 22:01:05 1.2 +++ GaussianBlurRed8Bit.java 2001/11/09 22:53:44 1.3 @@ -34,7 +34,7 @@ * GraphicsNode on demand for tiles. * * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Hardy</a> - * @version $Id: GaussianBlurRed8Bit.java,v 1.2 2001/04/30 22:01:05 deweese Exp $ + * @version $Id: GaussianBlurRed8Bit.java,v 1.3 2001/11/09 22:53:44 deweese Exp $ */ public class GaussianBlurRed8Bit extends AbstractRed { @@ -238,6 +238,7 @@ // this lets the Vertical conv know how much is junk, so it // doesn't bother to convolve the top and bottom edges int skipX; + // long t1 = System.currentTimeMillis(); if (convOp[0] != null) { tmpR2 = getColorModel().createCompatibleWritableRaster @@ -282,6 +283,10 @@ } tmpR2 = tmpR1; } + // long t2 = System.currentTimeMillis(); + // System.out.println("Time: " + (t2-t1) + + // (((convOp[0] != null) || (convOp[1] != null))? + // " ConvOp":"")); // System.out.println("Rasters WR :" + wr.getBounds()); // System.out.println(" tmp:" + tmpR2.getBounds()); // System.out.println(" bounds:" + getBounds()); @@ -335,10 +340,8 @@ final int srcPixels [] = srcDB.getBankData()[0]; final int destPixels[] = dstDB.getBankData()[0]; - final int [] bufferA = new int [boxSz]; - final int [] bufferR = new int [boxSz]; - final int [] bufferG = new int [boxSz]; - final int [] bufferB = new int [boxSz]; + final int [] buffer = new int [boxSz]; + int curr, prev; // Fixed point normalization factor (8.24) int scale = (1<<24)/boxSz; @@ -354,11 +357,11 @@ */ for (int y=skipY; y<(h-skipY); y++) { - int sp = srcOff + y*srcScanStride; - int dp = dstOff + y*dstScanStride; + int sp = srcOff + y*srcScanStride; + int dp = dstOff + y*dstScanStride; int rowEnd = sp + (w-skipX); - int k=0; + int k = 0; int sumA = 0; int sumR = 0; int sumG = 0; @@ -368,41 +371,43 @@ int end = sp+boxSz; while (sp < end) { - final int currentPixel = srcPixels[sp]; - sumA += bufferA[k] = currentPixel>>>24; - sumR += bufferR[k] = (currentPixel>>16)&0xff; - sumG += bufferG[k] = (currentPixel>>8)&0xff; - sumB += bufferB[k] = currentPixel&0xff; + curr = buffer[k] = srcPixels[sp]; + sumA += (curr>>> 24); + sumR += (curr >> 16)&0xFF; + sumG += (curr >> 8)&0xFF; + sumB += (curr )&0xFF; k++; sp++; } dp += skipX + loc; - destPixels[dp] = (( (sumA*scale)&0xFF000000) | - (((sumR*scale)&0xFF000000)>>>8) | - (((sumG*scale)&0xFF000000)>>>16) | - (((sumB*scale)&0xFF000000)>>>24)); + prev = destPixels[dp] = (( (sumA*scale)&0xFF000000) | + (((sumR*scale)&0xFF000000)>>>8) | + (((sumG*scale)&0xFF000000)>>>16) | + (((sumB*scale)&0xFF000000)>>>24)); dp++; - k=0; while (sp < rowEnd) { - final int currentPixel = srcPixels[sp]; - sumA -= bufferA[k]; - sumA += bufferA[k] = currentPixel>>>24; - - sumR -= bufferR[k]; - sumR += bufferR[k] = (currentPixel>> 16)&0xff; - - sumG -= bufferG[k]; - sumG += bufferG[k] = (currentPixel>> 8)&0xff; - - sumB -= bufferB[k]; - sumB += bufferB[k] = currentPixel &0xff; - - destPixels[dp] = (( (sumA*scale)&0xFF000000) | - (((sumR*scale)&0xFF000000)>>>8) | - (((sumG*scale)&0xFF000000)>>>16) | - (((sumB*scale)&0xFF000000)>>>24)); + curr = buffer[k]; + if (curr == srcPixels[sp]) { + destPixels[dp] = prev; + } else { + sumA -= (curr>>> 24); + sumR -= (curr >> 16)&0xFF; + sumG -= (curr >> 8)&0xFF; + sumB -= (curr )&0xFF; + + curr = buffer[k] = srcPixels[sp]; + + sumA += (curr>>> 24); + sumR += (curr >> 16)&0xFF; + sumG += (curr >> 8)&0xFF; + sumB += (curr )&0xFF; + prev = destPixels[dp] = (( (sumA*scale)&0xFF000000) | + (((sumR*scale)&0xFF000000)>>>8) | + (((sumG*scale)&0xFF000000)>>>16) | + (((sumB*scale)&0xFF000000)>>>24)); + } k = (k+1)%boxSz; sp++; dp++; @@ -454,10 +459,8 @@ final int srcPixels [] = srcDB.getBankData()[0]; final int destPixels[] = dstDB.getBankData()[0]; - final int [] bufferA = new int [boxSz]; - final int [] bufferR = new int [boxSz]; - final int [] bufferG = new int [boxSz]; - final int [] bufferB = new int [boxSz]; + final int [] buffer = new int [boxSz]; + int curr, prev; // Fixed point normalization factor (8.24) final int scale = (1<<24)/boxSz; @@ -487,42 +490,44 @@ int end = sp+(boxSz*srcScanStride); while (sp < end) { - final int currentPixel = srcPixels[sp]; - sumA += bufferA[k] = currentPixel>>>24; - sumR += bufferR[k] = (currentPixel>> 16)&0xff; - sumG += bufferG[k] = (currentPixel>> 8)&0xff; - sumB += bufferB[k] = currentPixel &0xff; + curr = buffer[k] = srcPixels[sp]; + sumA += (curr>>> 24); + sumR += (curr >> 16)&0xFF; + sumG += (curr >> 8)&0xFF; + sumB += (curr )&0xFF; k++; sp+=srcScanStride; } dp += (skipY + loc)*dstScanStride; - destPixels[dp] = (( (sumA*scale)&0xFF000000) | - (((sumR*scale)&0xFF000000)>>>8) | - (((sumG*scale)&0xFF000000)>>>16) | - (((sumB*scale)&0xFF000000)>>>24)); + prev = destPixels[dp] = (( (sumA*scale)&0xFF000000) | + (((sumR*scale)&0xFF000000)>>>8) | + (((sumG*scale)&0xFF000000)>>>16) | + (((sumB*scale)&0xFF000000)>>>24)); dp+=dstScanStride; k=0; while (sp < colEnd) { - final int currentPixel = srcPixels[sp]; - sumA -= bufferA[k]; - sumA += bufferA[k] = currentPixel>>>24; - - sumR -= bufferR[k]; - sumR += bufferR[k] = (currentPixel>>16)&0xff; - - sumG -= bufferG[k]; - sumG += bufferG[k] = (currentPixel>>8)&0xff; - - sumB -= bufferB[k]; - sumB += bufferB[k] = currentPixel&0xff; - - destPixels[dp] = (( (sumA*scale)&0xFF000000) | - (((sumR*scale)&0xFF000000)>>>8) | - (((sumG*scale)&0xFF000000)>>>16) | - (((sumB*scale)&0xFF000000)>>>24)); - + curr = buffer[k]; + if (curr == srcPixels[sp]) { + destPixels[dp] = prev; + } else { + sumA -= (curr>>> 24); + sumR -= (curr >> 16)&0xFF; + sumG -= (curr >> 8)&0xFF; + sumB -= (curr )&0xFF; + + curr = buffer[k] = srcPixels[sp]; + + sumA += (curr>>> 24); + sumR += (curr >> 16)&0xFF; + sumG += (curr >> 8)&0xFF; + sumB += (curr )&0xFF; + prev = destPixels[dp] = (( (sumA*scale)&0xFF000000) | + (((sumR*scale)&0xFF000000)>>>8) | + (((sumG*scale)&0xFF000000)>>>16) | + (((sumB*scale)&0xFF000000)>>>24)); + } k = (k+1)%boxSz; sp+=srcScanStride; dp+=dstScanStride;
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]