/* 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)
if(usefonts && ! drawonlyshapes)
{
- int charid = font->getSWFCharID(character);
+ int charid = font->getSWFCharID(character, charnr);
if(shapeid>=0)
endshape();
if(textid<0)
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("<verbose> Font %s(%d): Storing %d outlines.\n", name, id, t);
+ logf("<verbose> 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*));
- width = (int*)malloc(t*sizeof(int));
- memset(width, 0, t*sizeof(int));
- memset(charname, 0, t*sizeof(char*));
- 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)
// parsecharacters
for(s=0;s<t;s++)
{
+ char* name = T1_GetCharName(id, s);
+ if(!name) name = "";
this->outline[outlinepos] = T1_CopyOutline(T1_GetCharOutline(id, s, 100.0, 0));
this->width[outlinepos] = T1_GetCharWidth(id, s);
- this->charname[outlinepos] = strdup(T1_GetCharName(id, s));
+ this->charname[outlinepos] = strdup(name);
outlinepos++;
}
t=0;
for(t=0;t<this->charnum;t++)
{
if(this->charname[t])
- getSWFCharID(this->charname[t]);
+ getSWFCharID(this->charname[t], -1);
}
}
logf("<verbose> 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;
for(t=0;t<swfcharpos;t++)
{
- ptr[t] = swf_GetDataSize(ftag);
+ ptr[t] = swf_GetTagLen(ftag);
swf_SetU16(ftag, 0x1234);
}
for(t=0;t<swfcharpos;t++)
{
- *(U16*)&ftag->data[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
free(outline);
for(t=0;t<charnum;t++)
free(charname[t]);
+ for(t=0;t<standardtablesize;t++)
+ if(standardtable[t]) {
+ free(standardtable[t]);
+ }
+ free(standardtable);
free(charname);
free(width);
free(used);
return 0;
}
-int SWFFont::getSWFCharID(char*name)
+int SWFFont::getSWFCharID(char*name, int charnr)
{
int t;
for(t=0;t<this->charnum;t++) {
return char2swfcharid[t];
}
}
+ if(this->standardtable && charnr>=0 && charnr < this->standardtablesize) {
+ return getSWFCharID(this->standardtable[charnr], -1);
+ }
logf("<warning> Didn't find character '%s' in font '%s'", name, this->name);
return 0;
}
}
/* 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;
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 */
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;
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;
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;
double x3,double y3,
double x4,double y4)
{
+ if(id<0) return;
if(shapeid>=0)
endshape();
if(textid>=0)