Changeset 2634


Ignore:
Timestamp:
08/02/08 02:01:12 (5 years ago)
Author:
sam
Message:
  • blur.c: support for greyscale images.
File:
1 edited

Legend:

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

    r2619 r2634  
    4646    double *kernel, *buffer; 
    4747    double K; 
    48     int x, y, i, w, h, kr, kw; 
     48    int x, y, i, w, h, kr, kw, gray; 
    4949 
    5050    if(rx < BLUR_EPSILON) rx = BLUR_EPSILON; 
     
    5454    h = src->h; 
    5555 
    56     srcp = pipi_getpixels(src, PIPI_PIXELS_RGBA_F); 
     56    gray = (src->last_modified == PIPI_PIXELS_Y_F); 
     57 
     58    srcp = gray ? pipi_getpixels(src, PIPI_PIXELS_Y_F) 
     59                : pipi_getpixels(src, PIPI_PIXELS_RGBA_F); 
    5760    srcdata = (float *)srcp->pixels; 
    5861 
    5962    dst = pipi_new(w, h); 
    60     dstp = pipi_getpixels(dst, PIPI_PIXELS_RGBA_F); 
     63    dstp = gray ? pipi_getpixels(dst, PIPI_PIXELS_Y_F) 
     64                : pipi_getpixels(dst, PIPI_PIXELS_RGBA_F); 
    6165    dstdata = (float *)dstp->pixels; 
    6266 
    63     buffer = malloc(w * h * 4 * sizeof(double)); 
     67    buffer = malloc(w * h * (gray ? 1 : 4) * sizeof(double)); 
    6468 
    6569    kr = (int)(3. * rx + 1.99999); 
     
    7579        for(x = 0; x < w; x++) 
    7680        { 
    77             double R = 0., G = 0., B = 0., t = 0.; 
    78             int x2, off = 4 * (y * w + x); 
     81            if(gray) 
     82            { 
     83                double Y = 0., t = 0.; 
     84                int x2; 
    7985 
    80             for(i = -kr; i <= kr; i++) 
     86                for(i = -kr; i <= kr; i++) 
     87                { 
     88                    double f = kernel[i + kr]; 
     89 
     90                    x2 = x + i; 
     91                    if(x2 < 0) x2 = 0; 
     92                    else if(x2 >= w) x2 = w - 1; 
     93 
     94                    Y += f * srcdata[y * w + x2]; 
     95                    t += f; 
     96                } 
     97 
     98                buffer[y * w + x] = Y / t; 
     99            } 
     100            else 
    81101            { 
    82                 double f = kernel[i + kr]; 
     102                double R = 0., G = 0., B = 0., t = 0.; 
     103                int x2, off = 4 * (y * w + x); 
    83104 
    84                 x2 = x + i; 
    85                 if(x2 < 0) x2 = 0; 
    86                 else if(x2 >= w) x2 = w - 1; 
     105                for(i = -kr; i <= kr; i++) 
     106                { 
     107                    double f = kernel[i + kr]; 
    87108 
    88                 R += f * srcdata[(y * w + x2) * 4]; 
    89                 G += f * srcdata[(y * w + x2) * 4 + 1]; 
    90                 B += f * srcdata[(y * w + x2) * 4 + 2]; 
    91                 t += f; 
     109                    x2 = x + i; 
     110                    if(x2 < 0) x2 = 0; 
     111                    else if(x2 >= w) x2 = w - 1; 
     112 
     113                    R += f * srcdata[(y * w + x2) * 4]; 
     114                    G += f * srcdata[(y * w + x2) * 4 + 1]; 
     115                    B += f * srcdata[(y * w + x2) * 4 + 2]; 
     116                    t += f; 
     117                } 
     118 
     119                buffer[off] = R / t; 
     120                buffer[off + 1] = G / t; 
     121                buffer[off + 2] = B / t; 
    92122            } 
    93  
    94             buffer[off] = R / t; 
    95             buffer[off + 1] = G / t; 
    96             buffer[off + 2] = B / t; 
    97123        } 
    98124    } 
     
    112138        for(x = 0; x < w; x++) 
    113139        { 
    114             double R = 0., G = 0., B = 0., t = 0.; 
    115             int y2, off = 4 * (y * w + x); 
     140            if(gray) 
     141            { 
     142                double Y = 0., t = 0.; 
     143                int y2; 
    116144 
    117             for(i = -kr; i <= kr; i++) 
     145                for(i = -kr; i <= kr; i++) 
     146                { 
     147                    double f = kernel[i + kr]; 
     148 
     149                    y2 = y + i; 
     150                    if(y2 < 0) y2 = 0; 
     151                    else if(y2 >= h) y2 = h - 1; 
     152 
     153                    Y += f * buffer[y2 * w + x]; 
     154                    t += f; 
     155                } 
     156 
     157                dstdata[y * w + x] = Y / t; 
     158            } 
     159            else 
    118160            { 
    119                 double f = kernel[i + kr]; 
     161                double R = 0., G = 0., B = 0., t = 0.; 
     162                int y2, off = 4 * (y * w + x); 
    120163 
    121                 y2 = y + i; 
    122                 if(y2 < 0) y2 = 0; 
    123                 else if(y2 >= h) y2 = h - 1; 
     164                for(i = -kr; i <= kr; i++) 
     165                { 
     166                    double f = kernel[i + kr]; 
    124167 
    125                 R += f * buffer[(y2 * w + x) * 4]; 
    126                 G += f * buffer[(y2 * w + x) * 4 + 1]; 
    127                 B += f * buffer[(y2 * w + x) * 4 + 2]; 
    128                 t += f; 
     168                    y2 = y + i; 
     169                    if(y2 < 0) y2 = 0; 
     170                    else if(y2 >= h) y2 = h - 1; 
     171 
     172                    R += f * buffer[(y2 * w + x) * 4]; 
     173                    G += f * buffer[(y2 * w + x) * 4 + 1]; 
     174                    B += f * buffer[(y2 * w + x) * 4 + 2]; 
     175                    t += f; 
     176                } 
     177 
     178                dstdata[off] = R / t; 
     179                dstdata[off + 1] = G / t; 
     180                dstdata[off + 2] = B / t; 
    129181            } 
    130  
    131             dstdata[off] = R / t; 
    132             dstdata[off + 1] = G / t; 
    133             dstdata[off + 2] = B / t; 
    134182        } 
    135183    } 
Note: See TracChangeset for help on using the changeset viewer.