Skip to content

Commit 982aa14

Browse files
author
Lukas Kirschner
committed
Implemented OverrideFillColor and OverrideStrokeColor to set both independently
1 parent 365ed4e commit 982aa14

File tree

3 files changed

+106
-11
lines changed

3 files changed

+106
-11
lines changed

Source/SVGImage/SVG/SVGImage.cs

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,14 @@ public enum eSizeType
9797
DependencyProperty.Register("OverrideColor", typeof(Color?), typeof(SVGImage),
9898
new FrameworkPropertyMetadata(default, FrameworkPropertyMetadataOptions.AffectsRender, OverrideColorPropertyChanged));
9999

100+
public static readonly DependencyProperty OverrideFillColorProperty =
101+
DependencyProperty.Register("OverrideFillColor", typeof(Color?), typeof(SVGImage),
102+
new FrameworkPropertyMetadata(default, FrameworkPropertyMetadataOptions.AffectsRender, OverrideFillColorPropertyChanged));
103+
104+
public static readonly DependencyProperty OverrideStrokeColorProperty =
105+
DependencyProperty.Register("OverrideStrokeColor", typeof(Color?), typeof(SVGImage),
106+
new FrameworkPropertyMetadata(default, FrameworkPropertyMetadataOptions.AffectsRender, OverrideStrokeColorPropertyChanged));
107+
100108
public static readonly DependencyProperty CustomBrushesProperty = DependencyProperty.Register(nameof(CustomBrushes),
101109
typeof(Dictionary<string, Brush>), typeof(SVGImage), new FrameworkPropertyMetadata(default,
102110
FrameworkPropertyMetadataOptions.AffectsRender, CustomBrushesPropertyChanged));
@@ -167,6 +175,18 @@ public Color? OverrideColor
167175
set { SetValue(OverrideColorProperty, value); }
168176
}
169177

