// lib/editor/render/live_ink_painter.dart // // CustomPainter for the in-progress stroke (live) layer. // // Paints only the single EditorStroke? currently being drawn, with // isComplete:false so perfect_freehand tapers the trailing end correctly. // Kept in a separate RepaintBoundary so committed strokes are never // re-rasterized on pointer-move events. import 'package:flutter/material.dart'; import '../engine/stroke_geometry.dart'; import '../engine/stroke_model.dart'; /// Paints the single in-progress [EditorStroke] (or nothing when [live] is /// null / empty). Use alongside [StaticInkPainter] in stacked [CustomPaint]s. class LiveInkPainter extends CustomPainter { const LiveInkPainter({ required this.live, required this.pageSize, this.thinning = kDefaultPenThinning, }); /// The stroke currently being drawn, or null when idle. final EditorStroke? live; final Size pageSize; /// perfect_freehand pressure→width response (from `PenConfig.pressureSensitivity`), /// kept consistent with the static layer so the stroke doesn't change width /// the instant it commits. final double thinning; @override void paint(Canvas canvas, Size size) { final stroke = live; if (stroke == null || stroke.points.isEmpty) return; final path = buildStrokeOutline(stroke, pageSize, isComplete: false, thinning: thinning); if (path.getBounds().isEmpty) return; canvas.drawPath(path, paintForEditorStroke(stroke)); } @override bool shouldRepaint(LiveInkPainter old) => !identical(old.live, live) || old.pageSize != pageSize || old.thinning != thinning; }