int traceConicBezier(FT_VECTOR_PARAMETER *control, FT_VECTOR_PARAMETER *to, void *obj) { Glyph *glyph = reinterpret_cast<Glyph *>(obj); Affine &affine = glyph->affine(); BezierPathLibart *path = static_cast<BezierPathLibart *>(glyph->modifiableBezierPath()); int index = path->m_array.count(); if(!(index > 0)) return -1; path->m_array.resize(index + 1); ArtBpath *s = &path->m_array[index - 1]; ArtBpath *e = &path->m_array[index]; e->code = ART_CURVETO; Point c = affine.mapPoint(Point(control->x, control->y)); Point p = affine.mapPoint(Point(to->x, to->y)); e->x3 = p.x(); e->y3 = p.y(); path->m_array[index].x1 = c.x() - (c.x() - s->x3) / 3; path->m_array[index].y1 = c.y() - (c.y() - s->y3) / 3; path->m_array[index].x2 = c.x() + (e->x3 - c.x()) / 3; path->m_array[index].y2 = c.y() + (e->y3 - c.y()) / 3; return 0; }
int traceLineto(FT_VECTOR_PARAMETER *to, void *obj) { Glyph *glyph = reinterpret_cast<Glyph *>(obj); Affine &affine = glyph->affine(); BezierPathLibart *path = static_cast<BezierPathLibart *>(glyph->modifiableBezierPath()); Point p = affine.mapPoint(Point(to->x, to->y)); int index = path->m_array.count(); ArtBpath *last = &path->m_array[index - 1]; if((p.x() != last->x3) || (p.y() != last->y3)) { path->m_array.resize(index + 1); path->m_array[index].code = ART_LINETO; path->m_array[index].x3 = p.x(); path->m_array[index].y3 = p.y(); } return 0; }
int traceCubicBezier(FT_VECTOR_PARAMETER *control1, FT_VECTOR_PARAMETER *control2, FT_VECTOR_PARAMETER *to, void *obj) { Glyph *glyph = reinterpret_cast<Glyph *>(obj); Affine &affine = glyph->affine(); BezierPathLibart *path = static_cast<BezierPathLibart *>(glyph->modifiableBezierPath()); Point p = affine.mapPoint(Point(to->x, to->y)); Point c1 = affine.mapPoint(Point(control1->x, control1->y)); Point c2 = affine.mapPoint(Point(control2->x, control2->y)); int index = path->m_array.count(); path->m_array.resize(index + 1); path->m_array[index].code = ART_CURVETO; path->m_array[index].x1 = c1.x(); path->m_array[index].y1 = c1.y(); path->m_array[index].x2 = c2.x(); path->m_array[index].y2 = c2.y(); path->m_array[index].x3 = p.x(); path->m_array[index].y3 = p.y(); return 0; }