X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fas3%2Fabc.c;h=2962331ae2b9db197cf645097cc91206176ef276;hp=edebba21e2175176afc0707a7149c52162eb4c10;hb=780e53f414a281c516c153a578638c4f7414434c;hpb=dbc0f4b791d051296d8297c232bd0c8969c00795 diff --git a/lib/as3/abc.c b/lib/as3/abc.c index edebba2..2962331 100644 --- a/lib/as3/abc.c +++ b/lib/as3/abc.c @@ -157,10 +157,9 @@ void abc_class_add_interface(abc_class_t*c, multiname_t*interface) list_append(c->interfaces, multiname_clone(interface)); } -abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body) +void abc_method_init(abc_method_t*m, abc_file_t*file, multiname_t*returntype, char body) { /* construct method object */ - NEW(abc_method_t,m); m->index = array_length(file->methods); array_append(file->methods, NO_KEY, m); m->return_type = returntype; @@ -178,7 +177,11 @@ abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body) m->body = c; c->method = m; } - +} +abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body) +{ + NEW(abc_method_t,m); + abc_method_init(m, file, returntype, body); return m; } @@ -281,11 +284,11 @@ trait_t* abc_class_staticslot(abc_class_t*cls, multiname_t*name, multiname_t*typ } -trait_t* abc_class_find_slotid(abc_class_t*cls, int slotid) +trait_t* traits_find_slotid(trait_list_t*traits, int slotid) { trait_list_t*l; trait_t*t=0; - for(l=cls->traits;l;l=l->next) { + for(l=traits;l;l=l->next) { if(l->trait->slot_id==slotid) { t=l->trait; break; @@ -930,6 +933,8 @@ static pool_t*writeABC(TAG*abctag, void*code, pool_t*pool) abc_file_t*file = (abc_file_t*)code; if(!pool) pool = pool_new(); + if(!file) + file = abc_file_new(); TAG*tmp = swf_InsertTag(0,0); TAG*tag = tmp; @@ -1310,265 +1315,3 @@ void swf_FreeABC(void*code) abc_file_free(file); } -void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events) -{ - int num_frames = 0; - int has_buttons = 0; - TAG*tag=swf->firstTag; - while(tag) { - if(tag->id == ST_SHOWFRAME) - num_frames++; - if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) - has_buttons = 1; - tag = tag->next; - } - - abc_file_t*file = abc_file_new(); - abc_method_body_t*c = 0; - - abc_class_t*cls = abc_class_new2(file, "rfx::MainTimeline", "flash.display::MovieClip"); - abc_class_protectedNS(cls, "rfx:MainTimeline"); - - TAG*abctag = swf_InsertTagBefore(swf, swf->firstTag, ST_DOABC); - - tag = swf_InsertTag(abctag, ST_SYMBOLCLASS); - swf_SetU16(tag, 1); - swf_SetU16(tag, 0); - swf_SetString(tag, "rfx.MainTimeline"); - - c = abc_class_getstaticconstructor(cls, 0)->body; - c->old.max_stack = 1; - c->old.local_count = 1; - c->old.init_scope_depth = 9; - c->old.max_scope_depth = 10; - - __ getlocal_0(c); - __ pushscope(c); - __ returnvoid(c); - - c = abc_class_getconstructor(cls, 0)->body; - c->old.max_stack = 3; - c->old.local_count = 1; - c->old.init_scope_depth = 10; - c->old.max_scope_depth = 11; - - debugfile(c, "constructor.as"); - - __ getlocal_0(c); - __ pushscope(c); - - __ getlocal_0(c); - __ constructsuper(c,0); - - __ getlex(c, "[package]flash.system::Security"); - __ pushstring(c, "*"); - __ callpropvoid(c, "[package]::allowDomain", 1); - - if(stop_each_frame || has_buttons) { - int frame = 0; - tag = swf->firstTag; - abc_method_body_t*f = 0; //frame script - while(tag && tag->id!=ST_END) { - char framename[80]; - char needs_framescript=0; - char buttonname[80]; - char functionname[80]; - sprintf(framename, "[packageinternal]rfx::frame%d", frame); - - if(!f && (tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2 || stop_each_frame)) { - /* make the contructor add a frame script */ - __ findpropstrict(c,"[package]::addFrameScript"); - __ pushbyte(c,frame); - __ getlex(c,framename); - __ callpropvoid(c,"[package]::addFrameScript",2); - - f = abc_class_method(cls, 0, multiname_fromstring(framename))->body; - f->old.max_stack = 3; - f->old.local_count = 1; - f->old.init_scope_depth = 10; - f->old.max_scope_depth = 11; - __ debugfile(f, "framescript.as"); - __ debugline(f, 1); - __ getlocal_0(f); - __ pushscope(f); - if(stop_each_frame) { - __ findpropstrict(f, "[package]::stop"); - __ callpropvoid(f, "[package]::stop", 0); - } - } - - if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) { - U16 id = swf_GetDefineID(tag); - sprintf(buttonname, "::button%d", swf_GetDefineID(tag)); - __ getlex(f,buttonname); - __ getlex(f,"flash.events::MouseEvent"); - __ getproperty(f, "::CLICK"); - sprintf(functionname, "::clickbutton%d", swf_GetDefineID(tag)); - __ getlex(f,functionname); - __ callpropvoid(f, "::addEventListener" ,2); - - needs_framescript = 1; - - abc_method_body_t*h = - abc_class_method(cls, 0, multiname_fromstring(functionname))->body; - list_append(h->method->parameters, multiname_fromstring("flash.events::MouseEvent")); - - h->old.max_stack = 6; - h->old.local_count = 2; - h->old.init_scope_depth = 10; - h->old.max_scope_depth = 11; - __ getlocal_0(h); - __ pushscope(h); - - ActionTAG*oldaction = swf_ButtonGetAction(tag); - if(oldaction && oldaction->op == ACTION__GOTOFRAME) { - int framenr = GET16(oldaction->data); - if(!events) { - __ findpropstrict(h,"[package]::gotoAndStop"); - __ pushuint(h,framenr+1); - __ callpropvoid(h,"[package]::gotoAndStop", 1); - } else { - char framename[80]; - sprintf(framename, "frame%d", framenr); - __ getlocal_0(h); //this - __ findpropstrict(h, "[package]flash.events::TextEvent"); - __ pushstring(h, "link"); - __ pushtrue(h); - __ pushtrue(h); - __ pushstring(h, framename); - __ constructprop(h,"[package]flash.events::TextEvent", 4); - __ callpropvoid(h,"[package]::dispatchEvent", 1); - } - } else if(oldaction && oldaction->op == ACTION__GETURL) { - if(!events) { - __ findpropstrict(h,"flash.net::navigateToURL"); - __ findpropstrict(h,"flash.net::URLRequest"); - // TODO: target _blank - __ pushstring(h,oldaction->data); //url - __ constructprop(h,"flash.net::URLRequest", 1); - __ callpropvoid(h,"flash.net::navigateToURL", 1); - } else { - __ getlocal_0(h); //this - __ findpropstrict(h, "[package]flash.events::TextEvent"); - __ pushstring(h, "link"); - __ pushtrue(h); - __ pushtrue(h); - __ pushstring(h,oldaction->data); //url - __ constructprop(h,"[package]flash.events::TextEvent", 4); - __ callpropvoid(h,"[package]::dispatchEvent", 1); - } - } else if(oldaction) { - fprintf(stderr, "Warning: Couldn't translate button code of button %d to flash 9 abc action\n", id); - } - __ returnvoid(h); - swf_ActionFree(oldaction); - } - if(tag->id == ST_SHOWFRAME) { - if(f) { - __ returnvoid(f); - f = 0; - } - frame++; - } - tag = tag->next; - } - if(f) { - __ returnvoid(f); - } - } - __ returnvoid(c); - - tag = swf->firstTag; - while(tag) { - if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) { - char buttonname[80]; - sprintf(buttonname, "::button%d", swf_GetDefineID(tag)); - multiname_t*s = multiname_fromstring(buttonname); - //abc_class_slot(cls, multiname_fromstring(buttonname), s); - abc_class_slot(cls, multiname_fromstring(buttonname), - multiname_fromstring("flash.display::SimpleButton")); - } - tag = tag->next; - } - - - abc_script_t*s = abc_initscript(file); - c = s->method->body; - c->old.max_stack = 2; - c->old.local_count = 1; - c->old.init_scope_depth = 1; - c->old.max_scope_depth = 9; - - __ getlocal_0(c); - __ pushscope(c); - __ getscopeobject(c, 0); - __ getlex(c,"::Object"); - __ pushscope(c); - __ getlex(c,"flash.events::EventDispatcher"); - __ pushscope(c); - __ getlex(c,"flash.display::DisplayObject"); - __ pushscope(c); - __ getlex(c,"flash.display::InteractiveObject"); - __ pushscope(c); - __ getlex(c,"flash.display::DisplayObjectContainer"); - __ pushscope(c); - __ getlex(c,"flash.display::Sprite"); - __ pushscope(c); - __ getlex(c,"flash.display::MovieClip"); - __ pushscope(c); - __ getlex(c,"flash.display::MovieClip"); - __ newclass(c,cls); - __ popscope(c); - __ popscope(c); - __ popscope(c); - __ popscope(c); - __ popscope(c); - __ popscope(c); - __ popscope(c); - __ initproperty(c,"rfx::MainTimeline"); - __ returnvoid(c); - - //abc_method_body_addClassTrait(c, "rfx:MainTimeline", 1, cls); - multiname_t*classname = multiname_fromstring("rfx::MainTimeline"); - abc_initscript_addClassTrait(s, classname, cls); - multiname_destroy(classname); - - swf_WriteABC(abctag, file); -} - -TAG*swf_AddAS3FontDefine(TAG*tag, U16 id, char*fontname) -{ - tag = swf_InsertTag(tag, ST_DOABC); - abc_file_t*file = abc_file_new(); - - //abc_class_t*cls = abc_class_new2(file, fontname, "flash.display::MovieClip"); - //abc_class_slot(cls, multiname_fromstring(fontname), multiname_fromstring("flash.text::Font")); - - abc_class_t*cls = abc_class_new2(file, fontname, "flash.text::Font"); - - abc_script_t*s = abc_initscript(file); - code_t*c = s->method->body->code; - c = abc_getlocal_0(c); - c = abc_pushscope(c); - c = abc_getscopeobject(c, 0); - c = abc_getlex(c,"flash.text::Font"); - c = abc_pushscope(c); - c = abc_getlex(c,"flash.text::Font"); - c = abc_newclass(c,cls); - c = abc_popscope(c); - c = abc_initproperty(c, fontname); - c = abc_returnvoid(c); - s->method->body->code = c; - - abc_initscript_addClassTrait(s, multiname_fromstring(fontname), cls); - swf_WriteABC(tag, file); - - tag = swf_InsertTag(tag, ST_SYMBOLCLASS); - swf_SetU16(tag, 1); - swf_SetU16(tag, id); - swf_SetString(tag, fontname); - - return tag; -} - -