*** ../Imaging-orig/libImaging/Filter.c	Tue Apr 22 09:11:26 2003
--- libImaging/Filter.c	Thu Jul 10 22:44:35 2003
***************
*** 36,42 ****
      if (!im || strcmp(im->mode, "L") != 0)
  	return (Imaging) ImagingError_ModeError();
  
!     if ((xsize != 3 && xsize != 5) || xsize != ysize)
  	return (Imaging) ImagingError_ValueError("bad kernel size");
  
      imOut = ImagingNew(im->mode, im->xsize, im->ysize);
--- 36,42 ----
      if (!im || strcmp(im->mode, "L") != 0)
  	return (Imaging) ImagingError_ModeError();
  
!     if (/*(xsize != 3 && xsize != 5) ||*/ xsize != ysize)	// dsw
  	return (Imaging) ImagingError_ValueError("bad kernel size");
  
      imOut = ImagingNew(im->mode, im->xsize, im->ysize);
***************
*** 82,87 ****
--- 82,88 ----
      (int) image[y-2][x+d]   * kernel[23] + \
      (int) image[y-2][x+d+d] * kernel[24])
  
+ #if 0
      if (xsize == 3) {
  	/* 3x3 kernel. */
  	for (x = 0; x < im->xsize; x++)
***************
*** 125,130 ****
--- 126,170 ----
  	    for (x = 0; x < im->xsize; x++)
  		imOut->image8[y][x] = im->image8[y][x];
      }
+ #endif
+ 	{
+ 		// by Doug Wyatt <doug at sonosphere dot com>, July 2003
+ 		// Brute force.
+ 		// Note that we mirror pixels at the edges of the source image. Is this desirable?
+ 		// It adds branches to the inner loops and slows things down.
+ 		// For optimization ideas, see http://www.filtermeister.com/tutorials/blur01.html
+ 		int xmax = im->xsize, ymax = im->ysize;
+ 		int kmax = xsize / 2, kmin = -kmax;
+ 		int x1, y1;
+ 		int isum;
+ 		for (y = 0; y < ymax; ++y) {
+ 			UINT8 *yrow = imOut->image8[y];
+ 			for (x = 0; x < xmax; ++x) {
+ 				int kx, ky, ki = 0;
+ 				sum = 0.;
+ 				for (ky = kmin; ky <= kmax; ++ky) {
+ 					y1 = y + ky;
+ 					if (y1 < 0) y1 = -y1;
+ 					else if (y1 >= ymax) y1 = ymax - 1 - (y1 - ymax);
+ 					UINT8 *kyrow = im->image8[y1];
+ 					for (kx = kmin; kx <= kmax; ++kx, ++ki) {
+ 						x1 = x + kx;
+ 						if (x1 < 0) x1 = -x1;
+ 						else if (x1 >= xmax) x1 = xmax - 1 - (x1 - xmax);
+ 						sum += (int)kyrow[x1] * kernel[ki];
+ 					}
+ 				}
+ 				sum = sum / divisor + offset;
+ 				isum = (int)(sum + 0.5);
+ 				if (sum <= 0)
+ 					yrow[x] = 0;
+ 				else if (sum >= 255)
+ 					yrow[x] = 255;
+ 				else
+ 					yrow[x] = isum;
+ 			}
+ 		}
+ 	}
      return imOut;
  }
  

