2 +----------------------------------------------------------------------+
3 | Author: yoya@awm.jp |
4 +----------------------------------------------------------------------+
10 #include "swf_tag_sprite.h"
11 #include "swf_object.h"
13 swf_tag_detail_handler_t sprite_detail_handler;
15 swf_tag_detail_handler_t *
16 swf_tag_sprite_detail_handler(void) {
17 sprite_detail_handler.create = swf_tag_sprite_create_detail;
18 sprite_detail_handler.input = swf_tag_sprite_input_detail;
19 sprite_detail_handler.get_cid = swf_tag_sprite_get_cid_detail;
20 sprite_detail_handler.replace_cid = swf_tag_sprite_replace_cid_detail;
21 sprite_detail_handler.output = swf_tag_sprite_output_detail;
22 sprite_detail_handler.print = swf_tag_sprite_print_detail;
23 sprite_detail_handler.destroy = swf_tag_sprite_destroy_detail;
24 return &sprite_detail_handler;
28 swf_tag_sprite_create_detail(void) {
29 swf_tag_sprite_detail_t *swf_tag_sprite;
30 swf_tag_sprite = calloc(sizeof(*swf_tag_sprite), 1);
31 if (swf_tag_sprite == NULL) {
32 fprintf(stderr, "ERROR: swf_tag_sprite_create_detail: can't calloc\n");
35 return swf_tag_sprite;
39 swf_tag_sprite_input_detail(swf_tag_t *tag, struct swf_object_ *swf) {
40 swf_tag_sprite_detail_t *swf_tag_sprite = tag->detail;
41 unsigned char *data = tag->data;
42 unsigned long length = tag->length;
44 swf_tag_t *tag_in_sprite, *prev_tag;
46 if (swf_tag_sprite == NULL) {
47 fprintf(stderr, "ERROR: swf_tag_sprite_input_detail: swf_tag_sprite == NULL\n");
50 bs = bitstream_open();
51 bitstream_input(bs, data, length);
52 swf_tag_sprite->sprite_id = bitstream_getbytesLE(bs, 2);
53 swf_tag_sprite->frame_count = bitstream_getbytesLE(bs, 2);
59 pos = bitstream_getbytepos(bs);
60 if ((pos == -1) || ((long) length <= pos)) {
63 tag_in_sprite = swf_tag_create(bs);
64 if (tag_in_sprite == NULL) {
65 fprintf(stderr, "swf_object_input: swf_tag_create failed\n");
68 if (prev_tag == NULL) {
69 swf_tag_sprite->tag = tag_in_sprite;
70 tag_in_sprite->prev = NULL;
72 prev_tag->next = tag_in_sprite;
73 tag_in_sprite->prev = prev_tag;
75 tag_in_sprite->next = NULL;
76 prev_tag = tag_in_sprite;
82 int swf_tag_sprite_get_cid_detail(swf_tag_t *tag) {
83 unsigned char *data = tag->data;
85 swf_tag_sprite_detail_t *swf_tag_sprite = (swf_tag_sprite_detail_t *) tag->detail;
86 return swf_tag_sprite->sprite_id;
89 fprintf(stderr, "swf_tag_sprite_get_cid_detail: data == NULL\n");
92 return GetUShortLE(data); // sprite_id;
95 int swf_tag_sprite_replace_cid_detail(swf_tag_t *tag, int id) {
96 unsigned char *data = tag->data;
98 swf_tag_sprite_detail_t *swf_tag_sprite = (swf_tag_sprite_detail_t *) tag->detail;
99 swf_tag_sprite->sprite_id = id;
102 PutUShortLE(data, id);
104 return 0; // always 0
108 swf_tag_sprite_output_detail(swf_tag_t *tag, unsigned long *length,
109 struct swf_object_ *swf) {
110 swf_tag_sprite_detail_t *swf_tag_sprite = (swf_tag_sprite_detail_t *) tag->detail;
115 bs = bitstream_open();
116 bitstream_putbytesLE(bs, swf_tag_sprite->sprite_id, 2);
117 bitstream_putbytesLE(bs, swf_tag_sprite->frame_count, 2);
118 for (_tag=swf_tag_sprite->tag ; _tag ; _tag=_tag->next) {
119 swf_tag_build(bs, _tag, swf);
121 data = bitstream_steal(bs, length);
127 swf_tag_sprite_print_detail(swf_tag_t *tag,
128 struct swf_object_ *swf,
130 swf_tag_sprite_detail_t *swf_tag_sprite = (swf_tag_sprite_detail_t *) tag->detail;
133 print_indent(indent_depth);
134 printf("sprite_id=%d\n", swf_tag_sprite->sprite_id);
135 print_indent(indent_depth);
136 printf("frame_count=%d\n", swf_tag_sprite->frame_count);
137 _tag = swf_tag_sprite->tag;
138 for (i=0 ; _tag ; i++) {
139 print_indent(indent_depth);
141 swf_tag_print(_tag, swf, indent_depth + 1);
142 if (_tag->code == 0) { // END Tag
151 swf_tag_sprite_destroy_detail(swf_tag_t *tag) {
152 swf_tag_sprite_detail_t *swf_tag_sprite = (swf_tag_sprite_detail_t *) tag->detail;
153 if (swf_tag_sprite) {
154 swf_tag_t *t, *next_tag;
155 for (t = swf_tag_sprite->tag ; t ; t = next_tag) {
159 free(swf_tag_sprite);