void paint()

in packages/diagrams/lib/src/curve.dart [95:195]


  void paint(Canvas canvas, Size size) {
    assert(size != Size.zero);
    final double unit = _zero.width / 4.0;
    final double leftMargin = unit * 6.0;
    final double rightMargin = 3.0 * unit + _t.width;
    final double bottomMargin = unit / 2.0;
    final double verticalHeadroom = size.height * 0.2;
    final double markerWidth = unit * 3.0;

    final Rect area = Rect.fromLTRB(
      leftMargin,
      verticalHeadroom,
      size.width - rightMargin,
      size.height - verticalHeadroom,
    );
    final Path axes = Path()
      ..moveTo(area.left - unit, area.top) // vertical axis 1.0 tick
      ..lineTo(area.left, area.top) // vertical axis
      ..lineTo(area.left, area.bottom) // origin
      ..lineTo(area.right, area.bottom) // horizontal axis
      ..lineTo(area.right, area.bottom + unit); // horizontal axis 1.0 tick
    canvas.drawPath(axes, _axisPaint);
    final Path dashLine = Path();
    final double delta = 8.0 / area.width;
    assert(delta > 0.0);
    for (double t = 0.0; t < 1.0; t += delta) {
      final Offset point1 = FractionalOffset(t, 0.0).withinRect(area);
      final Offset point2 =
          FractionalOffset(t + delta / 2.0, 0.0).withinRect(area);
      dashLine
        ..moveTo(point1.dx, point1.dy)
        ..lineTo(point2.dx, point2.dy);
    }
    canvas.drawPath(dashLine, _dashPaint);

    _one.paint(
      canvas,
      Offset(area.left - leftMargin + (_zero.width - _one.width),
          area.top - _one.height / 2.0),
    );
    _one.paint(
        canvas,
        Offset(
            area.right - _one.width / 2.0, area.bottom + bottomMargin + unit));
    _x.paint(canvas, Offset(area.left + _x.width, area.top));
    _t.paint(canvas,
        Offset(area.right - _t.width, area.bottom - _t.height - unit / 2.0));
    _caption.paint(
      canvas,
      Offset(
        leftMargin + (area.width - _caption.width) / 2.0,
        size.height - (verticalHeadroom + _caption.height) / 2.0,
      ),
    );
    final Offset activePoint = FractionalOffset(
      position,
      1.0 - curve.transform(position),
    ).withinRect(area);
    // Skip drawing the tracing line if we're at 0.0 because we want the
    // initial paused state to not include the position indicators. They just
    // add clutter before the animation is started.
    if (position != 0.0) {
      final Path positionLine = Path()
        ..moveTo(activePoint.dx, area.bottom)
        ..lineTo(activePoint.dx, area.top); // vertical pointer from base
      canvas.drawPath(positionLine, _positionPaint);
      final Path valueMarker = Path()
        ..moveTo(area.right + unit, activePoint.dy)
        ..lineTo(area.right + unit * 2.0, activePoint.dy - unit)
        ..lineTo(area.right + unit * 2.0 + markerWidth, activePoint.dy - unit)
        ..lineTo(area.right + unit * 2.0 + markerWidth, activePoint.dy + unit)
        ..lineTo(area.right + unit * 2.0, activePoint.dy + unit)
        ..lineTo(area.right + unit, activePoint.dy);
      canvas.drawPath(valueMarker, _valueMarkerPaint);
    }
    final Path graph = Path()..moveTo(area.left, area.bottom);
    final double stepSize = 1.0 / (area.width * ui.window.devicePixelRatio);
    for (double t = 0.0;
        t <= (position == 0.0 ? 1.0 : position);
        t += stepSize) {
      final Offset point =
          FractionalOffset(t, 1.0 - curve.transform(t)).withinRect(area);
      graph.lineTo(point.dx, point.dy);
    }
    canvas.drawPath(graph, _graphPaint);
    if (position != 0.0) {
      final Offset startPoint = FractionalOffset(
        position,
        1.0 - curve.transform(position),
      ).withinRect(area);
      final Path graphProgress = Path()..moveTo(startPoint.dx, startPoint.dy);
      for (double t = position; t <= 1.0; t += stepSize) {
        final Offset point =
            FractionalOffset(t, 1.0 - curve.transform(t)).withinRect(area);
        graphProgress.lineTo(point.dx, point.dy);
      }
      canvas.drawPath(graphProgress, _graphProgressPaint);
      canvas.drawCircle(
          Offset(activePoint.dx, activePoint.dy), 4.0, _positionCirclePaint);
    }
  }