Skip to content

Commit da85121

Browse files
authored
Merge pull request #85 from lukas-kirschner/master
Set Override Colors independently for Fill and Stroke
2 parents 9ddec04 + a82607e commit da85121

File tree

13 files changed

+1367
-33
lines changed

13 files changed

+1367
-33
lines changed

Docs/articles/intro.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,10 @@ The control only has a couple of properties, `SizeType` and `ImageSource`.
2525

2626
For `None` and `ContentToSizeNoStretch`, the Horizontal/VerticalContentAlignment properties can be used to position the image within the control.
2727

28-
* `ImageSource` - This property is the same as `SetImage(drawing)`, and is exposed to allow for the source to be set through binding.
28+
* `ImageSource` - This property is the same as `SetImage(drawing)`, and is exposed to allow for the source to be set through binding.
29+
30+
The colors of an `SVGImage` can be overridden at run-time through some additional properties of the `SVGImage`:
31+
32+
* `OverrideFillColor` - This property overrides all fill colors of an SVG image
33+
* `OverrideStrokeColor` - Overrides all stroke colors of an SVG image
34+
* `OverrideColor` - Overrides all colors of an SVG image. `OverrideFillColor` and `OverrideStrokeColor` take precedence over the `OverrideColor` property.

Samples/Example/MainWindow.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
<svg1:SVGImage Source="/Example;component/Images/example radgrad01.svg" RenderTransformOrigin="0.848,0.125" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="3" />
104104
<svg1:SVGImage Source="/Example;component/Images/tiger.svg" RenderTransformOrigin="0.5,0.5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="3" />
105105
<svg1:SVGImage Source="/Example;component/Images/1.svg" RenderTransformOrigin="0.5,0.5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="3" />
106-
<svg1:SVGImage Source="/Example;component/Images/2.svg" RenderTransformOrigin="0.5,0.5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="3" />
106+
<svg1:SVGImage Source="/Example;component/Images/2.svg" RenderTransformOrigin="0.5,0.5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="3" OverrideFillColor="DarkGreen" OverrideStrokeColor="DarkSalmon" x:Name="OverrideSeparateColorTest" MouseDoubleClick="SVGImage_MouseDoubleClickSeparateOverride" />
107107
<svg1:SVGImage Source="/Example;component/Images/3.svg" RenderTransformOrigin="0.5,0.5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="3" />
108108
<svg1:SVGImage Source="/Example;component/Images/4.svg" RenderTransformOrigin="0.5,0.5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="3" />
109109
<svg1:SVGImage Source="/Example;component/Images/5.svg" RenderTransformOrigin="0.5,0.5" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="3" />

Samples/Example/MainWindow.xaml.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using System.IO;
33
using System.IO.Compression;
44
using System.Collections.Generic;
5-
5+
using System.Drawing;
66
using System.Windows;
77

88
namespace Example
@@ -149,5 +149,24 @@ private void SVGImage_MouseDoubleClick(object sender, System.Windows.Input.Mouse
149149
rnd == 1 ? System.Windows.Media.Colors.Magenta :
150150
System.Windows.Media.Colors.Black;
151151
}
152+
153+
private void SVGImage_MouseDoubleClickSeparateOverride(object sender, System.Windows.Input.MouseButtonEventArgs e)
154+
{
155+
System.Windows.Media.Color[] colors =
156+
{
157+
System.Windows.Media.Colors.White,
158+
System.Windows.Media.Colors.Magenta,
159+
System.Windows.Media.Colors.DarkGreen,
160+
System.Windows.Media.Colors.DarkSalmon,
161+
System.Windows.Media.Colors.DarkBlue,
162+
System.Windows.Media.Colors.Black,
163+
};
164+
var ran = new Random();
165+
var rndFill = ran.Next(0, colors.Length);
166+
OverrideSeparateColorTest.OverrideFillColor = colors[rndFill];
167+
168+
var rndStroke = ran.Next(0, colors.Length);
169+
OverrideSeparateColorTest.OverrideStrokeColor = colors[rndStroke];
170+
}
152171
}
153172
}

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: 24 additions & 7 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

@@ -117,20 +121,24 @@ private GeometryDrawing NewDrawingItem(Shape shape, Geometry geometry)
117121
Stroke stroke = shape.Stroke;
118122
if (stroke != null)
119123
{
120-
if(OverrideStrokeWidth.HasValue)
124+
var strokeWidth = stroke.Width;
125+
if (OverrideStrokeWidth.HasValue)
121126
{
122-
stroke.Width = OverrideStrokeWidth.Value;
127+
strokeWidth = OverrideStrokeWidth.Value;
123128
}
124129
var brush = stroke.StrokeBrush(this.SVG, this, shape, shape.Opacity, geometry.Bounds);
125130
if (OverrideColor != null)
126131
brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
127132
OverrideColor.Value.R, OverrideColor.Value.G, OverrideColor.Value.B));
128-
item.Pen = new Pen(brush, stroke.Width);
133+
if (OverrideStrokeColor != null)
134+
brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
135+
OverrideStrokeColor.Value.R, OverrideStrokeColor.Value.G, OverrideStrokeColor.Value.B));
136+
item.Pen = new Pen(brush, strokeWidth);
129137
if (stroke.StrokeArray != null)
130138
{
131139
item.Pen.DashCap = PenLineCap.Flat;
132140
DashStyle ds = new DashStyle();
133-
double scale = 1 / stroke.Width;
141+
double scale = 1 / strokeWidth;
134142
foreach (var dash in stroke.StrokeArray) ds.Dashes.Add(dash * scale);
135143
item.Pen.DashStyle = ds;
136144
}
@@ -169,6 +177,9 @@ private GeometryDrawing NewDrawingItem(Shape shape, Geometry geometry)
169177
if (OverrideColor != null)
170178
item.Brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
171179
OverrideColor.Value.R, OverrideColor.Value.G, OverrideColor.Value.B));
180+
if (OverrideFillColor != null)
181+
item.Brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
182+
OverrideFillColor.Value.R, OverrideFillColor.Value.G, OverrideFillColor.Value.B));
172183
GeometryGroup g = new GeometryGroup();
173184
g.FillRule = FillRule.Nonzero;
174185
g.Children.Add(geometry);
@@ -177,9 +188,15 @@ private GeometryDrawing NewDrawingItem(Shape shape, Geometry geometry)
177188
else if (shape.Fill != null)
178189
{
179190
item.Brush = shape.Fill.FillBrush(this.SVG, this, shape, shape.Opacity, geometry.Bounds);
180-
if (OverrideColor != null)
181-
item.Brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
182-
OverrideColor.Value.R, OverrideColor.Value.G, OverrideColor.Value.B));
191+
if (item.Brush != null)
192+
{
193+
if (OverrideColor != null)
194+
item.Brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
195+
OverrideColor.Value.R, OverrideColor.Value.G, OverrideColor.Value.B));
196+
if (OverrideFillColor != null)
197+
item.Brush = new SolidColorBrush(Color.FromArgb((byte)(255 * shape.Opacity),
198+
OverrideFillColor.Value.R, OverrideFillColor.Value.G, OverrideFillColor.Value.B));
199+
}
183200
GeometryGroup g = new GeometryGroup();
184201
g.FillRule = FillRule.Nonzero;
185202
if (shape.Fill.FillRule == Fill.eFillRule.evenodd) g.FillRule = FillRule.EvenOdd;

0 commit comments

Comments
 (0)