X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fpdf%2FInfoOutputDev.cc;h=c2accf29c8dadd7dac06ffb1a2773ad9f0b4f1fa;hb=0eaa557c36055770a90f6ea54c88f30010e1e5d9;hp=f0810752ec121954fb90dfb794cb7914ccb3d837;hpb=1f75b5311e88f8a6d71146cf2e709f1f5666dfc8;p=swftools.git diff --git a/lib/pdf/InfoOutputDev.cc b/lib/pdf/InfoOutputDev.cc index f081075..c2accf2 100644 --- a/lib/pdf/InfoOutputDev.cc +++ b/lib/pdf/InfoOutputDev.cc @@ -1,8 +1,18 @@ -#include "SplashTypes.h" +#include "config.h" +#include "Object.h" +#include "InfoOutputDev.h" #include "SplashOutputDev.h" +#ifdef HAVE_POPPLER +#include +#include +#include +#include +#else +#include "SplashTypes.h" #include "SplashPath.h" +#include "SplashFont.h" #include "SplashFontFile.h" -#include "InfoOutputDev.h" +#endif #include "GfxState.h" #include "../log.h" #include @@ -12,6 +22,7 @@ InfoOutputDev::InfoOutputDev(XRef*xref) num_links = 0; num_images = 0; num_fonts = 0; + num_polygons= 0; currentfont = 0; currentglyph = 0; id2font = new GHash(1); @@ -30,8 +41,8 @@ InfoOutputDev::~InfoOutputDev() } id2font->killIter(&i); - delete id2font; - delete splash; + delete id2font;id2font=0; + delete splash;splash=0; } void FontInfo::grow(int size) { @@ -48,6 +59,9 @@ FontInfo::FontInfo() this->num_glyphs = 0; this->glyphs = 0; this->splash_font = 0; + this->lastchar = -1; + this->lastx = 0; + this->lasty = 0; } FontInfo::~FontInfo() { @@ -64,6 +78,7 @@ FontInfo::~FontInfo() glyphs[t]=0; } } + free(glyphs);glyphs=0; } GBool InfoOutputDev::upsideDown() {return gTrue;} GBool InfoOutputDev::useDrawChar() {return gTrue;} @@ -146,12 +161,25 @@ void InfoOutputDev::updateFont(GfxState *state) state->setCTM(1.0,0,0,1.0,0,0); splash->updateCTM(state, 0,0,0,0,0,0); - state->setTextMat(1.0,0,0,-1.0,0,0); + state->setTextMat(1.0,0,0,1.0,0,0); state->setFont(font, 1024.0); splash->doUpdateFont(state); currentfont->splash_font = splash->getCurrentFont(); + currentfont->ascender = currentfont->splash_font->ascender; + currentfont->descender = currentfont->splash_font->descender; free(id); } + +void InfoOutputDev::fill(GfxState *state) +{ + num_polygons++; +} + +void InfoOutputDev::eoFill(GfxState *state) +{ + num_polygons++; +} + FontInfo* InfoOutputDev::getFont(char*id) { return (FontInfo*)id2font->lookup(id); @@ -179,13 +207,63 @@ void InfoOutputDev::drawChar(GfxState *state, double x, double y, GlyphInfo*g = currentfont->glyphs[code]; if(!g) { g = currentfont->glyphs[code] = new GlyphInfo(); + g->advance_samples = 0; + currentfont->splash_font->last_advance = -1; g->path = currentfont->splash_font->getGlyphPath(code); + g->advance = currentfont->splash_font->last_advance; g->unicode = 0; } if(uLen && (u[0]>=32 && u[0]unicode || !g->unicode)) { g->unicode = u[0]; } + if(currentfont->lastchar>=0 && currentfont->lasty == y) { + double xshift = x - currentfont->lastx; + if(xshift>=0) { + AdvanceSample* old = g->advance_samples; + g->advance_samples = new AdvanceSample(); + g->advance_samples->next = old; + g->advance_samples->advance = xshift; + } + } + + currentfont->lastx = x; + currentfont->lasty = y; + currentfont->lastchar = code; +} + +static int compare_double(const void *_a, const void *_b) +{ + const double*a = (const double*)_a; + const double*b = (const double*)_b; + if(*a < *b) + return -1; + if(*a > *b) + return 1; + return 0; +} +double GlyphInfo::estimateAdvance() +{ + AdvanceSample*a = advance_samples; + int n=0; + while(a) { + n++; + a = a->next; + } + if(!n) + return -1; + double*list = (double*)malloc(sizeof(double)*n); + n = 0; + a = advance_samples; + while(a) { + list[n++] = a->advance; + a = a->next; + } + // FIXME: a true median algorithm would be faster + qsort(list, n, sizeof(double), compare_double); + double median = list[n/2]; + free(list); + return median; } GBool InfoOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen) @@ -216,7 +294,7 @@ GBool InfoOutputDev::beginType3Char(GfxState *state, double x, double y, double currentglyph->x1=0; currentglyph->y1=0; currentglyph->x2=dx; - currentglyph->y2=-dy; + currentglyph->y2=dy; return gFalse; } else { return gTrue; @@ -228,15 +306,15 @@ void InfoOutputDev::type3D0(GfxState *state, double wx, double wy) currentglyph->x1=0; currentglyph->y1=0; currentglyph->x2=wx; - currentglyph->y2=-wy; + currentglyph->y2=wy; } void InfoOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) { currentglyph->x1=llx; - currentglyph->y1=-lly; + currentglyph->y1=lly; currentglyph->x2=urx; - currentglyph->y2=-ury; + currentglyph->y2=ury; } void InfoOutputDev::endType3Char(GfxState *state)