178+
public Color? OverrideFillColor
179+
{
180+
get { return (Color?)GetValue(OverrideFillColorProperty); }
181+
set { SetValue(OverrideFillColorProperty, value); }
182+
}
183+
184+
public Color? OverrideStrokeColor
185+
{
186+
get { return (Color?)GetValue(OverrideStrokeColorProperty); }
187+
set { SetValue(OverrideStrokeColorProperty, value); }
188+
}
189+
170190
public double? OverrideStrokeWidth
171191
{
172192
get { return (double?)GetValue(OverrideStrokeWidthProperty); }
@@ -234,6 +254,8 @@ public void ReRenderSvg()
234254
_render = new SVGRender();
235255
_render.ExternalFileLoader = this.ExternalFileLoader;
236256
_render.OverrideColor = OverrideColor;
257+
_render.OverrideFillColor = OverrideFillColor;
258+
_render.OverrideStrokeColor = OverrideStrokeColor;
237259
_render.CustomBrushes = CustomBrushes;
238260
_render.OverrideStrokeWidth = OverrideStrokeWidth;
239261
_render.UseAnimations = this.UseAnimations;
@@ -256,6 +278,8 @@ public void SetImage(string svgFilename)
256278
_render.ExternalFileLoader = this.ExternalFileLoader;
257279
_render.UseAnimations = false;
258280
_render.OverrideColor = OverrideColor;
281+
_render.OverrideFillColor = OverrideFillColor;
282+
_render.OverrideStrokeColor = OverrideStrokeColor;
259283
_render.CustomBrushes = CustomBrushes;
260284
_render.OverrideStrokeWidth = OverrideStrokeWidth;
261285

@@ -276,6 +300,8 @@ public void SetImage(Stream stream)
276300
_render = new SVGRender();
277301
_render.ExternalFileLoader = this.ExternalFileLoader;
278302
_render.OverrideColor = OverrideColor;
303+
_render.OverrideFillColor = OverrideFillColor;
304+
_render.OverrideStrokeColor = OverrideStrokeColor;
279305
_render.CustomBrushes = CustomBrushes;
280306
_render.OverrideStrokeWidth = OverrideStrokeWidth;
281307
_render.UseAnimations = false;
@@ -298,6 +324,8 @@ public void SetImage(Uri uriSource)
298324
_render = new SVGRender();
299325
_render.ExternalFileLoader = this.ExternalFileLoader;
300326
_render.OverrideColor = OverrideColor;
327+
_render.OverrideFillColor = OverrideFillColor;
328+
_render.OverrideStrokeColor = OverrideStrokeColor;
301329
_render.CustomBrushes = CustomBrushes;
302330
_render.OverrideStrokeWidth = OverrideStrokeWidth;
303331
_render.UseAnimations = false;
@@ -326,6 +354,8 @@ protected override void OnInitialized(EventArgs e)
326354
_render = new SVGRender();
327355
_render.ExternalFileLoader = this.ExternalFileLoader;
328356
_render.OverrideColor = OverrideColor;
357+
_render.OverrideFillColor = OverrideFillColor;
358+
_render.OverrideStrokeColor = OverrideStrokeColor;
329359
_render.CustomBrushes = CustomBrushes;
330360
_render.OverrideStrokeWidth = OverrideStrokeWidth;
331361
_render.UseAnimations = this.UseAnimations;
@@ -694,7 +724,7 @@ DrawingGroup LoadDrawing(Uri svgSource)
694724
//case "ftp":
695725
case "https":
696726
case "http":
697-
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor))
727+
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor, this.OverrideFillColor, this.OverrideStrokeColor))
698728
{
699729
DrawingGroup drawGroup = reader.Read(svgSource, _render);
700730

@@ -729,7 +759,7 @@ DrawingGroup LoadDrawing(Uri svgSource)
729759
{
730760
using (var zipStream = new GZipStream(svgStream, CompressionMode.Decompress))
731761
{
732-
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor))
762+
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor, this.OverrideFillColor, this.OverrideStrokeColor))
733763
{
734764
DrawingGroup drawGroup = reader.Read(zipStream, _render);
735765

@@ -745,7 +775,7 @@ DrawingGroup LoadDrawing(Uri svgSource)
745775
{
746776
using (svgStream)
747777
{
748-
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor))
778+
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor, this.OverrideFillColor, this.OverrideStrokeColor))
749779
{
750780
DrawingGroup drawGroup = reader.Read(svgStream, _render);
751781

@@ -781,7 +811,7 @@ DrawingGroup LoadDrawing(Uri svgSource)
781811
{
782812
using (GZipStream zipStream = new GZipStream(stream, CompressionMode.Decompress))
783813
{
784-
using (var reader = new FileSvgReader(this.OverrideColor))
814+
using (var reader = new FileSvgReader(this.OverrideColor, this.OverrideFillColor, this.OverrideStrokeColor))
785815
{
786816
DrawingGroup drawGroup = reader.Read(zipStream, _render);
787817
if (drawGroup != null)
@@ -796,7 +826,7 @@ DrawingGroup LoadDrawing(Uri svgSource)
796826
{
797827
using (var stream = new MemoryStream(imageBytes))
798828
{
799-
using (var reader = new FileSvgReader(this.OverrideColor))
829+
using (var reader = new FileSvgReader(this.OverrideColor, this.OverrideFillColor, this.OverrideStrokeColor))
800830
{
801831
DrawingGroup drawGroup = reader.Read(stream, _render);
802832
if (drawGroup != null)
@@ -875,6 +905,26 @@ private static void OverrideColorPropertyChanged(DependencyObject d, DependencyP
875905
}
876906
}
877907

908+
private static void OverrideFillColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
909+
{
910+
if (d is SVGImage svgImage && e.NewValue is Color newColor && svgImage._render != null)
911+
{
912+
svgImage._render.OverrideFillColor = newColor;
913+
svgImage.InvalidateVisual();
914+
svgImage.ReRenderSvg();
915+
}
916+
}
917+
918+
private static void OverrideStrokeColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
919+
{
920+
if (d is SVGImage svgImage && e.NewValue is Color newColor && svgImage._render != null)
921+
{
922+
svgImage._render.OverrideStrokeColor = newColor;
923+
svgImage.InvalidateVisual();
924+
svgImage.ReRenderSvg();
925+
}
926+
}
927+
878928
private static void OverrideStrokeWidthPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
879929
{
880930
if (d is SVGImage svgImage && e.NewValue is double newStrokeWidth && svgImage._render != null)

Source/SVGImage/SVG/SVGRender.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ public SVGRender(IExternalFileLoader fileLoader)
3535
public bool UseAnimations { get; set; }
3636

3737
public Color? OverrideColor { get; set; }
38+
39+
public Color? OverrideFillColor { get; set; }
40+
41+
public Color? OverrideStrokeColor { get; set; }
3842

3943
public double? OverrideStrokeWidth { get; set; }
4044

@@ -125,6 +129,9 @@ private GeometryDrawing NewDrawingItem(Shape shape, Geometry geometry)
125129
if (OverrideColor != null)
126130
brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
127131
OverrideColor.Value.R, OverrideColor.Value.G, OverrideColor.Value.B));
132+
if (OverrideStrokeColor != null)
133+
brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
134+
OverrideStrokeColor.Value.R, OverrideStrokeColor.Value.G, OverrideStrokeColor.Value.B));
128135
item.Pen = new Pen(brush, stroke.Width);
129136
if (stroke.StrokeArray != null)
130137
{
@@ -169,6 +176,9 @@ private GeometryDrawing NewDrawingItem(Shape shape, Geometry geometry)
169176
if (OverrideColor != null)
170177
item.Brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
171178
OverrideColor.Value.R, OverrideColor.Value.G, OverrideColor.Value.B));
179+
if (OverrideFillColor != null)
180+
item.Brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
181+
OverrideFillColor.Value.R, OverrideFillColor.Value.G, OverrideFillColor.Value.B));
172182
GeometryGroup g = new GeometryGroup();
173183
g.FillRule = FillRule.Nonzero;
174184
g.Children.Add(geometry);
@@ -180,6 +190,9 @@ private GeometryDrawing NewDrawingItem(Shape shape, Geometry geometry)
180190
if (OverrideColor != null)
181191
item.Brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
182192
OverrideColor.Value.R, OverrideColor.Value.G, OverrideColor.Value.B));
193+
if (OverrideFillColor != null && shape.Fill.Opacity > 0.0)
194+
item.Brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
195+
OverrideFillColor.Value.R, OverrideFillColor.Value.G, OverrideFillColor.Value.B));
183196
GeometryGroup g = new GeometryGroup();
184197
g.FillRule = FillRule.Nonzero;
185198
if (shape.Fill.FillRule == Fill.eFillRule.evenodd) g.FillRule = FillRule.EvenOdd;

