int Make(Value& v) const { GlyphPainter gp; gp.move = gp.pos = Null; gp.tolerance = gk.tolerance; PaintCharacter(gp, Pointf(0, 0), gk.chr, gk.fnt); int sz = gp.glyph.GetCount() * 4; v = RawPickToValue(pick(gp.glyph)); return sz; }
void BufferPainter::ApproximateChar(LinearPathConsumer& t, const CharData& ch, double tolerance) { PAINTER_TIMING("ApproximateChar"); Value v; INTERLOCKED { PAINTER_TIMING("ApproximateChar::Fetch"); static LRUCache<Value, GlyphKey> cache; cache.Shrink(500000); sMakeGlyph h; h.gk.fnt = ch.fnt; h.gk.chr = ch.ch; h.gk.tolerance = tolerance; v = cache.Get(h); } #if 0 GlyphPainter chp; chp.move = chp.pos = Null; chp.tolerance = tolerance; PaintCharacter(chp, ch.p, ch.ch, ch.fnt); Vector<float>& g = chp.glyph; #else const Vector<float>& g = ValueTo< Vector<float> >(v); #endif int i = 0; while(i < g.GetCount()) { Pointf p; p.x = g[i++]; if(p.x > 1e30) { p.x = g[i++]; p.y = g[i++]; t.Move(p + ch.p); } else { PAINTER_TIMING("ApproximateChar::Line"); p.y = g[i++]; t.Line(p + ch.p); } } }
void BoundsPainter::CharacterOp(const Pointf& p, int ch, Font fnt) { PaintCharacter(*this, p, ch, fnt); }