recordDanmakuImage static method
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;
}