Generated from configure.in
[swftools.git] / lib / modules / swftools.c
index d6e93de..f3a4b94 100644 (file)
@@ -116,8 +116,10 @@ U16 swf_GetDefineID(TAG * t)
     case ST_DEFINESPRITE:
     case ST_DEFINEMOVIE:
     case ST_DEFINEVIDEOSTREAM:
+    case ST_GLYPHNAMES: //pseudodefine
     case ST_VIDEOFRAME: //pseudodefine
     case ST_NAMECHARACTER: //pseudodefine
+    case ST_DOINITACTION: //pseudodefine
       id = swf_GetU16(t);
       break;
   }
@@ -143,8 +145,6 @@ SRECT swf_GetDefineBBox(TAG * t)
     case ST_DEFINESHAPE2:
     case ST_DEFINESHAPE3:
     case ST_DEFINEEDITTEXT:
-    case ST_DEFINEBUTTON:
-    case ST_DEFINEBUTTON2:
     case ST_DEFINETEXT:
     case ST_DEFINETEXT2:
     case ST_DEFINEVIDEOSTREAM:
@@ -250,6 +250,7 @@ static int swf_pseudodefiningtagids[] =
  ST_NAMECHARACTER,
  ST_DOINITACTION,
  ST_VIDEOFRAME,
+ ST_GLYPHNAMES,
  -1
 };
 
@@ -658,6 +659,7 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v
            }
            break;
        }
+       case ST_GLYPHNAMES:
        case ST_DEFINEFONTINFO:
        case ST_DEFINEFONTINFO2:
        case ST_VIDEOFRAME:
@@ -871,6 +873,9 @@ void swf_RelocateDepth(SWF*swf, char*bitmap)
 
     while(tag)
     {
+       /* TODO * clip depths 
+               * sprites
+        */
        int depth = swf_GetDepth(tag);
        if(depth>=0) {
            int newdepth = depth+nr;
@@ -883,4 +888,46 @@ void swf_RelocateDepth(SWF*swf, char*bitmap)
        tag=tag->next;
     }
 }
-       
+
+TAG* swf_Concatenate (TAG*list1,TAG*list2)
+{
+    TAG*tag=0,*lasttag=0;
+    char bitmap[65536];
+    char depthmap[65536];
+    SWF swf1,swf2;
+    memset(bitmap, 0, sizeof(bitmap));
+    memset(depthmap, 0, sizeof(depthmap));
+    memset(&swf1, 0, sizeof(swf1));
+    memset(&swf2, 0, sizeof(swf2));
+
+    swf1.firstTag = list1;
+    swf_FoldAll(&swf1);
+    swf2.firstTag = list2;
+    swf_FoldAll(&swf2);
+
+    tag = list1;
+    while(tag) {
+       if(!swf_isDefiningTag(tag)) {
+           int id = swf_GetDefineID(tag);
+           bitmap[id] = 1;
+       }
+       if(tag->id == ST_PLACEOBJECT ||
+          tag->id == ST_PLACEOBJECT2) {
+           int depth = swf_GetDepth(tag);
+           depthmap[depth] = 1;
+       }
+       if(tag->id == ST_REMOVEOBJECT ||
+          tag->id == ST_REMOVEOBJECT2) {
+           int depth = swf_GetDepth(tag);
+           depthmap[depth] = 0;
+       }
+       tag = tag->next;
+       lasttag = tag;
+    }
+    swf_Relocate(&swf2, bitmap);
+    swf_RelocateDepth(&swf2, depthmap);
+    lasttag->next = swf2.firstTag;
+    swf2.firstTag->prev = lasttag;
+
+    return swf1.firstTag;
+}