[Swfed-svn] swfed-svn [404] - depth の renumbering 処理を追加

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2011年 3月 10日 (木) 02:18:55 JST


Revision: 404
          http://sourceforge.jp/projects/swfed/svn/view?view=rev&revision=404
Author:   yoya
Date:     2011-03-10 02:18:55 +0900 (Thu, 10 Mar 2011)

Log Message:
-----------
- depth の renumbering 処理を追加
- sprite 内の cid renumbering 処理を追加したがコメントアウト (問題あるので)

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


-------------- next part --------------
Modified: trunk/src/swf_object.c
===================================================================
--- trunk/src/swf_object.c	2011-03-09 16:42:53 UTC (rev 403)
+++ trunk/src/swf_object.c	2011-03-09 17:18:55 UTC (rev 404)
@@ -856,6 +856,84 @@
     return 0; // SUCCESS
 }
 
+/*
+ * 利用している全 depth 値を取得する。
+ */
+static void
+trans_table_reserve_place_depth_recursive(swf_tag_t *tag, trans_table_t *depth_trans_table) {
+    for (; tag ; tag=tag->next) {
+        int tag_no = tag->tag;
+        if (isPlaceTag(tag_no)) {
+            swf_tag_place_detail_t *tag_place;
+            if (tag->detail == NULL) {
+                swf_tag_create_input_detail(tag, NULL);
+            }
+            tag_place = tag->detail;
+            trans_table_set(depth_trans_table, tag_place->depth, TRANS_TABLE_RESERVE_ID);
+        } else if (isSpriteTag(tag_no)) {
+            swf_tag_sprite_detail_t *tag_sprite;
+            if (tag->detail == NULL) {
+                swf_tag_create_input_detail(tag, NULL);
+            }
+            tag_sprite = tag->detail;
+            trans_table_reserve_place_depth_recursive(tag_sprite->tag, depth_trans_table);
+        }
+    }
+}
+
+/*
+ * depth 値を入れ替える
+ */
+static void
+trans_table_replace_place_depth_recursive(swf_tag_t *tag, trans_table_t *depth_trans_table) {
+    for ( ; tag ; tag=tag->next) {
+        int tag_no = tag->tag;
+        if (isPlaceTag(tag_no)) {
+            swf_tag_place_detail_t *tag_place;
+            int depth;
+            if (tag->detail == NULL) {
+                swf_tag_create_input_detail(tag, NULL);
+            }
+            tag_place = tag->detail;
+            depth = tag_place->depth;
+            tag_place = tag->detail;
+        } else if (isSpriteTag(tag_no)) {
+            swf_tag_sprite_detail_t *tag_sprite;
+            if (tag->detail == NULL) {
+                swf_tag_create_input_detail(tag, NULL);
+            }
+            tag_sprite = tag->detail;
+            trans_table_reserve_place_depth_recursive(tag_sprite->tag, depth_trans_table);
+        }
+    }
+}
+
+/*
+ * 参照側の cid 値を入れ替える // 未使用
+ */
+static void
+trans_table_replace_refcid_recursive(swf_tag_t *tag, trans_table_t *cid_trans_table) {
+    for ( ; tag ; tag=tag->next) {
+        int tag_no = tag->tag;
+        if (isSpriteTag(tag_no)) {
+            swf_tag_sprite_detail_t *tag_sprite;
+            if (tag->detail == NULL) {
+                swf_tag_create_input_detail(tag, NULL);
+            }
+            tag_sprite = tag->detail;
+            trans_table_replace_refcid_recursive(tag_sprite->tag, cid_trans_table);
+        } else if (isPlaceTag(tag_no)) {
+            int refcid = swf_tag_get_refcid(tag);
+            if (refcid > 0) {
+                int to_refcid = trans_table_get(cid_trans_table, refcid);
+                if (refcid != to_refcid) {
+                    swf_tag_replace_refcid(tag, to_refcid);
+                }
+            }
+        }
+    }
+}
+
 int
 swf_object_replace_movieclip(swf_object_t *swf,
                              unsigned char *instance_name, int instance_name_len,
@@ -869,6 +947,7 @@
     swf_tag_info_t *tag_info = NULL;
     swf_tag_detail_handler_t *detail_handler = NULL;
     trans_table_t *cid_trans_table;
+    trans_table_t *depth_trans_table;
     if (swf == NULL) {
         fprintf(stderr, "swf_object_replace_movieclip: swf == NULL\n");
         return 1;
@@ -907,8 +986,9 @@
         fprintf(stderr, "swf_object_replace_movieclip: swf_object_input (swf_data_len=%d) failed\n", swf_data_len);
         return ret;
     }
-    // 既存の CID をチェックする
+    // 既存の CID
     cid_trans_table = trans_table_open();
+    depth_trans_table = trans_table_open();
     for (tag=swf->tag ; tag ; tag=tag->next) {
         int cid;
         cid = swf_tag_get_cid(tag);
@@ -916,6 +996,9 @@
             trans_table_set(cid_trans_table, cid, TRANS_TABLE_RESERVE_ID);
         }
     }
+    // 既存の DEPTH をチェックする
+    trans_table_reserve_place_depth_recursive(swf->tag, depth_trans_table);
+    
     // Sprite タグの中を綺麗にする
     tag_info = get_swf_tag_info(sprite_tag->tag);
     detail_handler = tag_info->detail_handler();
@@ -996,6 +1079,10 @@
                       int to_bitmap_id = trans_table_get(cid_trans_table, bitmap_id);
                       swf_tag_shape_bitmap_replace_refcid(tag, to_bitmap_id);
                   }
+              } else if (isSpriteTag(tag_no)) {
+                  swf_tag_sprite_detail_t *s = sprite_tag->detail;
+                  // 未使用
+                  // trans_table_replace_refcid_recursive(s->tag, cid_trans_table);
               }
               // TODO depth が被らないように。
               ;
@@ -1016,18 +1103,21 @@
           case 43: // FrameLabel
           case 59: // DoInitAction
             // Sprite の中に挿入
-            // TODO: Character ID の変更に追随
+            // Character ID の変更に追随
               switch (tag_no) {
                 int refcid, to_refcid;
+                case 4:  // PlaceObject
                 case 26: // PlaceObject2
                   refcid = swf_tag_get_refcid(tag);
-                  to_refcid = trans_table_get(cid_trans_table, refcid);
-                  if (refcid != to_refcid) {
-                      swf_tag_replace_refcid(tag, to_refcid);
+                  if (refcid > 0) {
+                      to_refcid = trans_table_get(cid_trans_table, refcid);
+                      if (refcid != to_refcid) {
+                          swf_tag_replace_refcid(tag, to_refcid);
+                      }
                   }
                   break;
               }
-            // TODO: 変数スコープ
+              // Sprite への tag 埋め込み
               if (sprite_tag_tail == NULL) {
                   swf_tag_sprite->tag = swf_tag_move(tag);
                   sprite_tag_tail = swf_tag_sprite->tag;
@@ -1042,8 +1132,10 @@
             break;
         }
     }
+    trans_table_replace_place_depth_recursive(swf_tag_sprite->tag, depth_trans_table);
     swf_object_close(swf4sprite);
     trans_table_close(cid_trans_table);
+    trans_table_close(depth_trans_table);
     return 0;
 }
 



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