this->num_glyphs = 0;
this->glyphs = 0;
this->splash_font = 0;
+ this->lastchar = -1;
+ this->lastx = 0;
+ this->lasty = 0;
}
FontInfo::~FontInfo()
{
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);
}
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]<g->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)