Showing
5 changed files
with
37 additions
and
9 deletions
| @@ -38,6 +38,10 @@ class SvgColor { | @@ -38,6 +38,10 @@ class SvgColor { | ||
| 38 | return none; | 38 | return none; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | + if (painter.parser.colorFilter != null) { | ||
| 42 | + return SvgColor(color: painter.parser.colorFilter); | ||
| 43 | + } | ||
| 44 | + | ||
| 41 | if (svgColors.containsKey(color)) { | 45 | if (svgColors.containsKey(color)) { |
| 42 | return SvgColor(color: svgColors[color]); | 46 | return SvgColor(color: svgColors[color]); |
| 43 | } | 47 | } |
| @@ -15,6 +15,7 @@ | @@ -15,6 +15,7 @@ | ||
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | import 'package:pdf/pdf.dart'; | 17 | import 'package:pdf/pdf.dart'; |
| 18 | +import 'package:pdf/src/svg/color.dart'; | ||
| 18 | import 'package:pdf/widgets.dart'; | 19 | import 'package:pdf/widgets.dart'; |
| 19 | 20 | ||
| 20 | import 'brush.dart'; | 21 | import 'brush.dart'; |
| @@ -38,11 +39,12 @@ class SvgPainter { | @@ -38,11 +39,12 @@ class SvgPainter { | ||
| 38 | final PdfRect boundingBox; | 39 | final PdfRect boundingBox; |
| 39 | 40 | ||
| 40 | void paint() { | 41 | void paint() { |
| 41 | - SvgGroup.fromXml( | ||
| 42 | - parser.root, | ||
| 43 | - this, | ||
| 44 | - SvgBrush.defaultContext, | ||
| 45 | - ).paint(_canvas!); | 42 | + final brush = parser.colorFilter == null |
| 43 | + ? SvgBrush.defaultContext | ||
| 44 | + : SvgBrush.defaultContext | ||
| 45 | + .copyWith(fill: SvgColor(color: parser.colorFilter)); | ||
| 46 | + | ||
| 47 | + SvgGroup.fromXml(parser.root, this, brush).paint(_canvas!); | ||
| 46 | } | 48 | } |
| 47 | 49 | ||
| 48 | final _fontCache = <String, Font>{}; | 50 | final _fontCache = <String, Font>{}; |
| @@ -22,7 +22,10 @@ import 'brush.dart'; | @@ -22,7 +22,10 @@ import 'brush.dart'; | ||
| 22 | class SvgParser { | 22 | class SvgParser { |
| 23 | /// Create an SVG parser | 23 | /// Create an SVG parser |
| 24 | 24 | ||
| 25 | - factory SvgParser({required XmlDocument xml}) { | 25 | + factory SvgParser({ |
| 26 | + required XmlDocument xml, | ||
| 27 | + PdfColor? colorFilter, | ||
| 28 | + }) { | ||
| 26 | final root = xml.rootElement; | 29 | final root = xml.rootElement; |
| 27 | 30 | ||
| 28 | final vbattr = root.getAttribute('viewBox'); | 31 | final vbattr = root.getAttribute('viewBox'); |
| @@ -45,10 +48,22 @@ class SvgParser { | @@ -45,10 +48,22 @@ class SvgParser { | ||
| 45 | 48 | ||
| 46 | final viewBox = PdfRect(fvb[0], fvb[1], fvb[2], fvb[3]); | 49 | final viewBox = PdfRect(fvb[0], fvb[1], fvb[2], fvb[3]); |
| 47 | 50 | ||
| 48 | - return SvgParser._(width, height, viewBox, root); | 51 | + return SvgParser._( |
| 52 | + width, | ||
| 53 | + height, | ||
| 54 | + viewBox, | ||
| 55 | + root, | ||
| 56 | + colorFilter, | ||
| 57 | + ); | ||
| 49 | } | 58 | } |
| 50 | 59 | ||
| 51 | - SvgParser._(this.width, this.height, this.viewBox, this.root); | 60 | + SvgParser._( |
| 61 | + this.width, | ||
| 62 | + this.height, | ||
| 63 | + this.viewBox, | ||
| 64 | + this.root, | ||
| 65 | + this.colorFilter, | ||
| 66 | + ); | ||
| 52 | 67 | ||
| 53 | final PdfRect viewBox; | 68 | final PdfRect viewBox; |
| 54 | 69 | ||
| @@ -58,6 +73,8 @@ class SvgParser { | @@ -58,6 +73,8 @@ class SvgParser { | ||
| 58 | 73 | ||
| 59 | final XmlElement root; | 74 | final XmlElement root; |
| 60 | 75 | ||
| 76 | + final PdfColor? colorFilter; | ||
| 77 | + | ||
| 61 | static final _transformParameterRegExp = | 78 | static final _transformParameterRegExp = |
| 62 | RegExp(r'[\w.-]+(px|pt|em|cm|mm|in|%|)'); | 79 | RegExp(r'[\w.-]+(px|pt|em|cm|mm|in|%|)'); |
| 63 | 80 |
| @@ -31,9 +31,13 @@ class SvgImage extends Widget { | @@ -31,9 +31,13 @@ class SvgImage extends Widget { | ||
| 31 | bool clip = true, | 31 | bool clip = true, |
| 32 | double? width, | 32 | double? width, |
| 33 | double? height, | 33 | double? height, |
| 34 | + PdfColor? colorFilter, | ||
| 34 | }) { | 35 | }) { |
| 35 | final xml = XmlDocument.parse(svg); | 36 | final xml = XmlDocument.parse(svg); |
| 36 | - final parser = SvgParser(xml: xml); | 37 | + final parser = SvgParser( |
| 38 | + xml: xml, | ||
| 39 | + colorFilter: colorFilter, | ||
| 40 | + ); | ||
| 37 | 41 | ||
| 38 | return SvgImage._fromParser( | 42 | return SvgImage._fromParser( |
| 39 | parser, | 43 | parser, |
-
Please register or login to post a comment