Ignore:
Timestamp:
Jul 29, 2008, 1:01:29 AM (12 years ago)
Author:
Sam Hocevar
Message:
  • Big API reorganisation. Now libpipi can transparently convert between colour spaces for a given image. For instance, if pipi_gaussian_blur is applied to a 32-bpp image, it is automatically converted to gamma-corrected 32-bit floats beforehands, then converted back to normal.
  • TODO: clipping, regions of interest, more formats, getpixel macros...
File:
1 edited

Legend:

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

    r2260 r2605  
    2626#include "pipi_internals.h"
    2727
    28 pipi_image_t *pipi_resize(pipi_image_t const *src, int w, int h)
     28pipi_image_t *pipi_resize(pipi_image_t *src, int w, int h)
    2929{
    30     double *aline, *line;
     30    float *srcdata, *dstdata, *aline, *line;
    3131    pipi_image_t *dst;
     32    pipi_pixels_t *srcp, *dstp;
    3233    int x, y, x0, y0, sw, dw, sh, dh, remy;
    3334
     35    srcp = pipi_getpixels(src, PIPI_PIXELS_RGBA_F);
     36    srcdata = (float *)srcp->pixels;
     37
    3438    dst = pipi_new(w, h);
     39    dstp = pipi_getpixels(dst, PIPI_PIXELS_RGBA_F);
     40    dstdata = (float *)dstp->pixels;
    3541
    36     sw = src->width; sh = src->height;
    37     dw = dst->width; dh = dst->height;
     42    sw = src->w; sh = src->h;
     43    dw = dst->w; dh = dst->h;
    3844
    39     aline = malloc(3 * dw * sizeof(double));
    40     line = malloc(3 * dw * sizeof(double));
     45    aline = malloc(3 * dw * sizeof(float));
     46    line = malloc(3 * dw * sizeof(float));
    4147
    42     memset(line, 0, 3 * dw * sizeof(double));
     48    memset(line, 0, 3 * dw * sizeof(float));
    4349    remy = 0;
    4450
    45     for(y = 0, y0 = 0; y < dst->height; y++)
     51    for(y = 0, y0 = 0; y < dh; y++)
    4652    {
    4753        int toty = 0, ny;
    4854
    49         memset(aline, 0, 3 * dw * sizeof(double));
     55        memset(aline, 0, 3 * dw * sizeof(float));
    5056
    5157        while(toty < sh)
     
    5359            if(remy == 0)
    5460            {
    55                 double r = 0, g = 0, b = 0;
     61                float r = 0, g = 0, b = 0;
    5662                int remx = 0;
    5763
    58                 for(x = 0, x0 = 0; x < dst->width; x++)
     64                for(x = 0, x0 = 0; x < dw; x++)
    5965                {
    60                     double ar = 0, ag = 0, ab = 0;
     66                    float ar = 0, ag = 0, ab = 0;
    6167                    int totx = 0, nx;
    6268
     
    6571                        if(remx == 0)
    6672                        {
    67                             pipi_getpixel(src, x0, y0, &r, &g, &b);
     73                            r = srcdata[(y0 * sw + x0) * 4];
     74                            g = srcdata[(y0 * sw + x0) * 4 + 1];
     75                            b = srcdata[(y0 * sw + x0) * 4 + 2];
    6876                            x0++;
    6977                            remx = dw;
     
    8694
    8795            ny = (toty + remy <= sh) ? remy : sh - toty;
    88             for(x = 0; x < dst->width; x++)
     96            for(x = 0; x < dw; x++)
    8997            {
    9098                aline[3 * x] += ny * line[3 * x];
     
    96104        }
    97105
    98         for(x = 0; x < dst->width; x++)
    99             pipi_setpixel(dst, x, y,
    100                           aline[3 * x] / (sw * sh),
    101                           aline[3 * x + 1] / (sw * sh),
    102                           aline[3 * x + 2] / (sw * sh));
     106        for(x = 0; x < dw; x++)
     107        {
     108            dstdata[(y * dw + x) * 4] = aline[3 * x] / (sw * sh);
     109            dstdata[(y * dw + x) * 4 + 1] = aline[3 * x + 1] / (sw * sh);
     110            dstdata[(y * dw + x) * 4 + 2] = aline[3 * x + 2] / (sw * sh);
     111        }
    103112    }
    104113
Note: See TracChangeset for help on using the changeset viewer.