2 +----------------------------------------------------------------------+
3 | Author: yoya@awm.jp |
4 +----------------------------------------------------------------------+
10 #include "swf_define.h"
12 #include "swf_tag_jpeg.h"
13 #include "swf_tag_lossless.h"
14 #include "swf_tag_edit.h"
15 #include "swf_tag_action.h"
16 #include "swf_tag_sound.h"
17 #include "swf_tag_sprite.h"
18 #include "swf_tag_shape.h"
19 #include "swf_tag_place.h"
20 #include "swf_tag_button.h"
21 #include "bitmap_util.h"
23 swf_tag_info_t swf_tag_info_table[] = {
25 { 1, "ShowFrame", NULL },
26 { 2, "DefineShape", swf_tag_shape_detail_handler },
27 { 3, "FreeCharacter", NULL},
28 { 4, "PlaceObject", swf_tag_place_detail_handler },
29 { 5, "RemoveObject", NULL},
30 { 6, "DefineBitsJPEG", swf_tag_jpeg_detail_handler },
31 { 7, "DefineButton", swf_tag_button_detail_handler},
32 { 8, "JPEGTables", swf_tag_jpegt_detail_handler },
33 { 9, "SetBackgroundColor", NULL },
34 { 10, "DefineFont", NULL},
35 { 11, "DefineText", NULL },
36 { 12, "DoAction", swf_tag_action_detail_handler },
37 { 13, "DefineFontInfo", NULL },
38 { 14, "DefineSound", swf_tag_sound_detail_handler },
39 { 15, "StartSound", NULL },
41 { 17, "DefineButtonSound", NULL },
42 { 18, "SoundStreamHead", NULL },
43 { 19, "SoundStreamBlock", NULL },
44 { 20, "DefineBitsLossless", swf_tag_lossless_detail_handler },
45 { 21, "DefineBitsJPEG2", swf_tag_jpeg_detail_handler },
46 { 22, "DefineShape2", swf_tag_shape_detail_handler },
47 { 24, "Protect", NULL },
48 { 26, "PlaceObject2", swf_tag_place_detail_handler },
49 { 28, "RemoveObject2", NULL },
50 { 32, "DefineShape3", swf_tag_shape_detail_handler },
51 { 33, "DefineText2", NULL },
52 { 34, "DefineButton2", swf_tag_button_detail_handler },
53 { 35, "DefineBitsJPEG3", swf_tag_jpeg3_detail_handler },
54 { 36, "DefineBitsLossless2", swf_tag_lossless_detail_handler },
55 { 37, "DefineEditText", swf_tag_edit_detail_handler },
56 { 39, "DefineSprite", swf_tag_sprite_detail_handler },
57 { 43, "FrameLabel", NULL } ,
58 { 46, "DefineMorphShape", swf_tag_shape_detail_handler },
59 { 48, "DefineFont2", NULL } ,
60 { 56, "Export", NULL } ,
61 { 59, "DoInitAction", swf_tag_action_detail_handler },
62 { 69, "FileAttributes", NULL },
63 { 73, "DefineFontAlignZones", NULL },
64 { 74, "CSMTextSettings", NULL },
65 { 75, "DefineFont3", NULL } ,
66 { 83, "DefineShape4", swf_tag_shape_cid_handler },
67 { 84, "DefineMorphShape2", swf_tag_shape_cid_handler },
68 { 88, "DefineFontName", NULL } ,
69 { 777,"Reflex", NULL } ,
72 swf_tag_info_t *get_swf_tag_info(int tag_id) {
73 int i, tag_info_num = NumOfTable(swf_tag_info_table);
74 for (i=0 ; i < tag_info_num ; i++) {
75 if (tag_id == swf_tag_info_table[i].id) {
76 return &(swf_tag_info_table[i]);
82 swf_tag_t *swf_tag_create(bitstream_t *bs) {
83 swf_tag_t *tag = NULL;
84 unsigned short tag_and_length;
86 fprintf(stderr, "swf_tag_create: bs == NULL\n");
89 tag_and_length = bitstream_getbytesLE(bs, 2);
90 if (tag_and_length == (unsigned short) -1) {
91 fprintf(stderr, "swf_tag_create: tag_and_length(short) == -1\n");
94 tag = calloc(sizeof(*tag), 1);
95 tag->code = tag_and_length >> 6;
96 tag->length = tag_and_length & 0x3f;
97 tag->length_longformat = 0;
98 if (tag->length == 0x3f) {
99 tag->length = bitstream_getbytesLE(bs, 4);
100 if (tag_and_length == (unsigned short) -1) {
101 fprintf(stderr, "swf_tag_create: tag_and_length(long) == -1\n");
105 tag->length_longformat = 1;
107 // printf("XXX: malloc length=%d\n", tag->length);
108 tag->data = malloc(tag->length);
109 bitstream_getstring(bs, tag->data, tag->length);
114 void swf_tag_destroy(swf_tag_t *tag) {
123 swf_tag_destroy_detail(tag);
129 static int swf_tag_and_length_build(bitstream_t *bs, swf_tag_t *tag) {
130 signed short tag_and_length;
132 fprintf(stderr, "swf_tag_and_length_build: bs == NULL\n");
136 fprintf(stderr, "swf_tag_and_length_build: tag == NULL\n");
139 if (tag->length >= 0x3f) {
140 tag->length_longformat = 1;
143 case 6: // DefineBitsJPEG
144 case 21: // DefineBitsJPEG2
145 case 35: // DefineBitsJPEG3
146 case 20: // DefineBitsLossless
147 case 36: // DefineBitsLossless2
148 case 19: // SoundStreamBlock
149 tag->length_longformat = 1;
152 tag->length_longformat = 0;
156 if (tag->length_longformat) {
157 tag_and_length = (tag->code << 6) | 0x3f;
158 bitstream_putbytesLE(bs, tag_and_length, 2);
159 bitstream_putbytesLE(bs, tag->length, 4);
161 tag_and_length = (tag->code << 6) | tag->length;
162 bitstream_putbytesLE(bs, tag_and_length, 2);
167 int swf_tag_build(bitstream_t *bs, swf_tag_t *tag, struct swf_object_ *swf) {
168 swf_tag_info_t *tag_info = NULL;
169 unsigned char *data = NULL;
170 unsigned long data_len = 0;
171 swf_tag_detail_handler_t *detail_handler = NULL;
173 fprintf(stderr, "swf_tag_build: bs == NULL\n");
177 fprintf(stderr, "swf_tag_build: tag == NULL\n");
180 // fprintf(stderr, "XXX: swf_tag_build: tag->code=%d\n",tag->code);
182 swf_tag_and_length_build(bs, tag);
183 bitstream_putstring(bs, tag->data, tag->length);
184 } else if (tag->detail) {
185 tag_info = get_swf_tag_info(tag->code);
186 if ((tag_info == NULL) || (tag_info->detail_handler == NULL)) {
187 fprintf(stderr, "swf_tag_build: not implemented yet. detail build tag->code=%d\n",
191 detail_handler = tag_info->detail_handler();
192 if (detail_handler->output == NULL) {
193 fprintf(stderr, "swf_tag_build: detail_handler->output == NULL: tag->code=%d\n",
197 data = detail_handler->output(tag, &data_len, swf);
199 fprintf(stderr, "swf_tag_build: Can't output: data=%p data_len=%lu\n",
202 tag->length = data_len;
203 swf_tag_and_length_build(bs, tag);
204 bitstream_putstring(bs, data, data_len);
207 fprintf(stderr, "ERROR: not found tag data and detail\n");
214 swf_tag_rebuild(swf_tag_t *tag, struct swf_object_ *swf) {
215 swf_tag_info_t *tag_info = NULL;
216 swf_tag_detail_handler_t * detail_handler = NULL;
218 tag_info = get_swf_tag_info(tag->code);
219 if ((tag_info == NULL) || (tag_info->detail_handler == NULL)) {
222 detail_handler = tag_info->detail_handler();
223 if (detail_handler == NULL) {
224 return 0; // no detail handler
226 if ((detail_handler->input == NULL) || (detail_handler->output == NULL)) {
227 return 0; // no input or output handler
229 detail = swf_tag_create_input_detail(tag, swf);
230 if (detail == NULL) {
231 fprintf(stderr, "swf_tag_rebuild: swf_tag_create_input_detail failed tag->code=%d\n", tag->code);
241 swf_tag_print(swf_tag_t *tag, struct swf_object_ *swf, int indent_depth) {
242 swf_tag_info_t *tag_info = NULL;
243 const char *tag_name = NULL;
245 fprintf(stderr, "swf_tag_print: tag == NULL\n");
248 tag_info = get_swf_tag_info(tag->code);
249 tag_name = (tag_info)?tag_info->name:"Unknown";
250 // print_indent(indent_depth);
251 printf("tag=%s(%d)", tag_name, tag->code);
252 if (tag->length > 0) {
253 printf(" length=%lu", tag->length);
256 if (tag_info && tag_info->detail_handler) {
257 swf_tag_detail_handler_t * detail_handler;
258 if (swf_tag_create_input_detail(tag, swf) == NULL) {
259 fprintf(stderr, "swf_tag_print: swf_tag_create_input_detail failed\n");
262 detail_handler = tag_info->detail_handler();
263 if (detail_handler->print) {
264 detail_handler->print(tag, swf, indent_depth + 1);
269 void *swf_tag_create_input_detail(swf_tag_t *tag, struct swf_object_ *swf) {
270 swf_tag_info_t *tag_info = NULL;
272 fprintf(stderr, "swf_tag_create_input_detail: tag == NULL\n");
278 tag_info = get_swf_tag_info(tag->code);
279 if (tag_info && tag_info->detail_handler) {
281 swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler();
282 if (detail_handler->create == NULL) {
283 fprintf(stderr, "swf_tag_create_input_detail: detail_handler->create == NULL (tag=%d)\n",
287 tag->detail = detail_handler->create();
288 if (tag->detail == NULL) {
289 fprintf(stderr, "swf_tag_create_input_detail: can't create tag detail (tag=%d)\n", tag->code);
292 result = detail_handler->input(tag, swf);
294 fprintf(stderr, "swf_tag_create_input_detail: can't input tag detail (result=%d)\n", result);
298 fprintf(stderr, "swf_tag_create_input_detail: tag_info or detail_handler == NULL\n");
300 if (tag->detail == NULL) {
301 fprintf(stderr, "swf_tag_create_input_detail: function tail but tag->detail == NULL (tag->code=%d)\n", tag->code);
306 void swf_tag_destroy_detail(swf_tag_t *tag) {
311 swf_tag_info_t *tag_info = get_swf_tag_info(tag->code);
312 if (tag_info && tag_info->detail_handler) {
313 swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler();
314 if (detail_handler->destroy) {
315 detail_handler->destroy(tag);
317 fprintf(stderr, "detail_handler->destroy == NULL (tag=%d)\n",
321 fprintf(stderr, "not impremented yet. destroy tag detail\n");
329 swf_tag_get_cid(swf_tag_t *tag) {
330 swf_tag_info_t *tag_info = NULL;
333 fprintf(stderr, "swf_tag_get_cid: tag == NULL\n");
339 case 7: // DefineButton
340 case 10: // DefineFont
341 case 11: // DefineText
342 case 13: // DefineFontInfo
343 case 14: // DefineSound
344 case 17: // DefineButtonSound
345 case 33: // DefineText2
346 case 34: // DefineButton2
347 case 39: // DefineSprite
348 case 46: // DefineMorphShape
349 case 48: // DefineFont2
350 case 88: // DefineFontName
351 return GetUShortLE(tag->data);
355 tag_info = get_swf_tag_info(tag_no);
356 if (tag_info && tag_info->detail_handler) {
357 swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler();
358 if (detail_handler->get_cid) {
359 return detail_handler->get_cid(tag);
362 return -1; // no cid tag
366 swf_tag_replace_cid(swf_tag_t *tag, int cid) {
367 swf_tag_info_t *tag_info;
370 fprintf(stderr, "swf_tag_replace_cid: tag == NULL\n");
374 tag_info = get_swf_tag_info(tag_no);
375 if (tag_info && tag_info->detail_handler) {
376 swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler();
377 if (detail_handler->replace_cid) {
378 return detail_handler->replace_cid(tag, cid);
382 case 7: // DefineButton
383 case 10: // DefineFont
384 case 11: // DefineText
385 case 13: // DefineFontInfo
386 case 14: // DefineSound
387 case 17: // DefineButtonSound
388 case 33: // DefineText2
389 case 34: // DefineButton2
390 case 39: // DefineSprite
391 case 46: // DefineMorphShape
392 case 48: // DefineFont2
393 case 88: // DefineFontName
395 PutUShortLE(tag->data, cid);
403 return 1; // no cid tag
407 swf_tag_get_refcid(swf_tag_t *tag) {
409 fprintf(stderr, "swf_tag_get_refcid: tag == NULL\n");
412 if (isPlaceTag(tag->code)) { // PlaceObject, PlaceObject2
413 swf_tag_place_detail_t *swf_tag_place;
414 swf_tag_place = swf_tag_create_input_detail(tag, NULL);
415 if (swf_tag_place == NULL) {
416 fprintf(stderr, "swf_tag_get_refcid: swf_tag_place swf_tag_create_input_detail failed\n");
419 return swf_tag_place->character_id;
420 } else if (tag->code == 37) { // DefineEditText
421 swf_tag_edit_detail_t *swf_tag_edit;
422 swf_tag_edit = swf_tag_create_input_detail(tag, NULL);
423 if (swf_tag_edit == NULL) {
424 fprintf(stderr, "swf_tag_get_refcid: swf_tag_edit swf_tag_create_input_detail failed\n");
427 return swf_tag_edit->edit_font_id_ref;
429 return -1; // no cid tag
433 swf_tag_replace_refcid(swf_tag_t *tag, int cid) {
435 fprintf(stderr, "swf_tag_replace_refcid: tag == NULL\n");
438 if (isPlaceTag(tag->code)) { // PlaceObject, PlaceObject2
439 swf_tag_place_detail_t *swf_tag_place;
440 swf_tag_place = swf_tag_create_input_detail(tag, NULL);
441 if (swf_tag_place == NULL) {
442 fprintf(stderr, "swf_tag_replace_refcid: swf_tag_place swf_tag_create_input_detail failed\n");
445 swf_tag_place->character_id = cid;
446 } else if (tag->code == 37) { // DefineEditText
447 swf_tag_edit_detail_t *swf_tag_edit;
448 swf_tag_edit = swf_tag_create_input_detail(tag, NULL);
449 if (swf_tag_edit == NULL) {
450 fprintf(stderr, "swf_tag_get_refcid: swf_tag_edit swf_tag_create_input_detail failed\n");
453 swf_tag_edit->edit_font_id_ref = cid;
467 swf_tag_get_bitmap_size(swf_tag_t *tag,
468 int *width, int *height) {
471 fprintf(stderr, "swf_tag_get_bitmap_size: tag == NULL\n");
474 if ((width == NULL ) || (height == NULL)) {
475 fprintf(stderr, "swf_tag_get_bitmap_size: width == NULL or height == NULL\n");
478 if (isBitsJPEGTag(tag->code)) {
479 swf_tag_jpeg_detail_t *swf_tag_jpeg;
480 if (swf_tag_create_input_detail(tag, NULL) == NULL) {
481 fprintf(stderr, "swf_tag_get_bitmap_size: swf_tag_create_input_detail failed\n");
484 swf_tag_jpeg = (swf_tag_jpeg_detail_t *) tag->detail;
485 ret = jpeg_size(swf_tag_jpeg->jpeg_data, swf_tag_jpeg->jpeg_data_len,
487 } else if (isBitsLosslessTag(tag->code)) {
489 swf_tag_lossless_detail_t *swf_tag_lossless = (swf_tag_lossless_detail_t *) tag->detail;
490 *width = swf_tag_lossless->width;
491 *height = swf_tag_lossless->height;
493 *width = GetUShortLE((tag->data + 3));
494 *height = GetUShortLE((tag->data + 5));
496 } else { // no Bitmap Tag
503 swf_tag_get_bitmap_color1stpixel(swf_tag_t *tag,
504 int *red, int *green, int *blue) {
505 swf_tag_lossless_detail_t *swf_tag_lossless = NULL;
507 fprintf(stderr, "swf_tag_get_bitmap_color1stpixel: tag == NULL\n");
510 if ((red == NULL ) || (green == NULL) || (blue == NULL)) {
511 fprintf(stderr, "swf_tag_get_bitmap_color1stpixel: width == NULL or height == NULL\n");
514 if (swf_tag_create_input_detail(tag, NULL) == NULL) {
515 fprintf(stderr, "swf_tag_get_bitmap_color1stpixel: swf_tag_create_input_detail failed\n");
518 if (isBitsLosslessTag(tag->code) == 0) {
519 return 1; // No Lossless Tag;
521 swf_tag_lossless = (swf_tag_lossless_detail_t *) tag->detail;
523 // get first 1 pixel RGB value. by format and tag_code.
524 switch (swf_tag_lossless->format) {
527 color_index = swf_tag_lossless->indices[0];
528 if (tag->code == 20) { // Lossless => RGB
529 *red = swf_tag_lossless->colormap[color_index].red;
530 *green = swf_tag_lossless->colormap[color_index].green;
531 *blue = swf_tag_lossless->colormap[color_index].blue;
532 } else { // Lossless2 => RGBA
533 int alpha = swf_tag_lossless->colormap2[color_index].alpha;
535 *red = swf_tag_lossless->colormap2[color_index].red;
536 *green = swf_tag_lossless->colormap2[color_index].green;
537 *blue = swf_tag_lossless->colormap2[color_index].blue;
540 *red = swf_tag_lossless->colormap2[color_index].red * 255 / alpha;
541 *green = swf_tag_lossless->colormap2[color_index].green * 255 / alpha;
542 *blue = swf_tag_lossless->colormap2[color_index].blue * 255 / alpha;
547 if (tag->code == 20) { // Lossless => RGB
548 *red = swf_tag_lossless->bitmap[0].red;
549 *green = swf_tag_lossless->bitmap[0].green;
550 *blue = swf_tag_lossless->bitmap[0].blue;
551 } else { // Lossless2 => ARGB
552 int alpha = swf_tag_lossless->bitmap2[0].alpha;
554 *red = swf_tag_lossless->bitmap2[0].red;
555 *green = swf_tag_lossless->bitmap2[0].green;
556 *blue = swf_tag_lossless->bitmap2[0].blue;
559 *red = swf_tag_lossless->bitmap2[0].red * 255 / alpha;
560 *green = swf_tag_lossless->bitmap2[0].green * 255 / alpha;
561 *blue = swf_tag_lossless->bitmap2[0].blue * 255 / alpha;
565 default: // include 4 (15bit color)
566 fprintf(stderr, "swf_tag_get_bitmap_color1stpixel: unacceptable format=(%d)\n", swf_tag_lossless->format);
573 swf_tag_get_jpeg_data(swf_tag_t *tag, unsigned long *length, int image_id, swf_tag_t *tag_jpegtables) {
574 swf_tag_info_t *tag_info = NULL;
577 fprintf(stderr, "swf_tag_get_jpeg_data: tag == NULL\n");
580 if (length == NULL) {
581 fprintf(stderr, "swf_tag_get_jpeg_data: length == NULL\n");
584 tag_info = get_swf_tag_info(tag->code);
585 if ((tag->code != 6) && (tag->code != 21) && (tag->code != 35)) {
588 if (swf_tag_create_input_detail(tag, NULL) == NULL) {
589 fprintf(stderr, "swf_tag_get_jpeg_data: swf_tag_create_input_detail failed\n");
592 if (tag_jpegtables) {
593 return swf_tag_jpeg_get_jpeg_data(tag->detail, length, image_id,
594 tag_jpegtables->data,
595 tag_jpegtables->length);
597 return swf_tag_jpeg_get_jpeg_data(tag->detail, length, image_id,
603 swf_tag_get_alpha_data(swf_tag_t *tag, unsigned long *length, int image_id) {
606 fprintf(stderr, "swf_tag_get_alpha_data: tag == NULL\n");
609 if (length == NULL) {
610 fprintf(stderr, "swf_tag_get_alpha_data: length == NULL\n");
613 if (tag->code != 35) { // ! DefineBitsJPEG3
616 if (swf_tag_get_cid(tag) != image_id) {
619 if (swf_tag_create_input_detail(tag, NULL) == NULL) {
620 fprintf(stderr, "swf_tag_get_alpha_data: swf_tag_create_input_detail failed\n");
623 return swf_tag_jpeg_get_alpha_data(tag->detail, length, image_id);
627 swf_tag_replace_jpeg_data(swf_tag_t *tag, int image_id,
628 unsigned char *jpeg_data,
629 unsigned long jpeg_data_len,
630 unsigned char *alpha_data,
631 unsigned long alpha_data_len,
632 int without_converting) {
633 swf_tag_info_t *tag_info = NULL;
634 swf_tag_detail_handler_t * detail_handler = NULL;
637 fprintf(stderr, "swf_tag_replace_jpeg_data: tag == NULL\n");
640 if (jpeg_data == NULL) {
641 fprintf(stderr, "swf_tag_replace_jpeg_data: jpeg_data == NULL\n");
644 if (! isBitmapTag(tag->code)) {
647 tag_info = get_swf_tag_info(tag->code); // Bitmap Tag
648 detail_handler = tag_info->detail_handler();
649 if (detail_handler->get_cid(tag) != image_id) {
653 if (tag->detail && (! isBitsJPEGTag(tag->code))) {
654 detail_handler->destroy(tag);
657 if (alpha_data && (alpha_data_len > 0)) {
658 tag->code = 35; // DefineBitsJPEG3
660 tag->code = 21; // DefineBitsJPEG2
663 tag_info = get_swf_tag_info(tag->code); // JPEG Tag
664 detail_handler = tag_info->detail_handler();
665 if (tag->detail == NULL) {
666 tag->detail = detail_handler->create();
669 if (without_converting) {
670 result= swf_tag_jpeg_replace_bitmap_data(tag->detail, image_id,
671 jpeg_data, jpeg_data_len,
674 result= swf_tag_jpeg_replace_jpeg_data(tag->detail, image_id,
675 jpeg_data, jpeg_data_len,
676 alpha_data, alpha_data_len, tag);
683 detail_handler->destroy(tag);
693 swf_tag_get_png_data(swf_tag_t *tag, unsigned long *length, int image_id) {
694 swf_tag_info_t *tag_info = NULL;
697 fprintf(stderr, "swf_tag_get_png_data: tag == NULL\n");
700 if (length == NULL) {
701 fprintf(stderr, "swf_tag_get_png_data: length == NULL\n");
704 tag_info = get_swf_tag_info(tag->code);
705 if ((tag->code != 20) && (tag->code != 36)) {
708 if (swf_tag_create_input_detail(tag, NULL) == NULL) {
709 fprintf(stderr, "swf_tag_get_png_data: swf_tag_create_input_detail failed\n");
712 return swf_tag_lossless_get_png_data(tag->detail, length, image_id, tag);
716 swf_tag_replace_png_data(swf_tag_t *tag, int image_id,
717 unsigned char *png_data,
718 unsigned long png_data_len, int rgb15) {
719 swf_tag_info_t *tag_info = NULL;
720 swf_tag_detail_handler_t *detail_handler = NULL;
723 fprintf(stderr, "swf_tag_replace_png_data: tag == NULL\n");
726 if (png_data == NULL) {
727 fprintf(stderr, "swf_tag_replace_png_data: png_data == NULL\n");
730 if (! isBitmapTag(tag->code)) {
733 tag_info = get_swf_tag_info(tag->code); // Bitmap Tag
734 detail_handler = tag_info->detail_handler();
735 if (detail_handler->get_cid(tag) != image_id) {
739 if (tag->detail && (! isBitsLosslessTag(tag->code))) {
740 detail_handler->destroy(tag);
743 if (tag->code == 20) {
744 tag->code = 20; // DefineBitsLossless
746 tag->code = 36; // DefineBitsLossless2
749 tag_info = get_swf_tag_info(tag->code); // Lossless Tag
750 detail_handler = tag_info->detail_handler();
751 if (tag->detail == NULL) {
752 tag->detail = detail_handler->create();
755 result= swf_tag_lossless_replace_png_data(tag->detail, image_id,
756 png_data, png_data_len,
763 detail_handler->destroy(tag);
769 #endif /* HAVE_PNG */
774 swf_tag_replace_gif_data(swf_tag_t *tag, int image_id,
775 unsigned char *gif_data,
776 unsigned long gif_data_len) {
777 swf_tag_info_t *tag_info = NULL;
778 swf_tag_detail_handler_t *detail_handler = NULL;
781 fprintf(stderr, "swf_tag_replace_gif_data: tag == NULL\n");
784 if (gif_data == NULL) {
785 fprintf(stderr, "swf_tag_replace_gif_data: gif_data == NULL\n");
788 if (! isBitmapTag(tag->code)) {
791 tag_info = get_swf_tag_info(tag->code); // Bitmap Tag
792 detail_handler = tag_info->detail_handler();
793 if (detail_handler->get_cid(tag) != image_id) {
797 if (tag->detail && (! isBitsLosslessTag(tag->code))) {
798 detail_handler->destroy(tag);
801 if (tag->code == 20) {
802 tag->code = 20; // DefineBitsLossless
804 tag->code = 36; // DefineBitsLossless2
807 tag_info = get_swf_tag_info(tag->code); // Lossless Tag
808 detail_handler = tag_info->detail_handler();
809 if (tag->detail == NULL) {
810 tag->detail = detail_handler->create();
813 result= swf_tag_lossless_replace_gif_data(tag->detail, image_id,
814 gif_data, gif_data_len, tag);
820 detail_handler->destroy(tag);
826 #endif /* HAVE_GIF */
829 swf_tag_convert_bitmap_data_tojpegtag(swf_tag_t *tag) {
832 unsigned char *bitmap_data;
833 unsigned long bitmap_data_len;
834 swf_tag_lossless_detail_t *swf_tag_lossless;
837 fprintf(stderr, "swf_object_convert_bitmap_data_tojpegtag: tag == NULL\n");
840 tag_code = tag->code;
841 if ((tag_code != 20) && (tag_code != 36)) {
844 if (tag->detail == NULL) {
845 swf_tag_lossless = (swf_tag_lossless_detail_t *) swf_tag_create_input_detail(tag, NULL);
847 swf_tag_lossless = (swf_tag_lossless_detail_t *) tag->detail;
849 image_id= swf_tag_lossless->image_id;
850 bitmap_data = swf_tag_lossless_get_png_data(swf_tag_lossless, &bitmap_data_len, image_id, tag);
851 if (bitmap_data == NULL) {
852 fprintf(stderr, "swf_object_convert_bitmap_data_tojpegtag: failed to swf_tag_get_png_data image_id=%d\n", image_id);
855 ret = swf_tag_replace_jpeg_data(tag, image_id,
856 bitmap_data, bitmap_data_len, NULL, 0, 1);
859 fprintf(stderr, "swf_object_convert_bitmap_data_tojpegtag: failed to swf_tag_replace_jpeg_data image_id=%d\n", image_id);
870 swf_tag_get_sound_data(swf_tag_t *tag, unsigned long *length, int sound_id) {
871 swf_tag_info_t *tag_info = NULL;
874 fprintf(stderr, "swf_tag_get_sound_data: tag == NULL\n");
877 if (length == NULL) {
878 fprintf(stderr, "swf_tag_get_sound_data: length == NULL\n");
881 tag_info = get_swf_tag_info(tag->code);
882 if (tag->code != 14) { // DefineSound
888 if (swf_tag_create_input_detail(tag, NULL) == NULL) {
889 fprintf(stderr, "swf_tag_get_sound_data: swf_tag_create_input_detail failed\n");
892 return swf_tag_sound_get_sound_data(tag->detail, length, sound_id);
896 swf_tag_replace_melo_data(swf_tag_t *tag, int sound_id,
897 unsigned char *melo_data,
898 unsigned long melo_data_len) {
901 fprintf(stderr, "swf_tag_replace_melo_data: tag == NULL\n");
904 if (melo_data == NULL) {
905 fprintf(stderr, "swf_tag_replace_melo_data: melo_data == NULL\n");
908 if (tag->code != 14) { // DefineSound
911 if (swf_tag_get_cid(tag) != sound_id) {
914 if (swf_tag_create_input_detail(tag, NULL) == NULL) {
915 fprintf(stderr, "swf_tag_replace_melog_data: swf_tag_create_input_detail failed\n");
918 result= swf_tag_sound_replace_melo_data(tag->detail, sound_id,
919 melo_data, melo_data_len);
929 swf_tag_get_edit_string(swf_tag_t *tag,
930 char *variable_name, int variable_name_len,
931 int *error, struct swf_object_ *swf) {
934 fprintf(stderr, "swf_tag_get_edit_string: tag == NULL\n");
937 if (variable_name == NULL) {
938 fprintf(stderr, "swf_tag_get_edit_string: variable_name == NULL\n");
941 if (tag->code != 37) { // DefineEditText
944 if (swf_tag_create_input_detail(tag, swf) == NULL) {
945 fprintf(stderr, "swf_tag_get_edit_string: swf_tag_create_input_detail failed\n");
948 return swf_tag_edit_get_string(tag->detail,
949 variable_name, variable_name_len, error);
953 swf_tag_replace_edit_string(swf_tag_t *tag,
954 char *variable_name, int variable_name_len,
955 char *initial_text, int initial_text_len,
956 struct swf_object_ *swf) {
959 fprintf(stderr, "swf_tag_replace_edit_string: tag == NULL\n");
962 if (variable_name == NULL) {
963 fprintf(stderr, "swf_tag_replace_edit_string: variable_name == NULL\n");
966 if (tag->code != 37) { // DefineEditText
969 if (swf_tag_create_input_detail(tag, swf) == NULL) {
970 fprintf(stderr, "swf_tag_replace_edit_string: swf_tag_create_input_detail failed\n");
973 result = swf_tag_edit_replace_string(tag->detail,
974 variable_name, variable_name_len,
975 initial_text, initial_text_len);
985 swf_tag_apply_shape_matrix_factor(swf_tag_t *tag, int shape_id, int bitmap_id,
986 double scale_x, double scale_y,
988 signed int trans_x, signed int trans_y,
989 struct swf_object_ *swf) {
992 fprintf(stderr, "swf_tag_apply_shape_matrix_factor: tag == NULL\n");
995 if ((tag->code != 2) && (tag->code != 22) && (tag->code !=32 )
996 && (tag->code != 46)) {
997 // ! DefineShape1,2,3, DefineMorphShape
1000 if (swf_tag_get_cid(tag) != shape_id) {
1003 if (swf_tag_create_input_detail(tag, swf) == NULL) {
1004 fprintf(stderr, "swf_tag_apply_shape_matrix_factor: swf_tag_create_input_detail failed\n");
1007 result = swf_tag_shape_apply_matrix_factor(tag->detail, shape_id,
1021 swf_tag_apply_shape_rect_factor(swf_tag_t *tag, int shape_id, int bitmap_id,
1022 double scale_x, double scale_y,
1023 signed int trans_x, signed int trans_y,
1024 struct swf_object_ *swf) {
1027 fprintf(stderr, "swf_tag_apply_shape_rect_factor: tag == NULL\n");
1030 if ((tag->code != 2) && (tag->code != 22) && (tag->code !=32 )
1031 && (tag->code != 46)) {
1032 // ! DefineShape1,2,3, DefineMorphShape
1035 if (swf_tag_get_cid(tag) != shape_id) {
1038 if (swf_tag_create_input_detail(tag, swf) == NULL) {
1039 fprintf(stderr, "swf_tag_apply_shape_rect_factor: swf_tag_create_input_detail failed\n");
1042 result = swf_tag_shape_apply_rect_factor(tag->detail, shape_id, bitmap_id,
1054 swf_tag_apply_shape_type_tilled(swf_tag_t *tag, int shape_id, int bitmap_id,
1055 struct swf_object_ *swf) {
1058 fprintf(stderr, "swf_tag_apply_shape_type_tylled: tag == NULL\n");
1061 if ((tag->code != 2) && (tag->code != 22) && (tag->code !=32 )
1062 && (tag->code != 46)) {
1063 // ! DefineShape1,2,3, DefineMorphShape
1066 if (swf_tag_get_cid(tag) != shape_id) {
1069 if (swf_tag_create_input_detail(tag, swf) == NULL) {
1070 fprintf(stderr, "swf_tag_apply_shape_rect_factor: swf_tag_create_input_detail failed\n");
1073 result = swf_tag_shape_apply_type_tilled(tag->detail, shape_id, bitmap_id);
1083 swf_tag_create_action_setvariables(y_keyvalue_t *kv) {
1085 swf_tag_t *tag = NULL;
1086 swf_tag_action_detail_t *swf_tag_action;
1087 swf_tag_info_t *tag_info;
1088 swf_tag_detail_handler_t *detail_handler;
1090 fprintf(stderr, "swf_tag_create_action_setvariables: kv == NULL\n");
1093 tag = calloc(sizeof(*tag), 1);
1094 tag->code = 12; // DoAction
1095 tag_info = get_swf_tag_info(tag->code);
1096 detail_handler = tag_info->detail_handler();
1097 tag->detail = detail_handler->create();
1098 swf_tag_action = (swf_tag_action_detail_t*) tag->detail;
1099 swf_tag_action->action_list = swf_action_list_create();
1100 if (swf_tag_action->action_list == NULL) {
1101 fprintf(stderr, "swf_tag_create_action_setvariables: swf_action_list_create failed\n");
1102 swf_tag_destroy(tag);
1105 swf_action_list_append_top(swf_tag_action->action_list, 0, NULL, 0); // End Action
1106 ret = swf_tag_action_top_append_varibles(tag, kv);
1108 swf_tag_destroy(tag);
1115 swf_tag_put_action_setvariables(swf_tag_t *tag, y_keyvalue_t *kv,
1116 struct swf_object_ *swf) {
1119 fprintf(stderr, "swf_tag_put_action_setvariables: tag == NULL\n");
1123 fprintf(stderr, "swf_tag_put_action_setvariables: kv == NULL\n");
1126 if (swf_tag_create_input_detail(tag, swf) == NULL) {
1127 fprintf(stderr, "swf_tag_put_action_setvariables: swf_tag_create_input_detail failed\n");
1130 ret = swf_tag_action_top_append_varibles(tag, kv);
1132 swf_tag_destroy(tag);
1143 swf_tag_replace_action_strings(swf_tag_t *tag, y_keyvalue_t *kv,
1144 int *modified, struct swf_object_ *swf) {
1147 fprintf(stderr, "swf_tag_replace_action_string: tag == NULL\n");
1151 fprintf(stderr, "swf_tag_replace_action_string: kv == NULL\n");
1155 fprintf(stderr, "swf_tag_replace_action_string: swf == NULL\n");
1158 if (swf_tag_create_input_detail(tag, swf) == NULL) {
1159 fprintf(stderr, "swf_tag_replace_action_string: swf_tag_create_input_detail failed\n");
1162 ret = swf_tag_action_replace_strings(tag, kv, modified);
1164 fprintf(stderr, "swf_tag_replace_action_string: swf_tag_action_replace_strings failed\n");
1170 // move tag contents.
1172 swf_tag_move(swf_tag_t *from_tag) {
1173 swf_tag_t *to_tag = NULL;
1174 if (from_tag == NULL) {
1175 fprintf(stderr, "swf_tag_move: from_tag == NULL\n");
1178 to_tag = calloc(sizeof(*to_tag), 1);
1179 to_tag->code = from_tag->code;
1180 to_tag->length = from_tag->length;
1181 to_tag->length_longformat = from_tag->length_longformat;
1182 to_tag->data = from_tag->data;
1183 from_tag->data = NULL;
1184 from_tag->length = 0;
1185 to_tag->detail = from_tag->detail;
1186 from_tag->detail = NULL;
1191 * return tag CID that all condition match
1195 swf_tag_search_cid_by_bitmap_condition(swf_tag_t *tag,
1196 int width, int height,
1197 int red, int green, int blue) {
1199 if ((width > 0) || (height > 0)) {
1201 if (swf_tag_get_bitmap_size(tag, &w, &h)) {
1204 if ((width > 0) && (width != w)) {
1207 if ((height > 0) && (height != h)) {
1210 cid = swf_tag_get_cid(tag);
1212 if (isBitsLosslessTag(tag->code) &&
1213 ( (red >= 0) || (green >= 0) || (blue >= 0) )) {
1215 swf_tag_get_bitmap_color1stpixel(tag, &r, &g, &b);
1217 int red_diff = red - r;
1218 if ((red_diff < -10) || (10 < red_diff)) {
1223 int green_diff = green - g;
1224 if ((green_diff < -10) || (10 < green_diff)) {
1229 int blue_diff = blue - b;
1230 if ((blue_diff < -10) || (10 < blue_diff)) {
1234 cid = swf_tag_get_cid(tag);