parseStroke method

DrawablePaint? parseStroke(
  1. Rect bounds,
  2. DrawablePaint? parentStroke,
  3. Color? currentColor
)

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);
}