fixed two bugs in font2swf
[swftools.git] / src / swfc.c
index 34de7f8..646ec80 100644 (file)
@@ -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(&currentrect, 0, sizeof(currentrect));
@@ -993,7 +994,7 @@ static void s_endSprite()
         syntaxerror("internal error(7)");
     /* TODO: before clearing, prepend "<spritename>." 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();
 }