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