tried to fix font layout
[swftools.git] / lib / devices / swf.c
index f0b0473..8cbfec0 100644 (file)
 #include <string.h>
 #include "../../config.h"
 #include <fcntl.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
+#ifdef HAVE_IO_H
+#include <io.h>
+#endif
 #ifdef HAVE_ASSERT_H
 #include <assert.h>
 #else
 #define assert(a)
 #endif
 #include <math.h>
+#include "../mem.h"
 #include "../log.h"
 #include "../rfxswf.h"
 #include "../gfxdevice.h"
 #include "../gfxtools.h"
 #include "../art/libart.h"
-#include "artsutils.c"
+#include "swf.h"
+#include "artsutils.h"
 
 #define CHARDATAMAX 8192
 #define CHARMIDX 0
@@ -74,7 +81,6 @@ typedef struct _swfoutput_internal
     int config_drawonlyshapes;
     int config_jpegquality;
     int config_storeallcharacters;
-    int config_generate_fake_tags;
     int config_enablezlib;
     int config_insertstoptag;
     int config_flashversion;
@@ -227,7 +233,6 @@ static swfoutput_internal* init_internal_struct()
     i->config_jpegquality=85;
     i->config_storeallcharacters=0;
     i->config_enablezlib=0;
-    i->config_generate_fake_tags=0;
     i->config_insertstoptag=0;
     i->config_flashversion=6;
     i->config_framerate=0.25;
@@ -722,6 +727,10 @@ static int drawchar(gfxdevice_t*dev, SWFFONT *swffont, int charid, float x, floa
     p.y = (SCOORD)((- x * i->fontmatrix.r0/65536.0 + y * i->fontmatrix.sx/65536.0)*det);
 
     RGBA rgba = *(RGBA*)col;
+    
+    msg("<trace> Drawing char %d in font %d at %d,%d in color %02x%02x%02x%02x", 
+           charid, swffont->id, p.x,p.y, rgba.r, rgba.g, rgba.b, rgba.a);
+
     putcharacter(dev, swffont->id, charid,p.x,p.y,i->current_font_size, rgba);
     swf_FontUseGlyph(swffont, charid);
     return 1;
@@ -853,7 +862,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);
@@ -929,7 +938,6 @@ void gfxdevice_swf_init(gfxdevice_t* dev)
     swfoutput_internal*i = (swfoutput_internal*)dev->internal;
     i->dev = dev;
 
-    SRECT r;
     RGBA rgb;
 
     msg("<verbose> initializing swf output\n", i->max_x,i->max_y);
@@ -1174,7 +1182,6 @@ void wipeSWF(SWF*swf)
     }
 }
 
-
 void swfoutput_finalize(gfxdevice_t*dev)
 {
     swfoutput_internal*i = (swfoutput_internal*)dev->internal;
@@ -1216,7 +1223,7 @@ void swfoutput_finalize(gfxdevice_t*dev)
     }
 
     endpage(dev);
-    fontlist_t *tmp,*iterator = i->fontlist;
+    fontlist_t *iterator = i->fontlist;
     while(iterator) {
        TAG*mtag = i->swf->firstTag;
        if(iterator->swffont) {
@@ -1225,7 +1232,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 +1258,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);
 }
@@ -1269,13 +1280,8 @@ int swfresult_save(gfxresult_t*gfx, const char*filename)
        return -1;
     }
     
-    if(swf->compressed) {
-       if FAILED(swf_WriteSWC(fi,swf)) 
-           msg("<error> WriteSWC() failed.\n");
-    } else {
-       if FAILED(swf_WriteSWF(fi,swf)) 
-           msg("<error> WriteSWF() failed.\n");
-    }
+    if FAILED(swf_WriteSWF(fi,swf)) 
+        msg("<error> WriteSWF() failed.\n");
 
     if(filename)
      close(fi);
@@ -1592,12 +1598,10 @@ static void drawlink(gfxdevice_t*dev, ActionTAG*actions1, ActionTAG*actions2, gf
     SRECT r;
     int lsid=0;
     int fsid;
-    plotxy_t p1,p2,p3,p4;
     int myshapeid;
     int myshapeid2;
     double posx = 0;
     double posy = 0;
-    int t;
     int buttonid = getNewID(dev);
     gfxbbox_t bbox = gfxline_getbbox(points);
 
@@ -1798,8 +1802,6 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value)
        if(i->config_protect && i->tag) {
            i->tag = swf_InsertTag(i->tag, ST_PROTECT);
        }
-    } else if(!strcmp(name, "faketags")) {
-       i->config_generate_fake_tags = atoi(value);
     } else if(!strcmp(name, "flashversion")) {
        i->config_flashversion = atoi(value);
        if(i->swf) {
@@ -2043,8 +2045,6 @@ static void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxm
     double fy = (double)img->height / (double)newheight;
 
     MATRIX m;
-    float m00,m10,tx;
-    float m01,m11,ty;
     m.sx = (int)(65536*20*matrix->m00*fx); m.r1 = (int)(65536*20*matrix->m10*fy);
     m.r0 = (int)(65536*20*matrix->m01*fx); m.sy = (int)(65536*20*matrix->m11*fy);
     m.tx = (int)(matrix->tx*20);
@@ -2470,8 +2470,8 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id)
            advance = xmax;
        }
            
-       if(advance<32768) {
-           swffont->glyph[t].advance = advance;
+       if(advance<32768/20) {
+           swffont->glyph[t].advance = advance*20;
        } else {
            swffont->glyph[t].advance = 32767;
        }
@@ -2489,6 +2489,9 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id)
        swffont->layout->descent = (bounds.ymax - bounds.ymin)/2;
        swffont->layout->leading = bounds.ymax - bounds.ymin;
     }
+    swffont->layout->descent= (bounds.ymax - bounds.ymin);
+    swffont->layout->ascent = 0;
+    swffont->layout->leading = bounds.ymax - bounds.ymin;
 
     return swffont;
 }
@@ -2567,8 +2570,10 @@ static void swf_switchfont(gfxdevice_t*dev, const char*fontid)
 static void swf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix)
 {
     swfoutput_internal*i = (swfoutput_internal*)dev->internal;
-    if(!font)
+    if(!font) {
+       msg("<error> swf_drawchar called (glyph %d) without font", glyph);
        return;
+    }
        
     if(!i->swffont || !i->swffont->name || strcmp((char*)i->swffont->name,font->id)) // not equal to current font
     {