diff options
-rw-r--r-- | mupdf/image1.c | 5 | ||||
-rw-r--r-- | mupdf/image2.c | 84 | ||||
-rw-r--r-- | render/renderimage.c | 3 | ||||
-rw-r--r-- | tree/colorspace.c | 4 | ||||
-rw-r--r-- | tree/font.c | 4 |
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) |