diff options
-rw-r--r-- | mupdf/image.c | 89 | ||||
-rw-r--r-- | render/renderimage.c | 20 |
2 files changed, 88 insertions, 21 deletions
diff --git a/mupdf/image.c b/mupdf/image.c index a9a45f43..c30fb780 100644 --- a/mupdf/image.c +++ b/mupdf/image.c @@ -67,42 +67,46 @@ static void loadtile8a(pdf_image *src, fz_pixmap *dst, int n) } static void -decodetile(fz_pixmap *pix, int bpc, int a, float *decode) +decodetile(fz_pixmap *pix, int bpc, int skip, float *decode) { unsigned char table[32][256]; float twon = (1 << bpc) - 1; int x, y, k, i; - int isdefault = 1; - for (k = 0; k < pix->n - a; k++) +printf(" decode bpc=%d skip=%d n=%d twon=%g\n", bpc, skip, pix->n, twon); + + for (k = skip; k < pix->n; k++) { - int min = decode[k * 2 + 0] * 255; - int max = decode[k * 2 + 1] * 255; - if (min != 0 || max != 255) - isdefault = 0; + float min = decode[(k - skip) * 2 + 0]; + float max = decode[(k - skip) * 2 + 1]; + printf(" k=%d min=%g max=%g\n", k, min, max); } - if (isdefault) - return; for (i = 0; i < (1 << bpc); i++) { - for (k = 0; k < pix->n - a; k++) + if (skip) + table[0][i] = (i * 255) / twon; + for (k = skip; k < pix->n; k++) { - float min = decode[k * 2 + 0]; - float max = decode[k * 2 + 1]; + float min = decode[(k - skip) * 2 + 0]; + float max = decode[(k - skip) * 2 + 1]; float f = min + i * (max - min) / twon; table[k][i] = f * 255; } } +// for (i = 0; i < 256; i++) +// for (k = 0; k < 32; k++) +// table[k][i] = i; + for (y = 0; y < pix->h; y++) { for (x = 0; x < pix->w; x++) { - for (k = a; k < pix->n; k++) + for (k = 0; k < pix->n; k++) { i = pix->samples[ (y * pix->w + x) * pix->n + k]; - pix->samples[ (y * pix->w + x) * pix->n + k] = table[k-a][i]; + pix->samples[ (y * pix->w + x) * pix->n + k] = table[k][i]; } } } @@ -190,6 +194,7 @@ loadtile(fz_image *img, fz_pixmap *tile) return nil; } +/* TODO error cleanup */ fz_error * pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *dict, fz_obj *ref) { @@ -197,6 +202,7 @@ pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *dict, fz_obj *ref) pdf_image *img; int ismask; fz_obj *obj; + fz_obj *sub; int i; int w, h, bpc; @@ -206,15 +212,20 @@ pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *dict, fz_obj *ref) pdf_indexed *indexed = nil; int stride; +printf("loading image "); fz_debugobj(dict); printf("\n"); + img = fz_malloc(sizeof(pdf_image)); if (!img) return fz_outofmem; + /* + * Dimensions, BPC and ColorSpace + */ + w = fz_toint(fz_dictgets(dict, "Width")); h = fz_toint(fz_dictgets(dict, "Height")); bpc = fz_toint(fz_dictgets(dict, "BitsPerComponent")); -printf("loading image "); fz_debugobj(dict); printf("\n"); printf(" geometry %d x %d @ %d\n", w, h, bpc); cs = nil; @@ -242,19 +253,55 @@ printf(" indexed!\n"); fz_dropobj(obj); } + /* + * ImageMask, Mask and SoftMask + */ + ismask = fz_tobool(fz_dictgets(dict, "ImageMask")); if (ismask) { printf(" image mask!\n"); + bpc = 1; n = 0; a = 1; } + obj = fz_dictgets(dict, "SMask"); + if (fz_isindirect(obj)) + { + // sub-image mask + } + + obj = fz_dictgets(dict, "Mask"); + if (fz_isindirect(obj)) + { + error = pdf_loadindirect(&sub, xref, obj); + if (error) + return error; + if (fz_isarray(sub)) + { + // color key masking + } + else + { + // sub-image mask + } + fz_dropobj(sub); + } + else if (fz_isarray(obj)) + { + // color key masking + } + + /* + * Decode + */ + obj = fz_dictgets(dict, "Decode"); if (fz_isarray(obj)) { printf(" decode array!\n"); - if (img->indexed) + if (indexed) for (i = 0; i < 2; i++) img->decode[i] = fz_toreal(fz_arrayget(obj, i)); else @@ -263,7 +310,7 @@ printf(" decode array!\n"); } else { - if (img->indexed) + if (indexed) for (i = 0; i < 2; i++) img->decode[i] = i & 1 ? (1 << img->bpc) - 1 : 0; else @@ -271,6 +318,10 @@ printf(" decode array!\n"); img->decode[i] = i & 1; } + /* + * Load samples + */ + if (indexed) stride = (w * bpc + 7) / 8; else @@ -306,6 +357,10 @@ printf("%g ", img->decode[i]); printf("]\n"); printf("\n"); + /* + * Create image object + */ + img->super.loadtile = loadtile; img->super.drop = nil; img->super.cs = cs; diff --git a/render/renderimage.c b/render/renderimage.c index c82d411c..73b45e0c 100644 --- a/render/renderimage.c +++ b/render/renderimage.c @@ -210,20 +210,32 @@ printf(" draw image mask\n"); } /* render rgb over */ - else if (n == 3 && a == 0 && gc->acc) + else if (gc->acc) { + if (n == 3 && a == 0) + { printf(" draw image rgb over\n"); - error = drawtile(gc, gc->acc, tile2, ctm, 1); + error = drawtile(gc, gc->acc, tile2, ctm, 1); + } + + /* render generic image */ + else + { +printf(" draw image rgb over after cs transform\n"); + error = fz_convertpixmap(&tile3, tile2, cs, gc->model); + error = drawtile(gc, gc->acc, tile3, ctm, 1); + fz_droppixmap(tile3); + } } /* render generic image */ else { -printf(" draw image rgb over after cs transform\n"); +printf(" draw image after cs transform\n"); error = fz_convertpixmap(&tile3, tile2, cs, gc->model); error = fz_newpixmap(&gc->tmp, gc->x, gc->y, gc->w, gc->h, gc->model->n + 1); fz_clearpixmap(gc->tmp); - error = drawtile(gc, gc->tmp, tile3, ctm, 1); + error = drawtile(gc, gc->tmp, tile3, ctm, 0); fz_droppixmap(tile3); } |