From c23fe6facde0794fa6db23224d9c2d7ebda3fda1 Mon Sep 17 00:00:00 2001 From: Eric Smith Date: Fri, 21 Feb 2003 09:25:47 +0000 Subject: [PATCH] implemented ImageMask fill color arguments to pdf_write_g4_fax_image(). --- TODO | 4 +--- bitblt_g4.c | 39 ++++++++++++++++++++++----------------- pdf.h | 9 ++++++--- pdf_g4.c | 39 ++++++++++++++++++++++----------------- pdf_prim.c | 15 ++++++++++++++- pdf_prim.h | 11 ++++++++--- t2p.c | 9 ++++----- tumble.c | 9 ++++----- 8 files changed, 81 insertions(+), 54 deletions(-) diff --git a/TODO b/TODO index a13f97f..b5787e9 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,5 @@ t2p TODO list -$Id: TODO,v 1.8 2003/02/21 01:12:05 eric Exp $ +$Id: TODO,v 1.9 2003/02/21 01:25:47 eric Exp $ No particular order. @@ -78,8 +78,6 @@ Adobe Systems Incorporated, Addison-Wesley, 1993.] * balance pages tree - currently a degenerate single-level tree, but the PDF spec recommends max. of 6 children per parent -* ImageMask (p. 79) using fill color (g, k, or rg operator, p. 95) - * thumbnails * PDF Page rotate attribute (p. 53)? diff --git a/bitblt_g4.c b/bitblt_g4.c index 3fbf94b..5a82122 100644 --- a/bitblt_g4.c +++ b/bitblt_g4.c @@ -4,7 +4,7 @@ * will be compressed using ITU-T T.6 (G4) fax encoding. * * PDF routines - * $Id: bitblt_g4.c,v 1.4 2003/02/21 01:01:33 eric Exp $ + * $Id: bitblt_g4.c,v 1.5 2003/02/21 01:25:47 eric Exp $ * Copyright 2001, 2002, 2003 Eric Smith * * This program is free software; you can redistribute it and/or modify @@ -41,9 +41,11 @@ struct pdf_g4_image { double width, height; double x, y; + double r, g, b; /* fill color, only for ImageMask */ unsigned long Columns; unsigned long Rows; - int BlackIs1; + bool ImageMask; + bool BlackIs1; Bitmap *bitmap; char XObject_name [4]; }; @@ -73,20 +75,16 @@ void pdf_write_g4_content_callback (pdf_file_handle pdf_file, { struct pdf_g4_image *image = app_data; - char str1 [100]; - char *str2 = "/"; - char *str3 = " Do Q\r\n"; + /* transformation matrix is: width 0 0 height x y cm */ + pdf_stream_printf (pdf_file, stream, "q %g 0 0 %g %g %g cm ", + image->width, image->height, + image->x, image->y); + if (image->ImageMask) + pdf_stream_printf (pdf_file, stream, "%g %g %g rg ", + image->r, image->g, image->b); - /* width 0 0 height x y cm */ - sprintf (str1, "q %g 0 0 %g %g %g cm\r\n", - image->width, image->height, - image->x, image->y); - - pdf_stream_write_data (pdf_file, stream, str1, strlen (str1)); - pdf_stream_write_data (pdf_file, stream, str2, strlen (str2)); - pdf_stream_write_data (pdf_file, stream, & image->XObject_name [0], - strlen (& image->XObject_name [0])); - pdf_stream_write_data (pdf_file, stream, str3, strlen (str3)); + pdf_stream_printf (pdf_file, stream, "/%s Do Q\r\n", + image->XObject_name); } @@ -127,8 +125,11 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page, double width, double height, Bitmap *bitmap, - int ImageMask, - int BlackIs1) /* boolean, typ. false */ + bool ImageMask, + double r, /* RGB fill color, only for ImageMask */ + double g, + double b, + bool BlackIs1) /* boolean, typ. false */ { struct pdf_g4_image *image; @@ -144,10 +145,14 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page, image->height = height; image->x = x; image->y = y; + image->r = r; + image->g = g; + image->b = b; image->bitmap = bitmap; image->Columns = bitmap->rect.max.x - bitmap->rect.min.x; image->Rows = bitmap->rect.max.y - bitmap->rect.min.y; + image->ImageMask = ImageMask; image->BlackIs1 = BlackIs1; stream_dict = pdf_new_obj (PT_DICTIONARY); diff --git a/pdf.h b/pdf.h index 1b4c98e..9e69615 100644 --- a/pdf.h +++ b/pdf.h @@ -4,7 +4,7 @@ * will be compressed using ITU-T T.6 (G4) fax encoding. * * PDF routines - * $Id: pdf.h,v 1.3 2003/02/21 01:01:33 eric Exp $ + * $Id: pdf.h,v 1.4 2003/02/21 01:25:47 eric Exp $ * Copyright 2001, 2002, 2003 Eric Smith * * This program is free software; you can redistribute it and/or modify @@ -59,8 +59,11 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page, double width, double height, Bitmap *bitmap, - int ImageMask, - int BlackIs1); /* boolean, typ. false */ + bool ImageMask, + double r, /* RGB fill color, only for ImageMask */ + double g, + double b, + bool BlackIs1); /* boolean, typ. false */ void pdf_set_page_number (pdf_page_handle pdf_page, char *page_number); diff --git a/pdf_g4.c b/pdf_g4.c index 37cf0a8..eef5e68 100644 --- a/pdf_g4.c +++ b/pdf_g4.c @@ -4,7 +4,7 @@ * will be compressed using ITU-T T.6 (G4) fax encoding. * * PDF routines - * $Id: pdf_g4.c,v 1.4 2003/02/21 01:01:33 eric Exp $ + * $Id: pdf_g4.c,v 1.5 2003/02/21 01:25:47 eric Exp $ * Copyright 2001, 2002, 2003 Eric Smith * * This program is free software; you can redistribute it and/or modify @@ -41,9 +41,11 @@ struct pdf_g4_image { double width, height; double x, y; + double r, g, b; /* fill color, only for ImageMask */ unsigned long Columns; unsigned long Rows; - int BlackIs1; + bool ImageMask; + bool BlackIs1; Bitmap *bitmap; char XObject_name [4]; }; @@ -73,20 +75,16 @@ void pdf_write_g4_content_callback (pdf_file_handle pdf_file, { struct pdf_g4_image *image = app_data; - char str1 [100]; - char *str2 = "/"; - char *str3 = " Do Q\r\n"; + /* transformation matrix is: width 0 0 height x y cm */ + pdf_stream_printf (pdf_file, stream, "q %g 0 0 %g %g %g cm ", + image->width, image->height, + image->x, image->y); + if (image->ImageMask) + pdf_stream_printf (pdf_file, stream, "%g %g %g rg ", + image->r, image->g, image->b); - /* width 0 0 height x y cm */ - sprintf (str1, "q %g 0 0 %g %g %g cm\r\n", - image->width, image->height, - image->x, image->y); - - pdf_stream_write_data (pdf_file, stream, str1, strlen (str1)); - pdf_stream_write_data (pdf_file, stream, str2, strlen (str2)); - pdf_stream_write_data (pdf_file, stream, & image->XObject_name [0], - strlen (& image->XObject_name [0])); - pdf_stream_write_data (pdf_file, stream, str3, strlen (str3)); + pdf_stream_printf (pdf_file, stream, "/%s Do Q\r\n", + image->XObject_name); } @@ -127,8 +125,11 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page, double width, double height, Bitmap *bitmap, - int ImageMask, - int BlackIs1) /* boolean, typ. false */ + bool ImageMask, + double r, /* RGB fill color, only for ImageMask */ + double g, + double b, + bool BlackIs1) /* boolean, typ. false */ { struct pdf_g4_image *image; @@ -144,10 +145,14 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page, image->height = height; image->x = x; image->y = y; + image->r = r; + image->g = g; + image->b = b; image->bitmap = bitmap; image->Columns = bitmap->rect.max.x - bitmap->rect.min.x; image->Rows = bitmap->rect.max.y - bitmap->rect.min.y; + image->ImageMask = ImageMask; image->BlackIs1 = BlackIs1; stream_dict = pdf_new_obj (PT_DICTIONARY); diff --git a/pdf_prim.c b/pdf_prim.c index a068a51..bbf6ddf 100644 --- a/pdf_prim.c +++ b/pdf_prim.c @@ -4,7 +4,7 @@ * will be compressed using ITU-T T.6 (G4) fax encoding. * * PDF routines - * $Id: pdf_prim.c,v 1.3 2003/02/20 04:44:17 eric Exp $ + * $Id: pdf_prim.c,v 1.4 2003/02/21 01:25:47 eric Exp $ * Copyright 2001, 2002, 2003 Eric Smith * * This program is free software; you can redistribute it and/or modify @@ -24,6 +24,7 @@ */ +#include #include #include #include @@ -452,6 +453,18 @@ void pdf_stream_write_data (pdf_file_handle pdf_file, } +void pdf_stream_printf (pdf_file_handle pdf_file, + struct pdf_obj *stream, + char *fmt, ...) +{ + va_list ap; + + va_start (ap, fmt); + vfprintf (pdf_file->f, fmt, ap); + va_end (ap); +} + + void pdf_write_stream (pdf_file_handle pdf_file, struct pdf_obj *stream) { unsigned long begin_pos, end_pos; diff --git a/pdf_prim.h b/pdf_prim.h index 6d40e54..22bbbbd 100644 --- a/pdf_prim.h +++ b/pdf_prim.h @@ -4,7 +4,7 @@ * will be compressed using ITU-T T.6 (G4) fax encoding. * * PDF routines - * $Id: pdf_prim.h,v 1.2 2003/02/20 04:44:17 eric Exp $ + * $Id: pdf_prim.h,v 1.3 2003/02/21 01:25:47 eric Exp $ * Copyright 2001, 2002, 2003 Eric Smith * * This program is free software; you can redistribute it and/or modify @@ -95,13 +95,18 @@ struct pdf_obj *pdf_new_stream (pdf_file_handle pdf_file, pdf_stream_write_callback callback, void *app_data); -/* The callback should call pdf_stream_write_data to write the actual - stream data. */ +/* The callback should call pdf_stream_write_data or pdf_stream_printf + to write the actual stream data. */ void pdf_stream_write_data (pdf_file_handle pdf_file, struct pdf_obj *stream, char *data, unsigned long len); +void pdf_stream_printf (pdf_file_handle pdf_file, + struct pdf_obj *stream, + char *fmt, ...); + + void pdf_stream_add_filter (struct pdf_obj *stream, char *filter_name, struct pdf_obj *decode_parms); diff --git a/t2p.c b/t2p.c index a69b64e..5267089 100644 --- a/t2p.c +++ b/t2p.c @@ -4,7 +4,7 @@ * will be compressed using ITU-T T.6 (G4) fax encoding. * * Main program - * $Id: t2p.c,v 1.23 2003/02/21 01:01:33 eric Exp $ + * $Id: t2p.c,v 1.24 2003/02/21 01:25:47 eric Exp $ * Copyright 2001, 2002, 2003 Eric Smith * * This program is free software; you can redistribute it and/or modify @@ -465,12 +465,11 @@ bool process_page (int image, /* range 1 .. n */ page = pdf_new_page (out->pdf, width_points, height_points); pdf_write_g4_fax_image (page, - 0, /* x */ - 0, /* y */ - width_points, - height_points, + 0, 0, /* x, y */ + width_points, height_points, bitmap, 0, /* ImageMask */ + 0, 0, 0, /* r, g, b */ 0); /* BlackIs1 */ free_bitmap (bitmap); diff --git a/tumble.c b/tumble.c index 4869049..56a8b9d 100644 --- a/tumble.c +++ b/tumble.c @@ -4,7 +4,7 @@ * will be compressed using ITU-T T.6 (G4) fax encoding. * * Main program - * $Id: tumble.c,v 1.23 2003/02/21 01:01:33 eric Exp $ + * $Id: tumble.c,v 1.24 2003/02/21 01:25:47 eric Exp $ * Copyright 2001, 2002, 2003 Eric Smith * * This program is free software; you can redistribute it and/or modify @@ -465,12 +465,11 @@ bool process_page (int image, /* range 1 .. n */ page = pdf_new_page (out->pdf, width_points, height_points); pdf_write_g4_fax_image (page, - 0, /* x */ - 0, /* y */ - width_points, - height_points, + 0, 0, /* x, y */ + width_points, height_points, bitmap, 0, /* ImageMask */ + 0, 0, 0, /* r, g, b */ 0); /* BlackIs1 */ free_bitmap (bitmap);