--- /dev/null
+<?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();
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;
}
#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);
}
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;
}
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 *
}
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) {
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,