int charmap = -1;
int isunicode = 1;
int has_had_errors = 0;
+ int num_names = 0;
if(ftlibrary == 0) {
if(FT_Init_FreeType(&ftlibrary)) {
the encoding is no longer unicode.
TODO: find a way to convert the encoding to unicode
*/
- if(font->max_unicode == 0 && charmap < face->num_charmaps - 1) {
+ if(font->max_unicode == 0 && charmap < face->num_charmaps-1 &&
+ face->charmaps[charmap+1]->encoding != 0x41444243 /* custom */)
+ {
charmap++;
FT_Set_Charmap(face, face->charmaps[charmap]);
- //font->encoding = 0;//anything but unicode FIXME
isunicode = 0;
- } else
+ } else
break;
}
font->num_glyphs = 0;
+
+ for(t=0; t < face->num_glyphs; t++) {
+ if(FT_HAS_GLYPH_NAMES(face)) {
+ char name[128];
+ error = FT_Get_Glyph_Name(face, t, name, 127);
+ if(!error && name[0] && !strstr(name, "notdef")) {
+ num_names++;
+ }
+ }
+ }
+
+
for(t=0; t < face->num_glyphs; t++) {
FT_Glyph glyph;
FT_BBox bbox;
font->glyphs[font->num_glyphs].unicode = glyph2unicode[t];
font->glyphs[font->num_glyphs].name = 0;
- if(FT_HAS_GLYPH_NAMES(face)) {
+ if(FT_HAS_GLYPH_NAMES(face) && (num_names >= face->num_glyphs/10 || num_names > 2)) {
+ name[0] = 0;
error = FT_Get_Glyph_Name(face, t, name, 127);
if(!error && name[0] && !strstr(name, "notdef")) {
font->glyphs[font->num_glyphs].name = strdup(name);
fprintf(stderr, "Warning: glyph %d/%d (unicode %d, name %s) has return code %d\n", t, face->num_glyphs, glyph2unicode[t], name, error);
else
fprintf(stderr, "Warning: glyph %d/%d (unicode %d) has return code %d\n", t, face->num_glyphs, glyph2unicode[t], error);
- omit = 1;
+ omit = 2;
#if 0
if(!has_had_errors) {
error = FT_Get_Glyph(face->glyph, &glyph);
if(error) {
fprintf(stderr, "Couldn't get glyph %d/%d, error:%d\n", t, face->num_glyphs, error);
- omit = 1;
+ omit = 3;
}
}
if(!omit) {
+ gfxline_t*l;
+ int ok=0;
gfxdrawer_target_gfxline(&draw);
info.draw = &draw;
info.quality = quality;
fprintf(stderr, "Couldn't decompose glyph %d\n", t);
gfxline_free((gfxline_t*)draw.result(&draw));
FT_Done_Glyph(glyph);
- omit = 1;
+ omit = 4;
} else {
- font->glyphs[font->num_glyphs].advance = glyph->advance.x*20/65536;
+ font->glyphs[font->num_glyphs].advance = (glyph->advance.x*20)/65536;
font->glyphs[font->num_glyphs].line = (gfxline_t*)draw.result(&draw);
}
+ l = font->glyphs[font->num_glyphs].line;
+ while(l) {
+ if(l->type != gfx_moveTo) {
+ ok = 1;
+ }
+ l = l->next;
+ }
+ if(!ok && !name) {
+ gfxline_free(font->glyphs[font->num_glyphs].line);
+ font->glyphs[font->num_glyphs].line = 0;
+ font->glyphs[font->num_glyphs].advance = 0;
+
+ /* Some PDFs created e.g. by InDesign tend to create
+ fonts with reduced (empty) characters, which still
+ have unicode indices attached to them.
+ Remove that information, in order to not confuse
+ any converter applications.
+ */
+ font->glyphs[font->num_glyphs].unicode = 0;
+ if(font->glyphs[font->num_glyphs].name) {
+ free(font->glyphs[font->num_glyphs].name);
+ font->glyphs[font->num_glyphs].name = 0;
+ }
+ FT_Done_Glyph(glyph);
+ omit = 5;
+ }
}
if(!omit) {
FT_Done_Glyph(glyph);
+ font->glyphs[font->num_glyphs].unicode = glyph2unicode[t];
}
+
glyph2glyph[t] = font->num_glyphs;
font->num_glyphs++;
}
FT_Done_Face(face);
FT_Done_FreeType(ftlibrary);ftlibrary=0;
-
- if(!isunicode && font->num_glyphs>0) {
+
+ if(!isunicode && font->num_glyphs>0 && font->max_unicode) {
/* if the encoding isn't unicode, remap the font
so that the encoding equals the char position, and
remove the unicode table */