processSubtitleAttributes static method
(TextOriginAndExtent?, TextStyle?, AlignmentGeometry, Color, double, Paint)
processSubtitleAttributes(
- List<
SubtitleAttribute> subtitleAttributes
Process subtitle attributes and return the text alignment and text style.
Implementation
static (TextOriginAndExtent?, TextStyle?, AlignmentGeometry, Color, double, Paint)
processSubtitleAttributes(List<SubtitleAttribute> subtitleAttributes) {
TextOriginAndExtent actualTextOriginAndExtent = TextOriginAndExtent.none;
var actualTextStyle = const TextStyle(height: 1.0, fontSize: 1 / 15.0);
AlignmentGeometry actualTextAlign = Alignment.center;
var actualWindowBgColor = const Color(0x00000000); // default transparent color.
double actualFontSize = 1 / 15.0;
var foreground = Paint()..style = PaintingStyle.stroke;
if (subtitleAttributes.isEmpty) {
return (
actualTextOriginAndExtent,
actualTextStyle,
actualTextAlign,
actualWindowBgColor,
actualFontSize,
foreground
);
}
for (final attr in subtitleAttributes) {
switch (attr.attrType) {
// For text origin and extent.
case SubtitleAttrType.subAttrRegionXPos:
final xPos = attr.attrValue as double;
if (xPos > 0) {
actualTextOriginAndExtent = actualTextOriginAndExtent.addValue(originX: xPos);
}
case SubtitleAttrType.subAttrRegionYPos:
final yPos = attr.attrValue as double;
if (yPos > 0) {
actualTextOriginAndExtent = actualTextOriginAndExtent.addValue(originY: yPos);
}
case SubtitleAttrType.subAttrRegionWidth:
final width = attr.attrValue as double;
if (width > 0) {
actualTextOriginAndExtent = actualTextOriginAndExtent.addValue(extentWidth: width);
}
case SubtitleAttrType.subAttrRegionHeight:
final height = attr.attrValue as double;
if (height > 0) {
actualTextOriginAndExtent = actualTextOriginAndExtent.addValue(extentHeight: height);
}
// For text style.
case SubtitleAttrType.subAttrFontFamily:
actualTextStyle = actualTextStyle.copyWith(fontFamily: attr.attrValue as String);
case SubtitleAttrType.subAttrFontSize:
final fontSize = attr.attrValue as double;
if (fontSize > 0) {
actualFontSize = fontSize;
}
case SubtitleAttrType.subAttrFontWeight:
actualTextStyle =
actualTextStyle.copyWith(fontWeight: _intToFontWeight(attr.attrValue as int));
case SubtitleAttrType.subAttrFontStyle:
actualTextStyle =
actualTextStyle.copyWith(fontStyle: _intToFontStyle(attr.attrValue as int));
case SubtitleAttrType.subAttrFontColor:
if (actualTextStyle.foreground == null) {
actualTextStyle = actualTextStyle.copyWith(color: _intToColor(attr.attrValue as int));
}
case SubtitleAttrType.subAttrFontBgColor:
if (actualTextStyle.background == null) {
actualTextStyle =
actualTextStyle.copyWith(backgroundColor: _intToColor(attr.attrValue as int));
}
case SubtitleAttrType.subAttrFontOpacity:
final fontOpacity = attr.attrValue as double;
if (fontOpacity >= 0.0 && fontOpacity <= 1.0) {
if (actualTextStyle.color == null) {
actualTextStyle = actualTextStyle.copyWith(color: Colors.white);
}
actualTextStyle = actualTextStyle.copyWith(
color: actualTextStyle.color!.withValues(alpha: fontOpacity));
}
case SubtitleAttrType.subAttrFontBgOpacity:
final fontBgOpacity = attr.attrValue as double;
if (fontBgOpacity >= 0.0 &&
fontBgOpacity <= 1.0 &&
actualTextStyle.backgroundColor != null) {
actualTextStyle = actualTextStyle.copyWith(
backgroundColor: actualTextStyle.backgroundColor!.withValues(alpha: fontBgOpacity));
}
// For text vertical and horizontal align.
case SubtitleAttrType.subAttrFontVerticalAlign:
actualTextAlign = actualTextAlign.add(_intToTextVerticalAlign(attr.attrValue as int));
case SubtitleAttrType.subAttrFontHorizontalAlign:
actualTextAlign = actualTextAlign.add(_intToTextHorizontalAlign(attr.attrValue as int));
// For text background window.
case SubtitleAttrType.subAttrWindowBgColor:
actualWindowBgColor = _intToColor(attr.attrValue as int);
case SubtitleAttrType.subAttrWindowOpacity:
final windowOpacity = attr.attrValue as double;
if (windowOpacity >= 0.0 && windowOpacity <= 1.0) {
actualWindowBgColor = actualWindowBgColor.withValues(alpha: windowOpacity);
}
// For text outline.
case SubtitleAttrType.subAttrFontTextOutlineColor:
foreground = foreground..color = _intToColor(attr.attrValue as int);
case SubtitleAttrType.subAttrFontTextOutlineThickness:
foreground = foreground..strokeWidth = (attr.attrValue as int) / 1.0;
case SubtitleAttrType.subAttrFontTextOutlineBlurRadius:
case SubtitleAttrType.subAttrWindowXPadding:
case SubtitleAttrType.subAttrWindowYPadding:
case SubtitleAttrType.subAttrWindowLeftMargin:
case SubtitleAttrType.subAttrWindowRightMargin:
case SubtitleAttrType.subAttrWindowTopMargin:
case SubtitleAttrType.subAttrWindowBottomMargin:
case SubtitleAttrType.subAttrWindowShowBg:
case SubtitleAttrType.subAttrRawSubtitle:
case SubtitleAttrType.subAttrWebvttCueLine:
case SubtitleAttrType.subAttrWebvttCueLineNum:
case SubtitleAttrType.subAttrWebvttCueLineAlign:
case SubtitleAttrType.subAttrWebvttCueAlign:
case SubtitleAttrType.subAttrWebvttCueSize:
case SubtitleAttrType.subAttrWebvttCuePosition:
case SubtitleAttrType.subAttrWebvttCuePositionAlign:
case SubtitleAttrType.subAttrWebvttCueVertical:
case SubtitleAttrType.subAttrTimestamp:
case SubtitleAttrType.subAttrExtsubIndex:
case SubtitleAttrType.subAttrTypeNone:
break;
}
}
return (
actualTextOriginAndExtent == TextOriginAndExtent.none ? null : actualTextOriginAndExtent,
actualTextStyle == const TextStyle(height: 1.0, fontSize: 1 / 15.0) ? null : actualTextStyle,
actualTextAlign,
actualWindowBgColor,
actualFontSize,
foreground
);
}