summaryrefslogtreecommitdiff
path: root/toolbin
diff options
context:
space:
mode:
Diffstat (limited to 'toolbin')
-rw-r--r--toolbin/bmpcmp.c430
1 files changed, 240 insertions, 190 deletions
diff --git a/toolbin/bmpcmp.c b/toolbin/bmpcmp.c
index 78b7ef7be..53361b3c1 100644
--- a/toolbin/bmpcmp.c
+++ b/toolbin/bmpcmp.c
@@ -97,17 +97,30 @@ typedef struct
int lab;
} Params;
+typedef struct
+{
+ int width;
+ int height;
+ int span;
+ int bpp;
+ int cmyk;
+ void *lab;
+ /* Below are the entries for handling spot colors and the */
+ /* CMYK equivalents (only used for PSD images currently). */
+ int *num_spots;
+ unsigned char *spots;
+ /* used to map the second file colors to the same colorants */
+ /* as the first and issue a warning if they did not match. */
+ int *color_map;
+} Image;
+
+
typedef struct ImageReader
{
FILE *file;
const char* file_name;
void *(*read)(struct ImageReader *,
- int *w,
- int *h,
- int *s,
- int *bpp,
- int *cmyk,
- void **lab);
+ Image *);
} ImageReader;
/*
@@ -121,10 +134,6 @@ typedef void (DiffFn)(unsigned char *bmp,
BBox *bbox,
Params *params);
-/* Nasty (as if the rest of this code isn't!) global variables for holding
- * spot color details. */
-static unsigned char spots[256*4];
-static int spotfill = 0;
static void *Malloc(size_t size) {
void *block;
@@ -384,12 +393,7 @@ static unsigned char *bmp_load_sub(unsigned char *bmp,
}
static void *bmp_read(ImageReader *im,
- int *width,
- int *height,
- int *span,
- int *bpp,
- int *cmyk,
- void **lab)
+ Image *img)
{
int offset;
long filelen, filepos;
@@ -397,8 +401,8 @@ static void *bmp_read(ImageReader *im,
unsigned char *bmp;
/* No CMYK bmp support */
- *cmyk = 0;
- *lab = NULL;
+ img->cmyk = 0;
+ img->lab = NULL;
filepos = ftell(im->file);
fseek(im->file, 0, SEEK_END);
@@ -415,7 +419,7 @@ static void *bmp_read(ImageReader *im,
fread(bmp, 1, filelen, im->file);
offset = getdword(bmp+10);
- data = bmp_load_sub(bmp+14, width, height, span, bpp, offset-14, filelen);
+ data = bmp_load_sub(bmp+14, &img->width, &img->height, &img->span, &img->bpp, offset-14, filelen);
free(bmp);
return data;
}
@@ -465,24 +469,19 @@ static int get_short(FILE *file, int rev)
}
static void *cups_read(ImageReader *im,
- int *width,
- int *height,
- int *span,
- int *bpp,
- int *cmyk,
- int rev,
- void **lab)
+ Image *img,
+ int rev)
{
unsigned char *data, *d;
int c, x, y, b, bpc, bpl;
int colspace;
- *lab = NULL;
+ img->lab = NULL;
if (skip_bytes(im->file, 372) == EOF)
return NULL;
- *width = get_int(im->file, rev);
- *height = get_int(im->file, rev);
+ img->width = get_int(im->file, rev);
+ img->height = get_int(im->file, rev);
if (skip_bytes(im->file, 4) == EOF)
return NULL;
bpc = get_int(im->file, rev);
@@ -513,14 +512,14 @@ static void *cups_read(ImageReader *im,
if (skip_bytes(im->file, 1796-424) == EOF)
return NULL;
- data = Malloc(*width * *height * 4);
- *span = *width * 4;
- *bpp = 32;
- for (y = *height; y > 0; y--) {
+ data = Malloc(img->width * img->height * 4);
+ img->span = img->width * 4;
+ img->bpp = 32;
+ for (y = img->height; y > 0; y--) {
b = 0;
c = 0;
- d = data + (y - 1) * *span;
- for (x = *width; x > 0; x--) {
+ d = data + (y - 1) * img->span;
+ for (x = img->width; x > 0; x--) {
b >>= 1;
if (b == 0) {
c = fgetc(im->file);
@@ -540,35 +539,25 @@ static void *cups_read(ImageReader *im,
*d++ = 0;
}
}
- skip_bytes(im->file, bpl-((*width+7)>>3));
+ skip_bytes(im->file, bpl-((img->width+7)>>3));
}
/* No CMYK cups support */
- *cmyk = 0;
+ img->cmyk = 0;
return data;
}
static void *cups_read_le(ImageReader *im,
- int *width,
- int *height,
- int *span,
- int *bpp,
- int *cmyk,
- void **lab)
+ Image *img)
{
- return cups_read(im, width, height, span, bpp, cmyk, 0, lab);
+ return cups_read(im, img, 0);
}
static void *cups_read_be(ImageReader *im,
- int *width,
- int *height,
- int *span,
- int *bpp,
- int *cmyk,
- void **lab)
+ Image *img)
{
- return cups_read(im, width, height, span, bpp, cmyk, 1, lab);
+ return cups_read(im, img, 1);
}
static void skip_to_eol(FILE *file)
@@ -981,18 +970,13 @@ static int pam_header_read(FILE *file,
}
static void *pnm_read(ImageReader *im,
- int *width,
- int *height,
- int *span,
- int *bpp,
- int *cmyk,
- void **lab)
+ Image *img)
{
unsigned char *bmp;
int c, maxval;
void (*read)(FILE *, int, int, int, unsigned char *);
- *lab = NULL;
+ img->lab = NULL;
c = fgetc(im->file);
/* Skip over any white space before the P */
@@ -1001,7 +985,7 @@ static void *pnm_read(ImageReader *im,
}
if (c == EOF)
return NULL;
- *cmyk = 0;
+ img->cmyk = 0;
switch (get_pnm_num(im->file))
{
case 1:
@@ -1031,22 +1015,22 @@ static void *pnm_read(ImageReader *im,
return NULL;
}
if (read == pam_read) {
- *cmyk = pam_header_read(im->file, width, height, &maxval);
+ img->cmyk = pam_header_read(im->file, &img->width, &img->height, &maxval);
} else {
- *width = get_pnm_num(im->file);
- *height = get_pnm_num(im->file);
+ img->width = get_pnm_num(im->file);
+ img->height = get_pnm_num(im->file);
if (read != pbm_read)
maxval = get_pnm_num(im->file);
else
maxval = 1;
}
- *span = *width * 4;
- *bpp = 32; /* We always convert to 32bpp */
+ img->span = img->width * 4;
+ img->bpp = 32; /* We always convert to 32bpp */
- bmp = Malloc(*width * *height * 4);
+ bmp = Malloc(img->width * img->height * 4);
- read(im->file, *width, *height, maxval, bmp);
+ read(im->file, img->width, img->height, maxval, bmp);
return bmp;
}
@@ -1093,12 +1077,7 @@ static toff_t tiff_csize(thandle_t im_)
}
static void* tif_read(ImageReader* im,
- int* im_width,
- int* im_height,
- int* span,
- int* bpp,
- int* cmyk,
- void **lab)
+ Image *img)
{
TIFF* tif;
uint16 compression;
@@ -1118,7 +1097,7 @@ static void* tif_read(ImageReader* im,
cmsContext ctx;
#endif
- *lab = NULL;
+ img->lab = NULL;
/* There is only one image in each file */
if (ftell(im->file) != 0)
@@ -1222,7 +1201,7 @@ static void* tif_read(ImageReader* im,
/* Do calloc just to make sure alpha value is known */
data_lab = Calloc(height * width * 4);
- *lab = data_lab;
+ img->lab = data_lab;
}
#endif
@@ -1287,11 +1266,11 @@ static void* tif_read(ImageReader* im,
_TIFFfree(buf);
TIFFClose(tif);
- *im_width = width;
- *im_height = height;
- *span = width * 4;
- *bpp = 32;
- *cmyk = num_comps == 4;
+ img->width = width;
+ img->height = height;
+ img->span = width * 4;
+ img->bpp = 32;
+ img->cmyk = num_comps == 4;
return data;
}
@@ -1299,12 +1278,7 @@ static void* tif_read(ImageReader* im,
#ifdef HAVE_LIBPNG
static void *png_read(ImageReader *im,
- int *width,
- int *height,
- int *span,
- int *bpp,
- int *cmyk,
- void **lab)
+ Image *img)
{
png_structp png;
png_infop info;
@@ -1313,7 +1287,7 @@ static void *png_read(ImageReader *im,
unsigned char *data;
int expand = 0;
- *lab = NULL;
+ img->lab = NULL;
/* There is only one image in each file */
if (ftell(im->file) != 0)
@@ -1370,28 +1344,23 @@ static void *png_read(ImageReader *im,
png_read_end(png, NULL);
png_destroy_read_struct(&png, &info, NULL);
- *width = w;
- *height = h;
- *span = (int) stride;
- *bpp = (int) (stride * 8) / w;
- *cmyk = 0;
+ img->width = w;
+ img->height = h;
+ img->span = (int) stride;
+ img->bpp = (int) (stride * 8) / w;
+ img->cmyk = 0;
return data;
}
#endif
static void *psd_read(ImageReader *im,
- int *width,
- int *height,
- int *span,
- int *bpp,
- int *cmyk,
- void **lab)
-{
- int c, ir_len, w, h, n, x, y, z, N;
+ Image *img)
+{
+ int c, ir_len, w, h, span, n, x, y, z, N;
unsigned char *bmp, *line, *ptr;
int bpc;
- *lab = NULL;
+ img->lab = NULL;
if (feof(im->file))
return NULL;
@@ -1404,14 +1373,14 @@ static void *psd_read(ImageReader *im,
}
/* Skip zeros */
- c = get_short(im->file, 1);
- c = get_int(im->file, 1);
+ (void)get_short(im->file, 1);
+ (void)get_int(im->file, 1);
n = get_short(im->file, 1);
- *bpp = n * 8;
+ img->bpp = n * 8;
- h = *height = get_int(im->file, 1);
- w = *width = get_int(im->file, 1);
+ h = img->height = get_int(im->file, 1);
+ w = img->width = get_int(im->file, 1);
bpc = get_short(im->file, 1);
if (bpc != 8 && bpc != 16) {
fprintf(stderr, "bmpcmp: We only support 8bpp or 16bpp psd files!\n");
@@ -1419,19 +1388,19 @@ static void *psd_read(ImageReader *im,
}
c = get_short(im->file, 1);
if (c == 4) {
- *cmyk = 1;
+ img->cmyk = 1;
if (n < 4) {
fprintf(stderr, "bmpcmp: Unexpected number of components (%d) in a CMYK (+spots) PSD file!\n", n);
exit(1);
}
} else if (c == 3) {
- *cmyk = 0; /* RGB */
+ img->cmyk = 0; /* RGB */
if (n != 3) {
fprintf(stderr, "bmpcmp: Unexpected number of components (%d) in a RGB PSD file!\n", n);
exit(1);
}
} else if (c == 1) {
- *cmyk = 0; /* Greyscale */
+ img->cmyk = 0; /* Greyscale */
if (n != 1) {
fprintf(stderr, "bmpcmp: Unexpected number of components (%d) in a Greyscale PSD file!\n", n);
exit(1);
@@ -1449,64 +1418,100 @@ static void *psd_read(ImageReader *im,
}
/* Image Resources section */
- spotfill = 0;
ir_len = get_int(im->file, 1);
while (ir_len > 0)
{
- int data_len, pad;
- c = fgetc(im->file)<<24; if (--ir_len == 0) break;
- c |= fgetc(im->file)<<16; if (--ir_len == 0) break;
- c |= fgetc(im->file)<<8; if (--ir_len == 0) break;
- c |= fgetc(im->file); if (--ir_len == 0) break;
+ int data_len;
+
+ if (ir_len < 12) /* enough for "8BIM", short data_type (0x3ef), 2-byte pad, int data_len */
+ break; /* not enough data */
+ c = get_int(im->file, 1);
/* c == 8BIM */
- c = fgetc(im->file)<<8; if (--ir_len == 0) break;
- c |= fgetc(im->file); if (--ir_len == 0) break;
+ c = get_short(im->file, 1);
/* Skip the padded id (which will always be 00 00) */
- pad = fgetc(im->file); if (--ir_len == 0) break;
- pad |= fgetc(im->file)<<8; if (--ir_len == 0) break;
- /* Get the data len */
- data_len = fgetc(im->file)<<24; if (--ir_len == 0) break;
- data_len |= fgetc(im->file)<<16; if (--ir_len == 0) break;
- data_len |= fgetc(im->file)<<8; if (--ir_len == 0) break;
- data_len |= fgetc(im->file); if (--ir_len == 0) break;
+ (void)get_short(im->file, 1);
+ data_len = get_int(im->file, 1);
+ ir_len -= 12;
if (c == 0x3ef) {
- while (data_len > 0) {
+ int spotnum = 0;
+ int i;
+
+ while (data_len > 0) {
+ unsigned char spot[4];
+
+ if (ir_len < 14) /* enough for short colorspace, and CMYK data */
+ break;
/* Read the colorspace */
- c = fgetc(im->file)<<8; if (--ir_len == 0) break;
- c |= fgetc(im->file); if (--ir_len == 0) break;
+ c = get_short(im->file, 1);
/* We only support CMYK spots! */
if (c != 2) {
fprintf(stderr, "bmpcmp: Spot color equivalent not CMYK! (%d)\n", c);
exit(EXIT_FAILURE);
}
/* c == 2 = COLORSPACE = CMYK */
- /* 16 bits C, 16 bits M, 16 bits Y, 16 bits K */
- spots[spotfill++] = 0xff - fgetc(im->file); if (--ir_len == 0) break;
- c = fgetc(im->file); if (--ir_len == 0) break;
- spots[spotfill++] = 0xff - fgetc(im->file); if (--ir_len == 0) break;
- c = fgetc(im->file); if (--ir_len == 0) break;
- spots[spotfill++] = 0xff - fgetc(im->file); if (--ir_len == 0) break;
- c = fgetc(im->file); if (--ir_len == 0) break;
- spots[spotfill++] = 0xff - fgetc(im->file); if (--ir_len == 0) break;
- c = fgetc(im->file); if (--ir_len == 0) break;
+ /* 16 bits C, 16 bits M, 16 bits Y, 16 bits K, ignore the low byte */
+ spot[0] = 0xff - fgetc(im->file); /* high byte of Cyan */
+ (void)fgetc(im->file); /* ignore low byte */
+ spot[1] = 0xff - fgetc(im->file); /* high byte of Magenta */
+ (void)fgetc(im->file); /* ignore low byte */
+ spot[2] = 0xff - fgetc(im->file); /* high byte of Yellow */
+ (void)fgetc(im->file); /* ignore low byte */
+ spot[3] = 0xff - fgetc(im->file); /* high byte of Black */
+ (void)fgetc(im->file); /* ignore low byte */
/* 2 bytes opacity (always seems to be 0) */
- c = fgetc(im->file); if (--ir_len == 0) break;
- c = fgetc(im->file); if (--ir_len == 0) break;
+ (void)get_short(im->file, 1);
/* 1 byte 'kind' (0 = selected, 1 = protected) */
- c = fgetc(im->file); if (--ir_len == 0) break;
+ (void)fgetc(im->file);
/* 1 byte padding */
- c = fgetc(im->file); if (--ir_len == 0) break;
+ (void)fgetc(im->file);
data_len -= 14;
- }
- }
- if (ir_len > 0)
- {
- while (data_len > 0)
- {
- c = fgetc(im->file); if (--ir_len == 0) break;
- data_len--;
- }
+ ir_len -= 14;
+
+ /* Check if the spot colorants were filled in by the first image and */
+ /* if so, fill in the color_map with the matching spot number. */
+ if (*(img->num_spots) == 0) { /* num_spots not updated until finished with this file */
+ /* Spots not seen, this must be the first image */
+ img->spots[spotnum*4 + 0] = spot[0];
+ img->spots[spotnum*4 + 1] = spot[1];
+ img->spots[spotnum*4 + 2] = spot[2];
+ img->spots[spotnum*4 + 3] = spot[3];
+ img->color_map[spotnum + 4] = spotnum + 4; /* default, map to self */
+ } else {
+ /* spots were set by the first file. See if the colorant order matches */
+ if (img->spots[spotnum*4 + 0] != spot[0] || img->spots[spotnum*4 + 1] != spot[1] ||
+ img->spots[spotnum*4 + 2] != spot[2] || img->spots[spotnum*4 + 3] != spot[3] ) {
+ /* This spot didn't match, issue a warning and see if we can map */
+ fprintf(stderr, "bmpcmp: spot colorant number %d did not match.\n", spotnum);
+ for (i=(*(img->num_spots)-1); i >= 0 ; --i) {
+ if (img->spots[i*4 + 0] == spot[0] && img->spots[i*4 + 1] == spot[1] &&
+ img->spots[i*4 + 2] == spot[2] && img->spots[i*4 + 3] == spot[3]) {
+ img->color_map[spotnum + 4] = i + 4;
+ fprintf(stderr, "bmpcmp: spot colorant %d in file 2 matches colorant %d.\n",
+ spotnum, i);
+ break;
+ }
+ }
+ if (i < 0) {
+ /* a match was not found. stop */
+ fprintf(stderr, "bmpcmp: no matching colorant found for color_map\n");
+ exit(1);
+ }
+ }
+ }
+ spotnum++;
+ }
+ *(img->num_spots) = spotnum; /* save for the next image file */
+#ifdef VERBOSE
+ fprintf(stderr, "color map:");
+ for (i=0; i < 4+nimg->um_spots; i++)
+ fprintf(stderr, " %d->%d,", i, color_map[i]);
+ fprintf(stderr, "\n");
+#endif
}
+ /* skip any remaining data */
+ ir_len -= data_len;
+ while (data_len-- > 0)
+ (void)fgetc(im->file);
}
/* Skip Layer and Mask section */
@@ -1526,10 +1531,10 @@ static void *psd_read(ImageReader *im,
N = n;
if (N < 4)
N = 4;
- *span = (w * N + 3) & ~3;
- bmp = Malloc(*span * h);
+ img->span = span = (w * N + 3) & ~3;
+ bmp = Malloc(span * h);
line = Malloc(w * (bpc>>3));
- ptr = bmp + *span * (h-1);
+ ptr = bmp + span * (h-1);
if (bpc == 8) {
if (n == 1) {
/* Greyscale */
@@ -1544,10 +1549,10 @@ static void *psd_read(ImageReader *im,
*ptr++ = val;
*ptr++ = 0;
}
- ptr -= w*N + *span;
+ ptr -= w*N + span;
line -= w;
}
- ptr += *span * h + 1;
+ ptr += span * h + 1;
} else if (n == 3) {
/* RGB (reverse to get BGR) */
ptr += 2;
@@ -1561,10 +1566,10 @@ static void *psd_read(ImageReader *im,
*ptr = *line++;
ptr += N;
}
- ptr -= w*N + *span;
+ ptr -= w*N + span;
line -= w;
}
- ptr += *span * h - 1;
+ ptr += span * h - 1;
}
ptr += 4;
for (y = 0; y < h; y++)
@@ -1574,13 +1579,14 @@ static void *psd_read(ImageReader *im,
*ptr = 0;
ptr += N;
}
- ptr -= w*N + *span;
+ ptr -= w*N + span;
}
- ptr += *span * h + 1;
+ ptr += span * h + 1;
} else {
/* CMYK + (maybe) spots */
for (z = 0; z < n; z++)
{
+ ptr = bmp + img->color_map[z] + span * (h-1);
for (y = 0; y < h; y++)
{
fread(line, 1, w, im->file);
@@ -1589,10 +1595,9 @@ static void *psd_read(ImageReader *im,
*ptr = 255 - *line++;
ptr += n;
}
- ptr -= w*n + *span;
+ ptr -= w*n + span;
line -= w;
}
- ptr += *span * h + 1;
}
}
} else {
@@ -1611,10 +1616,10 @@ static void *psd_read(ImageReader *im,
*ptr++ = val;
*ptr++ = 0;
}
- ptr -= w*N + *span;
+ ptr -= w*N + span;
line -= w*2;
}
- ptr += *span * h + 1;
+ ptr += span * h + 1;
} else if (n == 3) {
/* RGB (reverse to get BGR) */
ptr += 2;
@@ -1629,10 +1634,10 @@ static void *psd_read(ImageReader *im,
line++;
ptr += N;
}
- ptr -= w*N + *span;
+ ptr -= w*N + span;
line -= w*2;
}
- ptr += *span * h - 1;
+ ptr += span * h - 1;
}
ptr += 4;
for (y = 0; y < h; y++)
@@ -1642,26 +1647,26 @@ static void *psd_read(ImageReader *im,
*ptr = 0;
ptr += N;
}
- ptr -= w*N + *span;
+ ptr -= w*N + span;
}
- ptr += *span * h + 1;
+ ptr += span * h + 1;
} else {
/* CMYK + (maybe) spots */
for (z = 0; z < n; z++)
{
+ ptr = bmp + img->color_map[z] + span * (h-1);
for (y = 0; y < h; y++)
{
fread(line, 2, w, im->file);
for (x = 0; x < w; x++)
{
*ptr = 255 - *line++;
- line++;
+ line++; /* skip the low byte of data */
ptr += n;
}
- ptr -= w*n + *span;
+ ptr -= w*n + span;
line -= 2*w;
}
- ptr += *span * h + 1;
}
}
}
@@ -1669,13 +1674,13 @@ static void *psd_read(ImageReader *im,
/* Skip over any following header */
if (!feof(im->file))
- c = fgetc(im->file);
+ (void)fgetc(im->file);
if (!feof(im->file))
- c = fgetc(im->file);
+ (void)fgetc(im->file);
if (!feof(im->file))
- c = fgetc(im->file);
+ (void)fgetc(im->file);
if (!feof(im->file))
- c = fgetc(im->file);
+ (void)fgetc(im->file);
return bmp;
}
@@ -3631,8 +3636,13 @@ static void rediff(unsigned char *map,
*global = local;
}
-static void unspot(unsigned char *bmp, int w, int h, int span, int bpp)
+static void unspot(unsigned char *bmp, Image *img)
{
+ int w = img->width;
+ int h = img->height;
+ int span = img->span;
+ int bpp = img->bpp;
+ unsigned char *spots = img->spots;
int x, y, z, n = bpp>>3;
unsigned char *p = bmp;
@@ -3671,10 +3681,12 @@ static void unspot(unsigned char *bmp, int w, int h, int span, int bpp)
int main(int argc, char *argv[])
{
int w, h, s, bpp, cmyk;
- int w2, h2, s2, bpp2, cmyk2;
+ int w2, h2;
int nx, ny, n;
int xstep, ystep;
int imagecount;
+ Image im1 = { 0 };
+ Image im2 = { 0 };
unsigned char *bmp;
unsigned char *bmp2;
unsigned char *map;
@@ -3691,6 +3703,19 @@ int main(int argc, char *argv[])
int can_compare = 1;
void *lab1, *lab2;
+ /* The following is for CMYK+spots (currently only PSD */
+ int num_spots = 0;
+ unsigned char spots[256*4] = { 0 }; /* shared between both images */
+ int color_map[256] = { 0, 1, 2, 3, 0 };
+
+ im1.spots = (unsigned char *)&spots;
+ im2.spots = (unsigned char *)&spots;
+ im1.num_spots = &num_spots;
+ im2.num_spots = &num_spots;
+ im1.color_map = (int *)&color_map;
+ im2.color_map = (int *)&color_map;
+ /* end CMYK+spots section */
+
parseArgs(argc, argv, &params);
if (params.window <= 1 && params.threshold == 0) {
diffFn = simple_diff;
@@ -3711,22 +3736,47 @@ int main(int argc, char *argv[])
image_open(&image2, params.filename2);
imagecount = 0;
- while (((bmp2 = NULL,
- bmp = image1.read(&image1, &w, &h, &s, &bpp, &cmyk, &lab1)) != NULL) &&
- ((bmp2 = image2.read(&image2, &w2, &h2, &s2, &bpp2, &cmyk2, &lab2)) != NULL))
- {
+ while (bmp2 == NULL) {
+ /* Reset CMYK+spots values for next image (page) in file */
+ /* NB: Probably not needed since PSD only supports one image==page */
+ num_spots = 0;
+ memset(spots, 0, sizeof(spots));
+ memset(color_map, 0, sizeof(color_map));
+ for (n=0; n < 4; n++)
+ color_map[n] = n;
+
+ if ((bmp = image1.read(&image1, &im1)) == NULL) {
+ fprintf(stderr, "Unable to read image 1, %s, image #%d\n", params.filename1, imagecount+1);
+ continue; /* try next image??? */
+ }
+
+ if ((bmp2 = image2.read(&image2, &im2)) == NULL) {
+ fprintf(stderr, "Unable to read image 2, %s, image #%d\n", params.filename2, imagecount+1);
+ continue; /* try next image??? */
+ }
imagecount++;
/* Check images are compatible */
- if ((w != w2) || (h != h2) || (s != s2) || (bpp != bpp2) ||
- (cmyk != cmyk2))
+ if ((im1.width != im2.width) ||
+ (im1.height != im2.height) ||
+ (im1.span != im2.span) ||
+ (im1.bpp != im2.bpp) ||
+ (im1.cmyk != im2.cmyk))
{
fprintf(stderr,
"bmpcmp: Page %d: Can't compare images "
"(w=%d,%d) (h=%d,%d) (s=%d,%d) (bpp=%d,%d) (cmyk=%d,%d)!\n",
- imagecount, w, w2, h, h2, s, s2, bpp, bpp2, cmyk, cmyk2);
+ imagecount, im1.width, im2.width, im1.height, im2.height,
+ im1.span, im2.span, im1.bpp, im2.bpp, im1.cmyk, im2.cmyk);
can_compare = 0;
continue;
}
+ w = im1.width;
+ h = im1.height;
+ s = im1.span;
+ bpp = im1.bpp;
+ cmyk = im1.cmyk;
+ lab1 = im1.lab;
+ lab2 = im2.lab;
if (params.lab && (lab1 == NULL || lab2 == NULL)) {
fprintf(stderr, "bmpcmp: Lab compare failed (only valid for tiffs with icc profiles)\n");
@@ -3821,10 +3871,10 @@ int main(int argc, char *argv[])
/* bbox */
boxlist = Malloc(sizeof(*boxlist) * nx * ny);
- if (bpp >= 32)
+ if (bpp > 32)
{
- unspot(bmp, w, h, s, bpp);
- unspot(bmp2, w, h, s, bpp);
+ unspot(bmp, &im1);
+ unspot(bmp2, &im2);
}
/* Now save the changed bmps */
@@ -3866,25 +3916,25 @@ int main(int argc, char *argv[])
default:
break;
}
-#ifdef HAVE_LIBPNG
+ #ifdef HAVE_LIBPNG
sprintf(str1, "%s.%05d.png", params.outroot, n);
sprintf(str2, "%s.%05d.png", params.outroot, n+1);
sprintf(str3, "%s.%05d.png", params.outroot, n+2);
save_png(bmp, boxlist, s, bpp, str1);
save_png(bmp2, boxlist, s, bpp, str2);
-#else
+ #else
sprintf(str1, "%s.%05d.bmp", params.outroot, n);
sprintf(str2, "%s.%05d.bmp", params.outroot, n+1);
sprintf(str3, "%s.%05d.bmp", params.outroot, n+2);
save_bmp(bmp, boxlist, s, bpp, str1);
save_bmp(bmp2, boxlist, s, bpp, str2);
-#endif
+ #endif
diff_bmp(bmp, map, boxlist, s, w);
-#ifdef HAVE_LIBPNG
+ #ifdef HAVE_LIBPNG
save_png(bmp, boxlist, s, bpp, str3);
-#else
+ #else
save_bmp(bmp, boxlist, s, bpp, str3);
-#endif
+ #endif
sprintf(str4, "%s.%05d.meta", params.outroot, n);
save_meta(boxlist, str4, w, h, imagecount, params.threshold, params.window);
n += 3;