OSDN Git Service

test for replaceBitmapData Lossless with alpha0
[swfed/swfed.git] / src / swf_tag_edit.c
1 /*
2   +----------------------------------------------------------------------+
3   | Author: yoya@awm.jp                                                  |
4   +----------------------------------------------------------------------+
5 */
6
7 #include <stdio.h>
8 #include <string.h>
9 #include "bitstream.h"
10 #include "swf_tag_edit.h"
11 #include "swf_object.h"
12 #include "swf_rgba.h"
13
14 swf_tag_detail_handler_t edit_detail_handler;
15
16 swf_tag_detail_handler_t *
17 swf_tag_edit_detail_handler(void) {
18     edit_detail_handler.create   = swf_tag_edit_create_detail;
19     edit_detail_handler.input    = swf_tag_edit_input_detail;
20     edit_detail_handler.get_cid  = swf_tag_edit_get_cid_detail;
21     edit_detail_handler.replace_cid = swf_tag_edit_replace_cid_detail;
22     edit_detail_handler.output   = swf_tag_edit_output_detail;
23     edit_detail_handler.print    = swf_tag_edit_print_detail;
24     edit_detail_handler.destroy  = swf_tag_edit_destroy_detail;
25     return &edit_detail_handler;
26 }
27
28 void *
29 swf_tag_edit_create_detail(void) {
30     swf_tag_edit_detail_t *swf_tag_edit;
31     swf_tag_edit = calloc(sizeof(*swf_tag_edit), 1);
32     if (swf_tag_edit == NULL) {
33         fprintf(stderr, "ERROR: swf_tag_edit_create_detail: can't calloc\n");
34         return NULL;
35     }
36     return swf_tag_edit;
37 }
38
39 int
40 swf_tag_edit_input_detail(swf_tag_t *tag, struct swf_object_ *swf) {
41     swf_tag_edit_detail_t *swf_tag_edit = tag->detail;
42     unsigned char *data  = tag->data;
43     unsigned long length = tag->length;
44     bitstream_t *bs;
45     if (swf_tag_edit == NULL) {
46         fprintf(stderr, "ERROR: swf_tag_edit_input_detail: swf_tag_edit == NULL\n");
47         return 1;
48     }
49     bs = bitstream_open();
50     bitstream_input(bs, data, length);
51     swf_tag_edit->edit_id = bitstream_getbytesLE(bs, 2);
52     swf_rect_parse(bs, &swf_tag_edit->rect);
53     bitstream_align(bs);
54     swf_tag_edit->edit_has_text       = bitstream_getbit(bs);
55     swf_tag_edit->edit_word_wrap      = bitstream_getbit(bs);
56     swf_tag_edit->edit_multiline      = bitstream_getbit(bs);
57     swf_tag_edit->edit_password       = bitstream_getbit(bs);
58     swf_tag_edit->edit_readonly       = bitstream_getbit(bs);
59     swf_tag_edit->edit_has_color      = bitstream_getbit(bs);
60     swf_tag_edit->edit_has_max_length = bitstream_getbit(bs);
61     swf_tag_edit->edit_has_font       = bitstream_getbit(bs);
62     if (swf && (swf->header.version >= 6)) {
63         (void) bitstream_getbit(bs); // reserved;
64         swf_tag_edit->edit_auto_size = bitstream_getbit(bs);
65     } else {
66         (void) bitstream_getbit(bs); // reserved;
67         (void) bitstream_getbit(bs); // reserved;
68     }
69     swf_tag_edit->edit_has_layout   = bitstream_getbit(bs);
70     swf_tag_edit->edit_no_select    = bitstream_getbit(bs);
71     swf_tag_edit->edit_border       = bitstream_getbit(bs);
72     (void) bitstream_getbit(bs); // reserved;
73     swf_tag_edit->edit_html         = bitstream_getbit(bs);
74     swf_tag_edit->edit_use_outlines = bitstream_getbit(bs);
75     if (swf_tag_edit->edit_has_font) {
76         swf_tag_edit->edit_font_id_ref = bitstream_getbytesLE(bs, 2);
77         swf_tag_edit->edit_font_height = bitstream_getbytesLE(bs, 2);
78     }
79     if (swf_tag_edit->edit_has_color) {
80         swf_rgba_parse(bs, &swf_tag_edit->edit_color);
81     }
82     if (swf_tag_edit->edit_has_max_length) {
83         swf_tag_edit->edit_max_length = bitstream_getbytesLE(bs, 2);
84     }
85     if (swf_tag_edit->edit_has_layout) {
86         swf_tag_edit->edit_align = bitstream_getbyte(bs);
87         swf_tag_edit->edit_left_margine = bitstream_getbytesLE(bs, 2);
88         swf_tag_edit->edit_right_margine = bitstream_getbytesLE(bs, 2);
89         swf_tag_edit->edit_indent = (signed) bitstream_getbytesLE(bs, 2);
90         swf_tag_edit->edit_leading = (signed) bitstream_getbytesLE(bs, 2);
91     }
92     swf_tag_edit->edit_variable_name = (char *) bitstream_outputstring(bs);
93     if (swf_tag_edit->edit_has_text) {
94         swf_tag_edit->edit_initial_text = (char *) bitstream_outputstring(bs);
95     } else {
96         swf_tag_edit->edit_initial_text = NULL;
97     }
98     
99     bitstream_close(bs);
100     return 0;
101 }
102
103 int swf_tag_edit_get_cid_detail(swf_tag_t *tag) {
104     unsigned char *data = tag->data;
105     if (tag->detail) {
106         swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) tag->detail;
107         return swf_tag_edit->edit_id;
108     }
109     if (data == NULL) {
110         fprintf(stderr, "swf_tag_edit_get_cid_detail: data == NULL\n");
111         return -1;
112     }
113     return GetUShortLE(data); // edit_id;
114 }
115
116 int swf_tag_edit_replace_cid_detail(swf_tag_t *tag, int id) {
117     unsigned char *data = tag->data;
118     if (tag->detail) {
119         swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) tag->detail;
120         swf_tag_edit->edit_id = id;
121     }
122     if (data) {
123         PutUShortLE(data, id);
124     }
125     return 0; // always 0
126 }
127
128 unsigned char *
129 swf_tag_edit_output_detail(swf_tag_t *tag, unsigned long *length,
130                            struct swf_object_ *swf) {
131     swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) tag->detail;
132     bitstream_t *bs;
133     unsigned char *data;
134     (void) tag;
135     *length = 0;
136     bs = bitstream_open();
137     bitstream_putbytesLE(bs, swf_tag_edit->edit_id, 2);
138     swf_rect_build(bs, &swf_tag_edit->rect);
139     bitstream_align(bs);
140     bitstream_putbit(bs, swf_tag_edit->edit_has_text);
141     bitstream_putbit(bs, swf_tag_edit->edit_word_wrap);
142     bitstream_putbit(bs, swf_tag_edit->edit_multiline);
143     bitstream_putbit(bs, swf_tag_edit->edit_password );
144     bitstream_putbit(bs, swf_tag_edit->edit_readonly);
145     bitstream_putbit(bs, swf_tag_edit->edit_has_color );
146     bitstream_putbit(bs, swf_tag_edit->edit_has_max_length);
147     bitstream_putbit(bs, swf_tag_edit->edit_has_font);
148     if (swf && (swf->header.version >= 6)) {
149         bitstream_putbit(bs, 0); // reserved;
150         bitstream_putbit(bs, swf_tag_edit->edit_auto_size);
151     } else {
152         bitstream_putbit(bs, 0); // reserved;
153         bitstream_putbit(bs, 0); // reserved;
154     }
155     bitstream_putbit(bs, swf_tag_edit->edit_has_layout);
156     bitstream_putbit(bs, swf_tag_edit->edit_no_select);
157     bitstream_putbit(bs, swf_tag_edit->edit_border);
158     bitstream_putbit(bs, 0); // reserved;
159     bitstream_putbit(bs, swf_tag_edit->edit_html);
160     bitstream_putbit(bs, swf_tag_edit->edit_use_outlines);
161     if (swf_tag_edit->edit_has_font) {
162         bitstream_putbytesLE(bs, swf_tag_edit->edit_font_id_ref, 2);
163         bitstream_putbytesLE(bs, swf_tag_edit->edit_font_height, 2);
164     }
165     if (swf_tag_edit->edit_has_color) {
166         swf_rgba_build(bs, &swf_tag_edit->edit_color);
167     }
168     if (swf_tag_edit->edit_has_max_length) {
169         bitstream_putbytesLE(bs, swf_tag_edit->edit_max_length, 2);
170     }
171     if (swf_tag_edit->edit_has_layout) {
172         bitstream_putbyte(bs, swf_tag_edit->edit_align);
173         bitstream_putbytesLE(bs, swf_tag_edit->edit_left_margine, 2);
174         bitstream_putbytesLE(bs, swf_tag_edit->edit_right_margine, 2);
175         bitstream_putbytesLE(bs, swf_tag_edit->edit_indent, 2);
176         bitstream_putbytesLE(bs, swf_tag_edit->edit_leading, 2);
177     }
178     bitstream_putstring(bs,
179                         (unsigned char *) swf_tag_edit->edit_variable_name,
180                         strlen(swf_tag_edit->edit_variable_name) + 1);
181     if (swf_tag_edit->edit_has_text) {
182         bitstream_putstring(bs,
183                             (unsigned char *)swf_tag_edit->edit_initial_text,
184                             strlen(swf_tag_edit->edit_initial_text) + 1);
185     }
186     data = bitstream_steal(bs, length);
187     bitstream_close(bs);
188     return data;
189 }
190
191 void
192 swf_tag_edit_print_detail(swf_tag_t *tag,
193                           struct swf_object_ *swf, int indent_depth) {
194     swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) tag->detail;
195     (void) tag;
196     print_indent(indent_depth);
197     printf("edit_id=%d\n", swf_tag_edit->edit_id);
198     swf_rect_print(&swf_tag_edit->rect, indent_depth + 1);
199     print_indent(indent_depth);
200     printf("text=%d wwrap=%d multi=%d pass=%d ro=%d col=%d maxlen=%d font=%d\n",
201            swf_tag_edit->edit_has_text?1:0,
202            swf_tag_edit->edit_word_wrap?1:0,
203            swf_tag_edit->edit_multiline?1:0,
204            swf_tag_edit->edit_password?1:0,
205            swf_tag_edit->edit_readonly?1:0,
206            swf_tag_edit->edit_has_color?1:0,
207            swf_tag_edit->edit_has_max_length?1:0,
208            swf_tag_edit->edit_has_font?1:0);
209     if (swf->header.version >= 6) {
210             print_indent(indent_depth);
211             printf("auto_size=%d\n", swf_tag_edit->edit_auto_size);
212     }
213     print_indent(indent_depth);
214     printf("layout=%d no_sel=%d border=%d\n",
215            swf_tag_edit->edit_has_layout?1:0,
216            swf_tag_edit->edit_no_select?1:0,
217            swf_tag_edit->edit_border?1:0);
218     if (swf_tag_edit->edit_has_font) {
219         print_indent(indent_depth);
220         printf("font_id=%d font_height=%d",
221                swf_tag_edit->edit_font_id_ref,
222                swf_tag_edit->edit_font_height / SWF_TWIPS);
223     }
224     if (swf_tag_edit->edit_has_color) {
225         printf("  color=#%02x%02x%02x(%02x)",
226                swf_tag_edit->edit_color.red,
227                swf_tag_edit->edit_color.green,
228                swf_tag_edit->edit_color.blue,
229                swf_tag_edit->edit_color.alpha);
230     }
231     printf("\n");
232     if (swf_tag_edit->edit_has_max_length) {
233         print_indent(indent_depth);
234         printf("max_length=%d\n",
235                swf_tag_edit->edit_max_length);
236     }
237     if (swf_tag_edit->edit_has_layout) {
238         print_indent(indent_depth);
239         printf("align=%d (left,right)_margine=(%d,%d) indent=%d leading=%d\n",
240                swf_tag_edit->edit_align,
241                swf_tag_edit->edit_left_margine,
242                swf_tag_edit->edit_right_margine,
243                swf_tag_edit->edit_indent,
244                swf_tag_edit->edit_leading);
245     }
246     if (swf_tag_edit->edit_variable_name) {
247         print_indent(indent_depth);
248         printf("variable_name=%s\n",
249                swf_tag_edit->edit_variable_name);
250     }
251     if (swf_tag_edit->edit_initial_text) {
252         print_indent(indent_depth);
253         printf("initial_text=%s\n",
254                swf_tag_edit->edit_initial_text);
255     }
256     return ;
257 }
258
259 void
260 swf_tag_edit_destroy_detail(swf_tag_t *tag) {
261     swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) tag->detail;
262     if (swf_tag_edit) {
263         free(swf_tag_edit->edit_variable_name);
264         free(swf_tag_edit->edit_initial_text);
265         swf_tag_edit->edit_variable_name = NULL;
266         swf_tag_edit->edit_initial_text = NULL;
267         free(swf_tag_edit);
268         tag->detail = NULL;
269     }
270     return ;
271 }
272
273 char *
274 swf_tag_edit_get_string(void *detail,
275                         char *variable_name, int variable_name_len,
276                         int *error) {
277     swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) detail;
278     char *data, *initial_text;
279     int initial_text_len = 0;
280     *error = 0;
281
282     if ((strlen(swf_tag_edit->edit_variable_name) != (unsigned)variable_name_len) || strncmp(swf_tag_edit->edit_variable_name, variable_name, variable_name_len)) {
283         if (atoi(variable_name) != swf_tag_edit->edit_id) {
284             *error = 1;
285             return NULL;
286         }
287     }
288     initial_text = swf_tag_edit->edit_initial_text;
289     if (initial_text == NULL) {
290         return NULL;
291     }
292     initial_text_len = strlen(initial_text);
293     data = malloc(initial_text_len + 1);
294     if (data == NULL) {
295         *error = 1;
296         fprintf(stderr, "swf_tag_edit_get_string: Can't malloc\n");
297         return NULL;
298     }
299     memcpy(data, initial_text, initial_text_len + 1);
300     return data;
301 }
302
303 int
304 swf_tag_edit_replace_string(void *detail,
305                             char *variable_name, int variable_name_len,
306                             char *initial_text, int initial_text_len) {
307     char *new_str;
308     swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) detail;
309     if (((int) strlen(swf_tag_edit->edit_variable_name) != variable_name_len)
310         || memcmp(swf_tag_edit->edit_variable_name, variable_name,
311                   variable_name_len)) {
312         if (atoi(variable_name) != swf_tag_edit->edit_id) {
313             return 1;
314         }
315     }
316     if (initial_text_len == 0) {
317         swf_tag_edit->edit_has_text = 0;
318         if (swf_tag_edit->edit_initial_text) {
319             free(swf_tag_edit->edit_initial_text);
320             swf_tag_edit->edit_initial_text = NULL;
321         }
322         return 0;
323     } 
324     swf_tag_edit->edit_has_text = 1;
325     new_str = malloc(initial_text_len + 1);
326     if (new_str == NULL) {
327         fprintf(stderr, "swf_tag_edit_replace_string: Can't malloc\n");
328         return 1;
329     }
330     memcpy(new_str, initial_text, initial_text_len);
331     new_str[initial_text_len] = '\0';
332     if (swf_tag_edit->edit_initial_text) {
333         free(swf_tag_edit->edit_initial_text);
334     }
335     swf_tag_edit->edit_initial_text = new_str;
336     return 0;
337 }