00001 #include "sadie.h"
00002
00003 #include <stdio.h>
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 void
00015 IMG2EPSF (IMAGE * in,
00016 char *name,
00017 short nbit
00018
00019 )
00020 {
00021 static char hex[] =
00022 { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
00023 'E', 'F' };
00024 unsigned char *ptr = NULL, *data = NULL, cval;
00025 char msg[SLEN];
00026 short i, j, k, error;
00027 long nbytes;
00028 double factor, dval;
00029 time_t secs;
00030 struct tm *t;
00031 FILE *fp = NULL;
00032
00033 if (TIMES)
00034 TIMING (T_IMG2EPSF);
00035 if (NAMES)
00036 {
00037 MESSAGE ('I', "");
00038 MESSAGE ('I', "IMG2EPSF");
00039 MESSAGE ('I', "");
00040 sprintf (msg, " Input image: %s", in->text);
00041 MESSAGE ('I', msg);
00042 sprintf (msg, " Output disk file: %s", name);
00043 MESSAGE ('I', msg);
00044 sprintf (msg, " Output format: %d-bit EPSF", nbit);
00045 MESSAGE ('I', msg);
00046 MESSAGE ('I', " ...............");
00047 }
00048
00049
00050 if (!CHECKIMG (in))
00051 {
00052 MESSAGE ('E', " Can't identify image.");
00053 goto the_end;
00054 }
00055
00056
00057 if (!(fp = fopen (name, "w")))
00058 {
00059 sprintf (msg, " Can't open file %s.", name);
00060 MESSAGE ('E', msg);
00061 goto the_end;
00062 }
00063
00064 nbytes = max ((long) 4096, (long) 2 * (long) in->npix + (long) 1);
00065 if ((ptr = data =
00066 (unsigned char *) malloc (nbytes * sizeof (unsigned char))) == NULL)
00067 {
00068 MESSAGE ('E', " Memory request failed.");
00069 goto the_end;
00070 }
00071 secs = time (NULL);
00072 t = localtime (&secs);
00073
00074
00075 sprintf ((char *) ptr, "%%!PS-Adobe-3.0 EPSF-3.0\r");
00076 sprintf ((char *) ptr + strlen ((char *) ptr), "%%%%Creator: SADIE\r");
00077 sprintf ((char *) ptr + strlen ((char *) ptr), "%%%%Title: %s\r", name);
00078 sprintf ((char *) ptr + strlen ((char *) ptr),
00079 "%%%%CreationDate: %02d/%02d/%02d %02d:%02d\r", t->tm_mon,
00080 t->tm_mday, t->tm_year, t->tm_hour, t->tm_min);
00081 sprintf ((char *) ptr + strlen ((char *) ptr),
00082 "%%%%BoundingBox: 0 0 %d %d\r", in->npix, in->nlin);
00083 sprintf ((char *) ptr + strlen ((char *) ptr),
00084 "%%%%SuppressDotGainCompensation\r");
00085 if (in->nbnd != 3)
00086 {
00087 sprintf ((char *) ptr + strlen ((char *) ptr),
00088 "%%%%DocumentProcessColors: Black\r");
00089 }
00090 sprintf ((char *) ptr + strlen ((char *) ptr), "%%%%EndComments\r");
00091 sprintf ((char *) ptr + strlen ((char *) ptr), "%%%%BeginProlog\r");
00092 sprintf ((char *) ptr + strlen ((char *) ptr), "%%%%EndProlog\r");
00093 sprintf ((char *) ptr + strlen ((char *) ptr), "%%%%BeginSetup\r");
00094 sprintf ((char *) ptr + strlen ((char *) ptr), "%%%%EndSetup\r");
00095 sprintf ((char *) ptr + strlen ((char *) ptr),
00096 "%%ImageData: %d %d %d %d %d %d %d \"beginimage\"\r", in->npix,
00097 in->nlin, nbit, in->nbnd, in->nbnd == 3, in->npix, 1);
00098 if (in->nbnd != 3)
00099 {
00100 sprintf ((char *) ptr + strlen ((char *) ptr), "gsave\r");
00101 sprintf ((char *) ptr + strlen ((char *) ptr), "40 dict begin\r");
00102 sprintf ((char *) ptr + strlen ((char *) ptr),
00103 "/_image systemdict /image get def\r");
00104 sprintf ((char *) ptr + strlen ((char *) ptr),
00105 "/_setgray systemdict /setgray get def\r");
00106 sprintf ((char *) ptr + strlen ((char *) ptr),
00107 "/_currentgray systemdict /currentgray get def\r");
00108 sprintf ((char *) ptr + strlen ((char *) ptr),
00109 "/_settransfer systemdict /settransfer get def\r");
00110 sprintf ((char *) ptr + strlen ((char *) ptr),
00111 "/_currenttransfer systemdict /currenttransfer get def\r");
00112 sprintf ((char *) ptr + strlen ((char *) ptr),
00113 "/blank 0 _currenttransfer exec\r");
00114 sprintf ((char *) ptr + strlen ((char *) ptr),
00115 "1 _currenttransfer exec eq def\r");
00116 sprintf ((char *) ptr + strlen ((char *) ptr), "/negative blank\r");
00117 sprintf ((char *) ptr + strlen ((char *) ptr),
00118 "{0 _currenttransfer exec 0.5 lt}\r");
00119 sprintf ((char *) ptr + strlen ((char *) ptr),
00120 "{0 _currenttransfer exec 1 _currenttransfer exec gt}\r");
00121 sprintf ((char *) ptr + strlen ((char *) ptr), "ifelse def\r");
00122 sprintf ((char *) ptr + strlen ((char *) ptr),
00123 "/inverted? negative def\r");
00124 sprintf ((char *) ptr + strlen ((char *) ptr),
00125 "/level2 systemdict /languagelevel known\r");
00126 sprintf ((char *) ptr + strlen ((char *) ptr),
00127 "{languagelevel 2 ge} {false} ifelse def\r");
00128 sprintf ((char *) ptr + strlen ((char *) ptr), "gsave\r");
00129 sprintf ((char *) ptr + strlen ((char *) ptr), "/rows %d def\r",
00130 in->nlin);
00131 sprintf ((char *) ptr + strlen ((char *) ptr), "/cols %d def\r",
00132 in->npix);
00133 sprintf ((char *) ptr + strlen ((char *) ptr),
00134 "72 %ld mul %ld div dup cols mul exch rows mul scale\r",
00135 (long) in->nlin * (long) in->npix,
00136 (long) 72 * (long) in->nlin * (long) in->npix);
00137 sprintf ((char *) ptr + strlen ((char *) ptr), "level2 {\r");
00138 sprintf ((char *) ptr + strlen ((char *) ptr), "/DeviceGray\r");
00139 sprintf ((char *) ptr + strlen ((char *) ptr), "setcolorspace} if\r");
00140 sprintf ((char *) ptr + strlen ((char *) ptr),
00141 "/picstr1 %d string def\r", in->npix);
00142 sprintf ((char *) ptr + strlen ((char *) ptr),
00143 "/readdata {currentfile exch readhexstring pop} def\r");
00144 sprintf ((char *) ptr + strlen ((char *) ptr),
00145 "/image2 level2 {/image load def} {{begin\r");
00146 sprintf ((char *) ptr + strlen ((char *) ptr),
00147 "Width Height BitsPerComponent ImageMatrix\r");
00148 sprintf ((char *) ptr + strlen ((char *) ptr),
00149 "/DataSource load image end} def} ifelse\r");
00150 sprintf ((char *) ptr + strlen ((char *) ptr), "/beginimage {\r");
00151 sprintf ((char *) ptr + strlen ((char *) ptr), "image2\r");
00152 sprintf ((char *) ptr + strlen ((char *) ptr), "} def\r");
00153 sprintf ((char *) ptr + strlen ((char *) ptr), "12 dict begin\r");
00154 sprintf ((char *) ptr + strlen ((char *) ptr), "/ImageType 1 def\r");
00155 sprintf ((char *) ptr + strlen ((char *) ptr), "/Width cols def\r");
00156 sprintf ((char *) ptr + strlen ((char *) ptr), "/Height rows def\r");
00157 sprintf ((char *) ptr + strlen ((char *) ptr),
00158 "/ImageMatrix [cols 0 0 rows neg 0 rows] def\r");
00159 sprintf ((char *) ptr + strlen ((char *) ptr),
00160 "/BitsPerComponent %d def\r", nbit);
00161 sprintf ((char *) ptr + strlen ((char *) ptr), "/Decode [0 1] def\r");
00162 sprintf ((char *) ptr + strlen ((char *) ptr),
00163 "/DataSource {picstr1 readdata} def\r");
00164 sprintf ((char *) ptr + strlen ((char *) ptr), "currentdict end\r");
00165 sprintf ((char *) ptr + strlen ((char *) ptr),
00166 "%%%%BeginData: %ld ASCII Lines\r",
00167 (long) in->nlin + (long) 1);
00168 sprintf ((char *) ptr + strlen ((char *) ptr), "beginimage\r");
00169 }
00170 else
00171 {
00172 sprintf ((char *) ptr + strlen ((char *) ptr), "gsave\r");
00173 sprintf ((char *) ptr + strlen ((char *) ptr),
00174 "/hascolor /statusdict where {pop\r");
00175 sprintf ((char *) ptr + strlen ((char *) ptr),
00176 "statusdict /processcolors known\r");
00177 sprintf ((char *) ptr + strlen ((char *) ptr),
00178 "{statusdict /processcolors get exec 1 gt}\r");
00179 sprintf ((char *) ptr + strlen ((char *) ptr),
00180 "{false} ifelse} {false} ifelse def\r");
00181 sprintf ((char *) ptr + strlen ((char *) ptr), "40 dict begin\r");
00182 sprintf ((char *) ptr + strlen ((char *) ptr),
00183 "/_image systemdict /image get def\r");
00184 sprintf ((char *) ptr + strlen ((char *) ptr),
00185 "/_setgray systemdict /setgray get def\r");
00186 sprintf ((char *) ptr + strlen ((char *) ptr),
00187 "/_currentgray systemdict /currentgray get def\r");
00188 sprintf ((char *) ptr + strlen ((char *) ptr),
00189 "/_settransfer systemdict /settransfer get def\r");
00190 sprintf ((char *) ptr + strlen ((char *) ptr),
00191 "/_currenttransfer systemdict /currenttransfer get def\r");
00192 sprintf ((char *) ptr + strlen ((char *) ptr),
00193 "/blank 0 _currenttransfer exec\r");
00194 sprintf ((char *) ptr + strlen ((char *) ptr),
00195 "1 _currenttransfer exec eq def\r");
00196 sprintf ((char *) ptr + strlen ((char *) ptr), "/negative blank\r");
00197 sprintf ((char *) ptr + strlen ((char *) ptr),
00198 "{0 _currenttransfer exec 0.5 lt}\r");
00199 sprintf ((char *) ptr + strlen ((char *) ptr),
00200 "{0 _currenttransfer exec 1 _currenttransfer exec gt}\r");
00201 sprintf ((char *) ptr + strlen ((char *) ptr), "ifelse def\r");
00202 sprintf ((char *) ptr + strlen ((char *) ptr),
00203 "/inverted? negative def\r");
00204 sprintf ((char *) ptr + strlen ((char *) ptr),
00205 "/level2 systemdict /languagelevel known\r");
00206 sprintf ((char *) ptr + strlen ((char *) ptr),
00207 "{languagelevel 2 ge} {false} ifelse def\r");
00208 sprintf ((char *) ptr + strlen ((char *) ptr),
00209 "/foureq {4 index eq 8 1 roll\r");
00210 sprintf ((char *) ptr + strlen ((char *) ptr), "4 index eq 8 1 roll\r");
00211 sprintf ((char *) ptr + strlen ((char *) ptr), "4 index eq 8 1 roll\r");
00212 sprintf ((char *) ptr + strlen ((char *) ptr), "4 index eq 8 1 roll\r");
00213 sprintf ((char *) ptr + strlen ((char *) ptr),
00214 "pop pop pop pop and and and} def\r");
00215 sprintf ((char *) ptr + strlen ((char *) ptr),
00216 "hascolor {/band 0 def} {/band 5 def} ifelse\r");
00217 sprintf ((char *) ptr + strlen ((char *) ptr),
00218 "/setcmykcolor where {pop\r");
00219 sprintf ((char *) ptr + strlen ((char *) ptr),
00220 "1 0 0 0 setcmykcolor _currentgray 1 exch sub\r");
00221 sprintf ((char *) ptr + strlen ((char *) ptr),
00222 "0 1 0 0 setcmykcolor _currentgray 1 exch sub\r");
00223 sprintf ((char *) ptr + strlen ((char *) ptr),
00224 "0 0 1 0 setcmykcolor _currentgray 1 exch sub\r");
00225 sprintf ((char *) ptr + strlen ((char *) ptr),
00226 "0 0 0 1 setcmykcolor _currentgray 1 exch sub\r");
00227 sprintf ((char *) ptr + strlen ((char *) ptr), "4 {4 copy} repeat\r");
00228 sprintf ((char *) ptr + strlen ((char *) ptr),
00229 "1 0 0 0 foureq {/band 1 store} if\r");
00230 sprintf ((char *) ptr + strlen ((char *) ptr),
00231 "0 1 0 0 foureq {/band 2 store} if\r");
00232 sprintf ((char *) ptr + strlen ((char *) ptr),
00233 "0 0 1 0 foureq {/band 3 store} if\r");
00234 sprintf ((char *) ptr + strlen ((char *) ptr),
00235 "0 0 0 1 foureq {/band 4 store} if\r");
00236 sprintf ((char *) ptr + strlen ((char *) ptr),
00237 "0 0 0 0 foureq {/band 6 store} if} if\r");
00238 sprintf ((char *) ptr + strlen ((char *) ptr),
00239 "blank {/band 6 store} if\r");
00240 sprintf ((char *) ptr + strlen ((char *) ptr), "gsave\r");
00241 sprintf ((char *) ptr + strlen ((char *) ptr), "/rows %d def\r",
00242 in->nlin);
00243 sprintf ((char *) ptr + strlen ((char *) ptr), "/cols %d def\r",
00244 in->npix);
00245 sprintf ((char *) ptr + strlen ((char *) ptr),
00246 "72 %ld mul %ld div dup cols mul exch rows mul scale\r",
00247 (long) in->nlin * (long) in->npix,
00248 (long) 72 * (long) in->nlin * (long) in->npix);
00249 sprintf ((char *) ptr + strlen ((char *) ptr), "level2 {\r");
00250 sprintf ((char *) ptr + strlen ((char *) ptr), "band 0 eq {\r");
00251 sprintf ((char *) ptr + strlen ((char *) ptr),
00252 "[/CIEBasedABC 3 dict begin\r");
00253 sprintf ((char *) ptr + strlen ((char *) ptr),
00254 "/DecodeLMN [{1.8 exp} bind dup dup] def\r");
00255 sprintf ((char *) ptr + strlen ((char *) ptr), "/MatrixLMN [\r");
00256 sprintf ((char *) ptr + strlen ((char *) ptr),
00257 "0.4497 0.2446 0.0252\r");
00258 sprintf ((char *) ptr + strlen ((char *) ptr),
00259 "0.3163 0.6720 0.1412\r");
00260 sprintf ((char *) ptr + strlen ((char *) ptr),
00261 "0.1845 0.0833 0.9227\r");
00262 sprintf ((char *) ptr + strlen ((char *) ptr), "] def\r");
00263 sprintf ((char *) ptr + strlen ((char *) ptr),
00264 "/WhitePoint [0.9505 1 1.0891] def\r");
00265 sprintf ((char *) ptr + strlen ((char *) ptr), "currentdict end]\r");
00266 sprintf ((char *) ptr + strlen ((char *) ptr),
00267 "} {/DeviceGray} ifelse\r");
00268 sprintf ((char *) ptr + strlen ((char *) ptr), "setcolorspace} if\r");
00269 sprintf ((char *) ptr + strlen ((char *) ptr),
00270 "/picstr1 %d string def\r", in->npix);
00271 sprintf ((char *) ptr + strlen ((char *) ptr),
00272 "/picstr2 %d string def\r", in->npix);
00273 sprintf ((char *) ptr + strlen ((char *) ptr),
00274 "/picstr3 %d string def\r", in->npix);
00275 sprintf ((char *) ptr + strlen ((char *) ptr),
00276 "/picstr4 %d string def\r", in->npix);
00277 sprintf ((char *) ptr + strlen ((char *) ptr),
00278 "/readdata {currentfile exch readhexstring pop} def\r");
00279 sprintf ((char *) ptr + strlen ((char *) ptr),
00280 "/image2 level2 {/image load def} {{begin\r");
00281 sprintf ((char *) ptr + strlen ((char *) ptr),
00282 "Width Height BitsPerComponent ImageMatrix\r");
00283 sprintf ((char *) ptr + strlen ((char *) ptr), "Decode length 2 eq\r");
00284 sprintf ((char *) ptr + strlen ((char *) ptr),
00285 "{/DataSource load image} if\r");
00286 sprintf ((char *) ptr + strlen ((char *) ptr), "Decode length 6 eq\r");
00287 sprintf ((char *) ptr + strlen ((char *) ptr),
00288 "{DataSource 0 get DataSource 1 get DataSource 2 get\r");
00289 sprintf ((char *) ptr + strlen ((char *) ptr),
00290 "true 3 colorimage} if\r");
00291 sprintf ((char *) ptr + strlen ((char *) ptr), "Decode length 8 eq\r");
00292 sprintf ((char *) ptr + strlen ((char *) ptr),
00293 "{DataSource 0 get DataSource 1 get\r");
00294 sprintf ((char *) ptr + strlen ((char *) ptr),
00295 "DataSource 2 get DataSource 3 get\r");
00296 sprintf ((char *) ptr + strlen ((char *) ptr),
00297 "true 4 colorimage} if\r");
00298 sprintf ((char *) ptr + strlen ((char *) ptr), "end} def} ifelse\r");
00299 sprintf ((char *) ptr + strlen ((char *) ptr),
00300 "/_image2 level2 {/_image load def} {{begin\r");
00301 sprintf ((char *) ptr + strlen ((char *) ptr),
00302 "Width Height BitsPerComponent ImageMatrix\r");
00303 sprintf ((char *) ptr + strlen ((char *) ptr),
00304 "/DataSource load _image end} def} ifelse\r");
00305 sprintf ((char *) ptr + strlen ((char *) ptr), "/beginimage {\r");
00306 sprintf ((char *) ptr + strlen ((char *) ptr),
00307 "band 0 eq band 4 eq or band 5 eq or\r");
00308 sprintf ((char *) ptr + strlen ((char *) ptr), "{image2}\r");
00309 sprintf ((char *) ptr + strlen ((char *) ptr),
00310 "{negative {{pop 0}} {{pop 1}} ifelse\r");
00311 sprintf ((char *) ptr + strlen ((char *) ptr),
00312 "_settransfer _image2} ifelse\r");
00313 sprintf ((char *) ptr + strlen ((char *) ptr), "} def\r");
00314 sprintf ((char *) ptr + strlen ((char *) ptr), "12 dict begin\r");
00315 sprintf ((char *) ptr + strlen ((char *) ptr), "/ImageType 1 def\r");
00316 sprintf ((char *) ptr + strlen ((char *) ptr), "/Width cols def\r");
00317 sprintf ((char *) ptr + strlen ((char *) ptr), "/Height rows def\r");
00318 sprintf ((char *) ptr + strlen ((char *) ptr),
00319 "/ImageMatrix [cols 0 0 rows neg 0 rows] def\r");
00320 sprintf ((char *) ptr + strlen ((char *) ptr),
00321 "/BitsPerComponent %d def\r", nbit);
00322 sprintf ((char *) ptr + strlen ((char *) ptr), "band 0 eq\r");
00323 sprintf ((char *) ptr + strlen ((char *) ptr),
00324 "{/Decode [0 1 0 1 0 1] def\r");
00325 sprintf ((char *) ptr + strlen ((char *) ptr),
00326 "/MultipleDataSources true def\r");
00327 sprintf ((char *) ptr + strlen ((char *) ptr), "/DataSource [\r");
00328 sprintf ((char *) ptr + strlen ((char *) ptr), "{picstr1 readdata}\r");
00329 sprintf ((char *) ptr + strlen ((char *) ptr), "{picstr2 readdata}\r");
00330 sprintf ((char *) ptr + strlen ((char *) ptr),
00331 "{picstr3 readdata picstr4 readdata pop}\r");
00332 sprintf ((char *) ptr + strlen ((char *) ptr), "] def}\r");
00333 sprintf ((char *) ptr + strlen ((char *) ptr), "{/Decode [0 1] def\r");
00334 sprintf ((char *) ptr + strlen ((char *) ptr), "/DataSource {\r");
00335 sprintf ((char *) ptr + strlen ((char *) ptr),
00336 "picstr1 readdata pop\r");
00337 sprintf ((char *) ptr + strlen ((char *) ptr),
00338 "picstr2 readdata pop\r");
00339 sprintf ((char *) ptr + strlen ((char *) ptr),
00340 "picstr3 readdata pop\r");
00341 sprintf ((char *) ptr + strlen ((char *) ptr), "picstr4 readdata\r");
00342 sprintf ((char *) ptr + strlen ((char *) ptr), "} def}\r");
00343 sprintf ((char *) ptr + strlen ((char *) ptr), "ifelse\r");
00344 sprintf ((char *) ptr + strlen ((char *) ptr), "currentdict end\r");
00345 sprintf ((char *) ptr + strlen ((char *) ptr),
00346 "%%%%BeginData: %ld ASCII Lines\r",
00347 (long) 4 * (long) in->nlin + (long) 1);
00348 sprintf ((char *) ptr + strlen ((char *) ptr), "beginimage\r");
00349 }
00350 nbytes = (long) strlen ((char *) ptr);
00351 if (fwrite (ptr, nbytes, 1, fp) != 1)
00352 {
00353 sprintf (msg, " Can't write image header to file %s.", name);
00354 MESSAGE ('E', msg);
00355 goto the_end;
00356 }
00357
00358
00359 factor = 255.0 / (in->gmax - in->gmin);
00360 nbytes = (long) 2 *(long) in->npix + (long) 1;
00361 ptr[(long) 2 * (long) in->npix] = '\r';
00362 if (in->nbnd != 3)
00363 {
00364 for (j = 0; j < in->nlin; j += 1)
00365 {
00366 for (ptr = data, k = 0; k < in->npix; k += 1, ptr += 2)
00367 {
00368 dval = (in->data[0][j][k] - in->gmin) * factor;
00369 cval = (unsigned char) dval;
00370 ptr[0] = hex[(cval & 0xF0) >> 4];
00371 ptr[1] = hex[(cval & 0x0F)];
00372 }
00373 if (fwrite (data, nbytes, 1, fp) != 1)
00374 {
00375 sprintf (msg, " Can't write image data to file %s.", name);
00376 MESSAGE ('E', msg);
00377 goto the_end;
00378 }
00379 }
00380 }
00381 else
00382 {
00383 for (j = 0; j < in->nlin; j += 1)
00384 {
00385 for (i = 0; i < in->nbnd; i += 1)
00386 {
00387 for (ptr = data, k = 0; k < in->npix; k += 1, ptr += 2)
00388 {
00389 dval = (in->data[i][j][k] - in->gmin) * factor;
00390 cval = (unsigned char) dval;
00391 ptr[0] = hex[(cval & 0xF0) >> 4];
00392 ptr[1] = hex[(cval & 0x0F)];
00393 }
00394 if (fwrite (data, nbytes, 1, fp) != 1)
00395 {
00396 sprintf (msg, " Can't write image data to file %s.", name);
00397 MESSAGE ('E', msg);
00398 goto the_end;
00399 }
00400 }
00401 for (ptr = data, k = 0; k < in->npix; k += 1, ptr += 2)
00402 {
00403 dval =
00404 (in->data[0][j][k] - in->gmin) * factor * 0.30 +
00405 (in->data[1][j][k] - in->gmin) * factor * 0.59 +
00406 (in->data[2][j][k] - in->gmin) * factor * 0.11;
00407 cval = (unsigned char) rnd (dval);
00408 ptr[0] = hex[(cval & 0xF0) >> 4];
00409 ptr[1] = hex[(cval & 0x0F)];
00410 }
00411 if (fwrite (data, nbytes, 1, fp) != 1)
00412 {
00413 sprintf (msg, " Can't write image data to file %s.", name);
00414 MESSAGE ('E', msg);
00415 goto the_end;
00416 }
00417 }
00418 }
00419
00420
00421 sprintf ((char *) ptr, "%%%%EndData\r");
00422 sprintf ((char *) ptr + strlen ((char *) ptr), "grestore end\r");
00423 sprintf ((char *) ptr + strlen ((char *) ptr), "grestore\r");
00424 nbytes = (long) strlen ((char *) ptr);
00425 if (fwrite (ptr, nbytes, 1, fp) != 1)
00426 {
00427 sprintf (msg, " Can't write image trailer to file %s.", name);
00428 MESSAGE ('E', msg);
00429 goto the_end;
00430 }
00431
00432
00433 the_end:
00434 if (fp)
00435 {
00436 if (fclose (fp))
00437 {
00438 sprintf (msg, " Can't close file %s.", name);
00439 MESSAGE ('W', msg);
00440 }
00441 }
00442
00443 if (data)
00444 free (data);
00445
00446 if (TIMES)
00447 TIMING (T_EXIT);
00448 }