X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=src%2Fswfc.c;h=646ec8004e36e72b78d94ed72b4d66f6322ade77;hp=34de7f8c5d9c77ac9e4a8a0c2f937fc4a1de5017;hb=f0f4599a8cc05f18859d2bb8d0afe447f3e00813;hpb=ca5a320f4761e8761019c36684e773fb2f263e68 diff --git a/src/swfc.c b/src/swfc.c index 34de7f8..646ec80 100644 --- a/src/swfc.c +++ b/src/swfc.c @@ -177,6 +177,7 @@ static struct level /* for swf (0): */ SWF*swf; char*filename; + char as3; /* for sprites (1): */ TAG*tag; @@ -340,22 +341,22 @@ static void free_outline(void* o) static void freeDictionaries() { - dict_free_all(&instances, free_instance); - dict_free_all(&characters, free); - dict_free_all(&images, free); - dict_free_all(&textures, free); - dict_free_all(&outlines, free_outline); - dict_free_all(&gradients, free_gradient); - dict_free_all(&filters, free); - dict_free_all(&fonts, free_font); - dict_free_all(&sounds, free); - dict_free_all(&interpolations, free); + dict_free_all(&instances, 1, free_instance); + dict_free_all(&characters, 1, free); + dict_free_all(&images, 1, free); + dict_free_all(&textures, 1, free); + dict_free_all(&outlines, 1, free_outline); + dict_free_all(&gradients, 1, free_gradient); + dict_free_all(&filters, 1, free); + dict_free_all(&fonts, 1, free_font); + dict_free_all(&sounds, 1, free); + dict_free_all(&interpolations, 1, free); cleanUp = 0; } static void freeFontDictionary() { - dict_free_all(&fonts, free_font); + dict_free_all(&fonts, 1, free_font); } static void incrementid() @@ -609,15 +610,15 @@ void s_swf(const char*name, SRECT r, int version, int fps, int compress, RGBA ba swf->compressed = compress; swf_SetRGB(tag,&background); - dict_init(&characters); - dict_init(&images); - dict_init(&textures); - dict_init(&outlines); - dict_init(&gradients); - dict_init(&filters); - dict_init(&instances); - dict_init(&sounds); - dict_init(&interpolations); + dict_init(&characters, 16); + dict_init(&images, 16); + dict_init(&textures, 16); + dict_init(&outlines, 16); + dict_init(&gradients, 16); + dict_init(&filters, 16); + dict_init(&instances, 16); + dict_init(&sounds, 16); + dict_init(&interpolations, 16); initBuiltIns(); cleanUp = &freeDictionaries; @@ -660,7 +661,7 @@ void s_sprite(const char*name, SRECT*scalegrid) } /* FIXME: those four fields should be bundled together */ - dict_init(&instances); + dict_init(&instances, 16); currentframe = 0; currentdepth = 1; memset(¤trect, 0, sizeof(currentrect)); @@ -993,7 +994,7 @@ static void s_endSprite() syntaxerror("internal error(7)"); /* TODO: before clearing, prepend "." to names and copy into old instances dict */ - dict_free_all(&instances, free_instance); + dict_free_all(&instances, 1, free_instance); currentframe = stack[stackpos].oldframe; currentrect = stack[stackpos].oldrect; @@ -1029,6 +1030,22 @@ static void s_endSWF() // tag = swf_InsertTag(tag, ST_SHOWFRAME); tag = swf_InsertTag(tag, ST_SHOWFRAME); + if(stack[0].as3) { + TAG*tag = swf->firstTag; + tag = swf_InsertTag(tag, ST_DOABC); + void*code = as3_getcode(); + swf_WriteABC(tag, code); + if(as3_getglobalclass()) { + tag = swf_InsertTag(tag, ST_SYMBOLCLASS); + swf_SetU16(tag, 1); + swf_SetU16(tag, 0); + swf_SetString(tag, as3_getglobalclass()); + } else { + warning("no global public MovieClip subclass"); + } + as3_destroy(); + } + tag = swf_InsertTag(tag, ST_END); swf_OptimizeTagOrder(swf); @@ -1864,19 +1881,20 @@ void s_blur(const char*name, double blurx, double blury, int passes) void s_action(const char*text) { - ActionTAG* a = 0; - a = swf_ActionCompile(text, stack[0].swf->fileVersion); - if(!a) - { + if(stack[0].swf->fileVersion < 9) { + ActionTAG* a = 0; + a = swf_ActionCompile(text, stack[0].swf->fileVersion); + if(!a) { + swf_ActionFree(a); + syntaxerror("Couldn't compile ActionScript"); + } + tag = swf_InsertTag(tag, ST_DOACTION); + swf_ActionSet(tag, a); swf_ActionFree(a); - syntaxerror("Couldn't compile ActionScript"); + } else { + as3_parse_bytearray(stack[0].filename, text, strlen(text)); + stack[0].as3 = 1; } - - tag = swf_InsertTag(tag, ST_DOACTION); - - swf_ActionSet(tag, a); - - swf_ActionFree(a); } void s_initaction(const char*character, const char*text) @@ -3116,7 +3134,7 @@ static int c_define(map_t*args) const char*value = lu(args, "value"); if(!defines_initialized) { - dict_init(&defines); + dict_init(&defines, 16); mem_init(&define_values); defines_initialized = 1; } @@ -3131,7 +3149,7 @@ static int c_point(map_t*args) int pos; SPOINT p; if(!points_initialized) { - dict_init(&points); + dict_init(&points, 16); mem_init(&mpoints); points_initialized = 1; } @@ -4422,9 +4440,10 @@ static void analyseArgumentsForCommand(char*command) else { SWFFONT* font = dict_lookup(&fonts, lu(&args, "font")); - if (!font) - syntaxerror("font %s is not known in line %d", lu(&args, "font"), line); - else + if (!font) { + //that's ok... it might be an edittext with a system font + //syntaxerror("font %s is not known in line %d", lu(&args, "font"), line); + } else if (font->use && !font->use->glyphs_specified) { if (!strcmp(command, "edittext")) @@ -4468,7 +4487,7 @@ void firstPass() { pos = 0; id = 0; - dict_init(&fonts); + dict_init(&fonts, 16); cleanUp = &freeFontDictionary; findFontUsage(); }