measureText static method

NodeLayout measureText(
  1. String delimiter,
  2. RenderContext delimiterStyle, {
  3. Uint8List? fontBytes,
})

Implementation

static NodeLayout measureText(
  String delimiter,
  RenderContext delimiterStyle, {
  Uint8List? fontBytes,
}) {
  final textSpan = TextSpan(
    text: delimiter,
    style: delimiterStyle.textStyle(),
  );
  final textPainter = TextPainter(
    text: textSpan,
    textDirection: TextDirection.ltr,
  )..layout();

  final baseline = textPainter.computeDistanceToActualBaseline(
    TextBaseline.alphabetic,
  );
  final fontSizePx = delimiterStyle.fontSize;

  GlyphBounds? precise;
  if (fontBytes != null) {
    try {
      precise = measureGlyphBounds(
        text: delimiter,
        fontSizePx: fontSizePx,
        fontBytes: fontBytes,
        fontWeightValue: delimiterStyle.fontWeight?.value ?? 400,
      );
    } catch (_) {}
  }

  final topOffset = precise != null ? (baseline - precise.ascentPx) : 0.0;

  // THE FIX WE KEEP:
  // Do NOT use precise?.inkWidth. Use textPainter.width to keep the
  // font's mathematical padding so text like 'x=0' doesn't collide.
  final width = textPainter.width;

  final height = precise?.inkHeight ?? textPainter.height;

  return NodeLayout(
    width: width,
    height: height,
    baseline: precise?.ascentPx ?? baseline,
    draw: (Canvas canvas, double x, double y) {
      textPainter.paint(canvas, Offset(x, y - topOffset));
    },
  );
}