Changeset 3418 for libpipi


Ignore:
Timestamp:
Apr 21, 2009, 1:57:02 AM (12 years ago)
Author:
Sam Hocevar
Message:

wave.c: implement pipi_wave() in addition to pipi_sine(). The effect is
not yet satisfying.

Location:
libpipi/trunk/pipi
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/pipi/context.c

    r3417 r3418  
    9292        { "line", 1 },
    9393        { "sine", 1 },
     94        { "wave", 1 },
    9495
    9596        /* End marker */
     
    648649        ctx->nimages++;
    649650    }
    650     else if(!strcmp(cmd, "sine"))
    651     {
    652         pipi_image_t *tmp;
     651    else if(!strcmp(cmd, "sine") || !strcmp(cmd, "wave"))
     652    {
     653        pipi_image_t *src, *dst = NULL;
    653654        char const *arg;
    654655        va_list ap;
     
    667668            return -1;
    668669
    669         tmp = ctx->images[ctx->nimages - 1];
    670         ctx->images[ctx->nimages - 1] = pipi_sine(tmp, dw, dh, d, a);
    671         pipi_free(tmp);
     670        src = ctx->images[ctx->nimages - 1];
     671        switch(cmd[0])
     672        {
     673            case 's': dst = pipi_sine(src, dw, dh, d, a); break;
     674            case 'w': dst = pipi_wave(src, dw, dh, d, a); break;
     675        }
     676        if(dst == NULL)
     677            return -1;
     678        pipi_free(src);
     679        ctx->images[ctx->nimages - 1] = dst;
    672680    }
    673681    else
  • libpipi/trunk/pipi/filter/wave.c

    r3416 r3418  
    2828
    2929#define BORDER 64
     30
     31pipi_image_t *pipi_wave(pipi_image_t *src, double dw, double dh,
     32                        double d, double a)
     33{
     34    pipi_image_t *dst;
     35    pipi_pixels_t *srcp, *dstp;
     36    float *srcdata, *dstdata;
     37    double sina, cosa;
     38    int x, y, w, h, i, gray;
     39
     40    w = src->w;
     41    h = src->h;
     42
     43    gray = (src->last_modified == PIPI_PIXELS_Y_F32);
     44
     45    srcp = gray ? pipi_get_pixels(src, PIPI_PIXELS_Y_F32)
     46                : pipi_get_pixels(src, PIPI_PIXELS_RGBA_F32);
     47    srcdata = (float *)srcp->pixels;
     48
     49    dst = pipi_new(w, h);
     50    dstp = gray ? pipi_get_pixels(dst, PIPI_PIXELS_Y_F32)
     51                : pipi_get_pixels(dst, PIPI_PIXELS_RGBA_F32);
     52    dstdata = (float *)dstp->pixels;
     53
     54    sina = sin(a);
     55    cosa = cos(a);
     56
     57    for(y = 0; y < h; y++)
     58    {
     59        for(x = 0; x < w; x++)
     60        {
     61            double angle = 2 * M_PI / dw * ((x - w / 2) * cosa
     62                                             + (y - h / 2) * sina - d);
     63            double displacement = dh * sin(angle);
     64            double dx, dy;
     65            int x2, y2;
     66
     67            dx = cosa * displacement;
     68            dy = sina * displacement;
     69
     70            if(x < BORDER) dx = dx * x / BORDER;
     71            if(x > w - 1 - BORDER) dx = dx * (w - 1 - x) / BORDER;
     72            if(y < BORDER) dy = dy * y / BORDER;
     73            if(y > h - 1 - BORDER) dy = dy * (h - 1 - y) / BORDER;
     74
     75            x2 = x + dx;
     76            y2 = y + dy;
     77
     78            /* Just in case... */
     79            if(x2 < 0) x2 = 0;
     80            else if(x2 >= w) x2 = w - 1;
     81
     82            if(y2 < 0) y2 = 0;
     83            else if(y2 >= h) y2 = h - 1;
     84
     85            if(gray)
     86            {
     87                dstdata[y * w + x] = srcdata[y2 * w + x2];
     88            }
     89            else
     90            {
     91                for(i = 0; i < 4; i++)
     92                {
     93                    dstdata[4 * (y * w + x) + i]
     94                        = srcdata[4 * (y2 * w + x2) + i];
     95                }
     96            }
     97        }
     98    }
     99
     100    return dst;
     101}
    30102
    31103pipi_image_t *pipi_sine(pipi_image_t *src, double dw, double dh,
  • libpipi/trunk/pipi/pipi.h

    r3416 r3418  
    202202__extern pipi_image_t *pipi_sine(pipi_image_t *, double, double,
    203203                                 double, double);
     204__extern pipi_image_t *pipi_wave(pipi_image_t *, double, double,
     205                                 double, double);
    204206
    205207__extern pipi_image_t *pipi_order(pipi_image_t *);
Note: See TracChangeset for help on using the changeset viewer.