3 Part of the swftools package.
5 Copyright (c) 2005 Matthias Kramm <kramm@quiss.org>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
28 #include "../gfxdevice.h"
30 typedef struct _internal
{
35 int file_setparameter(struct _gfxdevice
*dev
, const char*key
, const char*value
)
37 internal_t
*i
= (internal_t
*)dev
->internal
;
38 fprintf(i
->fi
, "setparameter %s=%s\n", key
, value
);
42 void file_startpage(struct _gfxdevice
*dev
, int width
, int height
)
44 internal_t
*i
= (internal_t
*)dev
->internal
;
45 fprintf(i
->fi
, "startpage %d %d\n", width
, height
);
48 static void dumpline(FILE*fi
, gfxline_t
*line
)
51 if(line
->type
== gfx_moveTo
) {
52 fprintf(fi
, "\tmoveTo %f %f\n", line
->x
, line
->y
);
53 } else if(line
->type
== gfx_lineTo
) {
54 fprintf(fi
, "\tlineTo %f %f\n", line
->x
, line
->y
);
55 } else if(line
->type
== gfx_splineTo
) {
56 fprintf(fi
, "\tsplineTo %f %f %f %f\n", line
->sx
, line
->sy
, line
->x
, line
->y
);
62 static void dumpmatrix (FILE*fi
, gfxmatrix_t
*matrix
)
64 fprintf(fi
, "| %5.2f %5.2f %5.2f\n", matrix
->m00
, matrix
->m10
, matrix
->tx
);
65 fprintf(fi
, "| %5.2f %5.2f %5.2f\n", matrix
->m01
, matrix
->m11
, matrix
->ty
);
68 static void dumpgradient (FILE*fi
, gfxgradient_t
*gradient
)
71 fprintf(fi
, "pos %f: %02x%02x%02x%02x\n", gradient
->pos
, gradient
->color
.r
, gradient
->color
.g
, gradient
->color
.b
, gradient
->color
.a
);
72 gradient
= gradient
->next
;
76 void file_startclip(struct _gfxdevice
*dev
, gfxline_t
*line
)
78 internal_t
*i
= (internal_t
*)dev
->internal
;
79 fprintf(i
->fi
, "startclip\n");
80 dumpline(i
->fi
, line
);
83 void file_endclip(struct _gfxdevice
*dev
)
85 internal_t
*i
= (internal_t
*)dev
->internal
;
86 fprintf(i
->fi
, "endclip\n");
89 void file_stroke(struct _gfxdevice
*dev
, gfxline_t
*line
, gfxcoord_t width
, gfxcolor_t
*color
, gfx_capType cap_style
, gfx_joinType joint_style
, gfxcoord_t miterLimit
)
91 internal_t
*i
= (internal_t
*)dev
->internal
;
92 char* jointTypes
[] = {"joinMiter", "joinRound", "joinBevel"};
93 char* capTypes
[] = {"capButt", "capRound", "capSquare"};
95 fprintf(i
->fi
, "stroke %f %f %s %s %02x%02x%02x%02x\n", width
, miterLimit
, capTypes
[cap_style
], jointTypes
[joint_style
],
96 color
->r
, color
->g
, color
->b
, color
->a
98 dumpline(i
->fi
, line
);
101 void file_fill(struct _gfxdevice
*dev
, gfxline_t
*line
, gfxcolor_t
*color
)
103 internal_t
*i
= (internal_t
*)dev
->internal
;
104 fprintf(i
->fi
, "fill %02x%02x%02x%02x\n", color
->r
, color
->g
, color
->b
, color
->a
);
105 dumpline(i
->fi
, line
);
108 void file_fillbitmap(struct _gfxdevice
*dev
, gfxline_t
*line
, gfximage_t
*img
, gfxmatrix_t
*matrix
, gfxcxform_t
*cxform
)
110 internal_t
*i
= (internal_t
*)dev
->internal
;
111 fprintf(i
->fi
, "fillbitmap\n");
112 dumpmatrix(i
->fi
, matrix
);
113 dumpline(i
->fi
, line
);
116 void file_fillgradient(struct _gfxdevice
*dev
, gfxline_t
*line
, gfxgradient_t
*gradient
, gfxgradienttype_t type
, gfxmatrix_t
*matrix
)
118 internal_t
*i
= (internal_t
*)dev
->internal
;
119 fprintf(i
->fi
, "fillgradient\n");
120 dumpmatrix(i
->fi
, matrix
);
121 dumpgradient(i
->fi
, gradient
);
122 dumpline(i
->fi
, line
);
125 void file_addfont(struct _gfxdevice
*dev
, gfxfont_t
*font
)
127 internal_t
*i
= (internal_t
*)dev
->internal
;
128 fprintf(i
->fi
, "addfont %s\n", font
->id
);
131 void file_drawchar(struct _gfxdevice
*dev
, gfxfont_t
*font
, int glyph
, gfxcolor_t
*color
, gfxmatrix_t
*matrix
)
133 internal_t
*i
= (internal_t
*)dev
->internal
;
136 void file_drawlink(struct _gfxdevice
*dev
, gfxline_t
*line
, const char*action
, const char*text
)
138 internal_t
*i
= (internal_t
*)dev
->internal
;
139 fprintf(i
->fi
, "drawlink %s\n", action
);
140 dumpline(i
->fi
, line
);
143 void file_endpage(struct _gfxdevice
*dev
)
145 internal_t
*i
= (internal_t
*)dev
->internal
;
146 fprintf(i
->fi
, "endpage\n");
149 typedef struct gfxresult_internal
153 } gfxresult_internal_t
;
155 void fileresult_destroy(struct _gfxresult
*gfx
)
157 gfxresult_internal_t
*i
= (gfxresult_internal_t
*)gfx
->internal
;
159 free(i
->filename
);i
->filename
= 0;
162 int fileresult_save(struct _gfxresult
*gfx
, const char*filename
)
164 gfxresult_internal_t
*i
= (gfxresult_internal_t
*)gfx
->internal
;
166 fi
= fopen(i
->filename
, "rb");
171 fo
= fopen(filename
, "wb");
179 int l
= fread(buf
, 1, 4096, fi
);
181 fwrite(buf
, 1, l
, fo
);
192 void* fileresult_get(struct _gfxresult
*gfx
, const char*name
)
197 gfxresult_t
* file_finish(struct _gfxdevice
*dev
)
199 internal_t
*i
= (internal_t
*)dev
->internal
;
200 char*filename
= strdup(i
->filename
);
201 gfxresult_t
*result
= (gfxresult_t
*)malloc(sizeof(gfxresult_t
));
211 memset(result
, 0, sizeof(gfxresult_t
));
212 result
->save
= fileresult_save
;
213 result
->get
= fileresult_get
;
214 result
->destroy
= fileresult_destroy
;
215 result
->internal
= malloc(sizeof(gfxresult_internal_t
));
216 ((gfxresult_internal_t
*)result
->internal
)->filename
= filename
;
221 void gfxdevice_file_init(gfxdevice_t
*dev
, char*filename
)
223 internal_t
*i
= (internal_t
*)malloc(sizeof(internal_t
));
224 memset(dev
, 0, sizeof(gfxdevice_t
));
230 dev
->setparameter
= file_setparameter
;
231 dev
->startpage
= file_startpage
;
232 dev
->startclip
= file_startclip
;
233 dev
->endclip
= file_endclip
;
234 dev
->stroke
= file_stroke
;
235 dev
->fill
= file_fill
;
236 dev
->fillbitmap
= file_fillbitmap
;
237 dev
->fillgradient
= file_fillgradient
;
238 dev
->addfont
= file_addfont
;
239 dev
->drawchar
= file_drawchar
;
240 dev
->drawlink
= file_drawlink
;
241 dev
->endpage
= file_endpage
;
242 dev
->finish
= file_finish
;
244 i
->fi
= fopen(filename
, "wb");
245 i
->filename
= strdup(filename
);
247 fprintf(stderr
, "Couldn't open file %s\n", filename
);