*** ../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 , 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; }