diff options
Diffstat (limited to 'render/scale.c')
-rw-r--r-- | render/scale.c | 85 |
1 files changed, 49 insertions, 36 deletions
diff --git a/render/scale.c b/render/scale.c index 1fad5a0b..00203cfc 100644 --- a/render/scale.c +++ b/render/scale.c @@ -1,26 +1,26 @@ #include <fitz.h> static void -scalerow(unsigned char *src, int w, int denom, unsigned char *dst, int ncomp) +scalerow(unsigned char *src, unsigned char *dst, int w, int ncomp, int denom) { - int x, left, n; + int x, left, k; int sum[32]; left = 0; - for (n = 0; n < ncomp; n++) - sum[n] = 0; + for (k = 0; k < ncomp; k++) + sum[k] = 0; for (x = 0; x < w; x++) { - for (n = 0; n < ncomp; n++) - sum[n] += src[x * ncomp + n]; + for (k = 0; k < ncomp; k++) + sum[k] += src[x * ncomp + k]; if (++left == denom) { left = 0; - for (n = 0; n < ncomp; n++) + for (k = 0; k < ncomp; k++) { - dst[n] = sum[n] / denom; - sum[n] = 0; + dst[k] = sum[k] / denom; + sum[k] = 0; } dst += ncomp; } @@ -28,66 +28,79 @@ scalerow(unsigned char *src, int w, int denom, unsigned char *dst, int ncomp) /* left overs */ if (left) - for (n = 0; n < ncomp; n++) - dst[n] = sum[n] / left; + for (k = 0; k < ncomp; k++) + dst[k] = sum[k] / left; } static void -scalecols(unsigned char *src, int stride, int w, int denom, unsigned char *dst, int ncomp) +scalecols(unsigned char *src, unsigned char *dst, int w, int ncomp, int denom) { - int x, y, n; + int x, y, k; unsigned char *s; int sum[32]; for (x = 0; x < w; x++) { s = src + (x * ncomp); - for (n = 0; n < ncomp; n++) - sum[n] = 0; + for (k = 0; k < ncomp; k++) + sum[k] = 0; for (y = 0; y < denom; y++) - for (n = 0; n < ncomp; n++) - sum[n] += s[y * stride + n]; - for (n = 0; n < ncomp; n++) - dst[n] = sum[n] / denom; + for (k = 0; k < ncomp; k++) + sum[k] += s[y * w * ncomp + k]; + for (k = 0; k < ncomp; k++) + dst[k] = sum[k] / denom; dst += ncomp; } } fz_error * -fz_scalepixmap(fz_pixmap *src, fz_pixmap *dst, int xdenom, int ydenom) +fz_scalepixmap(fz_pixmap **dstp, fz_pixmap *src, int xdenom, int ydenom) { - assert(src->n == dst->n); - assert(src->a == dst->a); - assert((src->w + xdenom - 1) / xdenom == dst->w); - assert((src->h + ydenom - 1) / ydenom == dst->h); + fz_error *error; + fz_pixmap *dst; + unsigned char *buf; + int y, iy, oy; + int ow, oh, n; - int ncomp = src->n + src->a; - unsigned char scratch[dst->stride * ydenom]; + ow = (src->w + xdenom - 1) / xdenom; + oh = (src->h + ydenom - 1) / ydenom; + n = src->n; - int y, iy, oy; + buf = fz_malloc(ow * n * ydenom); + if (!buf) + return fz_outofmem; + + error = fz_newpixmap(&dst, 0, 0, ow, oh, src->n); + if (error) + { + fz_free(buf); + return error; + } - for (y = 0, oy = 0; y < (dst->h - 1) * ydenom; y += ydenom, oy++) + for (y = 0, oy = 0; y < (src->h / ydenom) * ydenom; y += ydenom, oy++) { for (iy = 0; iy < ydenom; iy++) - scalerow(src->samples + (y + iy) * src->stride, src->w, xdenom, - scratch + iy * dst->stride, ncomp); - scalecols(scratch, ncomp * dst->w, dst->w, ydenom, - dst->samples + (oy * dst->stride), ncomp); + scalerow(src->samples + (y + iy) * src->w * n, + buf + iy * ow * n, + src->w, n, xdenom); + scalecols(buf, dst->samples + oy * dst->w * n, dst->w, n, ydenom); } ydenom = src->h - y; if (ydenom) { for (iy = 0; iy < ydenom; iy++) - scalerow(src->samples + (y + iy) * src->stride, src->w, xdenom, - scratch + iy * (ncomp * dst->w), ncomp); - scalecols(scratch, ncomp * dst->w, dst->w, ydenom, - dst->samples + (oy * dst->stride), ncomp); + scalerow(src->samples + (y + iy) * src->w * n, + buf + iy * ow * n, + src->w, n, xdenom); + scalecols(buf, dst->samples + oy * dst->w * n, dst->w, n, ydenom); } //printf("unscaled image ");fz_debugpixmap(src);getchar(); //printf("scaled image ");fz_debugpixmap(dst);getchar(); + fz_free(buf); + *dstp = dst; return nil; } |