void applyVerticalHintingTransform (float fontSize, Path& path) { if (cachedSize != fontSize) { cachedSize = fontSize; cachedScale = Scaling (top, middle, bottom, fontSize); } if (bottom < top + 3.0f / fontSize) return; Path result; for (Path::Iterator i (path); i.next();) { switch (i.elementType) { case Path::Iterator::startNewSubPath: result.startNewSubPath (i.x1, cachedScale.apply (i.y1)); break; case Path::Iterator::lineTo: result.lineTo (i.x1, cachedScale.apply (i.y1)); break; case Path::Iterator::quadraticTo: result.quadraticTo (i.x1, cachedScale.apply (i.y1), i.x2, cachedScale.apply (i.y2)); break; case Path::Iterator::cubicTo: result.cubicTo (i.x1, cachedScale.apply (i.y1), i.x2, cachedScale.apply (i.y2), i.x3, cachedScale.apply (i.y3)); break; case Path::Iterator::closePath: result.closeSubPath(); break; default: jassertfalse; break; } } result.swapWithPath (path); }
void PaintElementPath::setToPath (const Path& newPath) { points.clear(); Path::Iterator i (newPath); while (i.next()) { ScopedPointer<PathPoint> p (new PathPoint (this)); p->type = i.elementType; if (i.elementType == Path::Iterator::startNewSubPath) { p->pos [0].rect.setX (i.x1); p->pos [0].rect.setY (i.y1); } else if (i.elementType == Path::Iterator::lineTo) { p->pos [0].rect.setX (i.x1); p->pos [0].rect.setY (i.y1); } else if (i.elementType == Path::Iterator::quadraticTo) { p->pos [0].rect.setX (i.x1); p->pos [0].rect.setY (i.y1); p->pos [1].rect.setX (i.x2); p->pos [1].rect.setY (i.y2); } else if (i.elementType == Path::Iterator::cubicTo) { p->pos [0].rect.setX (i.x1); p->pos [0].rect.setY (i.y1); p->pos [1].rect.setX (i.x2); p->pos [1].rect.setY (i.y2); p->pos [2].rect.setX (i.x3); p->pos [2].rect.setY (i.y3); } else if (i.elementType == Path::Iterator::closePath) { } else { continue; } points.add (p.release()); } }
RelativePointPath::RelativePointPath (const Path& path) : usesNonZeroWinding (path.isUsingNonZeroWinding()), containsDynamicPoints (false) { for (Path::Iterator i (path); i.next();) { switch (i.elementType) { case Path::Iterator::startNewSubPath: elements.add (new StartSubPath (RelativePoint (i.x1, i.y1))); break; case Path::Iterator::lineTo: elements.add (new LineTo (RelativePoint (i.x1, i.y1))); break; case Path::Iterator::quadraticTo: elements.add (new QuadraticTo (RelativePoint (i.x1, i.y1), RelativePoint (i.x2, i.y2))); break; case Path::Iterator::cubicTo: elements.add (new CubicTo (RelativePoint (i.x1, i.y1), RelativePoint (i.x2, i.y2), RelativePoint (i.x3, i.y3))); break; case Path::Iterator::closePath: elements.add (new CloseSubPath()); break; default: jassertfalse; break; } } }
void LowLevelGraphicsPostScriptRenderer::writePath (const Path& path) const { out << "newpath "; float lastX = 0.0f; float lastY = 0.0f; int itemsOnLine = 0; Path::Iterator i (path); while (i.next()) { if (++itemsOnLine == 4) { itemsOnLine = 0; out << '\n'; } switch (i.elementType) { case Path::Iterator::startNewSubPath: writeXY (i.x1, i.y1); lastX = i.x1; lastY = i.y1; out << "m "; break; case Path::Iterator::lineTo: writeXY (i.x1, i.y1); lastX = i.x1; lastY = i.y1; out << "l "; break; case Path::Iterator::quadraticTo: { const float cp1x = lastX + (i.x1 - lastX) * 2.0f / 3.0f; const float cp1y = lastY + (i.y1 - lastY) * 2.0f / 3.0f; const float cp2x = cp1x + (i.x2 - lastX) / 3.0f; const float cp2y = cp1y + (i.y2 - lastY) / 3.0f; writeXY (cp1x, cp1y); writeXY (cp2x, cp2y); writeXY (i.x2, i.y2); out << "ct "; lastX = i.x2; lastY = i.y2; } break; case Path::Iterator::cubicTo: writeXY (i.x1, i.y1); writeXY (i.x2, i.y2); writeXY (i.x3, i.y3); out << "ct "; lastX = i.x3; lastY = i.y3; break; case Path::Iterator::closePath: out << "cp "; break; default: jassertfalse; break; } } out << '\n'; }
void Direct2DLowLevelGraphicsContext::pathToGeometrySink (const Path& path, ID2D1GeometrySink* sink, const AffineTransform& transform) { Path::Iterator it (path); while (it.next()) { switch (it.elementType) { case Path::Iterator::cubicTo: { D2D1_BEZIER_SEGMENT seg; transform.transformPoint (it.x1, it.y1); seg.point1 = D2D1::Point2F (it.x1, it.y1); transform.transformPoint (it.x2, it.y2); seg.point2 = D2D1::Point2F (it.x2, it.y2); transform.transformPoint(it.x3, it.y3); seg.point3 = D2D1::Point2F (it.x3, it.y3); sink->AddBezier (seg); break; } case Path::Iterator::lineTo: { transform.transformPoint (it.x1, it.y1); sink->AddLine (D2D1::Point2F (it.x1, it.y1)); break; } case Path::Iterator::quadraticTo: { D2D1_QUADRATIC_BEZIER_SEGMENT seg; transform.transformPoint (it.x1, it.y1); seg.point1 = D2D1::Point2F (it.x1, it.y1); transform.transformPoint (it.x2, it.y2); seg.point2 = D2D1::Point2F (it.x2, it.y2); sink->AddQuadraticBezier (seg); break; } case Path::Iterator::closePath: { sink->EndFigure (D2D1_FIGURE_END_CLOSED); break; } case Path::Iterator::startNewSubPath: { transform.transformPoint (it.x1, it.y1); sink->BeginFigure (D2D1::Point2F (it.x1, it.y1), D2D1_FIGURE_BEGIN_FILLED); break; } } } }