summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mupdf/image1.c5
-rw-r--r--mupdf/image2.c84
-rw-r--r--render/renderimage.c3
-rw-r--r--tree/colorspace.c4
-rw-r--r--tree/font.c4
5 files changed, 86 insertions, 14 deletions
diff --git a/mupdf/image1.c b/mupdf/image1.c
index 44d93eda..90fb4862 100644
--- a/mupdf/image1.c
+++ b/mupdf/image1.c
@@ -67,13 +67,14 @@ pdf_loadinlineimage(pdf_image **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict,
return error;
}
- img->super.n = img->super.cs->n;
- img->super.a = 0;
if (!strcmp(img->super.cs->name, "Indexed"))
{
img->indexed = (pdf_indexed*)img->super.cs;
img->super.cs = img->indexed->base;
}
+
+ img->super.n = img->super.cs->n;
+ img->super.a = 0;
}
if (fz_isarray(d))
diff --git a/mupdf/image2.c b/mupdf/image2.c
index dde40926..485766e6 100644
--- a/mupdf/image2.c
+++ b/mupdf/image2.c
@@ -6,6 +6,16 @@ static inline int getbit(const unsigned char *buf, int x)
return ( buf[x >> 3] >> ( 7 - (x & 7) ) ) & 1;
}
+static inline int gettwo(const unsigned char *buf, int x)
+{
+ return ( buf[x >> 2] >> ( ( 3 - (x & 3) ) << 1 ) ) & 3;
+}
+
+static inline int getnib(const unsigned char *buf, int x)
+{
+ return ( buf[x >> 1] >> ( ( 1 - (x & 1) ) << 2 ) ) & 0xf;
+}
+
static void loadtile1(pdf_image *src, fz_pixmap *dst, int n)
{
int x, y, k;
@@ -37,6 +47,68 @@ static void loadtile1a(pdf_image *src, fz_pixmap *dst, int n)
}
}
+static void loadtile2(pdf_image *src, fz_pixmap *dst, int n)
+{
+ int x, y, k;
+ for (y = dst->y; y < dst->y + dst->h; y++)
+ {
+ unsigned char *s = src->samples->bp + y * src->stride;
+ unsigned char *d = dst->samples + y * dst->w * dst->n;
+ for (x = dst->x; x < dst->x + dst->w; x++)
+ {
+ for (k = 0; k < n; k++)
+ d[x * n + k] = gettwo(s, x * n + k);
+ }
+ }
+}
+
+static void loadtile2a(pdf_image *src, fz_pixmap *dst, int n)
+{
+ int x, y, k;
+ for (y = dst->y; y < dst->y + dst->h; y++)
+ {
+ unsigned char *s = src->samples->bp + y * src->stride;
+ unsigned char *d = dst->samples + y * dst->w * dst->n;
+ for (x = dst->x; x < dst->x + dst->w; x++)
+ {
+ d[x * (n+1) + 0] = 1;
+ for (k = 0; k < n; k++)
+ d[x * (n+1) + k + 1] = gettwo(s, x * n + k);
+ }
+ }
+}
+
+static void loadtile4(pdf_image *src, fz_pixmap *dst, int n)
+{
+ int x, y, k;
+ for (y = dst->y; y < dst->y + dst->h; y++)
+ {
+ unsigned char *s = src->samples->bp + y * src->stride;
+ unsigned char *d = dst->samples + y * dst->w * dst->n;
+ for (x = dst->x; x < dst->x + dst->w; x++)
+ {
+ for (k = 0; k < n; k++)
+ d[x * n + k] = getnib(s, x * n + k);
+ }
+ }
+}
+
+static void loadtile4a(pdf_image *src, fz_pixmap *dst, int n)
+{
+ int x, y, k;
+ for (y = dst->y; y < dst->y + dst->h; y++)
+ {
+ unsigned char *s = src->samples->bp + y * src->stride;
+ unsigned char *d = dst->samples + y * dst->w * dst->n;
+ for (x = dst->x; x < dst->x + dst->w; x++)
+ {
+ d[x * (n+1) + 0] = 1;
+ for (k = 0; k < n; k++)
+ d[x * (n+1) + k + 1] = getnib(s, x * n + k);
+ }
+ }
+}
+
static void loadtile8(pdf_image *src, fz_pixmap *dst, int n)
{
int x, y, k;
@@ -123,8 +195,8 @@ pdf_loadtile(fz_image *img, fz_pixmap *tile)
switch (src->bpc)
{
case 1: loadtile1(src, tmp, 1); break;
- /* case 2: loadtile2(src, tmp, 1); break; */
- /* case 4: loadtile4(src, tmp, 1); break; */
+ case 2: loadtile2(src, tmp, 1); break;
+ case 4: loadtile4(src, tmp, 1); break;
case 8: loadtile8(src, tmp, 1); break;
default:
return fz_throw("rangecheck: unsupported bit depth: %d", src->bpc);
@@ -156,8 +228,8 @@ printf(" unpack n=%d\n", tile->n);
switch (src->bpc)
{
case 1: loadtile1(src, tile, img->n + img->a); break;
- /* case 2: loadtile2(src, tile, img->n + img->a); break; */
- /* case 4: loadtile4(src, tile, img->n + img->a); break; */
+ case 2: loadtile2(src, tile, img->n + img->a); break;
+ case 4: loadtile4(src, tile, img->n + img->a); break;
case 8: loadtile8(src, tile, img->n + img->a); break;
default:
return fz_throw("rangecheck: unsupported bit depth: %d", src->bpc);
@@ -168,8 +240,8 @@ printf(" unpack n=%d\n", tile->n);
switch (src->bpc)
{
case 1: loadtile1a(src, tile, img->n); break;
- /* case 2: loadtile2a(src, tile, img->n); break; */
- /* case 4: loadtile4a(src, tile, img->n); break; */
+ case 2: loadtile2a(src, tile, img->n); break;
+ case 4: loadtile4a(src, tile, img->n); break;
case 8: loadtile8a(src, tile, img->n); break;
default:
return fz_throw("rangecheck: unsupported bit depth: %d", src->bpc);
diff --git a/render/renderimage.c b/render/renderimage.c
index 3d287dca..fb0dcb68 100644
--- a/render/renderimage.c
+++ b/render/renderimage.c
@@ -220,7 +220,7 @@ fz_renderimage(fz_renderer *gc, fz_imagenode *node, fz_matrix ctm)
while ( ( (h + dy - 1) / dy ) / sy > 2.0 && (h+dy-1)/dy > 1)
dy++;
-printf("renderimage s=%gx%g/%dx%d d=%d,%d\n", sx, sy, w, h, dx, dy);
+printf("renderimage n=%d a=%d s=%gx%g/%dx%d d=%d,%d\n", n, a, sx, sy, w, h, dx, dy);
error = fz_newpixmap(&tile1, 0, 0, w, h, n + 1);
@@ -236,7 +236,6 @@ printf(" scale tile 1/%d x 1/%d\n", dx, dy);
else
tile2 = tile1;
-
bbox.min.x = 0;
bbox.min.y = 0;
bbox.max.x = 1;
diff --git a/tree/colorspace.c b/tree/colorspace.c
index 2a3e8e87..799011f3 100644
--- a/tree/colorspace.c
+++ b/tree/colorspace.c
@@ -61,12 +61,12 @@ fz_stdconvpixmap(fz_colorspace *srcs, fz_pixmap *src, fz_colorspace *dsts, fz_pi
unsigned char *s = src->samples;
unsigned char *d = dst->samples;
+ printf("convert pixmap from %s to %s\n", srcs->name, dsts->name);
+
assert(src->w == dst->w && src->h == dst->h);
assert(src->n == srcs->n + 1);
assert(dst->n == dsts->n + 1);
- printf("convert pixmap from %s to %s\n", srcs->name, dsts->name);
-
for (y = 0; y < src->h; y++)
{
for (x = 0; x < src->w; x++)
diff --git a/tree/font.c b/tree/font.c
index 0814efba..b7367ce1 100644
--- a/tree/font.c
+++ b/tree/font.c
@@ -185,7 +185,7 @@ fz_hmtx
fz_gethmtx(fz_font *font, int cid)
{
int l = 0;
- int r = font->nhmtx;
+ int r = font->nhmtx - 1;
int m;
if (!font->hmtx)
@@ -212,7 +212,7 @@ fz_getvmtx(fz_font *font, int cid)
fz_hmtx h;
fz_vmtx v;
int l = 0;
- int r = font->nvmtx;
+ int r = font->nvmtx - 1;
int m;
if (!font->vmtx)