recordDanmakuImage static method

Image recordDanmakuImage({
  1. required Paragraph contentParagraph,
  2. required DanmakuContentItem content,
  3. required double fontSize,
  4. required int fontWeight,
  5. required double strokeWidth,
  6. required double devicePixelRatio,
  7. String? fontFamily,
})

Implementation

static ui.Image recordDanmakuImage({
  required ui.Paragraph contentParagraph,
  required DanmakuContentItem content,
  required double fontSize,
  required int fontWeight,
  required double strokeWidth,
  required double devicePixelRatio,
  String? fontFamily,
}) {
  double w = contentParagraph.maxIntrinsicWidth + strokeWidth;
  double h = contentParagraph.height + strokeWidth;

  final offset = Offset(
    (strokeWidth / 2.0) + (content.selfSend ? 2.0 : 0.0),
    strokeWidth / 2.0,
  );

  final rec = ui.PictureRecorder();
  final canvas = ui.Canvas(rec)..scale(devicePixelRatio);

  if (strokeWidth != 0) {
    final builder = ui.ParagraphBuilder(ui.ParagraphStyle(
      textAlign: TextAlign.left,
      fontWeight: FontWeight.values[fontWeight],
      textDirection: TextDirection.ltr,
      maxLines: 1,
      fontFamily: fontFamily,
    ));
    final Paint strokePaint = Paint()
      ..shader = content.isColorful
          ? const LinearGradient(
                  colors: [Color(0xFFF2509E), Color(0xFF308BCD)])
              .createShader(Rect.fromLTWH(0, 0, w, h))
          : null
      ..style = PaintingStyle.stroke
      ..strokeWidth = strokeWidth;

    if (!content.isColorful) {
      strokePaint.color = Colors.black;
    }

    if (content.count case final count?) {
      builder
        ..pushStyle(ui.TextStyle(
          fontSize: fontSize * 0.6,
          foreground: strokePaint,
          fontFamily: fontFamily,
        ))
        ..addText('($count)')
        ..pop();
    }

    builder
      ..pushStyle(ui.TextStyle(
          fontSize: fontSize,
          foreground: strokePaint,
          fontFamily: fontFamily))
      ..addText(content.text);

    final strokeParagraph = builder.build()
      ..layout(const ui.ParagraphConstraints(width: double.infinity));

    canvas.drawParagraph(strokeParagraph, offset);
    strokeParagraph.dispose();
  }

  canvas.drawParagraph(contentParagraph, offset);

  if (content.selfSend) {
    w += 4;
    canvas.drawRect(Rect.fromLTRB(0, 0, w, h), _selfSendPaint);
  }

  final pic = rec.endRecording();
  final img = pic.toImageSync(
    (w * devicePixelRatio).ceil(),
    (h * devicePixelRatio).ceil(),
  );
  pic.dispose();
  return img;
}