QPainterPath ConnectionPainter:: getPainterStroke(ConnectionGeometry const& geom) { auto cubic = cubicPath(geom); QPointF const& source = geom.source(); QPainterPath result(source); unsigned segments = 20; for (auto i = 0ul; i < segments; ++i) { double ratio = double(i + 1) / segments; result.lineTo(cubic.pointAtPercent(ratio)); } QPainterPathStroker stroker; stroker.setWidth(10.0); return stroker.createStroke(result); }
void onDrawContent(SkCanvas* canvas) override { const float SCALE = 1; canvas->translate(30, 40); canvas->scale(SCALE, SCALE); SkPoint p1 = SkPoint::Make(50, 50); SkPoint p2 = SkPoint::Make(80, 50); SkPath path; switch (fPathType) { case 0: path = quadPath(p1, p2); break; case 1: path = cubicPath(p1, p2); break; case 2: path = rectPath(p1); break; case 3: path = linSemicirclePath(p1, p2); break; default: path = quadPath(p1, p2); break; } if (fClosePath) { path.close(); } SkPaint p; p.setColor(SK_ColorRED); p.setAntiAlias(true); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(fStroke); canvas->drawPath(path, p); if (fDumpHex) { std::cerr << "path dumpHex" << std::endl; path.dumpHex(); } SkPaint hairp; hairp.setColor(SK_ColorBLACK); hairp.setAntiAlias(true); hairp.setStyle(SkPaint::kStroke_Style); if (fDrawFillPath) { SkPath fillpath; p.getFillPath(path, &fillpath); canvas->drawPath(fillpath, hairp); if (fDumpHex) { std::cerr << "fillpath dumpHex" << std::endl; fillpath.dumpHex(); } } if (fDumpHex) { std::cerr << std::endl; fDumpHex = false; } // draw original path with green hairline hairp.setColor(SK_ColorGREEN); canvas->drawPath(path, hairp); }
void ConnectionPainter:: paint(QPainter* painter, ConnectionGeometry const& geom, ConnectionState const& state) { double const lineWidth = geom.lineWidth(); double const pointDiameter = geom.pointDiameter(); #ifdef DEBUG_DRAWING { QPointF const& source = geom.source(); QPointF const& sink = geom.sink(); auto points = geom.pointsC1C2(); painter->setPen(Qt::red); painter->setBrush(Qt::red); painter->drawLine(QLineF(source, points.first)); painter->drawLine(QLineF(points.first, points.second)); painter->drawLine(QLineF(points.second, sink)); painter->drawEllipse(points.first, 4, 4); painter->drawEllipse(points.second, 4, 4); painter->setBrush(Qt::NoBrush); painter->drawPath(cubicPath()); } #endif auto cubic = cubicPath(geom); bool const hovered = geom.hovered(); if (hovered) { QPen p; p.setWidth(2 * lineWidth); p.setColor(QColor(Qt::cyan).lighter()); painter->setPen(p); painter->setBrush(Qt::NoBrush); // cubic spline painter->drawPath(cubic); } // draw normal line { QPen p; p.setWidth(lineWidth); p.setColor(QColor(Qt::cyan).darker(150)); if (state.requiresPort()) { p.setWidth(2.0); p.setColor(QColor(Qt::gray)); p.setStyle(Qt::DashLine); } painter->setPen(p); painter->setBrush(Qt::NoBrush); // cubic spline painter->drawPath(cubic); } QPointF const& source = geom.source(); QPointF const& sink = geom.sink(); painter->setPen(Qt::white); painter->setBrush(Qt::white); double const pointRadius = pointDiameter / 2.0; painter->drawEllipse(source, pointRadius, pointRadius); painter->drawEllipse(sink, pointRadius, pointRadius); }