Changeset 3415 for libpipi


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

resize.c: add pipi_crop() and the --crop flag.

Location:
libpipi/trunk/pipi
Files:
3 edited

Legend:

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

    r3411 r3415  
    5555        { "gamma", 1 },
    5656        { "scale", 1 },
     57        { "crop", 1 },
    5758        { "geometry", 1 },
    5859        { "tile", 1 },
     
    366367        ctx->images[ctx->nimages - 1] = dst;
    367368    }
     369    else if(!strcmp(cmd, "crop"))
     370    {
     371        pipi_image_t *tmp;
     372        char const *arg;
     373        va_list ap;
     374        int w, h, x = 0, y = 0;
     375        int ret;
     376
     377        if(ctx->nimages < 1)
     378            return -1;
     379
     380        va_start(ap, cmd);
     381        arg = va_arg(ap, char const *);
     382        va_end(ap);
     383
     384        ret = sscanf(arg, "%dx%d+%d+%d", &w, &h, &x, &y);
     385        if(ret < 2)
     386            return -1;
     387
     388        tmp = ctx->images[ctx->nimages - 1];
     389        ctx->images[ctx->nimages - 1] = pipi_crop(tmp, w, h, x, y);
     390        pipi_free(tmp);
     391    }
    368392    else if(!strcmp(cmd, "brightness"))
    369393    {
  • libpipi/trunk/pipi/pipi.h

    r3411 r3415  
    158158
    159159__extern pipi_image_t *pipi_resize(pipi_image_t *, int, int);
     160__extern pipi_image_t *pipi_crop(pipi_image_t *, int, int, int, int);
    160161
    161162__extern pipi_image_t *pipi_render_random(int, int);
  • libpipi/trunk/pipi/resize.c

    r3398 r3415  
    124124}
    125125
     126pipi_image_t *pipi_crop(pipi_image_t *src, int w, int h, int dx, int dy)
     127{
     128    float *srcdata, *dstdata;
     129    pipi_image_t *dst;
     130    pipi_pixels_t *srcp, *dstp;
     131    int y, off, len;
     132
     133    srcp = pipi_get_pixels(src, PIPI_PIXELS_RGBA_F32);
     134    srcdata = (float *)srcp->pixels;
     135
     136    dst = pipi_new(w, h);
     137    dstp = pipi_get_pixels(dst, PIPI_PIXELS_RGBA_F32);
     138    dstdata = (float *)dstp->pixels;
     139
     140    off = dx;
     141    len = w;
     142
     143    if(dx < 0)
     144    {
     145        len += dx;
     146        dx = 0;
     147    }
     148
     149    if(dx + len > srcp->w)
     150        len = srcp->w - dx;
     151
     152    if(len > 0)
     153    {
     154        for(y = 0; y < h; y++)
     155        {
     156            if(y + dy < 0 || y + dy >= srcp->h)
     157                continue;
     158
     159            memcpy(dstdata + y * w * 4,
     160                   srcdata + ((y + dy) * srcp->w + dx) * 4,
     161                   len * 4 * sizeof(float));
     162        }
     163    }
     164
     165    return dst;
     166}
     167
Note: See TracChangeset for help on using the changeset viewer.