1.1 diff -r d1c6dc4bf34a -r e8821eb2fb08 bitblt_g4.c 1.2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.3 +++ b/bitblt_g4.c Thu Feb 20 12:16:00 2003 +0000 1.4 @@ -0,0 +1,179 @@ 1.5 +#include <stdio.h> 1.6 +#include <string.h> 1.7 + 1.8 + 1.9 +#include "libpdf.h" 1.10 +#include "libpdf_util.h" 1.11 +#include "libpdf_prim.h" 1.12 +#include "libpdf_private.h" 1.13 + 1.14 + 1.15 +struct pdf_g4_image 1.16 +{ 1.17 + unsigned long Columns; 1.18 + unsigned long Rows; 1.19 + unsigned long rowbytes; 1.20 + int BlackIs1; 1.21 + unsigned char *data; 1.22 + unsigned long len; 1.23 + char XObject_name [4]; 1.24 +}; 1.25 + 1.26 + 1.27 +char pdf_new_XObject (pdf_page_handle pdf_page, struct pdf_obj *ind_ref) 1.28 +{ 1.29 + char XObject_name [4] = "Im "; 1.30 + 1.31 + XObject_name [2] = ++pdf_page->last_XObject_name; 1.32 + 1.33 + if (! pdf_page->XObject_dict) 1.34 + { 1.35 + pdf_page->XObject_dict = pdf_new_obj (PT_DICTIONARY); 1.36 + pdf_set_dict_entry (pdf_page->resources, "XObject", pdf_page->XObject_dict); 1.37 + } 1.38 + 1.39 + pdf_set_dict_entry (pdf_page->XObject_dict, & XObject_name [0], ind_ref); 1.40 + 1.41 + return (pdf_page->last_XObject_name); 1.42 +} 1.43 + 1.44 + 1.45 +void pdf_write_g4_content_callback (pdf_file_handle pdf_file, 1.46 + struct pdf_obj *stream, 1.47 + void *app_data) 1.48 +{ 1.49 + unsigned long width = (8.5 * 72); /* full width of page */ 1.50 + unsigned long height = (11 * 72); /* full height of page */ 1.51 + unsigned long x = 0; /* 0 is left edge */ 1.52 + unsigned long y = 0; /* 0 is bottom edge */ 1.53 + struct pdf_g4_image *image = app_data; 1.54 + 1.55 + char str1 [100]; 1.56 + char *str2 = "/"; 1.57 + char *str3 = " Do\r\n"; 1.58 + 1.59 + /* width 0 0 height x y cm */ 1.60 + sprintf (str1, "q %ld 0 0 %ld %ld %ld cm\r\n", width, height, x, y); 1.61 + 1.62 + pdf_stream_write_data (pdf_file, stream, str1, strlen (str1)); 1.63 + pdf_stream_write_data (pdf_file, stream, str2, strlen (str2)); 1.64 + pdf_stream_write_data (pdf_file, stream, & image->XObject_name [0], 1.65 + strlen (& image->XObject_name [0])); 1.66 + pdf_stream_write_data (pdf_file, stream, str3, strlen (str3)); 1.67 +} 1.68 + 1.69 + 1.70 +void pdf_write_g4_fax_image_callback (pdf_file_handle pdf_file, 1.71 + struct pdf_obj *stream, 1.72 + void *app_data) 1.73 +{ 1.74 + struct pdf_g4_image *image = app_data; 1.75 + 1.76 +#if 1 1.77 + pdf_stream_write_data (pdf_file, stream, image->data, image->len); 1.78 +#else 1.79 + unsigned long row = 0; 1.80 + unsigned char *ref; 1.81 + unsigned char *raw; 1.82 + 1.83 + ref = NULL; 1.84 + raw = image->data; 1.85 + 1.86 + while (row < image->Rows) 1.87 + { 1.88 + pdf_stream_write_data (pdf_file, stream, raw, image->rowbytes); 1.89 + 1.90 + row++; 1.91 + ref = raw; 1.92 + raw += image->rowbytes; 1.93 + } 1.94 + /* $$$ generate and write EOFB code */ 1.95 + /* $$$ flush any remaining buffered bits */ 1.96 +#endif 1.97 +} 1.98 + 1.99 + 1.100 +void pdf_write_g4_fax_image (pdf_page_handle pdf_page, 1.101 + unsigned long Columns, 1.102 + unsigned long Rows, 1.103 + unsigned long rowbytes, 1.104 + int ImageMask, 1.105 + int BlackIs1, /* boolean, typ. false */ 1.106 + unsigned char *data, 1.107 + unsigned long len) 1.108 +{ 1.109 + struct pdf_g4_image *image; 1.110 + 1.111 + struct pdf_obj *stream; 1.112 + struct pdf_obj *stream_dict; 1.113 + struct pdf_obj *decode_parms; 1.114 + 1.115 + struct pdf_obj *content_stream; 1.116 + 1.117 + image = pdf_calloc (sizeof (struct pdf_g4_image)); 1.118 + 1.119 + image->Columns = Columns; 1.120 + image->Rows = Rows; 1.121 + image->rowbytes = rowbytes; 1.122 + image->BlackIs1 = BlackIs1; 1.123 + image->data = data; 1.124 + image->len = len; 1.125 + 1.126 + stream_dict = pdf_new_obj (PT_DICTIONARY); 1.127 + 1.128 + stream = pdf_new_ind_ref (pdf_page->pdf_file, 1.129 + pdf_new_stream (pdf_page->pdf_file, 1.130 + stream_dict, 1.131 + & pdf_write_g4_fax_image_callback, 1.132 + image)); 1.133 + 1.134 + strcpy (& image->XObject_name [0], "Im "); 1.135 + image->XObject_name [2] = pdf_new_XObject (pdf_page, stream); 1.136 + 1.137 + pdf_set_dict_entry (stream_dict, "Type", pdf_new_name ("XObject")); 1.138 + pdf_set_dict_entry (stream_dict, "Subtype", pdf_new_name ("Image")); 1.139 + pdf_set_dict_entry (stream_dict, "Name", pdf_new_name (& image->XObject_name [0])); 1.140 + pdf_set_dict_entry (stream_dict, "Width", pdf_new_integer (Columns)); 1.141 + pdf_set_dict_entry (stream_dict, "Height", pdf_new_integer (Rows)); 1.142 + pdf_set_dict_entry (stream_dict, "BitsPerComponent", pdf_new_integer (1)); 1.143 + if (ImageMask) 1.144 + pdf_set_dict_entry (stream_dict, "ImageMask", pdf_new_bool (ImageMask)); 1.145 + else 1.146 + pdf_set_dict_entry (stream_dict, "ColorSpace", pdf_new_name ("DeviceGray")); 1.147 + 1.148 + decode_parms = pdf_new_obj (PT_DICTIONARY); 1.149 + 1.150 + pdf_set_dict_entry (decode_parms, 1.151 + "K", 1.152 + pdf_new_integer (-1)); 1.153 + 1.154 + pdf_set_dict_entry (decode_parms, 1.155 + "Columns", 1.156 + pdf_new_integer (Columns)); 1.157 + 1.158 + pdf_set_dict_entry (decode_parms, 1.159 + "Rows", 1.160 + pdf_new_integer (Rows)); 1.161 + 1.162 + if (BlackIs1) 1.163 + pdf_set_dict_entry (decode_parms, 1.164 + "BlackIs1", 1.165 + pdf_new_bool (BlackIs1)); 1.166 + 1.167 + pdf_stream_add_filter (stream, "CCITTFaxDecode", decode_parms); 1.168 + 1.169 + /* the following will write the stream, using our callback function to 1.170 + get the actual data */ 1.171 + pdf_write_ind_obj (pdf_page->pdf_file, stream); 1.172 + 1.173 + content_stream = pdf_new_ind_ref (pdf_page->pdf_file, 1.174 + pdf_new_stream (pdf_page->pdf_file, 1.175 + pdf_new_obj (PT_DICTIONARY), 1.176 + & pdf_write_g4_content_callback, 1.177 + image)); 1.178 + 1.179 + pdf_set_dict_entry (pdf_page->page_dict, "Contents", content_stream); 1.180 + 1.181 + pdf_write_ind_obj (pdf_page->pdf_file, content_stream); 1.182 +} 1.183 +