diff --git a/AUTHORS b/AUTHORS index b60279e3f60c..673c3f2fb551 100644 --- a/AUTHORS +++ b/AUTHORS @@ -79,3 +79,4 @@ Alexander Rabin LinXunFeng Hashir Shoaib Ricardo Dalarme +Andrei Kabylin diff --git a/packages/vector_graphics_compiler/CHANGELOG.md b/packages/vector_graphics_compiler/CHANGELOG.md index e132bbc01f73..35e214376734 100644 --- a/packages/vector_graphics_compiler/CHANGELOG.md +++ b/packages/vector_graphics_compiler/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.17 + +* Fixes a bug where stroke opacity not applied by color mapper. + ## 1.1.16 * Sets stroke-width to 1 by default when an invalid value is parsed instead of throwing an exception. diff --git a/packages/vector_graphics_compiler/lib/src/svg/parser.dart b/packages/vector_graphics_compiler/lib/src/svg/parser.dart index 6a4f280adcf3..6c2b487b6a9b 100644 --- a/packages/vector_graphics_compiler/lib/src/svg/parser.dart +++ b/packages/vector_graphics_compiler/lib/src/svg/parser.dart @@ -2306,7 +2306,7 @@ class SvgStrokeAttributes { } return Stroke( - color: color.color!.withOpacity(opacity ?? 1.0), + color: opacity == null ? color.color : color.color!.withOpacity(opacity!), shader: shader, join: join, cap: cap, diff --git a/packages/vector_graphics_compiler/lib/vector_graphics_compiler.dart b/packages/vector_graphics_compiler/lib/vector_graphics_compiler.dart index 206041b7d264..942a37649442 100644 --- a/packages/vector_graphics_compiler/lib/vector_graphics_compiler.dart +++ b/packages/vector_graphics_compiler/lib/vector_graphics_compiler.dart @@ -40,6 +40,7 @@ VectorInstructions parseWithoutOptimizers( String key = '', bool warningsAsErrors = false, SvgTheme theme = const SvgTheme(), + ColorMapper? colorMapper, }) { return parse( xml, @@ -49,6 +50,7 @@ VectorInstructions parseWithoutOptimizers( enableClippingOptimizer: false, enableMaskingOptimizer: false, enableOverdrawOptimizer: false, + colorMapper: colorMapper, ); } diff --git a/packages/vector_graphics_compiler/pubspec.yaml b/packages/vector_graphics_compiler/pubspec.yaml index 5beb9df96240..4296e1381a49 100644 --- a/packages/vector_graphics_compiler/pubspec.yaml +++ b/packages/vector_graphics_compiler/pubspec.yaml @@ -2,7 +2,7 @@ name: vector_graphics_compiler description: A compiler to convert SVGs to the binary format used by `package:vector_graphics`. repository: https://github.com/flutter/packages/tree/main/packages/vector_graphics_compiler issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+vector_graphics%22 -version: 1.1.16 +version: 1.1.17 executables: vector_graphics_compiler: diff --git a/packages/vector_graphics_compiler/test/parser_test.dart b/packages/vector_graphics_compiler/test/parser_test.dart index cfbec4732e6c..378bc3b5168e 100644 --- a/packages/vector_graphics_compiler/test/parser_test.dart +++ b/packages/vector_graphics_compiler/test/parser_test.dart @@ -10,6 +10,24 @@ import 'package:vector_graphics_compiler/vector_graphics_compiler.dart'; import 'test_svg_strings.dart'; +class _TestOpacityColorMapper implements ColorMapper { + const _TestOpacityColorMapper(); + + @override + Color substitute( + String? id, + String elementName, + String attributeName, + Color color, + ) { + if (color.value == 0xff000000) { + return const Color(0x7fff0000); + } else { + return color; + } + } +} + void main() { test('Reuse ID self-referentially', () { final VectorInstructions instructions = parseWithoutOptimizers(''' @@ -266,6 +284,24 @@ void main() { ); }); + test('preserve opacity from color mapper for strokes', () { + const String strokeOpacitySvg = ''' + + + +'''; + + final VectorInstructions instructions = parseWithoutOptimizers( + strokeOpacitySvg, + colorMapper: const _TestOpacityColorMapper(), + ); + + expect( + instructions.paints.single, + const Paint(stroke: Stroke(color: Color(0x7fff0000))), + ); + }); + test('text attributes are preserved', () { final VectorInstructions instructions = parseWithoutOptimizers(textTspan); expect( @@ -352,6 +388,39 @@ void main() { ); }); + test('currentColor stoke opacity', () { + const String currentColorSvg = ''' + + + +'''; + + final VectorInstructions blueInstructions = parseWithoutOptimizers( + currentColorSvg, + theme: const SvgTheme(currentColor: Color(0x7F0000FF)), + ); + final VectorInstructions redInstructions = parseWithoutOptimizers( + currentColorSvg, + theme: const SvgTheme(currentColor: Color(0x7FFF0000)), + ); + + expect( + blueInstructions.paints.single, + const Paint( + fill: Fill(color: Color(0x7F0000FF)), + stroke: Stroke(color: Color(0x7F0000FF)), + ), + ); + + expect( + redInstructions.paints.single, + const Paint( + fill: Fill(color: Color(0x7FFF0000)), + stroke: Stroke(color: Color(0x7FFF0000)), + ), + ); + }); + test('Opacity with a save layer does not continue to inherit', () { final VectorInstructions instructions = parseWithoutOptimizers('''