diff --git a/genethumb/genethumb.c b/genethumb/genethumb.c index 899adbe..ab24953 100644 --- a/genethumb/genethumb.c +++ b/genethumb/genethumb.c @@ -8,7 +8,7 @@ int main(void) pipi_image_t *i, *j; i = pipi_load("irc.png"); - j = pipi_resize(i, 100, 200); + j = pipi_resize(i, 1000, 114); pipi_save(j, "irc.bmp"); pipi_free(i); pipi_free(j); diff --git a/pipi/resize.c b/pipi/resize.c index dd45490..daaa256 100644 --- a/pipi/resize.c +++ b/pipi/resize.c @@ -24,41 +24,87 @@ pipi_image_t *pipi_resize(pipi_image_t const *src, int w, int h) { + int *aline, *line; pipi_image_t *dst; - int x, y, x0, y0; + int x, y, x0, y0, sw, dw, sh, dh, remy = 0; + dst = pipi_new(w, h); - int sw = src->width; - int dw = dst->width; + sw = src->width; sh = src->height; + dw = dst->width; dh = dst->height; + + aline = malloc(3 * dw * sizeof(int)); + line = malloc(3 * dw * sizeof(int)); for(y = 0, y0 = 0; y < dst->height; y++) { - for(x = 0, x0 = 0; x < dst->width; x++) - { - int rem = 0, tot = 0; - int ar = 0, ag = 0, ab = 0; - int r = 0, g = 0, b = 0; - int n; + int toty = 0, ny; - while(tot < sw) + memset(aline, 0, 3 * dw * sizeof(int)); + memset(line, 0, 3 * dw * sizeof(int)); + + while(toty < sh) + { + if(remy == 0) { - if(rem == 0) + for(x = 0, x0 = 0; x < dst->width; x++) { - pipi_getpixel(src, x0, y, &r, &g, &b); - x0++; - rem = dw; + int remx = 0, totx = 0, nx; + int ar = 0, ag = 0, ab = 0; + int r = 0, g = 0, b = 0; + + while(totx < sw) + { + if(remx == 0) + { + pipi_getpixel(src, x0, y0, &r, &g, &b); + x0++; + remx = dw; + } + + nx = (totx + remx <= sw) ? remx : sw - totx; + ar += nx * r; ag += nx * g; ab += nx * b; + totx += nx; + remx -= nx; + } + + line[3 * x] = ar; + line[3 * x + 1] = ag; + line[3 * x + 2] = ab; +/* HACK */ +pipi_setpixel(dst, x, y, ar / sw, ag / sw, ab / sw); } - n = (tot + rem <= sw) ? rem : sw - tot; - ar += n * r; ag += n * g; ab += n * b; - tot += n; - rem -= n; + y0++; + remy = dh; +//printf(" remy is now %i\n", remy); } - pipi_setpixel(dst, x, y, ar / sw, ag / sw, ab / sw); + ny = (toty + remy <= sh) ? remy : sh - toty; + for(x = 0; x < dst->width; x++) + { + aline[3 * x] += ny * line[3 * x]; + aline[3 * x + 1] += ny * line[3 * x + 1]; + aline[3 * x + 2] += ny * line[3 * x + 2]; + } + toty += ny; + remy -= ny; +//printf(" remy-- %i\n", remy); } +//printf("pasting line %i (src line now %i)\n", y, y0); + +#if 0 + for(x = 0; x < dst->width; x++) + pipi_setpixel(dst, x, y, + aline[3 * x] / (sw * sh), + aline[3 * x + 1] / (sw * sh), + aline[3 * x + 2] / (sw * sh)); +#endif } + free(aline); + free(line); + return dst; }