diff options
-rw-r--r-- | mupdf/colorspace.c | 114 | ||||
-rw-r--r-- | mupdf/function.c | 2 | ||||
-rw-r--r-- | mupdf/image.c | 10 | ||||
-rw-r--r-- | render/renderimage.c | 14 | ||||
-rw-r--r-- | tree/colorspace.c | 5 |
5 files changed, 132 insertions, 13 deletions
diff --git a/mupdf/colorspace.c b/mupdf/colorspace.c index 85fdc283..d7519593 100644 --- a/mupdf/colorspace.c +++ b/mupdf/colorspace.c @@ -513,7 +513,15 @@ static void separationtoxyz(fz_colorspace *fzcs, float *sep, float *xyz) cs->base->toxyz(cs->base, alt, xyz); } -fz_error * +static void +freeseparation(fz_colorspace *fzcs) +{ + struct separation *cs = (struct separation *)fzcs; + fz_freecolorspace(cs->base); + pdf_freefunction(cs->tint); +} + +static fz_error * loadseparation(fz_colorspace **csp, pdf_xref *xref, fz_obj *array) { fz_error *error; @@ -546,7 +554,7 @@ loadseparation(fz_colorspace **csp, pdf_xref *xref, fz_obj *array) return fz_outofmem; } - initcs((fz_colorspace*)sep, "Separation", 1, separationtoxyz, nil, nil); + initcs((fz_colorspace*)sep, "Separation", 1, separationtoxyz, nil, freeseparation); sep->base = base; sep->tint = tint; @@ -556,6 +564,105 @@ loadseparation(fz_colorspace **csp, pdf_xref *xref, fz_obj *array) } /* + * Indexed + */ + +struct indexed +{ + fz_colorspace super; + fz_colorspace *base; + int high; + float *lookup; +}; + +static void +indexedtoxyz(fz_colorspace *fzcs, float *ind, float *xyz) +{ + struct indexed *cs = (struct indexed *)fzcs; + int i = ind[0] * 255; // FIXME + i = CLAMP(i, 0, cs->high); + cs->base->toxyz(cs->base, cs->lookup + i * cs->base->n, xyz); +} + +static void +freeindexed(fz_colorspace *fzcs) +{ + struct indexed *cs = (struct indexed *)fzcs; + fz_freecolorspace(cs->base); + fz_free(cs->lookup); +} + +static fz_error * +loadindexed(fz_colorspace **csp, pdf_xref *xref, fz_obj *array) +{ + fz_error *error; + struct indexed *cs; + fz_obj *baseobj = fz_arrayget(array, 1); + fz_obj *highobj = fz_arrayget(array, 2); + fz_obj *lookup = fz_arrayget(array, 3); + fz_colorspace *base; + int n; + + error = pdf_resolve(&baseobj, xref); + if (error) + return error; + error = pdf_loadcolorspace(&base, xref, baseobj); + fz_dropobj(baseobj); + if (error) + return error; + + cs = fz_malloc(sizeof(struct indexed)); + if (!cs) + { + fz_freecolorspace(base); + return fz_outofmem; + } + + initcs((fz_colorspace*)cs, "Indexed", 1, indexedtoxyz, nil, freeindexed); + + cs->base = base; + cs->high = fz_toint(highobj); + + n = base->n * (cs->high + 1); + + cs->lookup = fz_malloc(n * sizeof(float)); + if (!cs->lookup) + { + freeindexed((fz_colorspace*)cs); + return fz_outofmem; + } + + if (fz_isstring(lookup) && fz_tostringlen(lookup) == n) + { + unsigned char *buf = fz_tostringbuf(lookup); + int i; + for (i = 0; i < n; i++) + cs->lookup[i] = buf[i] / 255.0; // FIXME base range + } + + if (fz_isindirect(lookup)) + { + fz_buffer *buf; + int i; + + error = pdf_loadstream(&buf, xref, fz_tonum(lookup), fz_togen(lookup)); + if (error) + { + freeindexed((fz_colorspace*)cs); + return error; + } + + for (i = 0; i < n && i < (buf->wp - buf->rp); i++) + cs->lookup[i] = buf->rp[i] / 255.0; // FIXME base range + + fz_freebuffer(buf); + } + + *csp = (fz_colorspace*)cs; + return nil; +} + +/* * Parse and create colorspace from PDF object. */ @@ -611,6 +718,9 @@ printf("\n"); if (!strcmp(fz_toname(name), "ICCBased")) return loadiccbased(csp, xref, fz_arrayget(obj, 1)); + if (!strcmp(fz_toname(name), "Indexed")) + return loadindexed(csp, xref, obj); + if (!strcmp(fz_toname(name), "Separation")) return loadseparation(csp, xref, obj); } diff --git a/mupdf/function.c b/mupdf/function.c index 4fa44d2a..44a38e0d 100644 --- a/mupdf/function.c +++ b/mupdf/function.c @@ -601,7 +601,7 @@ evalsamplefunc(pdf_function *func, float *in, float *out) float *range = func->range; float *decode = func->u.sa.decode; int *size = func->u.sa.size; - float byterange = 1<<func->u.sa.bps-1; + float byterange = (1<<func->u.sa.bps)-1; if(func->type != PDF_FUNC_SAMPLE) goto cleanup; diff --git a/mupdf/image.c b/mupdf/image.c index 12efa525..44ee499a 100644 --- a/mupdf/image.c +++ b/mupdf/image.c @@ -203,8 +203,14 @@ printf("load image %d x %d @ %d\n", img->super.w, img->super.h, img->bpc); for (i = 0; i < (img->super.n + img->super.a) * 2; i++) img->decode[i] = fz_toreal(fz_arrayget(obj, i)); else - for (i = 0; i < (img->super.n + img->super.a) * 2; i++) - img->decode[i] = i & 1; + { + if (cs && !strcmp(cs->name, "IndexedXXX")) + for (i = 0; i < (img->super.n + img->super.a) * 2; i++) + img->decode[i] = i & 1 ? (1 << img->bpc) - 1 : 0; + else + for (i = 0; i < (img->super.n + img->super.a) * 2; i++) + img->decode[i] = i & 1; + } printf(" colorspace %s\n", cs ? cs->name : "(null)"); printf(" mask %d\n", ismask); diff --git a/render/renderimage.c b/render/renderimage.c index a89409c5..37c32fae 100644 --- a/render/renderimage.c +++ b/render/renderimage.c @@ -9,10 +9,12 @@ void fz_gammapixmap(fz_pixmap *pix, float gamma); static inline int getcomp(fz_pixmap *pix, int u, int v, int k) { - if (u < 0 || u >= pix->w) - return 0; - if (v < 0 || v >= pix->h) - return 0; +// if (u < 0 || u >= pix->w) +// return 0; +// if (v < 0 || v >= pix->h) +// return 0; + u = CLAMP(u, 0, pix->w - 1); + v = CLAMP(v, 0, pix->h - 1); return pix->samples[ (v * pix->w + u) * pix->n + k ]; } @@ -172,11 +174,11 @@ fz_renderimage(fz_renderer *gc, fz_imagenode *node, fz_matrix ctm) float sy = sqrt(ctm.c * ctm.c + ctm.d * ctm.d); int dx = 1; - while ( ( (w + dx - 1) / dx ) / sx > 2.0 ) + while ( ( (w + dx - 1) / dx ) / sx > 2.0 && (w+dx-1)/dx > 1) dx++; int dy = 1; - while ( ( (h + dy - 1) / dy ) / sy > 2.0 ) + 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); diff --git a/tree/colorspace.c b/tree/colorspace.c index 57fa9ac5..6b4766c2 100644 --- a/tree/colorspace.c +++ b/tree/colorspace.c @@ -14,7 +14,7 @@ void fz_convertcolor(fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *dstv) { float xyz[3]; -//int i; + int i; if (srcs != dsts) { //printf("convert color from %s to %s\n ", srcs->name, dsts->name); @@ -22,11 +22,12 @@ fz_convertcolor(fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *ds srcs->toxyz(srcs, srcv, xyz); //printf(" %g %g %g\n ", xyz[0], xyz[1], xyz[2]); dsts->fromxyz(dsts, xyz, dstv); + for (i = 0; i < dsts->n; i++) + dstv[i] = CLAMP(dstv[i], 0.0, 1.0); //for(i=0;i<dsts->n;i++)printf("%g ", dstv[i]);printf("\n"); } else { - int i; for (i = 0; i < srcs->n; i++) dstv[i] = srcv[i]; } |