OSDN Git Service

- setActionVariables の度に DoAction を増やすのをやめて、既にある場合は変数代入イメージを混ぜるように改造。
authoryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Thu, 3 Mar 2011 14:26:29 +0000 (14:26 +0000)
committeryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Thu, 3 Mar 2011 14:26:29 +0000 (14:26 +0000)
- 不要な変数の削除やエラー文言の修正。

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/swfed/trunk@374 7c90b180-03d5-4157-b861-58a559ae9d1e

src/swf_object.c
src/swf_tag.c
src/swf_tag.h
src/swf_tag_action.c
src/swf_tag_action.h

index 537f2b6..0845d34 100644 (file)
@@ -10,6 +10,7 @@
 #include <zlib.h>
 #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
 }
index 8a294a1..e2cfe29 100644 (file)
@@ -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;
+}
+
index 38c0af3..f582a52 100644 (file)
@@ -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__ */
index d3f9d46..fe7ab16 100644 (file)
@@ -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);
index 32be3fd..b157442 100644 (file)
@@ -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__ */