summaryrefslogtreecommitdiff
path: root/render/scale.c
diff options
context:
space:
mode:
Diffstat (limited to 'render/scale.c')
-rw-r--r--render/scale.c85
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;
}