Source/SVGImage/SVG/SvgIconBase.cs

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ protected SvgIconBase()
4646
#region Public Properties
4747

4848
public Color? OverrideColor { get; set; }
49+
public Color? OverrideFillColor { get; set; }
50+
public Color? OverrideStrokeColor { get; set; }
4951

5052
/// <summary>
5153
/// Gets or sets the main culture information used for rendering texts.
@@ -136,7 +138,7 @@ protected virtual DrawingGroup GetDrawing(Uri svgSource)
136138
//case "ftp":
137139
case "https":
138140
case "http":
139-
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor))
141+
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor, this.OverrideFillColor, this.OverrideStrokeColor))
140142
{
141143
DrawingGroup drawGroup = reader.Read(svgSource);
142144

@@ -171,7 +173,7 @@ protected virtual DrawingGroup GetDrawing(Uri svgSource)
171173
{
172174
using (var zipStream = new GZipStream(svgStream, CompressionMode.Decompress))
173175
{
174-
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor))
176+
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor, this.OverrideFillColor, this.OverrideStrokeColor))
175177
{
176178
DrawingGroup drawGroup = reader.Read(zipStream);
177179

@@ -187,7 +189,7 @@ protected virtual DrawingGroup GetDrawing(Uri svgSource)
187189
{
188190
using (svgStream)
189191
{
190-
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor))
192+
using (FileSvgReader reader = new FileSvgReader(this.OverrideColor, this.OverrideFillColor, this.OverrideStrokeColor))
191193
{
192194
DrawingGroup drawGroup = reader.Read(svgStream);
193195

@@ -223,7 +225,7 @@ protected virtual DrawingGroup GetDrawing(Uri svgSource)
223225
{
224226
using (GZipStream zipStream = new GZipStream(stream, CompressionMode.Decompress))
225227
{
226-
using (var reader = new FileSvgReader(this.OverrideColor))
228+
using (var reader = new FileSvgReader(this.OverrideColor, this.OverrideFillColor, this.OverrideStrokeColor))
227229
{
228230
DrawingGroup drawGroup = reader.Read(zipStream);
229231
if (drawGroup != null)
@@ -238,7 +240,7 @@ protected virtual DrawingGroup GetDrawing(Uri svgSource)
238240
{
239241
using (var stream = new MemoryStream(imageBytes))
240242
{
241-
using (var reader = new FileSvgReader(this.OverrideColor))
243+
using (var reader = new FileSvgReader(this.OverrideColor, this.OverrideFillColor, this.OverrideStrokeColor))
242244
{
243245
DrawingGroup drawGroup = reader.Read(stream);
244246
if (drawGroup != null)
@@ -448,15 +450,19 @@ internal sealed class FileSvgReader : IDisposable
448450

449451
private CultureInfo _culture;
450452
private Color? _overrideColor;
453+
private Color? _overrideFillColor;
454+
private Color? _overrideStrokeColor;
451455
private bool _isDisposed;
452456

453457
public FileSvgReader()
454458
{
455459
}
456460

457-
public FileSvgReader(Color? overrideColor)
461+
public FileSvgReader(Color? overrideColor, Color? overrideFillColor, Color? overrideStrokeColor)
458462
{
459463
_overrideColor = overrideColor;
464+
_overrideFillColor = overrideFillColor;
465+
_overrideStrokeColor = overrideStrokeColor;
460466
}
461467

462468
~FileSvgReader()
@@ -494,6 +500,26 @@ public Color? OverrideColor
494500
}
495501
}
496502

503+
public Color? OverrideFillColor
504+
{
505+
get {
506+
return _overrideFillColor;
507+
}
508+
set {
509+
_overrideFillColor = value;
510+
}
511+
}
512+
513+
public Color? OverrideStrokeColor
514+
{
515+
get {
516+
return _overrideStrokeColor;
517+
}
518+
set {
519+
_overrideStrokeColor = value;
520+
}
521+
}
522+
497523
public DrawingGroup Read(string filepath, SVGRender svgRender = null)
498524
{
499525
if (string.IsNullOrWhiteSpace(filepath))
@@ -505,6 +531,8 @@ public DrawingGroup Read(string filepath, SVGRender svgRender = null)
505531
{
506532
svgRender = new SVGRender(new FileSystemLoader());
507533
svgRender.OverrideColor = _overrideColor;
534+
svgRender.OverrideFillColor = _overrideFillColor;
535+
svgRender.OverrideStrokeColor = _overrideStrokeColor;
508536
}
509537

510538
return svgRender.LoadDrawing(filepath);
@@ -521,6 +549,8 @@ public DrawingGroup Read(Uri fileUri, SVGRender svgRender = null)
521549
{
522550
svgRender = new SVGRender(new FileSystemLoader());
523551
svgRender.OverrideColor = _overrideColor;
552+
svgRender.OverrideFillColor = _overrideFillColor;
553+
svgRender.OverrideStrokeColor = _overrideStrokeColor;
524554
}
525555

526556
return svgRender.LoadDrawing(fileUri);
@@ -537,6 +567,8 @@ public DrawingGroup Read(Stream stream, SVGRender svgRender = null)
537567
{
538568
svgRender = new SVGRender(new FileSystemLoader());
539569
svgRender.OverrideColor = _overrideColor;
570+
svgRender.OverrideFillColor = _overrideFillColor;
571+
svgRender.OverrideStrokeColor = _overrideStrokeColor;
540572
}
541573

542574
return svgRender.LoadDrawing(stream);

0 commit comments

Comments
 (0)