X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fpdf%2FInfoOutputDev.cc;h=9f04518ed2bba961349ad9878391f8d30d6cb758;hb=b926b13a51e42375cf4b13ceb028e21869340e2e;hp=a142c772d946f510822cb86a90625658d7eee00c;hpb=5ba24931ec3861ca5befcaae1502dd9105639b44;p=swftools.git diff --git a/lib/pdf/InfoOutputDev.cc b/lib/pdf/InfoOutputDev.cc index a142c77..9f04518 100644 --- a/lib/pdf/InfoOutputDev.cc +++ b/lib/pdf/InfoOutputDev.cc @@ -15,6 +15,7 @@ #endif #include "GfxState.h" #include "../log.h" +#include "../types.h" #include "../q.h" #include #include @@ -52,21 +53,24 @@ InfoOutputDev::~InfoOutputDev() delete id2font;id2font=0; delete splash;splash=0; } + void FontInfo::grow(int size) { if(size >= this->num_glyphs) { this->glyphs = (GlyphInfo**)realloc(this->glyphs, sizeof(GlyphInfo*)*(size)); + this->kerning = (dict_t**)realloc(this->kerning, sizeof(dict_t*)*(size)); memset(&this->glyphs[this->num_glyphs], 0, sizeof(SplashPath*)*((size)-this->num_glyphs)); + memset(&this->kerning[this->num_glyphs], 0, sizeof(dict_t*)*((size)-this->num_glyphs)); this->num_glyphs = size; } } FontInfo::FontInfo(char*id) { this->id = strdup(id); - this->charid2glyph = 0; this->seen = 0; this->num_glyphs = 0; this->glyphs = 0; + this->kerning = 0; this->splash_font = 0; this->lastchar = -1; this->lastx = 0; @@ -78,10 +82,6 @@ FontInfo::~FontInfo() { if(this->id) {free(this->id);this->id=0;} this->font = 0; - if(this->charid2glyph) { - free(this->charid2glyph); - this->charid2glyph = 0; - } int t; for(t=0;tgfxfont) gfxfont_free(this->gfxfont); + + if(kerning) { + for(t=0;tnum_glyphs); font->num_glyphs = 0; - font->ascent = fabs(src->descender); - font->descent = fabs(src->ascender); + font->ascent = fabs(src->ascender); + font->descent = fabs(src->descender); for(t=0;tnum_glyphs;t++) { if(src->glyphs[t]) { @@ -214,6 +225,34 @@ static gfxfont_t* createGfxFont(FontInfo*src) } } + + int kerning_size = 0; + for(t=0;tnum_glyphs;t++) { + dict_t* d = src->kerning[t]; + if(!d) continue; + DICT_ITERATE_ITEMS(d,void*,key,mtf_t*,m) { + if(m) { + kerning_size++; + } + } + } + font->kerning_size = kerning_size; + font->kerning = (gfxkerning_t*)malloc(sizeof(gfxkerning_t)*kerning_size); + int pos = 0; + for(t=0;tnum_glyphs;t++) { + dict_t* d = src->kerning[t]; + if(!d) continue; + DICT_ITERATE_ITEMS(d,void*,key,mtf_t*,m) { + if(m) { + font->kerning[pos].c1 = src->glyphs[t]->glyphid; + font->kerning[pos].c2 = src->glyphs[(int)(ptroff_t)key]->glyphid; + font->kerning[pos].advance = (int)(ptroff_t)m->first->key; + pos++; + } + } + } + //int advance = (int)(ptroff_t)m->first->key; + return font; } @@ -407,15 +446,31 @@ void InfoOutputDev::drawChar(GfxState *state, double x, double y, g->unicode = u[0]; } if(currentfont->lastchar>=0 && currentfont->lasty == y) { - double xshift = x - currentfont->lastx; + double xshift = (x - currentfont->lastx); if(xshift>=0 && xshift > g->advance_max) { g->advance_max = xshift; } + int advance = (int)xshift; + if(advance>=0 && advanceadvance*4 && advance!=currentfont->lastadvance) { + int c1 = currentfont->lastchar; + int c2 = code; + dict_t*d = currentfont->kerning[c1]; + if(!d) { + d = currentfont->kerning[c1] = dict_new2(&int_type); + } + mtf_t*k = (mtf_t*)dict_lookup(d, (void*)(ptroff_t)c2); + if(!k) { + k = mtf_new(&int_type); + dict_put(d, (void*)(ptroff_t)c2, k); + } + mtf_increase(k, (void*)(ptroff_t)advance); + } } currentfont->lastx = x; currentfont->lasty = y; currentfont->lastchar = code; + currentfont->lastadvance = (int)(g->advance+0.5); } GBool InfoOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen)