paintDiagramGrid function

void paintDiagramGrid(
  1. Canvas canvas, {
  2. required DiagramGridPattern pattern,
  3. required DiagramRect bounds,
  4. required double gridSize,
  5. required double zoom,
  6. Color? minorColor,
  7. Color? majorColor,
})

Projects a canonical grid pattern in world coordinates. Density reduction is shared with interaction snapping (DiagramGridSnapping) to avoid hidden subdivisions.

minorColor and majorColor override the finest and the coarser layers' colors (a canvas theme); null keeps the pattern's own colors.

Implementation

void paintDiagramGrid(
  Canvas canvas, {
  required DiagramGridPattern pattern,
  required DiagramRect bounds,
  required double gridSize,
  required double zoom,
  Color? minorColor,
  Color? majorColor,
}) {
  if (!gridSize.isFinite ||
      gridSize <= 0 ||
      !zoom.isFinite ||
      zoom <= 0 ||
      !bounds.left.isFinite ||
      !bounds.top.isFinite ||
      !bounds.width.isFinite ||
      !bounds.height.isFinite ||
      !bounds.right.isFinite ||
      !bounds.bottom.isFinite ||
      bounds.width <= 0 ||
      bounds.height <= 0) {
    return;
  }
  final spacing = diagramVisibleGridSpacing(
    pattern: pattern,
    bounds: bounds,
    gridSize: gridSize,
    zoom: zoom,
  );
  if (!spacing.isFinite) return;
  final finest = pattern.layers.isEmpty
      ? 0
      : pattern.layers.map((layer) => layer.spacingMultiple).reduce(math.min);
  for (final layer in pattern.layers) {
    final step = spacing * layer.spacingMultiple;
    if (!step.isFinite) continue;
    final left = (bounds.left / step).floor();
    final right = (bounds.right / step).ceil();
    final top = (bounds.top / step).floor();
    final bottom = (bounds.bottom / step).ceil();
    final paint = Paint()
      ..color =
          (layer.spacingMultiple == finest ? minorColor : majorColor) ??
          layer.color.toColor();
    final points = <Offset>[];
    switch (layer) {
      case DiagramLineGridLayer():
        paint.strokeWidth = layer.size / zoom;
        for (var column = left; column <= right; column++) {
          points.addAll([
            Offset(column * step, bounds.top),
            Offset(column * step, bounds.bottom),
          ]);
        }
        for (var row = top; row <= bottom; row++) {
          points.addAll([
            Offset(bounds.left, row * step),
            Offset(bounds.right, row * step),
          ]);
        }
        canvas.drawPoints(PointMode.lines, points, paint);
      case DiagramDotGridLayer():
        paint
          ..strokeWidth = layer.size / zoom
          ..strokeCap = StrokeCap.round;
        for (var column = left; column <= right; column++) {
          for (var row = top; row <= bottom; row++) {
            points.add(Offset(column * step, row * step));
          }
        }
        canvas.drawPoints(PointMode.points, points, paint);
      case DiagramCrossGridLayer():
        paint.strokeWidth = 1 / zoom;
        final arm = layer.size / zoom;
        for (var column = left; column <= right; column++) {
          for (var row = top; row <= bottom; row++) {
            final x = column * step;
            final y = row * step;
            points.addAll([
              Offset(x - arm, y),
              Offset(x + arm, y),
              Offset(x, y - arm),
              Offset(x, y + arm),
            ]);
          }
        }
        canvas.drawPoints(PointMode.lines, points, paint);
    }
  }
}