Ignore:
Timestamp:
Aug 14, 2008, 8:34:44 PM (15 years ago)
Author:
Sam Hocevar
Message:
  • blur.c: add an argument to the gaussian convolution to specify an angle. Of course since the kernel is no longer separable, it becomes awfully slow with large images. Here is a tileable brushed metal texture: # pipi pipi:random512x512 --wrap --blur 20x0r25 -o image.png
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/pipi/filter/blur.c

    r2681 r2715  
    3535pipi_image_t *pipi_gaussian_blur(pipi_image_t *src, float radius)
    3636{
    37     return pipi_gaussian_blur_ext(src, radius, radius, 0.0, 0.0);
     37    return pipi_gaussian_blur_ext(src, radius, radius, 0.0, 0.0, 0.0);
    3838}
    3939
    4040pipi_image_t *pipi_gaussian_blur_ext(pipi_image_t *src, float rx, float ry,
    41                                      float dx, float dy)
     41                                     float angle, float dx, float dy)
    4242{
    4343    pipi_image_t *ret;
    4444    double *kernel;
    45     double Kx, Ky, t = 0.0;
     45    double Kx, Ky, t = 0.0, sint, cost, bbx, bby;
    4646    int i, j, krx, kry, m, n;
    4747
     
    4949    if(ry < BLUR_EPSILON) ry = BLUR_EPSILON;
    5050
     51    sint = sin(angle * M_PI / 180.);
     52    cost = cos(angle * M_PI / 180.);
     53
     54    /* Compute the final ellipse's bounding box */
     55    bbx = sqrt(rx * rx * cost * cost + ry * ry * sint * sint);
     56    bby = sqrt(ry * ry * cost * cost + rx * rx * sint * sint);
     57
    5158    /* FIXME: the kernel becomes far too big with large values of dx, because
    5259     * we grow both left and right. Fix the growing direction. */
    53     krx = (int)(3. * rx + .99999 + ceil(abs(dx)));
     60    krx = (int)(3. * bbx + .99999 + ceil(abs(dx)));
    5461    m = 2 * krx + 1;
    5562    Kx = -1. / (2. * rx * rx);
    5663
    57     kry = (int)(3. * ry + .99999 + ceil(abs(dy)));
     64    kry = (int)(3. * bby + .99999 + ceil(abs(dy)));
    5865    n = 2 * kry + 1;
    5966    Ky = -1. / (2. * ry * ry);
     
    6370    for(j = -kry; j <= kry; j++)
    6471    {
    65         double ey = Ky * ((double)j + dy) * ((double)j + dy);
    66 
    6772        for(i = -krx; i <= krx; i++)
    6873        {
    69             double ex = Kx * ((double)i + dx) * ((double)i + dx);
     74            double u = (double)i * cost - (double)j * sint + dx;
     75            double v = (double)j * cost + (double)i * sint + dy;
     76            double ex = Kx * u * u;
     77            double ey = Ky * v * v;
    7078            double d = exp(ex + ey);
    7179
Note: See TracChangeset for help on using the changeset viewer.