[Swfed-svn] swfed-svn [383] 渡された SWF 中のコンテンツタグを対象 Sprite の直前に、制御系タグを Sprite の中に展開する処理を実装

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2011年 3月 7日 (月) 00:08:18 JST


Revision: 383
          http://sourceforge.jp/projects/swfed/svn/view?view=rev&revision=383
Author:   yoya
Date:     2011-03-07 00:08:18 +0900 (Mon, 07 Mar 2011)

Log Message:
-----------
渡された SWF 中のコンテンツタグを対象 Sprite の直前に、制御系タグを Sprite の中に展開する処理を実装

Modified Paths:
--------------
    trunk/src/swf_object.c


-------------- next part --------------
Modified: trunk/src/swf_object.c
===================================================================
--- trunk/src/swf_object.c	2011-03-06 14:28:15 UTC (rev 382)
+++ trunk/src/swf_object.c	2011-03-06 15:08:18 UTC (rev 383)
@@ -16,6 +16,7 @@
 #include "swf_tag_lossless.h"
 #include "swf_tag_shape.h"
 #include "swf_tag_place.h"
+#include "swf_tag_sprite.h"
 #include "swf_action.h"
 #include "swf_object.h"
 #include "bitmap_util.h"
@@ -859,7 +860,10 @@
                              unsigned char *instance_name, int instance_name_len,
                              unsigned char *swf_data, int swf_data_len) {
     int cid = 0, ret;
-    swf_tag_t *tag, *sprite_tag = NULL, *prev_sprite_tag, *next_sprite_tag;
+    swf_tag_t *tag;
+    swf_tag_t *sprite_tag = NULL, *prev_sprite_tag = NULL;
+    swf_tag_t *sprite_tag_tail; // sprite の中の最後の tag
+    swf_tag_sprite_detail_t *swf_tag_sprite;
     if (swf == NULL) {
         fprintf(stderr, "swf_object_replace_movieclip: swf == NULL\n");
         return 1;
@@ -880,7 +884,6 @@
         if (isSpriteTag(tag->tag)) {
             if (swf_tag_identity(tag, cid) == 0) {
                 sprite_tag = tag;
-                next_sprite_tag = tag->next;
                 break;
             }
             prev_sprite_tag = tag;
@@ -893,10 +896,25 @@
     swf_object_t *swf4sprite = swf_object_open();
     ret = swf_object_input(swf4sprite, swf_data, swf_data_len);
     if (ret) {
-        fprintf(stderr, "swf_object_replace_movieclip: swf_object_input failed");
+        fprintf(stderr, "swf_object_replace_movieclip: swf_object_input (swf_data_len=%d) failed\n", swf_data_len);
         return ret;
     }
-
+    swf_tag_sprite = tag->detail;
+    // Sprite タグの中を綺麗にする
+    if (sprite_tag->tag) {
+        swf_tag_t *next_tag;
+        for (tag=swf_tag_sprite->tag ; tag ; tag=next_tag) {
+            next_tag = tag->next;
+            swf_tag_destroy(tag);
+        }
+        free(swf);
+        swf_tag_sprite->tag = NULL;
+    }
+    swf_tag_sprite->frame_count = 0;
+    free(sprite_tag->data);
+    sprite_tag->data = NULL;
+    sprite_tag->length = 0;
+    
     // Sprite 中のタグを削除
     for (tag=swf4sprite->tag ; tag ; tag=tag->next) {
         int tag_no = tag->tag;
@@ -943,7 +961,9 @@
           case 88: // DefineFontName
             // Sprite の前に CID が被らないように展開
             // TODO depth が被らないように。
-              ;
+              prev_sprite_tag->next = swf_tag_move(tag);
+              prev_sprite_tag = prev_sprite_tag->next;
+              prev_sprite_tag->next = sprite_tag;
             break;
             // Control Tag
           case 1: // ShowFrame
@@ -959,6 +979,15 @@
             // TODO: Character ID の変更に追随
             // TODO: 変数スコープ
               ;
+              if (sprite_tag_tail == NULL) {
+                  sprite_tag_tail = swf_tag_sprite->tag = swf_tag_move(tag);
+              } else {
+                  sprite_tag_tail->next = swf_tag_move(tag);
+                  sprite_tag_tail = sprite_tag_tail->next;
+              }
+              if (tag_no == 1) { // ShowFrame
+                  swf_tag_sprite->frame_count  += 1;
+              }
             break;
         }
     }



Swfed-svn メーリングリストの案内
Back to archive index