int width, int height, GfxImageColorMap*colorMap, GBool invert,
GBool inlineImg, int mask, int *maskColors,
Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GfxImageColorMap*maskColorMap);
- int SWFOutputDev::setGfxFont(char*id, char*filename, double quality);
+ int SWFOutputDev::setGfxFont(char*id, char*name, char*filename, double quality);
void strokeGfxline(GfxState *state, gfxline_t*line);
void clipToGfxLine(GfxState *state, gfxline_t*line);
void fillGfxLine(GfxState *state, gfxline_t*line);
static char*getFontID(GfxFont*font)
{
+ Ref*ref = font->getID();
GString*gstr = font->getName();
- char* fontname = gstr==0?0:gstr->getCString();
- if(fontname==0) {
- char buf[32];
- Ref*r=font->getID();
- sprintf(buf, "UFONT%d", r->num);
- return strdup(buf);
+ char* fname = gstr==0?0:gstr->getCString();
+ char buf[128];
+ if(fname==0) {
+ sprintf(buf, "font-%d-%d", ref->num, ref->gen);
+ } else {
+ sprintf(buf, "%s-%d-%d", fname, ref->num, ref->gen);
}
- return strdup(fontname);
+ return strdup(buf);
}
static char*getFontName(GfxFont*font)
{
- char*fontid = getFontID(font);
+ char*fontid;
+ GString*gstr = font->getName();
+ char* fname = gstr==0?0:gstr->getCString();
+ if(fname==0) {
+ char buf[32];
+ Ref*r=font->getID();
+ sprintf(buf, "UFONT%d", r->num);
+ fontid = strdup(buf);
+ }
+ fontid = strdup(fname);
+
char*fontname= 0;
char* plus = strchr(fontid, '+');
if(plus && plus < &fontid[strlen(fontid)-1]) {
int getGfxCharID(gfxfont_t*font, int charnr, char *charname, int u)
{
- int t;
+ char*uniname = 0;
+ if(u>0) {
+ int t;
+ /* find out char name from unicode index
+ TODO: should be precomputed
+ */
+ for(t=0;t<sizeof(nameToUnicodeTab)/sizeof(nameToUnicodeTab[0]);t++) {
+ if(nameToUnicodeTab[t].u == u) {
+ uniname = nameToUnicodeTab[t].name;
+ break;
+ }
+ }
+ }
+
if(charname) {
+ int t;
for(t=0;t<font->num_glyphs;t++) {
if(font->glyphs[t].name && !strcmp(font->glyphs[t].name,charname)) {
msg("<debug> Char [%d,>%s<,%d] maps to %d\n", charnr, charname, u, t);
}
}
+ if(uniname) {
+ int t;
+ for(t=0;t<font->num_glyphs;t++) {
+ if(font->glyphs[t].name && !strcmp(font->glyphs[t].name,uniname)) {
+ msg("<debug> Char [%d,%s,>%d(%s)<] maps to %d\n", charnr, charname, u, uniname, t);
+ return t;
+ }
+ }
+ /* if we didn't find the character, maybe
+ we can find the capitalized version */
+ for(t=0;t<font->num_glyphs;t++) {
+ if(font->glyphs[t].name && !strcasecmp(font->glyphs[t].name,uniname)) {
+ msg("<debug> Char [%d,%s,>>%d(%s)<<] maps to %d\n", charnr, charname, u, uniname, t);
+ return t;
+ }
+ }
+ }
+
/* try to use the unicode id */
if(u>=0 && u<font->max_unicode && font->unicode2glyph[u]>=0) {
msg("<debug> Char [%d,%s,>%d<] maps to %d\n", charnr, charname, u, font->unicode2glyph[u]);
return font->unicode2glyph[u];
}
- /* we don't need to "draw" space characters, so don't overdo the search
- for a matching glyph */
- if(charname && !strcasecmp(charname, "space"))
- return -1;
-
if(charnr>=0 && charnr<font->num_glyphs) {
msg("<debug> Char [>%d<,%s,%d] maps to %d\n", charnr, charname, u, charnr);
return charnr;
Unicode u=0;
char*name=0;
- if(_u && uLen) {
- u = *_u;
- if (u) {
- int t;
- /* find out char name from unicode index
- TODO: should be precomputed
- */
- for(t=0;t<sizeof(nameToUnicodeTab)/sizeof(nameToUnicodeTab[0]);t++) {
- if(nameToUnicodeTab[t].u == u) {
- name = nameToUnicodeTab[t].name;
- break;
- }
- }
- }
- }
-
if(font->isCIDFont()) {
GfxCIDFont*cfont = (GfxCIDFont*)font;
Gfx8BitFont*font8;
font8 = (Gfx8BitFont*)font;
char**enc=font8->getEncoding();
- if(enc && enc[c] && strcasecmp(enc[c], "space")) {
- name = enc[c];
- }
+ name = enc[c];
}
if (CIDToGIDMap) {
msg("<debug> drawChar(%f, %f, c='%c' (%d), GID=%d, u=%d <%d>) CID=%d name=\"%s\" render=%d\n", x, y, (c&127)>=32?c:'?', c, CIDToGIDMap[c], u, uLen, font->isCIDFont(), FIXNULL(name), render);
if(uLen<=1) {
charid = getGfxCharID(current_gfxfont, c, name, u);
} else {
- charid = getGfxCharID(current_gfxfont, c, 0, -1);
+ charid = getGfxCharID(current_gfxfont, c, name, -1);
+
if(charid < 0) {
/* multiple unicodes- should usually map to a ligature.
if the ligature doesn't exist, we need to draw
return;
}
}
-
if(charid<0) {
- if(!name || strcasecmp(name, "space")) {
- msg("<warning> Didn't find character '%s' (c=%d,u=%d) in current charset (%s, %d characters)",
- FIXNULL(name),c, u, FIXNULL((char*)current_font_id), current_gfxfont->num_glyphs);
- }
+ msg("<warning> Didn't find character '%s' (c=%d,u=%d) in current charset (%s, %d characters)",
+ FIXNULL(name),c, u, FIXNULL((char*)current_font_id), current_gfxfont->num_glyphs);
return;
}
this->xref = xref;
}
-int SWFOutputDev::setGfxFont(char*id, char*filename, double maxSize)
+int SWFOutputDev::setGfxFont(char*id, char*name, char*filename, double maxSize)
{
gfxfont_t*font = 0;
fontlist_t*last=0,*l = this->fontlist;
if (!gfxFont) {
return;
}
+
char * fontid = getFontID(gfxFont);
+ char * fontname = getFontName(gfxFont);
+
double maxSize = 1.0;
if(this->info) {
/* second, see if this is a font which was used before-
if so, we are done */
- if(setGfxFont(fontid, 0, 0)) {
+ if(setGfxFont(fontid, fontname, 0, 0)) {
free(fontid);
+ free(fontname);
return;
}
/* if(swfoutput_queryfont(&output, fontid))
showFontError(gfxFont, 2);
}
free(fontid);
+ free(fontname);
return;
}
if(!fileName) showFontError(gfxFont,0);
else del = 1;
} else {
- char * fontname = getFontName(gfxFont);
fileName = searchFont(fontname);
if(!fileName) showFontError(gfxFont,0);
- free(fontname);
}
if(!fileName) {
char * fontname = getFontName(gfxFont);
if(!fileName) {
msg("<error> Couldn't set font %s\n", fontid);
free(fontid);
+ free(fontname);
return;
}
//swfoutput_setfont(&output, fontid, fileName);
- if(!setGfxFont(fontid, 0, 0)) {
- setGfxFont(fontid, fileName, maxSize);
+ if(!setGfxFont(fontid, fontname, 0, 0)) {
+ setGfxFont(fontid, fontname, fileName, maxSize);
}
if(fileName && del)
unlinkfont(fileName);
+
if(fileName)
free(fileName);
free(fontid);
+ free(fontname);
msg("<verbose> |");
}