OSDN Git Service

removeTag メソッドの Sprite 中 tag 対応 (不具合あり)
authoryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Tue, 5 Apr 2011 13:18:13 +0000 (13:18 +0000)
committeryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Tue, 5 Apr 2011 13:18:13 +0000 (13:18 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/swfed/trunk@520 7c90b180-03d5-4157-b861-58a559ae9d1e

sample/swfremovetag.php [new file with mode: 0644]
src/php_swfed.c
src/swf_object.c
src/swf_object.h
src/swf_tag_sprite.c

diff --git a/sample/swfremovetag.php b/sample/swfremovetag.php
new file mode 100644 (file)
index 0000000..7ef0aa5
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+
+if (($argc != 3) && ($argc != 4)) {
+    fprintf(STDERR, "Usage: swfremovetag <swf_file> <tag_seqno> [<tag_seqno_in_sprite>]\n");
+    exit(1);
+}
+
+$swf_filename = $argv[1];
+
+$swfdata = file_get_contents($swf_filename);
+$obj = new SWFEditor();
+
+if ($obj->input($swfdata) == false) {
+    fprintf(STDERR, "input failed\n");
+    exit(1);
+}
+$tag_seqno = $argv[2];
+
+if ($argc == 3) {
+    if ($obj->removeTag($tag_seqno) == false) {
+        fprintf(STDERR, "removeTag($tag_seqno) failed\n");
+        exit(1);
+    }
+} else {
+    $tag_seqno_in_sprite = $argv[3];
+    if ($obj->removeTag($tag_seqno, $tag_seqno_in_sprite) == false) {
+        fprintf(STDERR, "removeTag($tag_seqno, $tag_seqno_in_sprite) failed\n");
+        exit(1);
+    }
+}
+
+echo $obj->output();
index 4549fad..992eff7 100644 (file)
@@ -714,13 +714,24 @@ PHP_METHOD(swfed, replaceTagContentsByCID) {
 
 PHP_METHOD(swfed, removeTag) {
     long tag_seqno = 0;
+    long tag_seqno_in_sprite = -1;
     swf_object_t *swf = NULL;
     int ret;
-    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &tag_seqno) == FAILURE) {
-        RETURN_FALSE;
+
+    switch (ZEND_NUM_ARGS()) {
+      case 1:
+        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &tag_seqno) == FAILURE) {
+            RETURN_FALSE;
+        }
+        break;
+      case 2:
+        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &tag_seqno, &tag_seqno_in_sprite) == FAILURE) {
+            RETURN_FALSE;
+        }
+        break;
     }
     swf = get_swf_object(getThis() TSRMLS_CC);
-    ret = swf_object_remove_tag(swf, tag_seqno);
+    ret = swf_object_remove_tag(swf, tag_seqno, tag_seqno_in_sprite);
     if (ret) {
         RETURN_FALSE;
     }
index e99ca20..62f859d 100644 (file)
@@ -23,6 +23,7 @@
 #include "trans_table.h"
 
 static int _swf_object_remove_tag(swf_object_t *swf, swf_tag_t *tag);
+static int _swf_object_remove_tag_in_sprite(swf_tag_sprite_detail_t *sprite, swf_tag_t *tag);
 static int _swf_object_replace_tag(swf_object_t *swf,
                                    swf_tag_t *old_tag, swf_tag_t *new_tag);
 
@@ -426,12 +427,31 @@ swf_object_replace_tagcontents_bycid(swf_object_t *swf, int cid,
 }
 
 int
