in packages/diagrams/lib/src/text.dart [178:308]
void paint(Canvas canvas, Size size) {
textPainter.layout();
final List<TextBox> boxes = textPainter.getBoxesForSelection(
const TextSelection(baseOffset: 0, extentOffset: largeIndex));
final Paint paint = Paint();
paint.color = Colors.black;
paint.strokeWidth = 3.5;
const double top = 0;
final double bottom = textPainter.height;
final double baseline =
textPainter.computeDistanceToActualBaseline(TextBaseline.alphabetic);
final double ratio = 100.0 / textPainter.height;
final double emTop = baseline - (baseline - top) * ratio;
final double emBottom = baseline + (bottom - baseline) * ratio;
final double width = boxes[boxes.length - 1].right;
final Offset baseOffset = Offset(
(size.width - width) / 2, (size.height - textPainter.height) / 2);
textPainter.paint(canvas, baseOffset);
// Baseline
canvas.drawLine(
baseOffset + Offset(0, baseline),
baseOffset + Offset(width, baseline),
paint,
);
paint.color = Colors.blue[900]!;
// Top
canvas.drawLine(
baseOffset,
baseOffset + Offset(width, top),
paint,
);
// Bottom
canvas.drawLine(
baseOffset + Offset(0, bottom),
baseOffset + Offset(width, bottom),
paint,
);
paint.strokeWidth = 2;
paint.color = Colors.red[900]!;
// emTop
canvas.drawLine(
baseOffset + Offset(0, emTop),
baseOffset + Offset(width, emTop),
paint,
);
// emBottom
canvas.drawLine(
baseOffset + Offset(0, emBottom),
baseOffset + Offset(width, emBottom),
paint,
);
paint.strokeWidth = 2;
paint.style = PaintingStyle.stroke;
Path path = Path();
path.moveTo(baseOffset.dx + width + 10, baseOffset.dy + emTop);
path.lineTo(baseOffset.dx + width + 25, baseOffset.dy + emTop);
path.lineTo(baseOffset.dx + width + 25, baseOffset.dy + emBottom);
path.lineTo(baseOffset.dx + width + 10, baseOffset.dy + emBottom);
canvas.drawPath(path, paint);
paint.color = Colors.blue[900]!;
path = Path();
path.moveTo(baseOffset.dx - 10, baseOffset.dy + top);
path.lineTo(baseOffset.dx - 25, baseOffset.dy + top);
path.lineTo(baseOffset.dx - 25, baseOffset.dy + bottom);
path.lineTo(baseOffset.dx - 10, baseOffset.dy + bottom);
canvas.drawPath(path, paint);
const double margin = 8;
TextPainter label = TextPainter(
text: const TextSpan(
text: 'Font metrics\ndefault height',
style: TextStyle(
fontSize: 12,
color: Colors.black,
),
),
textAlign: TextAlign.right,
textDirection: TextDirection.ltr,
);
label.layout();
label.paint(
canvas,
baseOffset +
Offset(-25.0 - (paint.strokeWidth + margin) - label.width,
(top + bottom) / 2 - 16));
paint.color = Colors.red[900]!;
label = TextPainter(
text: const TextSpan(
text: 'Font Size\n(EM-square)',
style: TextStyle(
fontSize: 12,
color: Colors.black,
),
),
textAlign: TextAlign.left,
textDirection: TextDirection.ltr,
);
label.layout();
label.paint(canvas,
baseOffset + Offset(width + 25 + margin, (emTop + emBottom) / 2 - 16));
paint.color = Colors.black;
// Baseline label
label = TextPainter(
text: const TextSpan(
text: 'Alphabetic Baseline',
style: TextStyle(
fontSize: 11,
color: Colors.black,
),
),
textAlign: TextAlign.left,
textDirection: TextDirection.ltr,
);
label.layout();
label.paint(canvas, baseOffset + Offset(0, baseline + 3));
}