parseStroke method
Parses a @stroke attribute into a Paint.
Implementation
DrawablePaint? parseStroke(
Rect bounds,
DrawablePaint? parentStroke,
Color? currentColor,
) {
final String? rawStroke = getAttribute(attributes, 'stroke', def: null);
final String? rawStrokeOpacity = getAttribute(
attributes,
'stroke-opacity',
def: '1.0',
);
final String? rawOpacity = getAttribute(attributes, 'opacity');
double opacity = parseDouble(rawStrokeOpacity)!.clamp(0.0, 1.0).toDouble();
if (rawOpacity != '') {
opacity *= parseDouble(rawOpacity)!.clamp(0.0, 1.0);
}
final String? rawStrokeCap =
getAttribute(attributes, 'stroke-linecap', def: null);
final String? rawLineJoin =
getAttribute(attributes, 'stroke-linejoin', def: null);
final String? rawMiterLimit =
getAttribute(attributes, 'stroke-miterlimit', def: null);
final String? rawStrokeWidth =
getAttribute(attributes, 'stroke-width', def: null);
final String? anyStrokeAttribute = rawStroke ??
rawStrokeCap ??
rawLineJoin ??
rawMiterLimit ??
rawStrokeWidth;
if (anyStrokeAttribute == null && DrawablePaint.isEmpty(parentStroke)) {
return null;
} else if (rawStroke == 'none') {
return DrawablePaint.empty;
}
DrawablePaint? definitionPaint;
Color? strokeColor;
if (rawStroke?.startsWith('url') == true) {
definitionPaint = _getDefinitionPaint(
_key,
PaintingStyle.stroke,
rawStroke!,
_definitions,
bounds,
opacity: opacity,
);
strokeColor = definitionPaint.color;
} else {
strokeColor = parseColor(rawStroke, currentColor: currentColor);
}
final DrawablePaint paint = DrawablePaint(
PaintingStyle.stroke,
color: (strokeColor ??
currentColor ??
parentStroke?.color ??
definitionPaint?.color)
?.withOpacity(opacity),
strokeCap: StrokeCap.values.firstWhere(
(StrokeCap sc) => sc.toString() == 'StrokeCap.$rawStrokeCap',
orElse: () =>
parentStroke?.strokeCap ??
definitionPaint?.strokeCap ??
StrokeCap.butt,
),
strokeJoin: StrokeJoin.values.firstWhere(
(StrokeJoin sj) => sj.toString() == 'StrokeJoin.$rawLineJoin',
orElse: () =>
parentStroke?.strokeJoin ??
definitionPaint?.strokeJoin ??
StrokeJoin.miter,
),
strokeMiterLimit: parseDouble(rawMiterLimit) ??
parentStroke?.strokeMiterLimit ??
definitionPaint?.strokeMiterLimit ??
4.0,
strokeWidth: parseDoubleWithUnits(rawStrokeWidth) ??
parentStroke?.strokeWidth ??
definitionPaint?.strokeWidth ??
1.0,
);
return DrawablePaint.merge(definitionPaint, paint);
}