flash9 tags implementation
[swftools.git] / lib / devices / swf.c
index b23f262..872d0a9 100644 (file)
@@ -694,7 +694,7 @@ static int drawchar(gfxdevice_t*dev, SWFFONT *swffont, int charid, float x, floa
     }
 
     if(charid<0 || charid>=swffont->numchars) {
-       msg("<warning> No character %d in font %s ", charid, FIXNULL((char*)swffont->name));
+       msg("<warning> No character %d in font %s (%d chars)", charid, FIXNULL((char*)swffont->name), swffont->numchars);
        return 0;
     }
     /*if(swffont->glyph[charid].shape->bitlen <= 16) {
@@ -853,7 +853,7 @@ void swf_endframe(gfxdevice_t*dev)
     if(!i->pagefinished)
         endpage(dev);
 
-    if(i->config_insertstoptag) {
+    if( (i->swf->fileVersion <= 8) && (i->config_insertstoptag) ) {
        ActionTAG*atag=0;
        atag = action_Stop(atag);
        atag = action_End(atag);
@@ -1174,7 +1174,6 @@ void wipeSWF(SWF*swf)
     }
 }
 
-
 void swfoutput_finalize(gfxdevice_t*dev)
 {
     swfoutput_internal*i = (swfoutput_internal*)dev->internal;
@@ -1225,7 +1224,7 @@ void swfoutput_finalize(gfxdevice_t*dev)
                swf_FontReduce(iterator->swffont);
            }
            int used = iterator->swffont->use && iterator->swffont->use->used_glyphs;
-           if(i->config_storeallcharacters || used) {
+           if(used) {
                mtag = swf_InsertTag(mtag, ST_DEFINEFONT2);
                swf_FontSetDefine2(mtag, iterator->swffont);
            }
@@ -1251,6 +1250,10 @@ void swfoutput_finalize(gfxdevice_t*dev)
        i->swf->compressed = 1;
     }
 
+    /* Initialize AVM2 if it is a Flash9 file */
+    if(i->config_flashversion>=9 && i->config_insertstoptag) {
+       AVM2_InsertStops(i->swf);
+    }
 //    if(i->config_reordertags)
 //     swf_Optimize(i->swf);
 }
@@ -1853,6 +1856,32 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value)
            i->config_linkcolor.b,
            i->config_linkcolor.a);
 
+    } else if(!strcmp(name, "help")) {
+       printf("\nSWF layer options:\n");
+       printf("jpegdpi=<dpi>               resolution adjustment for jpeg images\n");
+        printf("jpegsubpixels=<pixels>      resolution adjustment for jpeg images (same as jpegdpi, but in pixels)\n");
+        printf("ppmdpi=<dpi>                resolution adjustment for lossless images\n");
+        printf("ppmsubpixels=<pixels        resolution adjustment for  lossless images (same as ppmdpi, but in pixels)\n");
+        printf("subpixels=<pixels>          shortcut for setting both jpegsubpixels and ppmsubpixels\n");
+        printf("drawonlyshapes              convert everything to shapes (currently broken)\n");
+        printf("ignoredraworder             allow to perform a few optimizations for creating smaller SWFs\n");
+        printf("linksopennewwindow          make links open a new browser window\n");
+        printf("linktarget                  target window name of new links\n");
+        printf("linkcolor=<color)           color of links (format: RRGGBBAA)\n");
+        printf("storeallcharacters          don't reduce the fonts to used characters in the output file\n");
+        printf("enablezlib                  switch on zlib compression (also done if flashversion>=7)\n");
+        printf("bboxvars                    store the bounding box of the SWF file in actionscript variables\n");
+        printf("reordertags=0/1             (default: 1) perform some tag optimizations\n");
+        printf("internallinkfunction=<name> when the user clicks a internal link (to a different page) in the converted file, this actionscript function is called\n");
+        printf("externallinkfunction=<name> when the user clicks an external link (e.g. http://www.foo.bar/) on the converted file, this actionscript function is called\n");
+        printf("disable_polygon_conversion  never convert strokes to polygons (will remove capstyles and joint styles)\n");
+        printf("caplinewidth=<width>        the minimum thichness a line needs to have so that capstyles become visible (and are converted)\n");
+        printf("insertstop                  put an ActionScript \"STOP\" tag in every frame\n");
+        printf("protect                     add a \"protect\" tag to the file, to prevent loading in the Flash editor\n");
+        printf("flashversion=<version>      the SWF fileversion (6)\n");
+        printf("minlinewidth=<width>        convert horizontal/vertical boxes smaller than this width to lines (0.05) \n");
+        printf("animate                     insert a showframe tag after each placeobject (animate draw order of PDF files)\n");
+        printf("jpegquality=<quality>       set compression quality of jpeg images\n");
     } else {
        return 0;
     }
@@ -2438,9 +2467,10 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id)
        swffont->glyph[t].shape = swf_ShapeDrawerToShape(&draw);
        swffont->layout->bounds[t] = swf_ShapeDrawerGetBBox(&draw);
 
-       if(swffont->layout->bounds[t].xmax && swffont->layout->bounds[t].xmax*2 < advance) {
-           printf("fix bad advance value: bbox=%d, advance=%d (%f)\n", swffont->layout->bounds[t].xmax, advance, font->glyphs[t].advance);
-           advance = swffont->layout->bounds[t].xmax;
+       int xmax = swffont->layout->bounds[t].xmax / 20;
+       if(xmax>0 && xmax*2 < advance) {
+           printf("fix bad advance value: bbox=%d, advance=%d (%f)\n", xmax, advance, font->glyphs[t].advance);
+           advance = xmax;
        }
            
        if(advance<32768) {