X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2Fswfoutput.cc;h=de6ace2a06931a1d2f75f1e907e6f2a15067a40b;hb=94cfbda8462b59d93aa42d6bcd94fc2bee35bf33;hp=2353efe8aa416bf371ab988a5238052163806c13;hpb=ff6eab9880aba3d04d852cfa5b7cef01895db124;p=swftools.git diff --git a/pdf2swf/swfoutput.cc b/pdf2swf/swfoutput.cc index 2353efe..de6ace2 100644 --- a/pdf2swf/swfoutput.cc +++ b/pdf2swf/swfoutput.cc @@ -421,7 +421,7 @@ void putcharacter(struct swfoutput*obj, int fontid, int charid, /* process a character. */ -void drawchar(struct swfoutput*obj, SWFFont*font, char*character, swfmatrix*m) +void drawchar(struct swfoutput*obj, SWFFont*font, char*character, int charnr, swfmatrix*m) { int usefonts=1; if(m->m12!=0 || m->m21!=0) @@ -431,7 +431,7 @@ void drawchar(struct swfoutput*obj, SWFFont*font, char*character, swfmatrix*m) if(usefonts && ! drawonlyshapes) { - int charid = font->getSWFCharID(character); + int charid = font->getSWFCharID(character, charnr); if(shapeid>=0) endshape(); if(textid<0) @@ -505,30 +505,45 @@ SWFFont::SWFFont(char*name, int id, char*filename) this->name = strdup(T1_GetFontFileName(id)); this->fontid = strdup(name); this->t1id = id; - + char**a= T1_GetAllCharNames(id); - int t=0, outlinepos=0; + int t, outlinepos=0; char*map[256]; + + t=0; while(a[t]) t++; - this->charnum = t; - if(!t) + + if(!charnum) return; - logf(" Font %s(%d): Storing %d outlines.\n", name, id, t); + logf(" Font %s(%d): Storing %d outlines.\n", name, id, charnum); + + this->standardtablesize = 256; + if(this->charnum < this->standardtablesize) + this->standardtablesize = this->charnum; + this->standardtable = (char**)malloc(standardtablesize*sizeof(char*)); + + for(t = 0; t < this->standardtablesize; t++) { + char*name = T1_GetCharName(id,t); + if(!name) + name = ""; + standardtable[t] = strdup(name); + } - outline = (T1_OUTLINE**)malloc(t*sizeof(T1_OUTLINE*)); - charname = (char**)malloc(t*sizeof(char*)); - memset(charname, t*sizeof(char*), 0); - used = (char*)malloc(t*sizeof(char)); - char2swfcharid = (U16*)malloc(t*2); - swfcharid2char = (U16*)malloc(t*2); + outline = (T1_OUTLINE**)malloc(charnum*sizeof(T1_OUTLINE*)); + charname = (char**)malloc(charnum*sizeof(char*)); + width = (int*)malloc(charnum*sizeof(int)); + memset(width, 0, charnum*sizeof(int)); + memset(charname, 0, charnum*sizeof(char*)); + used = (char*)malloc(charnum*sizeof(char)); + char2swfcharid = (U16*)malloc(charnum*2); + swfcharid2char = (U16*)malloc(charnum*2); swfcharpos = 0; - memset(used,0,t*sizeof(char)); + memset(used,0,charnum*sizeof(char)); this->swfid = ++currentswfid; - t=0; while(*a) @@ -553,8 +568,11 @@ SWFFont::SWFFont(char*name, int id, char*filename) // parsecharacters for(s=0;soutline[outlinepos] = T1_CopyOutline(T1_GetCharOutline(id, s, 100.0, 0)); - this->charname[outlinepos] = strdup(T1_GetCharName(id, s)); + this->width[outlinepos] = T1_GetCharWidth(id, s); + this->charname[outlinepos] = strdup(name); outlinepos++; } t=0; @@ -574,7 +592,7 @@ SWFFont::~SWFFont() for(t=0;tcharnum;t++) { if(this->charname[t]) - getSWFCharID(this->charname[t]); + getSWFCharID(this->charname[t], -1); } } @@ -588,7 +606,7 @@ SWFFont::~SWFFont() logf(" Font %s has %d used characters",fontid, usednum); TAG*ftag = swf_InsertTag(swf.firstTag,ST_DEFINEFONT); swf_SetU16(ftag, this->swfid); - int initpos = swf_GetDataSize(ftag); + int initpos = swf_GetTagLen(ftag); swfmatrix m; m.m11 = m.m22 = 1; m.m21 = m.m12 = 0; @@ -597,12 +615,12 @@ SWFFont::~SWFFont() for(t=0;tdata[ptr[t]] = swf_GetDataSize(ftag)-initpos; + *(U16*)&ftag->data[ptr[t]] = swf_GetTagLen(ftag)-initpos; swflastx=0; swflasty=0; swf_SetU8(ftag,0x10); //0 fill bits, 0 linestyle bits @@ -644,7 +662,13 @@ SWFFont::~SWFFont() free(outline); for(t=0;tcharnum;t++) { @@ -682,6 +706,9 @@ int SWFFont::getSWFCharID(char*name) return char2swfcharid[t]; } } + 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); return 0; } @@ -763,7 +790,7 @@ void swfoutput_setfontmatrix(struct swfoutput*obj,double m11,double m12, } /* draws a character at x,y. */ -void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char*character) +void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char*character, int charnr) { swfmatrix m; m.m11 = obj->fontm11; @@ -772,7 +799,7 @@ void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char*character) m.m22 = obj->fontm22; m.m13 = x; m.m23 = y; - drawchar(obj, obj->font, character, &m); + drawchar(obj, obj->font, character, charnr, &m); } /* initialize the swf writer */ @@ -1268,15 +1295,21 @@ int swfoutput_drawimagejpeg(struct swfoutput*obj, char*filename, int sizex,int s double x3,double y3, double x4,double y4) { + TAG*oldtag; if(shapeid>=0) endshape(); if(textid>=0) endtext(); int bitid = ++currentswfid; + oldtag = tag; tag = swf_InsertTag(tag,ST_DEFINEBITSJPEG2); swf_SetU16(tag, bitid); - swf_SetJPEGBits(tag, filename, jpegquality); + if(swf_SetJPEGBits(tag, filename, jpegquality)<0) { + swf_DeleteTag(tag); + tag = oldtag; + return -1; + } drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4); return bitid; @@ -1288,15 +1321,21 @@ int swfoutput_drawimagelossless(struct swfoutput*obj, RGBA*mem, int sizex,int si double x3,double y3, double x4,double y4) { + TAG*oldtag; if(shapeid>=0) endshape(); if(textid>=0) endtext(); int bitid = ++currentswfid; + oldtag = tag; tag = swf_InsertTag(tag,ST_DEFINEBITSLOSSLESS); swf_SetU16(tag, bitid); - swf_SetLosslessBits(tag,sizex,sizey,mem, BMF_32BIT); + if(swf_SetLosslessBits(tag,sizex,sizey,mem, BMF_32BIT)<0) { + swf_DeleteTag(tag); + tag = oldtag; + return -1; + } drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4); return bitid; @@ -1308,15 +1347,21 @@ int swfoutput_drawimagelossless256(struct swfoutput*obj, U8*mem, RGBA*pal, int s double x3,double y3, double x4,double y4) { + TAG*oldtag; if(shapeid>=0) endshape(); if(textid>=0) endtext(); int bitid = ++currentswfid; + oldtag = tag; tag = swf_InsertTag(tag,ST_DEFINEBITSLOSSLESS2); swf_SetU16(tag, bitid); - swf_SetLosslessBitsIndexed(tag,sizex,sizey,mem, pal, 256); + if(swf_SetLosslessBitsIndexed(tag,sizex,sizey,mem, pal, 256)<0) { + swf_DeleteTag(tag); + tag = oldtag; + return -1; + } drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4); return bitid; @@ -1328,6 +1373,7 @@ void swfoutput_drawimageagain(struct swfoutput*obj, int id, int sizex,int sizey, double x3,double y3, double x4,double y4) { + if(id<0) return; if(shapeid>=0) endshape(); if(textid>=0)