Changeset 2245 for libpipi


Ignore:
Timestamp:
Feb 27, 2008, 12:50:15 AM (12 years ago)
Author:
Sam Hocevar
Message:
  • Image resizing test.
Location:
libpipi/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/genethumb/genethumb.c

    r2244 r2245  
    99
    1010    i = pipi_load("irc.png");
    11     j = pipi_resize(i, 100, 200);
     11    j = pipi_resize(i, 1000, 114);
    1212    pipi_save(j, "irc.bmp");
    1313    pipi_free(i);
  • libpipi/trunk/pipi/resize.c

    r2244 r2245  
    2525pipi_image_t *pipi_resize(pipi_image_t const *src, int w, int h)
    2626{
     27    int *aline, *line;
    2728    pipi_image_t *dst;
    28     int x, y, x0, y0;
     29    int x, y, x0, y0, sw, dw, sh, dh, remy = 0;
     30
    2931    dst = pipi_new(w, h);
    3032
    31     int sw = src->width;
    32     int dw = dst->width;
     33    sw = src->width; sh = src->height;
     34    dw = dst->width; dh = dst->height;
     35
     36    aline = malloc(3 * dw * sizeof(int));
     37    line = malloc(3 * dw * sizeof(int));
    3338
    3439    for(y = 0, y0 = 0; y < dst->height; y++)
    3540    {
    36         for(x = 0, x0 = 0; x < dst->width; x++)
     41        int toty = 0, ny;
     42
     43        memset(aline, 0, 3 * dw * sizeof(int));
     44        memset(line, 0, 3 * dw * sizeof(int));
     45
     46        while(toty < sh)
    3747        {
    38             int rem = 0, tot = 0;
    39             int ar = 0, ag = 0, ab = 0;
    40             int r = 0, g = 0, b = 0;
    41             int n;
     48            if(remy == 0)
     49            {
     50                for(x = 0, x0 = 0; x < dst->width; x++)
     51                {
     52                    int remx = 0, totx = 0, nx;
     53                    int ar = 0, ag = 0, ab = 0;
     54                    int r = 0, g = 0, b = 0;
    4255
    43             while(tot < sw)
    44             {
    45                 if(rem == 0)
    46                 {
    47                     pipi_getpixel(src, x0, y, &r, &g, &b);
    48                     x0++;
    49                     rem = dw;
     56                    while(totx < sw)
     57                    {
     58                        if(remx == 0)
     59                        {
     60                            pipi_getpixel(src, x0, y0, &r, &g, &b);
     61                            x0++;
     62                            remx = dw;
     63                        }
     64
     65                        nx = (totx + remx <= sw) ? remx : sw - totx;
     66                        ar += nx * r; ag += nx * g; ab += nx * b;
     67                        totx += nx;
     68                        remx -= nx;
     69                    }
     70
     71                    line[3 * x] = ar;
     72                    line[3 * x + 1] = ag;
     73                    line[3 * x + 2] = ab;
     74/* HACK */
     75pipi_setpixel(dst, x, y, ar / sw, ag / sw, ab / sw);
    5076                }
    5177
    52                 n = (tot + rem <= sw) ? rem : sw - tot;
    53                 ar += n * r; ag += n * g; ab += n * b;
    54                 tot += n;
    55                 rem -= n;
     78                y0++;
     79                remy = dh;
     80//printf("  remy is now %i\n", remy);
    5681            }
    5782
    58             pipi_setpixel(dst, x, y, ar / sw, ag / sw, ab / sw);
     83            ny = (toty + remy <= sh) ? remy : sh - toty;
     84            for(x = 0; x < dst->width; x++)
     85            {
     86                aline[3 * x] += ny * line[3 * x];
     87                aline[3 * x + 1] += ny * line[3 * x + 1];
     88                aline[3 * x + 2] += ny * line[3 * x + 2];
     89            }
     90            toty += ny;
     91            remy -= ny;
     92//printf("  remy-- %i\n", remy);
    5993        }
     94//printf("pasting line %i (src line now %i)\n", y, y0);
     95
     96#if 0
     97        for(x = 0; x < dst->width; x++)
     98            pipi_setpixel(dst, x, y,
     99                          aline[3 * x] / (sw * sh),
     100                          aline[3 * x + 1] / (sw * sh),
     101                          aline[3 * x + 2] / (sw * sh));
     102#endif
    60103    }
     104
     105    free(aline);
     106    free(line);
    61107
    62108    return dst;
Note: See TracChangeset for help on using the changeset viewer.