X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fgfxfont.c;h=d1f58066a0aaa3e063edd7c90cee7c10798796e3;hb=e1b1d44814fded4b2c363b52bc905704feeb65be;hp=efe29c3f81011a49a982e028a5d4e1373ebade0a;hpb=e47d392189dc87d32caf72cc6479117d512405a4;p=swftools.git diff --git a/lib/gfxfont.c b/lib/gfxfont.c index efe29c3..d1f5806 100644 --- a/lib/gfxfont.c +++ b/lib/gfxfont.c @@ -25,6 +25,7 @@ #include "gfxdevice.h" #include "gfxtools.h" #include "gfxfont.h" +#include "ttf.h" static int loadfont_scale = 64; static int full_unicode = 1; @@ -491,6 +492,7 @@ gfxfont_t* gfxfont_load(char*id, char*filename, unsigned int flags, double quali gfxfont_t* gfxfont_load(char*id, char*filename, unsigned int flags, double quality) { fprintf(stderr, "No freetype support compiled in! Not able to load %s\n", filename); + return 0; } #endif @@ -518,3 +520,121 @@ void gfxfont_free(gfxfont_t*font) free(font); } +ttf_t* gfxfont_to_ttf(gfxfont_t*font) +{ + ttf_t*ttf = ttf_new(); + int num_glyphs = font->num_glyphs; + int offset = 0; + int t; + char has_nondef_glyph = + font->num_glyphs && font->glyphs[0].unicode==-1 && + (!font->glyphs[0].line || !font->glyphs[0].line->next); + + if(!has_nondef_glyph) { + /* insert a new .nondef glyph at the start of the font */ + offset++; + num_glyphs++; + } + ttf->num_glyphs = num_glyphs; + ttf->glyphs = rfx_calloc(num_glyphs*sizeof(ttfglyph_t)); + double scale = 1.0; + int max_unicode = font->max_unicode; + int remap_pos=0; + for(t=0;tnum_glyphs;t++) { + gfxglyph_t*src = &font->glyphs[t]; + ttfglyph_t*dest = &ttf->glyphs[t+offset]; + gfxline_t*line = src->line; + int count = 0; + while(line) { + count++; + if(line->type == gfx_splineTo) + count++; + line=line->next; + } + dest->num_points = count; + dest->points = rfx_calloc(count*sizeof(ttfpoint_t)); + count = 0; + line = src->line; + while(line) { + if(line->type == gfx_splineTo) { + dest->points[count].x = line->sx*scale; + dest->points[count].y = line->sy*scale; + count++; + } + dest->points[count].x = line->x*scale; + dest->points[count].y = line->y*scale; + dest->points[count].flags |= GLYPH_ON_CURVE; + if(line->type == gfx_moveTo) { + dest->points[count].flags |= GLYPH_CONTOUR_START; + if(count) + dest->points[count-1].flags |= GLYPH_CONTOUR_END; + } + count++; + line=line->next; + } + if(count) + dest->points[count-1].flags |= GLYPH_CONTOUR_END; + + /* compute bounding box */ + int s; + if(count) { + dest->xmin = dest->xmax = dest->points[0].x; + dest->ymin = dest->ymax = dest->points[0].y; + for(s=1;spoints[s].x < dest->xmin) + dest->xmin = dest->points[s].x; + if(dest->points[s].y < dest->ymin) + dest->ymin = dest->points[s].y; + if(dest->points[s].x > dest->xmax) + dest->xmax = dest->points[s].x; + if(dest->points[s].y > dest->ymax) + dest->ymax = dest->points[s].y; + } + } + + dest->advance = src->advance*scale; + + int u = font->glyphs[t].unicode; + if(u<32 || (u>=0xe000 && u<0xf900)) { + u = 0xe000 + remap_pos++; + } + if(u > max_unicode) + max_unicode = u; + } + ttf->unicode_size = max_unicode+1; + ttf->unicode = rfx_calloc(sizeof(unicode_t)*ttf->unicode_size); + remap_pos=0; + for(t=0;tnum_glyphs;t++) { + gfxglyph_t*src = &font->glyphs[t]; + int u = font->glyphs[t].unicode; + if(u<32 || (u>=0xe000 && u<0xf900)) { + u = 0xe000 + remap_pos++; + } + if(u>=0 && uunicode_size) + ttf->unicode[u] = t+offset; + } + int u; + for(u=0;umax_unicode;u++) { + int g = font->unicode2glyph[u]; + if(u<32 || (u>=0xe000 && u<0xf900)) + continue; + if(g>=0 && !ttf->unicode[u]) { + ttf->unicode[u] = g+offset; + } + } + ttf->ascent = font->ascent; + ttf->descent = font->descent; + ttf->lineGap = font->ascent + font->descent; + + ttf->name = strdup(font->id); + + ttf_create_truetype_tables(ttf); + return ttf; +} + +void gfxfont_save(gfxfont_t*font, const char*filename) +{ + ttf_t*ttf = gfxfont_to_ttf(font); + ttf_save(ttf, filename); +} +