void Path::addPath (const Path& other, const AffineTransform& transformToApply) { size_t i = 0; const float* const d = other.data.elements; while (i < other.numElements) { const float type = d [i++]; if (type == closeSubPathMarker) { closeSubPath(); } else { float x = d[i++]; float y = d[i++]; transformToApply.transformPoint (x, y); if (type == moveMarker) { startNewSubPath (x, y); } else if (type == lineMarker) { lineTo (x, y); } else if (type == quadMarker) { float x2 = d [i++]; float y2 = d [i++]; transformToApply.transformPoint (x2, y2); quadraticTo (x, y, x2, y2); } else if (type == cubicMarker) { float x2 = d [i++]; float y2 = d [i++]; float x3 = d [i++]; float y3 = d [i++]; transformToApply.transformPoints (x2, y2, x3, y3); cubicTo (x, y, x2, y2, x3, y3); } else { // something's gone wrong with the element list! jassertfalse; } } } }
//============================================================================== void Path::applyTransform (const AffineTransform& transform) noexcept { bounds.reset(); bool firstPoint = true; float* d = data.elements; float* const end = d + numElements; while (d < end) { const float type = *d++; if (type == moveMarker) { transform.transformPoint (d[0], d[1]); if (firstPoint) { firstPoint = false; bounds.reset (d[0], d[1]); } else { bounds.extend (d[0], d[1]); } d += 2; } else if (type == lineMarker) { transform.transformPoint (d[0], d[1]); bounds.extend (d[0], d[1]); d += 2; } else if (type == quadMarker) { transform.transformPoints (d[0], d[1], d[2], d[3]); bounds.extend (d[0], d[1], d[2], d[3]); d += 4; } else if (type == cubicMarker) { transform.transformPoints (d[0], d[1], d[2], d[3], d[4], d[5]); bounds.extend (d[0], d[1], d[2], d[3]); bounds.extend (d[4], d[5]); d += 6; } } }
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; } } } }
const D2D1_POINT_2F Direct2DLowLevelGraphicsContext::pointTransformed (int x, int y, const AffineTransform& transform) { transform.transformPoint (x, y); return D2D1::Point2F ((FLOAT) x, (FLOAT) y); }