summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2012-04-13 18:51:34 +0000
committerRobin Watts <robin@ghostscript.com>2012-04-13 18:53:34 +0000
commit34b74d7bb34390ad75ba8ca52b6bd5e94e85a51e (patch)
tree29097f9b6504f507a638045fe22083beac55486f
parent42af17e78ebac4e31e4694d949ef5dfadeacb4fd (diff)
bmpcmp: Another attempt to make cmyk + spots psdcmyk files work.
Hopefully this should work; we now make the diff map, then convert down to cmyk (by dropping the spots), then convert cmyk -> rgb. Next step is to add the spots into the cmyk as we map down.
-rw-r--r--gs/toolbin/bmpcmp.c178
1 files changed, 44 insertions, 134 deletions
diff --git a/gs/toolbin/bmpcmp.c b/gs/toolbin/bmpcmp.c
index a02a7d5a1..78223d8df 100644
--- a/gs/toolbin/bmpcmp.c
+++ b/gs/toolbin/bmpcmp.c
@@ -2238,16 +2238,15 @@ static void fuzzy_diff(unsigned char *bmp,
static void uncmyk_bmp(unsigned char *bmp,
BBox *bbox,
- int span,
- int n)
+ int span)
{
int w, h;
int x, y;
- bmp += span *(bbox->ymin)+(bbox->xmin*n);
+ bmp += span *(bbox->ymin)+(bbox->xmin*4);
w = bbox->xmax - bbox->xmin;
h = bbox->ymax - bbox->ymin;
- span -= n*w;
+ span -= 4*w;
for (y = 0; y < h; y++)
{
for (x = 0; x < w; x++)
@@ -2272,17 +2271,16 @@ static void uncmyk_bmp(unsigned char *bmp,
bmp[-2] = r;
bmp[-3] = g;
bmp[-4] = b;
- bmp += n-4;
}
bmp += span;
}
}
-static void diff_bmp_int(unsigned char *bmp,
- unsigned char *map,
- BBox *bbox,
- int span,
- int map_span)
+static void diff_bmp(unsigned char *bmp,
+ unsigned char *map,
+ BBox *bbox,
+ int span,
+ int map_span)
{
int w, h;
int x, y;
@@ -2344,101 +2342,6 @@ static void diff_bmp_int(unsigned char *bmp,
}
}
-static void diff_bmp_n(unsigned char *bmp,
- unsigned char *map,
- BBox *bbox,
- int span,
- int map_span,
- int n)
-{
- int w, h;
- int x, y;
- unsigned char *src;
-
- src = bmp;
- src += span *(bbox->ymin)+bbox->xmin*n;
- map += map_span*(bbox->ymin)+bbox->xmin;
- w = bbox->xmax - bbox->xmin;
- h = bbox->ymax - bbox->ymin;
- span -= w*n;
- map_span -= w;
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- int m = *map++;
-
- switch (m) {
- case 0:
- {
- /* Matching pixel - greyscale it */
- int a;
-
- a = src[0];
- a += src[1];
- a += src[2];
- a /= 6*2;
-
- src[0] = a;
- src[1] = a;
- src[2] = a;
- break;
- }
- case 1:
- /* Green */
- src[0] = 0;
- src[1] = 0xFF;
- src[2] = 0;
- break;
- case 3:
- /* Cyan */
- src[0] = 0xFF;
- src[1] = 0xFF;
- src[2] = 0;
- break;
- case 5:
- /* Yellow */
- src[0] = 0;
- src[1] = 0xFF;
- src[2] = 0xFF;
- break;
- case 7:
- /* Orange */
- src[0] = 0;
- src[1] = 0x80;
- src[2] = 0xFF;
- break;
- case 15:
- /* Red */
- src[0] = 0x00;
- src[1] = 0x00;
- src[2] = 0xFF;
- break;
- default:
- fprintf(stderr,
- "bmpcmp: Internal error: unexpected map type %d\n", m);
- break;
- }
- src += n;
- }
- src += span;
- map += map_span;
- }
-}
-
-static void diff_bmp(unsigned char *bmp,
- unsigned char *map,
- BBox *bbox,
- int span,
- int map_span,
- int bpp)
-{
- if (bpp <= 32)
- diff_bmp_int(bmp, map, bbox, span, map_span);
- else
- diff_bmp_n(bmp, map, bbox, span, map_span, bpp>>3);
-}
-
static void save_meta(BBox *bbox, char *str, int w, int h, int page, int threshold, int window)
{
FILE *file;
@@ -2503,7 +2406,7 @@ static void save_bmp(unsigned char *data,
fwrite(bmp, 1, 14+40, file);
- data += bbox->xmin * n;
+ data += bbox->xmin * 4;
data += bbox->ymin * span;
if (bpp == 16)
@@ -2518,11 +2421,11 @@ static void save_bmp(unsigned char *data,
for (x=0; x<width; x++)
{
fwrite(data, 1, 3, file);
- data += n;
+ data += 4;
}
if (word_width)
fwrite(&zero, 1, word_width, file);
- data += span-(n*width);
+ data += span-(4*width);
}
}
fclose(file);
@@ -2578,10 +2481,8 @@ static void save_png(unsigned char *data,
/* we use bmp coordinates where the zero-th row is at the bottom */
if (bpp == 16)
src_bypp = 2;
- else if (bpp <= 32)
- src_bypp = 4;
else
- src_bypp = bpp>>3;
+ src_bypp = 4;
if (bpp == 16)
word_width = width*2;
else
@@ -2595,26 +2496,6 @@ static void save_png(unsigned char *data,
rows[height - y - 1] = &data[(y + bbox->ymin)*span + bbox->xmin * src_bypp - 1];
png_set_rows(png, info, rows);
- if (src_bypp > 32)
- {
- int n = src_bypp>>3;
- for (y = 0; y < height; y++)
- {
- unsigned char *p = rows[height - y - 1] + 1;
- unsigned char *q = p;
- int x;
- for (x = width; x > 0; x--)
- {
- p[0] = q[0];
- p[1] = q[1];
- p[2] = q[2];
- p[3] = q[3];
- p += 4;
- q += n;
- }
- }
- }
-
/* write out the image */
png_write_png(png, info,
PNG_TRANSFORM_STRIP_FILLER_BEFORE|
@@ -2887,6 +2768,29 @@ static void rediff(unsigned char *map,
*global = local;
}
+static void unspot(unsigned char *bmp, int w, int h, int span, int bpp)
+{
+ int x, y, n = bpp>>3;
+ unsigned char *p = bmp;
+
+ span -= w*4;
+ n -= 4;
+ for (y = h; y > 0; y--)
+ {
+ unsigned char *q = p;
+ for (x = w; x > 0; x--)
+ {
+ /* FIXME: Map spots down - don't just ignore them */
+ *p++ = *q++;
+ *p++ = *q++;
+ *p++ = *q++;
+ *p++ = *q++;
+ q += n;
+ }
+ p += span;
+ }
+}
+
int main(int argc, char *argv[])
{
int w, h, s, bpp, cmyk;
@@ -3016,6 +2920,12 @@ int main(int argc, char *argv[])
/* bbox */
boxlist = Malloc(sizeof(*boxlist) * nx * ny);
+ if (bpp >= 32)
+ {
+ unspot(bmp, w, h, s, bpp);
+ unspot(bmp2, w, h, s, bpp);
+ }
+
/* Now save the changed bmps */
n = params.basenum;
boxlist--;
@@ -3044,8 +2954,8 @@ int main(int argc, char *argv[])
boxlist->xmax, boxlist->ymax));
if (cmyk)
{
- uncmyk_bmp(bmp, boxlist, s, params.bpp>>3);
- uncmyk_bmp(bmp2, boxlist, s, params.bpp>>3);
+ uncmyk_bmp(bmp, boxlist, s);
+ uncmyk_bmp(bmp2, boxlist, s);
}
#ifdef HAVE_LIBPNG
sprintf(str1, "%s.%05d.png", params.outroot, n);
@@ -3060,7 +2970,7 @@ int main(int argc, char *argv[])
save_bmp(bmp, boxlist, s, bpp, str1);
save_bmp(bmp2, boxlist, s, bpp, str2);
#endif
- diff_bmp(bmp, map, boxlist, s, w, bpp);
+ diff_bmp(bmp, map, boxlist, s, w);
#ifdef HAVE_LIBPNG
save_png(bmp, boxlist, s, bpp, str3);
#else