From 62d5e489a65089161aaaca07f5f9c9f3d1c3b161 Mon Sep 17 00:00:00 2001 From: Matthias Kramm Date: Wed, 28 Jan 2009 18:01:39 +0100 Subject: [PATCH] moved scripts from abc.c --- lib/as3/scripts.c | 286 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/as3/scripts.h | 30 ++++++ 2 files changed, 316 insertions(+) create mode 100644 lib/as3/scripts.c create mode 100644 lib/as3/scripts.h diff --git a/lib/as3/scripts.c b/lib/as3/scripts.c new file mode 100644 index 0000000..f965b2b --- /dev/null +++ b/lib/as3/scripts.c @@ -0,0 +1,286 @@ +/* scripts.c + + Some hardcoded abc scripts. + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008,2009 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "abc.h" + +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; +} + diff --git a/lib/as3/scripts.h b/lib/as3/scripts.h new file mode 100644 index 0000000..ec2c477 --- /dev/null +++ b/lib/as3/scripts.h @@ -0,0 +1,30 @@ +/* scripts.h + + Some hardcoded abc scripts (header file) + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008,2009 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifdef __abc_scripts_h__ +#define __abc_scripts_h__ + +void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events); +TAG*swf_AddAS3FontDefine(TAG*tag, U16 id, char*fontname); + +#endif -- 1.7.10.4