X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswfaction.c;h=652fd6d2cd8809d3580230e8e9f903a4ff432e09;hb=774da0eb175e36c6b8a563f3a7af82e6640b19c9;hp=301c4c94ff4ffa2d1f16790905de6c7c5cb20c51;hpb=2275b63cc1e60eb913a939f4cc773763eef5f8cf;p=swftools.git diff --git a/lib/modules/swfaction.c b/lib/modules/swfaction.c index 301c4c9..652fd6d 100644 --- a/lib/modules/swfaction.c +++ b/lib/modules/swfaction.c @@ -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;tdata && 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;tnext; @@ -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*)¤tatag->tmp[1] = i; + *(U32*)¤tatag->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 +*/