You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by de...@apache.org on 2001/11/09 23:53:44 UTC

cvs commit: xml-batik/sources/org/apache/batik/ext/awt/image/rendered GaussianBlurRed8Bit.java

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:vincent.hardy@eng.sun.com">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: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org