new function FontExtract_DefineTextCallback.
[swftools.git] / lib / modules / swfaction.c
index 301c4c9..652fd6d 100644 (file)
@@ -128,7 +128,7 @@ r: register (byte)
 };
 static int definedactions = sizeof(actions)/sizeof(struct Action);
 
-ActionTAG* swf_GetActions(TAG*tag) 
+ActionTAG* swf_ActionGet(TAG*tag) 
 {
     U8 op = 1;
     int length;
@@ -149,10 +149,8 @@ ActionTAG* swf_GetActions(TAG*tag)
            length = swf_GetU16(tag);
 
        if(length) {
-           int t;
            data = malloc(length);
-           for(t=0;t<length;t++)
-               data[t] = swf_GetU8(tag);
+           swf_GetBlock(tag, data, length);
        } else {
          data = 0;
        }
@@ -164,7 +162,20 @@ ActionTAG* swf_GetActions(TAG*tag)
     return tmp.next;
 }
 
-void swf_SetActions(TAG*tag, ActionTAG*action)
+void swf_ActionFree(ActionTAG*action)
+{
+    while(action)
+    {
+       ActionTAG*tmp;
+       if(action->data && action->data != action->tmp)
+           free(action->data);
+       tmp = action;
+       action=action->next;
+       free(tmp);
+    }
+}
+
+void swf_ActionSet(TAG*tag, ActionTAG*action)
 {
     while(action)
     {
@@ -288,24 +299,27 @@ void swf_DumpActions(ActionTAG*atag, char*prefix)
                    if(type == 0) {
                        printf(" String:\"%s\"", value);
                    } else if (type == 1) {
-                       printf(" Float:\"%f\"", *(float*)value);
+                       printf(" Float:%f", *(float*)value);
                    } else if (type == 2) {
                        printf(" NULL");
                    } else if (type == 4) {
                        printf(" register:%d", *value);
                    } else if (type == 5) {
-                       printf(" %s", *value?"true":"false");
+                       printf(" bool:%s", *value?"true":"false");
                    } else if (type == 6) {
-                       printf(" %f", *(double*)value);
+                       printf(" float:%f", *(double*)value);
                    } else if (type == 7) {
-                       printf(" %d", *(int*)value);
+                       printf(" int:%d", *(int*)value);
                    } else if (type == 8) {
                        printf(" Lookup:%d", *value);
+                   } else {
+                       printf(" UNKNOWN[%02x]",type);
                    }
                } break;
            }
            data += OpAdvance(*cp, data);
-           if(*cp!='c' || !poollen)
+           if((*cp!='c' || !poollen) &&
+              (*cp!='p' || !(data<&atag->data[atag->len])))
                cp++;
            if(poollen)
                poollen--;
@@ -315,14 +329,14 @@ void swf_DumpActions(ActionTAG*atag, char*prefix)
        {
            int nl = ((atag->data+atag->len)-data);
            int t;
-           printf(" remainder of %d bytes:\"", nl);
+           printf(" (remainder of %d bytes:\"", nl);
            for(t=0;t<nl;t++) {
                if(data[t]<32)
                    printf("\\%d",data[t]);
                else
                    printf("%c", data[t]);
            }
-           printf("\"");
+           printf("\")");
        }
        printf("\n");
        atag = atag->next;
@@ -473,6 +487,19 @@ void swf_AddActionTAG(U8 op, U8*data, U16 len)
     currentatag = currentatag->next;
 }
 
+ActionMarker action_setMarker()
+{
+    ActionMarker m;
+    m.atag = currentatag;
+    return m;
+}
+
+int inline ActionTagSize(ActionTAG*atag)
+{
+    return (atag->op&0x80)?3+(atag->len):1+0;
+}
+
+
 #define ACTION_END            0x00
 #define ACTION_NEXTFRAME      0x04
 #define ACTION_PREVIOUSFRAME  0x05
@@ -563,6 +590,55 @@ void swf_AddActionTAG(U8 op, U8*data, U16 len)
 #define ACTION_CALL           0x9e
 #define ACTION_GOTOFRAME2     0x9f
 
+void action_fixjump(ActionMarker m1, ActionMarker m2)
+{
+    ActionTAG* a1 = m1.atag;
+    ActionTAG* a2 = m2.atag;
+    ActionTAG* a;
+    int len = 0;
+    int oplen = 0;
+    a = a1;
+    
+    a = a->next; //first one is free
+    while(a && a!=a2)
+    {
+       len += ActionTagSize(a);
+       oplen ++;
+       a = a->next;
+    }
+    if(!a)
+    { len = 0;
+      oplen = 0;
+      a = a2;
+      while(a && a!=a1) {
+         len -= ActionTagSize(a);
+         oplen --;
+         a = a->next;
+      }
+      if(!a) {
+         fprintf(stderr, "action_fixjump: couldn't find second tag\n");
+         return;
+      }
+      len -= ActionTagSize(a);
+      oplen --;
+    }
+
+    if (a1->op == ACTION_IF || a1->op == ACTION_JUMP) 
+    {
+       *(U16*)(a1->data) = len;
+    }
+    else if(a1->op == ACTION_WAITFORFRAME)
+    {
+       ((U8*)(a1->data))[2] = oplen;
+    }
+    else if(a1->op == ACTION_WAITFORFRAME2)
+    {
+       ((U8*)(a1->data))[0] = oplen;
+    }
+    
+}
+
+
 void action_NextFrame() {swf_AddActionTAG(ACTION_NEXTFRAME, 0, 0);}
 void action_PreviousFrame() {swf_AddActionTAG(ACTION_PREVIOUSFRAME, 0, 0);}
 void action_Play() {swf_AddActionTAG(ACTION_PLAY, 0, 0);}
@@ -731,7 +807,7 @@ void action_PushDouble(double d)
 void action_PushInt(int i)
 {
     *(U8*)currentatag->tmp = 7; //int
-    *(U8*)&currentatag->tmp[1] = i;
+    *(U32*)&currentatag->tmp[1] = i;
     swf_AddActionTAG(ACTION_PUSH, (U8*)currentatag->tmp, 5);
 }
 void action_GotoLabel(char* label)
@@ -745,10 +821,37 @@ void action_GetUrl(char* url, char* label)
     int l2= strlen(label);
     char*ptr = malloc(l1+l2+2);
     strcpy(ptr, url);
-    strcat(&ptr[l2+1], label);
-    swf_AddActionTAG(ACTION_GETURL, ptr, strlen(ptr));
+    strcpy(&ptr[l1+1], label);
+    swf_AddActionTAG(ACTION_GETURL, ptr, l1+l2+2);
 }
 //TODO:
 void action_DefineFunction(U8*data, int len) {}
 void action_Constantpool(char* constantpool) {}
 void action_With(char*object) {}
+
+/*
+  Properties:
+
+  _X 0
+  _Y 1
+  _xscale 2
+  _yscale 3
+  _currentframe 4
+  _totalframes 5
+  _alpha 6
+  _visible 7
+  _width 8
+  _height 9
+  _rotation 10
+  _target 11
+  _framesloaded 12
+  _name 13
+  _droptarget 14
+  _url 15
+  _highquality 16
+  _focusrect 17
+  _soundbuftime 18
+  _quality* 19
+  _xmouse* 20
+  _ymouse* 21
+*/