X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fdevices%2Fswf.c;h=59a9d0cff957c20c9735f364dd7923afc15e0f6a;hp=3277938986b2776fc73a65e68e01d36ff5936103;hb=af9a0b4c2720a7890c7226e32c2738f2ada135f8;hpb=4e514da68a127743aaa789f00145037f04179306 diff --git a/lib/devices/swf.c b/lib/devices/swf.c index 3277938..59a9d0c 100644 --- a/lib/devices/swf.c +++ b/lib/devices/swf.c @@ -42,7 +42,7 @@ #include "../gfxtools.h" #include "swf.h" #include "../gfxpoly.h" -#include "../png.h" +#include "../gfximage.h" #define CHARDATAMAX 1024 #define CHARMIDX 0 @@ -102,6 +102,7 @@ typedef struct _swfoutput_internal int config_storeallcharacters; int config_enablezlib; int config_insertstoptag; + int config_showimages; int config_watermark; int config_noclips; int config_flashversion; @@ -114,6 +115,7 @@ typedef struct _swfoutput_internal int config_bboxvars; int config_disable_polygon_conversion; int config_normalize_polygon_positions; + int config_alignfonts; char config_disablelinks; RGBA config_linkcolor; float config_minlinewidth; @@ -206,14 +208,13 @@ typedef struct _swfoutput_internal static const int NO_FONT3=0; -static void swf_fillbitmap(gfxdevice_t*driver, gfxline_t*line, gfximage_t*img, gfxmatrix_t*move, gfxcxform_t*cxform); +static void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform); static int swf_setparameter(gfxdevice_t*driver, const char*key, const char*value); static void swf_drawstroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit); static void swf_startclip(gfxdevice_t*dev, gfxline_t*line); static void swf_endclip(gfxdevice_t*dev); static void swf_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit); static void swf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color); -static void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform); static void swf_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix); static void swf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); static void swf_addfont(gfxdevice_t*dev, gfxfont_t*font); @@ -623,6 +624,7 @@ static void chararray_writetotag(chararray_t*_chardata, TAG*tag) int lastx; int lasty; int lastsize; + int lastchar; int charids[128]; int charadvance[128]; int charstorepos; @@ -646,6 +648,7 @@ static void chararray_writetotag(chararray_t*_chardata, TAG*tag) lastx = CHARMIDX; lasty = CHARMIDY; lastsize = -1; + lastchar = -1; if(pass==1) { @@ -670,9 +673,9 @@ static void chararray_writetotag(chararray_t*_chardata, TAG*tag) charatposition_t*chr = &chardata->chr[t]; - if(lastfont != chardata->chr[t].font || - lastx!=chardata->chr[t].x || - lasty!=chardata->chr[t].y || + if(lastfont != chr->font || + lastx!=chr->x || + lasty!=chr->y || !colorcompare(&color, &chardata->chr[t].color) || charstorepos==127 || lastsize != chardata->chr[t].size || @@ -745,7 +748,7 @@ static void chararray_writetotag(chararray_t*_chardata, TAG*tag) if(tpos-1) nextx = chardata->chr[t+1].x; if(t==chardata->pos-1 && chardata->next) nextx = chardata->next->chr[0].x; int dx = nextx-chr->x; - + int advance; if(dx>=0 && (dx<(1<<(advancebits-1)) || pass==0)) { advance = dx; @@ -754,8 +757,10 @@ static void chararray_writetotag(chararray_t*_chardata, TAG*tag) advance = 0; lastx=chr->x; } + charids[charstorepos] = chr->charid; charadvance[charstorepos] = advance; + lastchar = chr->charid; charstorepos ++; } chardata = chardata->next; @@ -950,6 +955,7 @@ static void endpage(gfxdevice_t*dev) swfoutput_internal*i = (swfoutput_internal*)dev->internal; if(i->pagefinished) return; + if(i->shapeid>=0) endshape(dev); if(i->textmode) @@ -1172,7 +1178,6 @@ void gfxdevice_swf_init(gfxdevice_t* dev) dev->startclip = swf_startclip; dev->endclip = swf_endclip; dev->fill = swf_fill; - dev->fillbitmap = swf_fillbitmap; dev->fillgradient = swf_fillgradient; dev->addfont = swf_addfont; dev->drawchar = swf_drawchar; @@ -1466,13 +1471,10 @@ void swfoutput_finalize(gfxdevice_t*dev) endpage(dev); fontlist_t *iterator = i->fontlist; char use_font3 = i->config_flashversion>=8 && !NO_FONT3; + while(iterator) { TAG*mtag = i->swf->firstTag; if(iterator->swffont) { - if(use_font3) { - // needs to be done before the reduce - swf_FontCreateAlignZones(iterator->swffont); - } if(!i->config_storeallcharacters) { msg(" Reducing font %s", iterator->swffont->name); swf_FontReduce(iterator->swffont); @@ -1485,19 +1487,19 @@ void swfoutput_finalize(gfxdevice_t*dev) } else { mtag = swf_InsertTag(mtag, ST_DEFINEFONT3); swf_FontSetDefine2(mtag, iterator->swffont); - if(iterator->swffont->alignzones) { - mtag = swf_InsertTag(mtag, ST_DEFINEFONTALIGNZONES); - swf_FontSetAlignZones(mtag, iterator->swffont); - } } } } iterator = iterator->next; } - + i->tag = swf_InsertTag(i->tag,ST_END); TAG* tag = i->tag->prev; + + if(use_font3 && i->config_storeallcharacters && i->config_alignfonts) { + swf_FontPostprocess(i->swf); // generate alignment information + } /* remove the removeobject2 tags between the last ST_SHOWFRAME and the ST_END- they confuse the flash player */ @@ -2118,6 +2120,10 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value) i->config_dumpfonts = atoi(value); } else if(!strcmp(name, "animate")) { i->config_animate = atoi(value); + } else if(!strcmp(name, "linknameurl")) { + i->config_linknameurl = atoi(value); + } else if(!strcmp(name, "showimages")) { + i->config_showimages = atoi(value); } else if(!strcmp(name, "disablelinks")) { i->config_disablelinks = atoi(value); } else if(!strcmp(name, "simpleviewer")) { @@ -2253,7 +2259,9 @@ static int add_image(swfoutput_internal*i, gfximage_t*img, int targetwidth, int if(newsizex Scaling %dx%d image to %dx%d", sizex, sizey, newsizex, newsizey); - newpic = swf_ImageScale(mem, sizex, sizey, newsizex, newsizey); + gfximage_t*ni = gfximage_rescale(img, newsizex, newsizey); + newpic = (RGBA*)ni->data; + free(ni); *newwidth = sizex = newsizex; *newheight = sizey = newsizey; mem = newpic; @@ -2355,6 +2363,11 @@ static void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxm SHAPE*shape; swf_ShapeNew(&shape); int fsid = swf_ShapeAddBitmapFillStyle(shape,&m,bitid,1); + int lsid = 0; + if(i->config_showimages) { + RGBA pink = {255,255,0,255}; + lsid = swf_ShapeAddLineStyle(shape, 20, &pink); + } swf_SetU16(i->tag, myshapeid); SRECT r = gfxline_getSWFbbox(line); r = swf_ClipRect(i->pagebbox, r); @@ -2362,7 +2375,7 @@ static void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxm swf_SetShapeStyles(i->tag,shape); swf_ShapeCountBits(shape,NULL,NULL); swf_SetShapeBits(i->tag,shape); - swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,0,fsid,0); + swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,lsid,fsid,0); i->swflastx = i->swflasty = UNDEFINED_COORD; drawgfxline(dev, line, 1); swf_ShapeSetEnd(i->tag); @@ -2811,21 +2824,26 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id, int version) swffont->glyph2ascii = (U16*)rfx_calloc(sizeof(U16)*swffont->numchars); swffont->glyph = (SWFGLYPH*)rfx_calloc(sizeof(SWFGLYPH)*swffont->numchars); swffont->glyphnames = (char**)rfx_calloc(sizeof(char*)*swffont->numchars); - for(t=0;tmax_unicode;t++) { - swffont->ascii2glyph[t] = font->unicode2glyph[t]; - } + SRECT max = {0,0,0,0}; for(t=0;tnum_glyphs;t++) { drawer_t draw; gfxline_t*line; double advance = 0; - swffont->glyph2ascii[t] = font->glyphs[t].unicode; - if(swffont->glyph2ascii[t] == 0xffff || swffont->glyph2ascii[t] == 0x0000) { + int u = font->glyphs[t].unicode; + int s; + char twice=0; + for(s=0;snum_glyphs;s++) { + if(swffont->glyph2ascii[s]==u) + twice=1; + } + if(u >= 0xe000 || u == 0x0000 || twice) { /* flash 8 flashtype requires unique unicode IDs for each character. We use the Unicode private user area to assign characters, hoping that the font doesn't contain more than 2048 glyphs */ - swffont->glyph2ascii[t] = 0xe000 + (t&0x1fff); + u = 0xe000 + (t&0x1fff); } + swffont->glyph2ascii[t] = u; if(font->glyphs[t].name) { swffont->glyphnames[t] = strdup(font->glyphs[t].name); @@ -2843,6 +2861,11 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id, int version) c.x = line->sx * scale; c.y = -line->sy * scale; //to.x = floor(line->x * scale); to.y = floor(-line->y * scale); to.x = line->x * scale; to.y = -line->y * scale; + + /*if(strstr(swffont->name, "BIRNU") && t==90) { + to.x += 1; + }*/ + if(line->type == gfx_moveTo) { draw.moveTo(&draw, &to); } else if(line->type == gfx_lineTo) { @@ -2871,6 +2894,7 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id, int version) swf_ExpandRect2(&bounds, &swffont->layout->bounds[t]); } + for(t=0;tnum_glyphs;t++) { SRECT bbox = swffont->layout->bounds[t]; @@ -2910,6 +2934,7 @@ static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id, int version) if(font->descent*20 > swffont->layout->descent) swffont->layout->descent = font->descent*20; + swf_FontSort(swffont); return swffont; } @@ -2956,11 +2981,6 @@ static void swf_addfont(gfxdevice_t*dev, gfxfont_t*font) l->swffont->layout->bounds[iii].xmax/20.0, l->swffont->layout->bounds[iii].ymax/20.0 ); - int t; - for(t=0;tswffont->maxascii;t++) { - if(l->swffont->ascii2glyph[t] == iii) - msg(" | - maps to %d",t); - } } } } @@ -3019,7 +3039,7 @@ static void setfontscale(gfxdevice_t*dev,double m11,double m12, double m21,doubl MATRIX m; swf_GetMatrix(0, &m); - if(m21 || m12 || fabs(m11+m22)>0.001) { + if(m21 || m12 || fabs(m11+m22)>0.001 || m11<0) { double ifs = (double)extrazoom/(i->current_font_size); m.sx = (S32)((m11*ifs)*65536); m.r1 = -(S32)((m21*ifs)*65536); m.r0 = (S32)((m12*ifs)*65536); m.sy = -(S32)((m22*ifs)*65536); @@ -3064,6 +3084,7 @@ static void swf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t* msg(" No character %d in font %s (%d chars)", glyph, FIXNULL((char*)i->swffont->name), i->swffont->numchars); return; } + glyph = i->swffont->glyph2glyph[glyph]; setfontscale(dev, matrix->m00, matrix->m01, matrix->m10, matrix->m11, matrix->tx, matrix->ty, 0);