summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mupdf/colorspace.c114
-rw-r--r--mupdf/function.c2
-rw-r--r--mupdf/image.c10
-rw-r--r--render/renderimage.c14
-rw-r--r--tree/colorspace.c5
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];
}