X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2Fswfoutput.cc;h=52f64ffb93f7b9ebf63dc12b99b04d31862282f7;hb=16ad05687b928ff8071118d69dc0e2bf52c7872f;hp=eb810bc3e0f4904e1fefa020931b47dec6c5bb25;hpb=e1463a1467e39324de30c6c1199b24d9d8bc1232;p=swftools.git diff --git a/pdf2swf/swfoutput.cc b/pdf2swf/swfoutput.cc index eb810bc..52f64ff 100644 --- a/pdf2swf/swfoutput.cc +++ b/pdf2swf/swfoutput.cc @@ -35,6 +35,7 @@ int ignoredraworder=0; int drawonlyshapes=0; int jpegquality=85; int storeallcharacters=0; +int enablezlib=0; static int flag_protected = 0; typedef unsigned char u8; @@ -71,6 +72,8 @@ int clippos = 0; int CHARMIDX = 0; int CHARMIDY = 0; +char fillstylechanged = 0; + static void startshape(struct swfoutput* obj); static void starttext(struct swfoutput* obj); static void endshape(); @@ -91,8 +94,9 @@ static void moveto(TAG*tag, plotxy p0) { int rx = (int)(p0.x*20); int ry = (int)(p0.y*20); - if(rx!=swflastx || ry!=swflasty) { + if(rx!=swflastx || ry!=swflasty || fillstylechanged) { swf_ShapeSetMove (tag, shape, rx,ry); + fillstylechanged = 0; } swflastx=rx; swflasty=ry; @@ -121,7 +125,8 @@ static void splineto(TAG*tag, plotxy control,plotxy end) int ey = ((int)(end.y*20)-swflasty); swflastx += ex; swflasty += ey; - swf_ShapeSetCurve(tag, shape, cx,cy,ex,ey); + if(cx || cy || ex || ey) + swf_ShapeSetCurve(tag, shape, cx,cy,ex,ey); } /* write a line, given two points and the transformation @@ -450,7 +455,7 @@ static void drawchar(struct swfoutput*obj, SWFFont*font, char*character, int cha if(!outline) { logf(" Didn't find %s in current charset (%s)", - character,font->getName()); + FIXNULL(character),FIXNULL(font->getName())); return; } @@ -465,8 +470,10 @@ static void drawchar(struct swfoutput*obj, SWFFont*font, char*character, int cha if(shapeid<0) startshape(obj); - if(!lastwasfill) + if(!lastwasfill) { swf_ShapeSetStyle(tag,shape,0x8000,fillstyleid,0); + fillstylechanged = 1; + } lastwasfill = 1; int lf = fill; @@ -482,17 +489,27 @@ void swfoutput_drawpath(swfoutput*output, T1_OUTLINE*outline, { if(textid>=0) endtext(); + + /* Multiple polygons in one shape don't overlap correctly, + so we better start a new shape here if the polygon is filled + */ + if(shapeid>=0 && fill && !ignoredraworder) { + endshape(); + } + if(shapeid<0) startshape(output); if(lastwasfill && !fill) { swf_ShapeSetStyle(tag,shape,linestyleid,0x8000,0); + fillstylechanged = 1; lastwasfill = 0; } if(!lastwasfill && fill) { swf_ShapeSetStyle(tag,shape,0x8000,fillstyleid,0); + fillstylechanged = 1; lastwasfill = 1; } @@ -521,7 +538,7 @@ SWFFont::SWFFont(char*name, int id, char*filename) if(!charnum) return; - logf(" Font %s(%d): Storing %d outlines.\n", name, id, charnum); + logf(" Font %s(%d): Storing %d outlines.\n", FIXNULL(name), id, charnum); this->standardtablesize = 256; if(this->charnum < this->standardtablesize) @@ -607,7 +624,7 @@ SWFFont::~SWFFont() if(usednum && !drawonlyshapes) { - logf(" Font %s has %d used characters",fontid, usednum); + logf(" Font %s has %d used characters",FIXNULL(fontid), usednum); TAG*ftag = swf_InsertTag(swf.firstTag,ST_DEFINEFONT); swf_SetU16(ftag, this->swfid); int initpos = swf_GetTagLen(ftag); @@ -634,6 +651,7 @@ SWFFont::~SWFFont() s.bits.fill = 1; s.bits.line = 0; swf_ShapeSetStyle(ftag,&s,0,1,0); + fillstylechanged = 1; int lastfill = fill; fill = 1; storefont = 1; @@ -726,7 +744,7 @@ int SWFFont::getSWFCharID(char*name, int charnr) if(this->standardtable && charnr>=0 && charnr < this->standardtablesize) { return getSWFCharID(this->standardtable[charnr], -1); } - logf(" Didn't find character '%s' in font '%s'", name, this->name); + logf(" Didn't find character '%s' in font '%s'", FIXNULL(name), this->name); return 0; } @@ -762,7 +780,7 @@ void swfoutput_setfont(struct swfoutput*obj, char*fontid, int t1id, char*filenam } if(t1id<0) { - logf(" internal error: t1id:%d, fontid:%s\n", t1id,fontid); + logf(" internal error: t1id:%d, fontid:%s\n", t1id,FIXNULL(fontid)); } SWFFont*font = new SWFFont(fontid, t1id, filename); @@ -990,14 +1008,20 @@ void swfoutput_destroy(struct swfoutput* obj) fi = 1; // stdout if(fi<=0) { - logf(" Could not create \"%s\". ", filename); + logf(" Could not create \"%s\". ", FIXNULL(filename)); exit(1); } tag = swf_InsertTag(tag,ST_END); - if FAILED(swf_WriteSWF(fi,&swf)) - logf(" WriteSWF() failed.\n"); + if(enablezlib) { + if FAILED(swf_WriteSWC(fi,&swf)) + logf(" WriteSWC() failed.\n"); + } else { + if FAILED(swf_WriteSWF(fi,&swf)) + logf(" WriteSWF() failed.\n"); + } + if(filename) close(fi); logf(" SWF written\n"); @@ -1024,9 +1048,9 @@ void swfoutput_setfillcolor(swfoutput* obj, u8 r, u8 g, u8 b, u8 a) obj->fillrgb.g == g && obj->fillrgb.b == b && obj->fillrgb.a == a) return; - if(shapeid>=0) endshape(); + obj->fillrgb.r = r; obj->fillrgb.g = g; obj->fillrgb.b = b; @@ -1179,6 +1203,8 @@ static void drawlink(struct swfoutput*obj, ActionTAG*actions1, ActionTAG*actions int myshapeid2; double xmin,ymin; double xmax=xmin=points[0].x,ymax=ymin=points[0].y; + double posx = 0; + double posy = 0; int t; int buttonid = ++currentswfid; for(t=1;t<4;t++) @@ -1188,8 +1214,18 @@ static void drawlink(struct swfoutput*obj, ActionTAG*actions1, ActionTAG*actions if(points[t].x=0) + endshape(); + if(textid>=0) + endtext(); + + int bitid = ++currentswfid; + oldtag = tag; + tag = swf_InsertTag(tag,ST_DEFINEBITSJPEG2); + swf_SetU16(tag, bitid); + swf_SetJPEGBits2(tag,sizex,sizey,mem,jpegquality); + drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4); + return bitid; +} + int swfoutput_drawimagelossless(struct swfoutput*obj, RGBA*mem, int sizex,int sizey, double x1,double y1, double x2,double y2, @@ -1418,11 +1487,29 @@ int swfoutput_drawimagelossless256(struct swfoutput*obj, U8*mem, RGBA*pal, int s double x4,double y4) { TAG*oldtag; + U8*mem2 = 0; if(shapeid>=0) endshape(); if(textid>=0) endtext(); + if(sizex&3) + { + /* SWF expects scanlines to be 4 byte aligned */ + printf("%d -> %d\n", sizex, BYTES_PER_SCANLINE(sizex)); + int x,y; + U8*ptr; + mem2 = (U8*)malloc(BYTES_PER_SCANLINE(sizex)*sizey); + ptr = mem2; + for(y=0;y