draw method

void draw(
  1. Canvas canvas,
  2. Painter painter
)

Calls painter once per enabled paint, in ascending priority order, with canvas translated to that entry's offset and back again.

Pass a function that already exists rather than a literal, so a node drawing every frame allocates nothing:

void painter(Canvas canvas, Paint paint) { ... }

draw((canvas) {
  palette.draw(canvas, painter);
});

Implementation

void draw(Canvas canvas, Painter painter) {
  for (final entry in _paints) {
    if (!entry.enabled) continue;
    final offset = entry.offset;
    // TODO: Profile the different ways to do this.
    final hasOffset = !offset.isZero;
    if (hasOffset) canvas.translate(offset.x, offset.y);
    painter(canvas, entry.paint);
    if (hasOffset) canvas.translate(-offset.x, -offset.y);
  }
}