21 #ifdef SIMAGE_EPS_SUPPORT
28 #define ERR_NO_ERROR 0
29 #define ERR_OPEN_WRITE 1
38 strncpy(buffer,
"EPS loader: Error opening file for writing", buflen);
45 encode_ascii85(
const unsigned char * in,
unsigned char * out)
48 ((
unsigned int)(in[0])<<24) |
49 ((
unsigned int)(in[1])<<16) |
50 ((
unsigned int)(in[2])<< 8) |
51 ((
unsigned int)(in[3]));
57 out[4] = (
unsigned char) (data%85 +
'!');
59 out[3] = (
unsigned char) (data%85 +
'!');
61 out[2] = (
unsigned char) (data%85 +
'!');
63 out[1] = (
unsigned char) (data%85 +
'!');
65 out[0] = (
unsigned char) (data%85 +
'!');
70 output_ascii85(FILE * fp,
71 const unsigned char val,
72 unsigned char * tuple,
73 unsigned char * linebuf,
74 int * tuplecnt,
int * linecnt,
81 for (i = *tuplecnt; i < 4; i++) tuple[i] = 0;
84 tuple[*tuplecnt] = val;
87 if (flush || *tuplecnt == 4) {
89 int add = encode_ascii85(tuple, linebuf + *linecnt);
92 for (i = 0; i < 5; i++) linebuf[*linecnt+i] =
'!';
94 *linecnt += *tuplecnt + 1;
99 if (*linecnt >= rowlen) {
100 unsigned char store = linebuf[rowlen];
102 fprintf(fp,
"%s\n", linebuf);
103 linebuf[rowlen] = store;
104 for (i = rowlen; i < *linecnt; i++) {
105 linebuf[i-rowlen] = linebuf[i];
109 if (flush && *linecnt) {
110 linebuf[*linecnt] = 0;
111 fprintf(fp,
"%s\n", linebuf);
117 flush_ascii85(FILE * fp,
118 unsigned char * tuple,
119 unsigned char * linebuf,
120 int * tuplecnt,
int * linecnt,
123 output_ascii85(fp, 0, tuple, linebuf, tuplecnt, linecnt, rowlen, 1);
128 const unsigned char * src,
149 unsigned char tuple[4];
150 unsigned char linebuf[ROWLEN+5];
154 FILE * fp = fopen(filename,
"wb");
167 pixelsize[0] = (int) (inchsize[0]*defaultdpi);
168 pixelsize[1] = (int) (inchsize[1]*defaultdpi);
170 chan = nc <= 2 ? 1 : 3;
171 scaledsize[0] = (int) ceil(((
double)size[0])*defaultdpi/dpi);
172 scaledsize[1] = (int) ceil(((
double)size[1])*defaultdpi/dpi);
174 fprintf(fp,
"%%!PS-Adobe-2.0 EPSF-1.2\n");
175 fprintf(fp,
"%%%%Pages: 1\n");
176 fprintf(fp,
"%%%%PageOrder: Ascend\n");
177 fprintf(fp,
"%%%%BoundingBox: 0 %d %d %d\n",
178 pixelsize[1]-scaledsize[1],
181 fprintf(fp,
"%%%%Creator: simage <https://coin3d.github.io>\n");
182 fprintf(fp,
"%%%%EndComments\n");
185 fprintf(fp,
"/origstate save def\n");
187 fprintf(fp,
"%% workaround for bug in some PS interpreters\n");
188 fprintf(fp,
"%% which doesn't skip the ASCII85 EOD marker.\n");
189 fprintf(fp,
"/~ {currentfile read pop pop} def\n\n");
190 fprintf(fp,
"/image_wd %d def\n", size[0]);
191 fprintf(fp,
"/image_ht %d def\n", size[1]);
192 fprintf(fp,
"/pos_wd %d def\n", size[0]);
193 fprintf(fp,
"/pos_ht %d def\n", size[1]);
194 fprintf(fp,
"/image_dpi %g def\n", dpi);
195 fprintf(fp,
"/image_scale %g image_dpi div def\n", defaultdpi);
196 fprintf(fp,
"/image_chan %d def\n", chan);
197 fprintf(fp,
"/xpos_offset 0 image_scale mul def\n");
198 fprintf(fp,
"/ypos_offset 0 image_scale mul def\n");
199 fprintf(fp,
"/pix_buf_size %d def\n\n", size[0]*chan);
200 fprintf(fp,
"/page_ht %g %g mul def\n", inchsize[1], defaultdpi);
201 fprintf(fp,
"/page_wd %g %g mul def\n", inchsize[0], defaultdpi);
202 fprintf(fp,
"/image_xpos 0 def\n");
203 fprintf(fp,
"/image_ypos page_ht pos_ht image_scale mul sub def\n");
204 fprintf(fp,
"image_xpos xpos_offset add image_ypos ypos_offset add translate\n");
206 fprintf(fp,
"/pix pix_buf_size string def\n");
207 fprintf(fp,
"image_wd image_scale mul image_ht image_scale mul scale\n");
209 fprintf(fp,
"image_wd image_ht 8\n");
210 fprintf(fp,
"[image_wd 0 0 image_ht 0 0]\n");
211 fprintf(fp,
"currentfile\n");
212 fprintf(fp,
"/ASCII85Decode filter\n");
214 if (chan == 3) fprintf(fp,
"false 3\ncolorimage\n");
215 else fprintf(fp,
"image\n");
217 num = size[0] * size[1];
226 output_ascii85(fp, src[cnt], tuple, linebuf, &tuplecnt, &linecnt, ROWLEN, 0);
229 output_ascii85(fp, src[cnt*2], tuple, linebuf, &tuplecnt, &linecnt, ROWLEN, 0);
232 output_ascii85(fp, src[cnt*3], tuple, linebuf, &tuplecnt, &linecnt, ROWLEN, 0);
233 output_ascii85(fp, src[cnt*3+1], tuple, linebuf, &tuplecnt, &linecnt, ROWLEN, 0);
234 output_ascii85(fp, src[cnt*3+2], tuple, linebuf, &tuplecnt, &linecnt, ROWLEN, 0);
237 output_ascii85(fp, src[cnt*4], tuple, linebuf, &tuplecnt, &linecnt, ROWLEN, 0);
238 output_ascii85(fp, src[cnt*4+1], tuple, linebuf, &tuplecnt, &linecnt, ROWLEN, 0);
239 output_ascii85(fp, src[cnt*4+2], tuple, linebuf, &tuplecnt, &linecnt, ROWLEN, 0);
246 flush_ascii85(fp, tuple, linebuf, &tuplecnt, &linecnt, ROWLEN);
248 fprintf(fp,
"~>\n\n");
249 fprintf(fp,
"origstate restore\n");
251 fprintf(fp,
"%%%%Trailer\n");
253 fprintf(fp,
"%%%%EOF\n");
int simage_eps_error(char *buffer, int bufferlen)
int simage_eps_save(const char *filename, const unsigned char *bytes, int width, int height, int numcomponents)