X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fpdf%2FInfoOutputDev.cc;h=8fb751af6e00e7ea2e49b0489dc2398f898f8c7b;hp=3c65bd8b1d006ec9b6894894407d5c60df2ddefb;hb=fc713269e9d26d1be92f70e1ff0d508c94a65dba;hpb=2ddfa640af28b592ecf4295f0b1b7b43c923f707 diff --git a/lib/pdf/InfoOutputDev.cc b/lib/pdf/InfoOutputDev.cc index 3c65bd8..8fb751a 100644 --- a/lib/pdf/InfoOutputDev.cc +++ b/lib/pdf/InfoOutputDev.cc @@ -17,6 +17,7 @@ #include "../log.h" #include "../types.h" #include "../q.h" +#include "../gfxfont.h" #include #include @@ -67,7 +68,6 @@ void FontInfo::grow(int size) FontInfo::FontInfo(char*id) { this->id = strdup(id); - this->charid2glyph = 0; this->seen = 0; this->num_glyphs = 0; this->glyphs = 0; @@ -78,15 +78,13 @@ FontInfo::FontInfo(char*id) this->lasty = 0; this->gfxfont = 0; this->space_char = -1; + this->ascender = 0; + this->descender = 0; } 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;tnum_glyphs;t++) { gfxglyph_t*g = &font->glyphs[t]; if(GLYPH_IS_SPACE(g)) { - if(g->unicode == 32) return t; - if(first_space<0) - first_space = t; + if(g->unicode == 32) { + /* now that we have found a space char, make sure it's unique */ + int s; + for(s=0;snum_glyphs;s++) { + if(s!=t && font->glyphs[s].unicode==32) + font->glyphs[s].unicode=0; + } + return t; + } } } - if(font->num_glyphs>32 && GLYPH_IS_SPACE(&font->glyphs[32])) { - return 32; - } - return first_space; + return -1; } static int addSpace(gfxfont_t*font) { + /* first, make sure the new space char is the only char that'll use unicode 32 */ + int t; + for(t=0;tnum_glyphs;t++) { + if(font->glyphs[t].unicode==32) + font->glyphs[t].unicode=0; + } font->num_glyphs++; font->glyphs = (gfxglyph_t*)realloc(font->glyphs, sizeof(gfxglyph_t)*font->num_glyphs); gfxglyph_t*g = &font->glyphs[font->num_glyphs-1]; memset(g, 0, sizeof(*g)); g->unicode = 32; - //g->advance = font->ascent; - g->advance = fabs(font->ascent - font->descent)*2 / 3; + g->advance = fabs(font->ascent + font->descent)*2 / 3; if(font->max_unicode > 32) font->unicode2glyph[32] = font->num_glyphs-1; #if 0 @@ -148,8 +156,7 @@ static int addSpace(gfxfont_t*font) static gfxfont_t* createGfxFont(FontInfo*src) { - gfxfont_t*font = (gfxfont_t*)malloc(sizeof(gfxfont_t)); - memset(font, 0, sizeof(gfxfont_t)); + gfxfont_t*font = (gfxfont_t*)rfx_calloc(sizeof(gfxfont_t)); font->glyphs = (gfxglyph_t*)malloc(sizeof(gfxglyph_t)*src->num_glyphs); memset(font->glyphs, 0, sizeof(gfxglyph_t)*src->num_glyphs); @@ -171,8 +178,6 @@ static gfxfont_t* createGfxFont(FontInfo*src) gfxglyph_t*glyph = &font->glyphs[font->num_glyphs]; src->glyphs[t]->glyphid = font->num_glyphs; glyph->unicode = src->glyphs[t]->unicode; - if(glyph->unicode >= font->max_unicode) - font->max_unicode = glyph->unicode+1; gfxdrawer_t drawer; gfxdrawer_target_gfxline(&drawer); int s; @@ -209,7 +214,6 @@ static gfxfont_t* createGfxFont(FontInfo*src) if(src->glyphs[t]->advance>0) { glyph->advance = src->glyphs[t]->advance; } else { - msg(" Approximating advance value for glyph %d", t); glyph->advance = xmax*scale; } if(config_bigchar) { @@ -222,17 +226,9 @@ static gfxfont_t* createGfxFont(FontInfo*src) font->num_glyphs++; } } - font->unicode2glyph = (int*)malloc(sizeof(int)*font->max_unicode); - memset(font->unicode2glyph, -1, sizeof(int)*font->max_unicode); - for(t=0;tnum_glyphs;t++) { - if(font->glyphs[t].unicode>0 && font->glyphs[t].unicodemax_unicode) { - font->unicode2glyph[font->glyphs[t].unicode] = t; - } - - } int kerning_size = 0; - for(t=0;tnum_glyphs;t++) { + for(t=0;tnum_glyphs;t++) { dict_t* d = src->kerning[t]; if(!d) continue; DICT_ITERATE_ITEMS(d,void*,key,mtf_t*,m) { @@ -244,13 +240,13 @@ static gfxfont_t* createGfxFont(FontInfo*src) font->kerning_size = kerning_size; font->kerning = (gfxkerning_t*)malloc(sizeof(gfxkerning_t)*kerning_size); int pos = 0; - for(t=0;tnum_glyphs;t++) { + 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 = t; - font->kerning[pos].c2 = (int)(ptroff_t)key; + 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++; } @@ -290,8 +286,9 @@ gfxfont_t* FontInfo::getGfxFont() this->gfxfont->glyphs[this->space_char].unicode); } else if(config_addspace) { this->space_char = addSpace(this->gfxfont); - msg(" Appending space char to font %s, position %d", this->gfxfont->id, this->space_char); + msg(" Appending space char to font %s, position %d, width %f", this->gfxfont->id, this->space_char, this->gfxfont->glyphs[this->space_char].advance); } + gfxfont_fix_unicode(this->gfxfont); } return this->gfxfont; } @@ -507,6 +504,7 @@ GBool InfoOutputDev::beginType3Char(GfxState *state, double x, double y, double currentglyph->y1=0; currentglyph->x2=dx; currentglyph->y2=dy; + currentglyph->advance=dx; return gFalse; } else { return gTrue; @@ -523,6 +521,11 @@ void InfoOutputDev::type3D0(GfxState *state, double wx, double wy) void InfoOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) { + if(-lly>currentfont->descender) + currentfont->descender = -lly; + if(ury>currentfont->ascender) + currentfont->ascender = ury; + currentglyph->x1=llx; currentglyph->y1=lly; currentglyph->x2=urx; @@ -541,6 +544,16 @@ void InfoOutputDev::endType3Char(GfxState *state) currentglyph->path->lineTo(x1,y2); currentglyph->path->close(); } + +void InfoOutputDev::saveState(GfxState *state) +{ + updateAll(state); +} + +void InfoOutputDev::restoreState(GfxState *state) +{ + updateAll(state); +} void InfoOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert,