From: yoya Date: Thu, 3 Mar 2011 14:26:29 +0000 (+0000) Subject: - setActionVariables の度に DoAction を増やすのをやめて、既にある場合は変数代入イメージを混ぜるように改造。 X-Git-Tag: v0_60~380 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=7688294f9631def9ada534c5c98809cd6fbb608c;p=swfed%2Fswfed.git - setActionVariables の度に DoAction を増やすのをやめて、既にある場合は変数代入イメージを混ぜるように改造。 - 不要な変数の削除やエラー文言の修正。 git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/swfed/trunk@374 7c90b180-03d5-4157-b861-58a559ae9d1e --- diff --git a/src/swf_object.c b/src/swf_object.c index 537f2b6..0845d34 100644 --- a/src/swf_object.c +++ b/src/swf_object.c @@ -10,6 +10,7 @@ #include #include "bitstream.h" #include "swf_define.h" +#include "swf_tag.h" #include "swf_tag_action.h" #include "swf_tag_jpeg.h" #include "swf_tag_lossless.h" @@ -266,7 +267,6 @@ swf_object_get_tagcontents_bycid(swf_object_t *swf, int cid, } if (tag) { if (tag->data) { - unsigned char *data; *length = tag->length - 2; return tag->data + 2; } @@ -329,7 +329,7 @@ swf_object_get_shapedata(swf_object_t *swf, int cid, unsigned long *length) { } if (tag) { if (! isShapeTag(tag->tag)) { - fprintf(stderr, ""); + fprintf(stderr, "swf_object_get_shapedata: not isShapeTag(%d)\n", tag->tag); return NULL; } if (tag->detail) { @@ -344,7 +344,6 @@ swf_object_get_shapedata(swf_object_t *swf, int cid, unsigned long *length) { bitstream_close(bs); } if (tag->data) { - unsigned char *data; *length = tag->length - 2; return tag->data + 2; } @@ -789,41 +788,67 @@ swf_object_get_actiondata(swf_object_t *swf, unsigned long *length, int tag_seqn int swf_object_insert_action_setvariables(swf_object_t *swf, y_keyvalue_t *kv) { - swf_tag_t *tag, *prev_tag = NULL, *next_tag = NULL; + swf_tag_t *tag, *prev = NULL; + swf_tag_t *action_tag = NULL, *prev_tag = NULL, *next_tag = NULL; + int ret, done = 0; if (swf == NULL) { fprintf(stderr, "swf_object_insert_action_setvariables: swf == NULL\n"); return 1; // NG } for (tag=swf->tag ; tag ; tag=tag->next) { switch (tag->tag) { + case 1: // ShowFrame + if (next_tag == NULL) { + prev_tag = prev; + next_tag = tag; + } + done = 1; + break; + case 12: // DoAction + action_tag = tag; + done = 1; + break; case 69: // FileAttributs case 9: // SetBackgroundColor case 24: // Protect break; default: - next_tag = tag; + if (next_tag == NULL) { + prev_tag = prev; + next_tag = tag; + } break; } - if (next_tag) { // found + if (done) { break; } - prev_tag = tag; - } - if (next_tag == NULL) { - fprintf(stderr, "swf_object_insert_action_setvariables: next_tag == NULL\n"); - return 1; + prev = tag; } - tag = swf_tag_create_action_setvariables(kv); - if (tag == NULL) { - fprintf(stderr, "swf_object_insert_action_setvariables: swf_tag_create_action_setvariables failed\n"); - return 1;// NG + if ((action_tag == NULL) && (next_tag == NULL)) { + fprintf(stderr, "swf_object_insert_action_setvariables: action_tag == NULL && next_tag == NULL\n"); + return 1; // NG } - if (prev_tag == NULL) { - swf->tag = tag; - tag->next = next_tag; - } else { - prev_tag->next = tag; - tag->next = next_tag; + if (action_tag) { // DoAction の頭に変数代入イメージを挿入 + ret = swf_tag_put_action_setvariables(action_tag, + kv, + swf); + if (ret) { + fprintf(stderr, "swf_object_insert_action_setvariables: swf_tag_put_action_setvariables failed\n"); + return 1; // NG + } + } else { // 新規に DoAction を挿入 + tag = swf_tag_create_action_setvariables(kv); + if (tag == NULL) { + fprintf(stderr, "swf_object_insert_action_setvariables: swf_tag_create_action_setvariables failed\n"); + return 1; // NG + } + if (prev_tag == NULL) { + swf->tag = tag; + tag->next = next_tag; + } else { + prev_tag->next = tag; + tag->next = next_tag; + } } return 0; // SUCCESS } diff --git a/src/swf_tag.c b/src/swf_tag.c index 8a294a1..e2cfe29 100644 --- a/src/swf_tag.c +++ b/src/swf_tag.c @@ -813,7 +813,27 @@ swf_tag_create_action_setvariables(y_keyvalue_t *kv) { ret = swf_tag_action_create_setvaribles(tag, kv); if (ret) { swf_tag_destroy(tag); - return 0; + return NULL; } return tag; } + +int +swf_tag_put_action_setvariables(swf_tag_t *tag, y_keyvalue_t *kv, + struct swf_object_ *swf) { + int ret; + if (! tag->detail) { + swf_tag_create_input_detail(tag, swf); + } + ret = swf_tag_action_put_setvaribles(tag, kv); + if (ret) { + swf_tag_destroy(tag); + return 1; // NG + } + if (tag->data) { + free(tag->data); + tag->data = NULL; + } + return 0; +} + diff --git a/src/swf_tag.h b/src/swf_tag.h index 38c0af3..f582a52 100644 --- a/src/swf_tag.h +++ b/src/swf_tag.h @@ -106,5 +106,8 @@ extern int swf_tag_apply_shape_type_tilled(swf_tag_t *tag, int shape_id, struct swf_object_ *swf); extern swf_tag_t *swf_tag_create_action_setvariables(y_keyvalue_t *kv); +extern int swf_tag_put_action_setvariables(swf_tag_t *tag, + y_keyvalue_t *kv, + struct swf_object_ *swf); #endif /* __SWF_TAG_H__ */ diff --git a/src/swf_tag_action.c b/src/swf_tag_action.c index d3f9d46..fe7ab16 100644 --- a/src/swf_tag_action.c +++ b/src/swf_tag_action.c @@ -145,6 +145,41 @@ swf_tag_action_create_setvaribles(swf_tag_t *tag, y_keyvalue_t *kv) { bitstream_putbyte(bs, 0x96); // Push Data bitstream_putbytesLE(bs, key_len + 2 , 2); bitstream_putbyte(bs, 0); + bitstream_putstring(bs, (unsigned char*) key, key_len); + bitstream_putbyte(bs, 0); + bitstream_putbyte(bs, 0x96); // Push Data + bitstream_putbytesLE(bs, value_len + 2 , 2); + bitstream_putbyte(bs, 0); + bitstream_putstring(bs, (unsigned char*) value, value_len); + bitstream_putbyte(bs, 0); + bitstream_putbyte(bs, 0x1d); // Set Variable + } + bitstream_putbyte(bs, 0); // End + if (swf_tag_action->action_record) { + free(swf_tag_action->action_record); + } + swf_tag_action->action_record = bitstream_steal(bs, &data_len); + swf_tag_action->action_record_len = data_len; + bitstream_close(bs); + return 0; +} + +int +swf_tag_action_put_setvaribles(swf_tag_t *tag, y_keyvalue_t *kv) { + bitstream_t *bs, *bs2; + char *key, *value; + int key_len, value_len; + unsigned long data_len, append_data_len; + swf_tag_action_detail_t *swf_tag_action = (swf_tag_action_detail_t *) tag->detail; + swf_tag_action->action_sprite = 0; + bs = bitstream_open(); + y_keyvalue_rewind(kv); + while (y_keyvalue_next(kv)) { + key = y_keyvalue_get_currentkey(kv, &key_len); + value = y_keyvalue_get_currentvalue(kv, &value_len); + bitstream_putbyte(bs, 0x96); // Push Data + bitstream_putbytesLE(bs, key_len + 2 , 2); + bitstream_putbyte(bs, 0); bitstream_putstring(bs, key, key_len); bitstream_putbyte(bs, 0); bitstream_putbyte(bs, 0x96); // Push Data @@ -154,7 +189,10 @@ swf_tag_action_create_setvaribles(swf_tag_t *tag, y_keyvalue_t *kv) { bitstream_putbyte(bs, 0); bitstream_putbyte(bs, 0x1d); // Set Variable } - bitstream_putbyte(bs, 0); // End + if (swf_tag_action->action_record) { + bitstream_putstring(bs, swf_tag_action->action_record, swf_tag_action->action_record_len); + free(swf_tag_action->action_record); + } swf_tag_action->action_record = bitstream_steal(bs, &data_len); swf_tag_action->action_record_len = data_len; bitstream_close(bs); diff --git a/src/swf_tag_action.h b/src/swf_tag_action.h index 32be3fd..b157442 100644 --- a/src/swf_tag_action.h +++ b/src/swf_tag_action.h @@ -31,5 +31,6 @@ extern void swf_tag_action_print_detail(swf_tag_t *tag, extern void swf_tag_action_destroy_detail(swf_tag_t *tag); extern int swf_tag_action_create_setvaribles(swf_tag_t *tag, y_keyvalue_t *kv); +extern int swf_tag_action_put_setvaribles(swf_tag_t *tag, y_keyvalue_t *kv); #endif /* __SWF_TAG_ACTION__H__ */