-swf_object_remove_tag(swf_object_t *swf, int tag_seqno) {
+swf_object_remove_tag(swf_object_t *swf, int tag_seqno,
+                      int tag_seqno_in_sprite) {
     swf_tag_t *tag;
     int ret = 1;
+
     tag = swf_object_search_tag_byseqno(swf, tag_seqno);
     if (tag) {
-        ret = _swf_object_remove_tag(swf, tag);
+        if (tag_seqno_in_sprite >= 0) {
+            if (isSpriteTag(tag->tag)) {
+                swf_tag_sprite_detail_t   *tag_sprite;
+                swf_tag_t *tag_in_sprite;
+                tag_sprite = swf_tag_create_input_detail(tag, swf);
+
+                tag_in_sprite = swf_object_search_tag_in_sprite_byseqno(tag_sprite, tag_seqno_in_sprite);
+                if (tag_in_sprite) {
+                    ret = _swf_object_remove_tag_in_sprite(tag_sprite, tag_in_sprite);
+                } else {
+                    ;
+                }
+            } else {
+                fprintf(stderr, "swf_object_remove_tag: not SpriteTag seqno=%d\n", tag_seqno);
+            }
+        } else {
+            ret = _swf_object_remove_tag(swf, tag);
+        }
     }
     return ret;
 }
@@ -459,6 +479,33 @@ _swf_object_remove_tag(swf_object_t *swf, swf_tag_t *tag) {
     return 0;
 }
 
+static int
+_swf_object_remove_tag_in_sprite(swf_tag_sprite_detail_t *sprite_tag, swf_tag_t *tag) {
+
+    fprintf(stderr, "_swf_object_remove_tag_in_sprite: sprite_id=%d tag->prev=%p tag->next=%p\n", sprite_tag->sprite_id, tag->prev, tag->next);
+    if (tag->prev) {
+        if (tag->next) { // prev:O next:O
+            tag->prev->next = tag->next;
+            tag->next->prev = tag->prev;
+        } else {         // prev:O next:X
+            tag->prev->next = NULL;
+            // swf->tag_tail = tag->prev;
+        }
+    } else {
+        if (tag->next) { // prev:X next:O
+            tag->next->prev = NULL;
+            sprite_tag->tag = tag->next;
+            // swf->tag_heat = tag->next;
+        } else {         // prev:X next:X
+            sprite_tag->tag = NULL;
+            // swf->tag_head = NULL;
+            // swf->tag_tail = NULL;
+        }
+    }
+    swf_tag_destroy(tag);
+    return 0;
+}
+
 /* --- */
 
 unsigned char *
@@ -549,6 +596,24 @@ swf_object_search_tag_byseqno(swf_object_t *swf, int tag_seqno) {
 }
 
 swf_tag_t *
+swf_object_search_tag_in_sprite_byseqno(swf_tag_sprite_detail_t *sprite, int tag_seqno) {
+    int i;
+    swf_tag_t *tag;
+    if (sprite == NULL) {
+        fprintf(stderr, "swf_object_search_tag_by_seqno: sprite == NULL\n");
+        return NULL;
+    }
+    i=0;
+    for (tag = sprite->tag ; tag ; tag = tag->next) {
+        if (i >= tag_seqno) {
+            break;
+        }
+        i++;
+    }
+    return tag;
+}
+
+swf_tag_t *
 swf_object_search_tag_bycid(swf_object_t *swf, int cid) {
     swf_tag_t *tag;
     if (swf == NULL) {
index cdd3b59..729b096 100644 (file)
@@ -56,12 +56,15 @@ extern unsigned char *swf_object_get_tagcontents_bycid(swf_object_t *swf,
 extern int swf_object_replace_tagcontents_bycid(swf_object_t *swf, int cid,
                                                 unsigned char *data,
                                                 unsigned long length);
-extern int swf_object_remove_tag(swf_object_t *swf, int tag_seqno);
+extern int swf_object_remove_tag(swf_object_t *swf, int tag_seqno,
+                                 int tag_seqno_in_sprite);
 
 /* --- */
 
 extern swf_tag_t *swf_object_search_tag_byseqno(swf_object_t *swf,
                                                int tag_seqno);
+extern swf_tag_t *swf_object_search_tag_in_sprite_byseqno(swf_tag_sprite_detail_t *sprite, int tag_seqno);
+
 extern swf_tag_t *swf_object_search_tag_bycid(swf_object_t *swf,
                                                int cid);
 extern swf_tag_t *swf_object_search_shape_tag(swf_object_t *swf,
index d489ad3..9a4b64d 100644 (file)
@@ -68,12 +68,11 @@ swf_tag_sprite_input_detail(swf_tag_t *tag, struct swf_object_ *swf) {
         if (prev_tag == NULL) {
             swf_tag_sprite->tag = tag_in_sprite;
             tag_in_sprite->prev = NULL;
-            tag_in_sprite->next = NULL;
         } else {
             prev_tag->next = tag_in_sprite;
             tag_in_sprite->prev = prev_tag;
-            tag_in_sprite->next = NULL;
         }
+        tag_in_sprite->next = NULL;
         prev_tag = tag_in_sprite;
     }
     bitstream_close(bs);