Changeset 2801 for libpipi/trunk


Ignore:
Timestamp:
Aug 29, 2008, 2:03:46 AM (12 years ago)
Author:
Sam Hocevar
Message:
  • blur.c: use the template system for the boxblur functions.
File:
1 edited

Legend:

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

    r2800 r2801  
    2828#include "pipi_internals.h"
    2929
     30#if !defined TEMPLATE_FILE /* This file uses the template system */
     31#define TEMPLATE_FLAGS SET_FLAG_GRAY
     32#define TEMPLATE_FILE "filter/blur.c"
     33#include "pipi_template.h"
     34
    3035/* Any standard deviation below this value will be rounded up, in order
    3136 * to avoid ridiculously low values. exp(-1/(2*0.2*0.2)) is < 10^-5 so
     
    125130}
    126131
    127 /* FIXME: split this into templates for wrap-around and proper gray support */
    128132pipi_image_t *pipi_box_blur_ext(pipi_image_t *src, int m, int n)
     133{
     134    if(src->last_modified == PIPI_PIXELS_Y_F)
     135        return boxblur_gray(src, m, n);
     136
     137    return boxblur(src, m, n);
     138}
     139
     140#else /* XXX: the following functions use the template system */
     141
     142/* FIXME: FLAG_WRAP */
     143static pipi_image_t *SUFFIX(boxblur)(pipi_image_t *src, int m, int n)
    129144{
    130145    pipi_image_t *dst;
     
    132147    float *srcdata, *dstdata;
    133148    double *acc;
    134     int x, y, w, h, i, j, size, gray;
     149    int x, y, w, h, i, j, size;
    135150
    136151    w = src->w;
     
    138153    size = (2 * m + 1) * (2 * n + 1);
    139154
    140     gray = (src->last_modified == PIPI_PIXELS_Y_F);
    141 
    142     srcp = gray ? pipi_getpixels(src, PIPI_PIXELS_Y_F)
    143                 : pipi_getpixels(src, PIPI_PIXELS_RGBA_F);
     155    srcp = FLAG_GRAY ? pipi_getpixels(src, PIPI_PIXELS_Y_F)
     156                     : pipi_getpixels(src, PIPI_PIXELS_RGBA_F);
    144157    srcdata = (float *)srcp->pixels;
    145158
    146159    dst = pipi_new(w, h);
    147     dstp = gray ? pipi_getpixels(dst, PIPI_PIXELS_Y_F)
    148                 : pipi_getpixels(dst, PIPI_PIXELS_RGBA_F);
     160    dstp = FLAG_GRAY ? pipi_getpixels(dst, PIPI_PIXELS_Y_F)
     161                     : pipi_getpixels(dst, PIPI_PIXELS_RGBA_F);
    149162    dstdata = (float *)dstp->pixels;
    150163
    151     acc = malloc(w * (gray ? 1 : 4) * sizeof(double));
     164    acc = malloc(w * (FLAG_GRAY ? 1 : 4) * sizeof(double));
    152165
    153166    /* Step 1: fill the accumulator */
    154167    for(x = 0; x < w; x++)
    155168    {
    156         if(gray)
    157         {
    158             double t = 0.;
    159 
    160             for(j = -n; j <= n; j++)
    161             {
    162                 int j2 = (j < 0) ? h - 1 - ((-j - 1) % h) : j % h;
     169        double r = 0., g = 0., b = 0., a = 0.;
     170        double t = 0.;
     171
     172        for(j = -n; j <= n; j++)
     173        {
     174            int j2 = (j < 0) ? h - 1 - ((-j - 1) % h) : j % h;
     175            if(FLAG_GRAY)
    163176                t += srcdata[j2 * w + x];
    164             }
    165 
    166             acc[x] = t;
    167         }
    168         else
    169         {
    170             double r = 0., g = 0., b = 0., a = 0.;
    171 
    172             for(j = -n; j <= n; j++)
    173             {
    174                 int j2 = (j < 0) ? h - 1 - ((-j - 1) % h) : j % h;
     177            else
     178            {
    175179                r += srcdata[4 * (j2 * w + x)];
    176180                g += srcdata[4 * (j2 * w + x) + 1];
     
    178182                a += srcdata[4 * (j2 * w + x) + 3];
    179183            }
    180 
     184        }
     185
     186        if(FLAG_GRAY)
     187            acc[x] = t;
     188        else
     189        {
    181190            acc[4 * x] = r;
    182191            acc[4 * x + 1] = g;
     
    193202
    194203        /* 2.1: compute the first pixel */
    195         if(gray)
    196         {
    197             for(i = -m; i <= m; i++)
    198             {
    199                 int i2 = (i < 0) ? w - 1 - ((-i - 1) % w) : i % w;
     204        for(i = -m; i <= m; i++)
     205        {
     206            int i2 = (i < 0) ? w - 1 - ((-i - 1) % w) : i % w;
     207
     208            if(FLAG_GRAY)
    200209                t += acc[i2];
    201             }
    202         }
    203         else
    204         {
    205             for(i = -m; i <= m; i++)
    206             {
    207                 int i2 = (i < 0) ? w - 1 - ((-i - 1) % w) : i % w;
     210            else
     211            {
    208212                r += acc[4 * i2];
    209213                g += acc[4 * i2 + 1];
     
    218222            int u, u2, v, v2;
    219223
    220             if(gray)
     224            if(FLAG_GRAY)
    221225            {
    222226                dstdata[y * w + x] = t / size;
     
    234238            v = x + m + 1;
    235239            v2 = (v < 0) ? w - 1 - ((-v - 1) % w) : v % w;
    236             if(gray)
     240            if(FLAG_GRAY)
    237241            {
    238242                t = t - acc[u2] + acc[v2];
     
    256260            v = y + n + 1;
    257261            v2 = (v < 0) ? w - 1 - ((-v - 1) % w) : v % w;
    258             if(gray)
     262            if(FLAG_GRAY)
    259263            {
    260264                acc[x] += srcdata[v2 * w + x] - srcdata[u2 * w + x];
     
    278282}
    279283
     284#endif
     285
Note: See TracChangeset for help on using the changeset viewer.