feat(pen): extensible brush model (4 brushes)
All checks were successful
CI / Windows build (push) Successful in 14m54s
All checks were successful
CI / Windows build (push) Successful in 14m54s
Replace the 2-tool ink system with a data-driven, Krita-style BrushProfile (lib/editor/engine/brush.dart). Adding a brush is a const map entry, not render-path branching. Four presets from the rnote/krita spec: - fountain pen: quadratic (p^2) pressure, wide dynamic width - ballpoint: near-constant width (thinning 0.15) - highlighter: flat width, square caps - pencil: sqrt(p) pressure, moderate width Pressure is pre-warped per brush via PressureCurve(gamma) before perfect_freehand; geometry fields (thinning/streamline/smoothing/ caps) flow through the shared stroke recipe so the PDF overlay and the note/slide PenCanvas both honor the brush. Brush kind is now persisted on the stroke model. Picker added to all three toolbars. Opacity/multiply and pencil grain are carried as data but not yet composited (TODO brush-opacity / brush-texture); this increment is width + pressure-curve differentiation. analyze clean, 283 tests.
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import '../engine/brush.dart';
|
||||
|
||||
/// A single captured sample of a stroke.
|
||||
///
|
||||
/// [x]/[y] are normalized to the page rectangle ([0,1]).
|
||||
@@ -35,6 +37,7 @@ class PenStroke {
|
||||
required this.color,
|
||||
required this.width,
|
||||
required this.kind,
|
||||
this.brush = BrushKind.fountainPen,
|
||||
});
|
||||
|
||||
/// Normalized points (see [PenPoint]).
|
||||
@@ -48,4 +51,12 @@ class PenStroke {
|
||||
final double width;
|
||||
|
||||
final PenStrokeKind kind;
|
||||
|
||||
/// The brush this stroke was drawn with — drives the perfect_freehand
|
||||
/// geometry (thinning/streamline/smoothing/caps) at render time via
|
||||
/// [brushProfileFor]. The pressure pre-warp ([BrushProfile.pressureGamma]) is
|
||||
/// applied at CAPTURE so it is already baked into [points]. Defaults to
|
||||
/// [BrushKind.fountainPen] (the legacy pen visual) so old/loaded strokes keep
|
||||
/// rendering as before.
|
||||
final BrushKind brush;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user