diff --git a/.github/workflows/runtests.yml b/.github/workflows/runtests.yml
index 515b428ff..8499c6fcf 100644
--- a/.github/workflows/runtests.yml
+++ b/.github/workflows/runtests.yml
@@ -1,7 +1,11 @@
name: Testsuite
on:
- [push, pull_request]
+ workflow_dispatch: # Allows manual triggering of workflow
+ push:
+ branches: [ "master" ]
+ pull_request:
+ branches: [ "master" ]
jobs:
test:
@@ -11,36 +15,37 @@ jobs:
matrix:
os: [windows-latest]
# os: [windows-latest, ubuntu-latest]
- framework: [netcoreapp3.1, net6.0, net462]
+ framework: [net8.0, net6.0, netcoreapp3.1, net462]
steps:
- name: Checkout source
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
with:
fetch-depth: 0 # needed for GitVersioning to work
- name: Setup NuGet
uses: NuGet/setup-nuget@v1
- name: Cache NuGet packages
- uses: actions/cache@v1
+ uses: actions/cache@v4
id: cache
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget }}
- - name: Setup .NET 3.1 SDK
- uses: actions/setup-dotnet@v3
+ - name: Setup .NET 3.1/8.0 SDK
+ uses: actions/setup-dotnet@v4
with:
- dotnet-version: 3.1.x
- include-prerelease: false
+ dotnet-version: |
+ 3.1.x
+ 8.0.x
- name: Restore NuGet Packages
if: steps.cache.outputs.cache-hit != 'true'
run: |
- nuget restore Source/Svg.sln
- nuget install NUnit.ConsoleRunner -Version 3.10.0 -OutputDirectory tools
+ nuget restore Tests/Svg.UnitTests.sln
+ nuget install NUnit.ConsoleRunner -Version 3.17.0 -OutputDirectory tools
- name: Run tests
env:
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
run: |
- dotnet test --framework ${{ matrix.framework }} Tests/Svg.UnitTests/Svg.UnitTests.csproj
+ dotnet test -c Release -f ${{ matrix.framework }} Tests/Svg.UnitTests/Svg.UnitTests.csproj
benchmark:
runs-on: ${{ matrix.os }}
@@ -49,29 +54,28 @@ jobs:
benchmark: [SvgDocument, SvgPathBuilder, SvgTransformConverter, CoordinateParser]
os: [windows-latest]
# os: [windows-latest, ubuntu-latest]
- framework: [netcoreapp3.1]
+ framework: [net8.0]
steps:
- name: Checkout source
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup NuGet
uses: NuGet/setup-nuget@v1
- name: Cache NuGet packages
- uses: actions/cache@v1
+ uses: actions/cache@v4
id: cache
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-bench }}
- - name: Setup .NET 3.1 SDK
- uses: actions/setup-dotnet@v3
+ - name: Setup .NET 8.x SDK
+ uses: actions/setup-dotnet@v4
with:
- dotnet-version: 3.1.x
- include-prerelease: false
+ dotnet-version: 8.0.x
- name: Restore NuGet Packages
if: steps.cache.outputs.cache-hit != 'true'
run: |
- nuget restore Source/Svg.sln
+ nuget restore Tests/Svg.Benchmark.sln
- name: Run benchmarks
env:
DOTNET_NOLOGO: true
diff --git a/Generators/Svg.Generators.csproj b/Generators/Svg.Generators.csproj
index cfcc8bb59..9ada21dd0 100644
--- a/Generators/Svg.Generators.csproj
+++ b/Generators/Svg.Generators.csproj
@@ -8,6 +8,14 @@
enable
latest
true
+ Debug;Release
+
+
+
+
+
+
+ $(NoWarn);CS1591;CS0618
diff --git a/Samples/Entities/Entities.csproj b/Samples/Entities/Entities.csproj
index 5a978b9f6..2305a36d9 100644
--- a/Samples/Entities/Entities.csproj
+++ b/Samples/Entities/Entities.csproj
@@ -3,10 +3,11 @@
Exe
netcoreapp3.1;net462
+ Debug;Release
- $(NoWarn);CS0618;NETSDK1138
+ $(NoWarn);NETSDK1138
$(NoWarn);CS1591;CS0618;NETSDK1138
diff --git a/Samples/SVGBuilder/Properties/AssemblyInfo.cs b/Samples/SVGBuilder/Properties/AssemblyInfo.cs
index ae12c1bd5..e7173798c 100644
--- a/Samples/SVGBuilder/Properties/AssemblyInfo.cs
+++ b/Samples/SVGBuilder/Properties/AssemblyInfo.cs
@@ -34,3 +34,6 @@
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
+#if NET5_0_OR_GREATER
+[assembly: System.Runtime.Versioning.SupportedOSPlatform("windows7.0")]
+#endif
diff --git a/Samples/SVGBuilder/SVGBuilder.csproj b/Samples/SVGBuilder/SVGBuilder.csproj
index e94f05007..d3ece4faa 100644
--- a/Samples/SVGBuilder/SVGBuilder.csproj
+++ b/Samples/SVGBuilder/SVGBuilder.csproj
@@ -2,14 +2,15 @@
WinExe
- net6.0-windows;net462
+ net8.0-windows;net6.0-windows;net462
true
false
true
+ Debug;Release
- $(NoWarn);CS0618;NETSDK1138
+ $(NoWarn);NETSDK1138
$(NoWarn);CS1591;CS0618;NETSDK1138
diff --git a/Samples/SVGViewer/Properties/AssemblyInfo.cs b/Samples/SVGViewer/Properties/AssemblyInfo.cs
index 08504e975..40285ac52 100644
--- a/Samples/SVGViewer/Properties/AssemblyInfo.cs
+++ b/Samples/SVGViewer/Properties/AssemblyInfo.cs
@@ -34,3 +34,6 @@
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
+#if NET5_0_OR_GREATER
+[assembly: System.Runtime.Versioning.SupportedOSPlatform("windows7.0")]
+#endif
diff --git a/Samples/SVGViewer/SVGViewer.csproj b/Samples/SVGViewer/SVGViewer.csproj
index 6fbff1a08..964683a12 100644
--- a/Samples/SVGViewer/SVGViewer.csproj
+++ b/Samples/SVGViewer/SVGViewer.csproj
@@ -2,14 +2,15 @@
WinExe
- net6.0-windows;net462
+ net8.0-windows;net6.0-windows;net462
true
false
true
+ Debug;Release
- $(NoWarn);CS0618;NETSDK1138
+ $(NoWarn);NETSDK1138
$(NoWarn);CS1591;CS0618;NETSDK1138
diff --git a/Samples/SvgConsole/SvgConsole.csproj b/Samples/SvgConsole/SvgConsole.csproj
index 46a211f55..45050e868 100644
--- a/Samples/SvgConsole/SvgConsole.csproj
+++ b/Samples/SvgConsole/SvgConsole.csproj
@@ -8,15 +8,13 @@
True
SvgConsole
7.3
-
-
-
+ Debug;Release
False
False
- $(NoWarn);CS0618;NETSDK1138
+ $(NoWarn);NETSDK1138
$(NoWarn);CS1591;CS0618;NETSDK1138
diff --git a/Samples/SvgRuntimeUpdates/SvgRuntimeUpdates.csproj b/Samples/SvgRuntimeUpdates/SvgRuntimeUpdates.csproj
index 5a978b9f6..2305a36d9 100644
--- a/Samples/SvgRuntimeUpdates/SvgRuntimeUpdates.csproj
+++ b/Samples/SvgRuntimeUpdates/SvgRuntimeUpdates.csproj
@@ -3,10 +3,11 @@
Exe
netcoreapp3.1;net462
+ Debug;Release
- $(NoWarn);CS0618;NETSDK1138
+ $(NoWarn);NETSDK1138
$(NoWarn);CS1591;CS0618;NETSDK1138
diff --git a/Source/DataTypes/SvgNumberCollection.cs b/Source/DataTypes/SvgNumberCollection.cs
index 8887db4e8..6e12254c7 100644
--- a/Source/DataTypes/SvgNumberCollection.cs
+++ b/Source/DataTypes/SvgNumberCollection.cs
@@ -64,7 +64,7 @@ public static SvgNumberCollection Parse(ReadOnlySpan numbers)
foreach (var part in parts)
{
var partValue = part.Value;
- var result = StringParser.ToFloatAny(ref partValue);
+ var result = StringParser.ToFloatAny(partValue);
collection.Add(result);
}
diff --git a/Source/DataTypes/SvgPointCollection.cs b/Source/DataTypes/SvgPointCollection.cs
index f51e80fbd..9c725caaa 100644
--- a/Source/DataTypes/SvgPointCollection.cs
+++ b/Source/DataTypes/SvgPointCollection.cs
@@ -63,7 +63,7 @@ public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo c
var coords = s.AsSpan().Trim();
var state = new CoordinateParserState(ref coords);
var result = new SvgPointCollection();
- while (CoordinateParser.TryGetFloat(out var pointValue, ref coords, ref state))
+ while (CoordinateParser.TryGetFloat(out var pointValue, coords, ref state))
{
result.Add(new SvgUnit(SvgUnitType.User, pointValue));
}
diff --git a/Source/DataTypes/SvgUnitConverter.cs b/Source/DataTypes/SvgUnitConverter.cs
index ab91b1458..2e92b992b 100644
--- a/Source/DataTypes/SvgUnitConverter.cs
+++ b/Source/DataTypes/SvgUnitConverter.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.ComponentModel;
using System.Globalization;
using Svg.Helpers;
@@ -81,7 +81,7 @@ public static SvgUnit Parse(ReadOnlySpan unit)
}
var valSpan = identifierIndex > -1 ? unit.Slice(0, identifierIndex) : unit;
- var val = StringParser.ToFloat(ref valSpan);
+ var val = StringParser.ToFloat(valSpan);
if (identifierIndex == -1)
{
return new SvgUnit(val);
diff --git a/Source/Exceptions/SvgException.cs b/Source/Exceptions/SvgException.cs
index 0e23bbbb9..3043262ff 100644
--- a/Source/Exceptions/SvgException.cs
+++ b/Source/Exceptions/SvgException.cs
@@ -1,5 +1,7 @@
using System;
+#if !NET8_0_OR_GREATER
using System.Runtime.Serialization;
+#endif
namespace Svg
{
@@ -10,8 +12,10 @@ public SvgException() { }
public SvgException(string message) : base(message) { }
public SvgException(string message, Exception inner) : base(message, inner) { }
+#if !NET8_0_OR_GREATER
protected SvgException(SerializationInfo info, StreamingContext context)
: base (info, context) { }
+#endif
}
[Serializable]
@@ -21,8 +25,10 @@ public SvgIDException() { }
public SvgIDException(string message) : base(message) { }
public SvgIDException(string message, Exception inner) : base(message, inner) { }
+#if !NET8_0_OR_GREATER
protected SvgIDException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
+#endif
}
[Serializable]
@@ -32,8 +38,10 @@ public SvgIDExistsException() { }
public SvgIDExistsException(string message) : base(message) { }
public SvgIDExistsException(string message, Exception inner) : base(message, inner) { }
+#if !NET8_0_OR_GREATER
protected SvgIDExistsException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
+#endif
}
[Serializable]
@@ -43,7 +51,9 @@ public SvgIDWrongFormatException() { }
public SvgIDWrongFormatException(string message) : base(message) { }
public SvgIDWrongFormatException(string message, Exception inner) : base(message, inner) { }
+#if !NET8_0_OR_GREATER
protected SvgIDWrongFormatException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
+#endif
}
}
diff --git a/Source/Exceptions/SvgGdiPlusCannotBeLoadedException.cs b/Source/Exceptions/SvgGdiPlusCannotBeLoadedException.cs
index fcf76bdb5..1c498d53d 100644
--- a/Source/Exceptions/SvgGdiPlusCannotBeLoadedException.cs
+++ b/Source/Exceptions/SvgGdiPlusCannotBeLoadedException.cs
@@ -1,5 +1,7 @@
using System;
+#if !NET8_0_OR_GREATER
using System.Runtime.Serialization;
+#endif
namespace Svg
{
@@ -13,7 +15,9 @@ public SvgGdiPlusCannotBeLoadedException(string message) : base(message) { }
public SvgGdiPlusCannotBeLoadedException(Exception inner) : base(gdiErrorMsg, inner) {}
public SvgGdiPlusCannotBeLoadedException(string message, Exception inner) : base(message, inner) { }
+#if !NET8_0_OR_GREATER
protected SvgGdiPlusCannotBeLoadedException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
+#endif
}
}
diff --git a/Source/Exceptions/SvgMemoryException.cs b/Source/Exceptions/SvgMemoryException.cs
index d132fc3b6..281790e7d 100644
--- a/Source/Exceptions/SvgMemoryException.cs
+++ b/Source/Exceptions/SvgMemoryException.cs
@@ -1,5 +1,7 @@
using System;
+#if !NET8_0_OR_GREATER
using System.Runtime.Serialization;
+#endif
namespace Svg.Exceptions
{
@@ -10,7 +12,9 @@ public SvgMemoryException() { }
public SvgMemoryException(string message) : base(message) { }
public SvgMemoryException(string message, Exception inner) : base(message, inner) { }
+#if !NET8_0_OR_GREATER
protected SvgMemoryException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
+#endif
}
}
diff --git a/Source/Helpers/StringParser.cs b/Source/Helpers/StringParser.cs
index 8a87efb0c..6670aba23 100644
--- a/Source/Helpers/StringParser.cs
+++ b/Source/Helpers/StringParser.cs
@@ -7,7 +7,7 @@ internal static class StringParser
{
private static readonly CultureInfo Format = CultureInfo.InvariantCulture;
- public static float ToFloat(ref ReadOnlySpan value)
+ public static float ToFloat(ReadOnlySpan value)
{
#if NETSTANDARD2_1 || NETCOREAPP2_1_OR_GREATER
return float.Parse(value, NumberStyles.Float, Format);
@@ -16,7 +16,7 @@ public static float ToFloat(ref ReadOnlySpan value)
#endif
}
- public static float ToFloatAny(ref ReadOnlySpan value)
+ public static float ToFloatAny(ReadOnlySpan value)
{
#if NETSTANDARD2_1 || NETCOREAPP2_1_OR_GREATER
return float.Parse(value, NumberStyles.Any, Format);
@@ -25,7 +25,7 @@ public static float ToFloatAny(ref ReadOnlySpan value)
#endif
}
- public static double ToDouble(ref ReadOnlySpan value)
+ public static double ToDouble(ReadOnlySpan value)
{
#if NETSTANDARD2_1 || NETCOREAPP2_1_OR_GREATER
return double.Parse(value, NumberStyles.Any, Format);
@@ -34,7 +34,7 @@ public static double ToDouble(ref ReadOnlySpan value)
#endif
}
- public static int ToInt(ref ReadOnlySpan value)
+ public static int ToInt(ReadOnlySpan value)
{
#if NETSTANDARD2_1 || NETCOREAPP2_1_OR_GREATER
return int.Parse(value, NumberStyles.Integer, Format);
diff --git a/Source/Paths/CoordinateParser.cs b/Source/Paths/CoordinateParser.cs
index 20cc06e24..4ed8f8ff2 100644
--- a/Source/Paths/CoordinateParser.cs
+++ b/Source/Paths/CoordinateParser.cs
@@ -44,7 +44,7 @@ private static bool MarkState(bool hasMode, ref CoordinateParserState state)
return hasMode;
}
- public static bool TryGetBool(out bool result, ref ReadOnlySpan chars, ref CoordinateParserState state)
+ public static bool TryGetBool(out bool result, ReadOnlySpan chars, ref CoordinateParserState state)
{
var charsLength = chars.Length;
@@ -88,7 +88,7 @@ public static bool TryGetBool(out bool result, ref ReadOnlySpan chars, ref
return MarkState(false, ref state);
}
- public static bool TryGetFloat(out float result, ref ReadOnlySpan chars, ref CoordinateParserState state)
+ public static bool TryGetFloat(out float result, ReadOnlySpan chars, ref CoordinateParserState state)
{
var charsLength = chars.Length;
@@ -289,7 +289,7 @@ public static bool TryGetFloat(out float result, ref ReadOnlySpan chars, r
if (state.CurrNumState != NumState.Separator && state.NewNumState < state.CurrNumState)
{
var value = chars.Slice(state.Position, state.CharsPosition - state.Position);
- result = StringParser.ToFloat(ref value);
+ result = StringParser.ToFloat(value);
state.Position = state.CharsPosition;
state.CurrNumState = state.NewNumState;
return MarkState(true, ref state);
@@ -316,7 +316,7 @@ public static bool TryGetFloat(out float result, ref ReadOnlySpan chars, r
else
{
var value = chars.Slice(state.Position, charsLength - state.Position);
- result = StringParser.ToFloat(ref value);
+ result = StringParser.ToFloat(value);
state.Position = charsLength;
return MarkState(true, ref state);
}
diff --git a/Source/Paths/SvgPathBuilder.cs b/Source/Paths/SvgPathBuilder.cs
index 8089a9e77..3a8e9613b 100644
--- a/Source/Paths/SvgPathBuilder.cs
+++ b/Source/Paths/SvgPathBuilder.cs
@@ -51,14 +51,14 @@ public static SvgPathSegmentList Parse(ReadOnlySpan path)
{
var commandSetTrimmed = pathTrimmed.Slice(start, length).Trim();
var state = new CoordinateParserState(ref commandSetTrimmed);
- CreatePathSegment(commandSetTrimmed[0], segments, ref state, ref commandSetTrimmed);
+ CreatePathSegment(commandSetTrimmed[0], segments, ref state, commandSetTrimmed);
}
if (pathLength == i + 1)
{
var commandSetTrimmed = pathTrimmed.Slice(i, 1).Trim();
var state = new CoordinateParserState(ref commandSetTrimmed);
- CreatePathSegment(commandSetTrimmed[0], segments, ref state, ref commandSetTrimmed);
+ CreatePathSegment(commandSetTrimmed[0], segments, ref state, commandSetTrimmed);
}
}
else if (pathLength == i + 1)
@@ -71,7 +71,7 @@ public static SvgPathSegmentList Parse(ReadOnlySpan path)
{
var commandSetTrimmed = pathTrimmed.Slice(start, length).Trim();
var state = new CoordinateParserState(ref commandSetTrimmed);
- CreatePathSegment(commandSetTrimmed[0], segments, ref state, ref commandSetTrimmed);
+ CreatePathSegment(commandSetTrimmed[0], segments, ref state, commandSetTrimmed);
}
}
}
@@ -84,7 +84,7 @@ public static SvgPathSegmentList Parse(ReadOnlySpan path)
return segments;
}
- private static void CreatePathSegment(char command, SvgPathSegmentList segments, ref CoordinateParserState state, ref ReadOnlySpan chars)
+ private static void CreatePathSegment(char command, SvgPathSegmentList segments, ref CoordinateParserState state, ReadOnlySpan chars)
{
var isRelative = char.IsLower(command);
// http://www.w3.org/TR/SVG11/paths.html#PathDataGeneralInformation
@@ -94,15 +94,15 @@ private static void CreatePathSegment(char command, SvgPathSegmentList segments,
case 'M': // moveto
case 'm': // relative moveto
{
- if (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state))
+ if (CoordinateParser.TryGetFloat(out var coords0, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords1, chars, ref state))
{
segments.Add(
new SvgMoveToSegment(
isRelative, new PointF(coords0, coords1)));
}
- while (CoordinateParser.TryGetFloat(out coords0, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out coords1, ref chars, ref state))
+ while (CoordinateParser.TryGetFloat(out coords0, chars, ref state)
+ && CoordinateParser.TryGetFloat(out coords1, chars, ref state))
{
segments.Add(
new SvgLineSegment(
@@ -113,13 +113,13 @@ private static void CreatePathSegment(char command, SvgPathSegmentList segments,
case 'A': // elliptical arc
case 'a': // relative elliptical arc
{
- while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state)
- && CoordinateParser.TryGetBool(out var size, ref chars, ref state)
- && CoordinateParser.TryGetBool(out var sweep, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords4, ref chars, ref state))
+ while (CoordinateParser.TryGetFloat(out var coords0, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords1, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords2, chars, ref state)
+ && CoordinateParser.TryGetBool(out var size, chars, ref state)
+ && CoordinateParser.TryGetBool(out var sweep, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords3, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords4, chars, ref state))
{
// A|a rx ry x-axis-rotation large-arc-flag sweep-flag x y
segments.Add(
@@ -136,8 +136,8 @@ private static void CreatePathSegment(char command, SvgPathSegmentList segments,
case 'L': // lineto
case 'l': // relative lineto
{
- while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state))
+ while (CoordinateParser.TryGetFloat(out var coords0, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords1, chars, ref state))
{
segments.Add(
new SvgLineSegment(
@@ -148,7 +148,7 @@ private static void CreatePathSegment(char command, SvgPathSegmentList segments,
case 'H': // horizontal lineto
case 'h': // relative horizontal lineto
{
- while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state))
+ while (CoordinateParser.TryGetFloat(out var coords0, chars, ref state))
{
segments.Add(
new SvgLineSegment(
@@ -159,7 +159,7 @@ private static void CreatePathSegment(char command, SvgPathSegmentList segments,
case 'V': // vertical lineto
case 'v': // relative vertical lineto
{
- while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state))
+ while (CoordinateParser.TryGetFloat(out var coords0, chars, ref state))
{
segments.Add(
new SvgLineSegment(
@@ -170,10 +170,10 @@ private static void CreatePathSegment(char command, SvgPathSegmentList segments,
case 'Q': // quadratic bézier curveto
case 'q': // relative quadratic bézier curveto
{
- while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state))
+ while (CoordinateParser.TryGetFloat(out var coords0, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords1, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords2, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords3, chars, ref state))
{
segments.Add(
new SvgQuadraticCurveSegment(
@@ -186,8 +186,8 @@ private static void CreatePathSegment(char command, SvgPathSegmentList segments,
case 'T': // shorthand/smooth quadratic bézier curveto
case 't': // relative shorthand/smooth quadratic bézier curveto
{
- while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state))
+ while (CoordinateParser.TryGetFloat(out var coords0, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords1, chars, ref state))
{
segments.Add(
new SvgQuadraticCurveSegment(
@@ -198,12 +198,12 @@ private static void CreatePathSegment(char command, SvgPathSegmentList segments,
case 'C': // curveto
case 'c': // relative curveto
{
- while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords4, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords5, ref chars, ref state))
+ while (CoordinateParser.TryGetFloat(out var coords0, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords1, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords2, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords3, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords4, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords5, chars, ref state))
{
segments.Add(
new SvgCubicCurveSegment(
@@ -217,10 +217,10 @@ private static void CreatePathSegment(char command, SvgPathSegmentList segments,
case 'S': // shorthand/smooth curveto
case 's': // relative shorthand/smooth curveto
{
- while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state)
- && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state))
+ while (CoordinateParser.TryGetFloat(out var coords0, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords1, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords2, chars, ref state)
+ && CoordinateParser.TryGetFloat(out var coords3, chars, ref state))
{
segments.Add(
new SvgCubicCurveSegment(
diff --git a/Source/Svg.csproj b/Source/Svg.csproj
index 5f3dc1993..c0aa6b26f 100644
--- a/Source/Svg.csproj
+++ b/Source/Svg.csproj
@@ -1,6 +1,6 @@
- net6.0;netcoreapp3.1;netstandard2.1;netstandard2.0;net462;net472;net481
+ net8.0;net6.0;netcoreapp3.1;netstandard2.1;netstandard2.0;net462;net472;net481
MS-PL
Svg
Svg
@@ -44,7 +44,7 @@
full
true
DEBUG;TRACE
- $(NoWarn);CS0618;NETSDK1138
+ $(NoWarn);NETSDK1138
true
@@ -143,6 +143,10 @@
+
+
+
+
diff --git a/Source/Svg.sln b/Source/Svg.sln
index 2b8f7c7f5..add02a0d1 100644
--- a/Source/Svg.sln
+++ b/Source/Svg.sln
@@ -10,9 +10,6 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A417AF1E-BEDB-4715-B4FD-D795579217F9}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
- Local.testsettings = Local.testsettings
- Svg.vsmdi = Svg.vsmdi
- TraceAndTestImpact.testsettings = TraceAndTestImpact.testsettings
version.json = version.json
EndProjectSection
EndProject
@@ -40,7 +37,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Generators", "Generators",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svg.Custom", "..\Svg.Custom\Svg.Custom.csproj", "{6FAA2B79-FE5C-456B-A743-E9290665B223}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Svg.Tests.Common", "..\Tests\Svg.Tests.Common\Svg.Tests.Common.csproj", "{D7C625E8-79EA-4859-A457-2C4A90786790}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svg.Tests.Common", "..\Tests\Svg.Tests.Common\Svg.Tests.Common.csproj", "{D7C625E8-79EA-4859-A457-2C4A90786790}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/Source/Transforms/SvgTransformConverter.cs b/Source/Transforms/SvgTransformConverter.cs
index aec154c35..bb27b8777 100644
--- a/Source/Transforms/SvgTransformConverter.cs
+++ b/Source/Transforms/SvgTransformConverter.cs
@@ -99,11 +99,11 @@ public static SvgTransformCollection Parse(ReadOnlySpan transform)
var partValue = part.Value;
if (count == 0)
{
- x = StringParser.ToFloat(ref partValue);
+ x = StringParser.ToFloat(partValue);
}
else if (count == 1)
{
- y = StringParser.ToFloat(ref partValue);
+ y = StringParser.ToFloat(partValue);
}
count++;
@@ -129,15 +129,15 @@ public static SvgTransformCollection Parse(ReadOnlySpan transform)
var partValue = part.Value;
if (count == 0)
{
- angle = StringParser.ToFloat(ref partValue);
+ angle = StringParser.ToFloat(partValue);
}
else if (count == 1)
{
- cx = StringParser.ToFloat(ref partValue);
+ cx = StringParser.ToFloat(partValue);
}
else if (count == 2)
{
- cy = StringParser.ToFloat(ref partValue);
+ cy = StringParser.ToFloat(partValue);
}
count++;
@@ -162,11 +162,11 @@ public static SvgTransformCollection Parse(ReadOnlySpan transform)
var partValue = part.Value;
if (count == 0)
{
- sx = StringParser.ToFloat(ref partValue);
+ sx = StringParser.ToFloat(partValue);
}
else if (count == 1)
{
- sy = StringParser.ToFloat(ref partValue);
+ sy = StringParser.ToFloat(partValue);
}
count++;
@@ -195,27 +195,27 @@ public static SvgTransformCollection Parse(ReadOnlySpan transform)
var partValue = part.Value;
if (count == 0)
{
- m11 = StringParser.ToFloat(ref partValue);
+ m11 = StringParser.ToFloat(partValue);
}
else if (count == 1)
{
- m12 = StringParser.ToFloat(ref partValue);
+ m12 = StringParser.ToFloat(partValue);
}
else if (count == 2)
{
- m21 = StringParser.ToFloat(ref partValue);
+ m21 = StringParser.ToFloat(partValue);
}
else if (count == 3)
{
- m22 = StringParser.ToFloat(ref partValue);
+ m22 = StringParser.ToFloat(partValue);
}
else if (count == 4)
{
- dx = StringParser.ToFloat(ref partValue);
+ dx = StringParser.ToFloat(partValue);
}
else if (count == 5)
{
- dy = StringParser.ToFloat(ref partValue);
+ dy = StringParser.ToFloat(partValue);
}
count++;
@@ -241,11 +241,11 @@ public static SvgTransformCollection Parse(ReadOnlySpan transform)
var partValue = part.Value;
if (count == 0)
{
- hx = StringParser.ToFloat(ref partValue);
+ hx = StringParser.ToFloat(partValue);
}
else if (count == 1)
{
- hy = StringParser.ToFloat(ref partValue);
+ hy = StringParser.ToFloat(partValue);
}
count++;
@@ -269,7 +269,7 @@ public static SvgTransformCollection Parse(ReadOnlySpan transform)
var partValue = part.Value;
if (count == 0)
{
- ax = StringParser.ToFloat(ref partValue);
+ ax = StringParser.ToFloat(partValue);
}
count++;
@@ -293,7 +293,7 @@ public static SvgTransformCollection Parse(ReadOnlySpan transform)
var partValue = part.Value;
if (count == 0)
{
- ay = StringParser.ToFloat(ref partValue);
+ ay = StringParser.ToFloat(partValue);
}
count++;
diff --git a/Svg.Custom/Svg.Custom.csproj b/Svg.Custom/Svg.Custom.csproj
index 2ea599716..7b4d346e4 100644
--- a/Svg.Custom/Svg.Custom.csproj
+++ b/Svg.Custom/Svg.Custom.csproj
@@ -3,7 +3,7 @@
Library
- netstandard2.0;net6.0
+ netstandard2.0;net6.0;net8.0
False
False
True
diff --git a/Tests/Svg.Benchmark.sln b/Tests/Svg.Benchmark.sln
new file mode 100644
index 000000000..d2c6482dd
--- /dev/null
+++ b/Tests/Svg.Benchmark.sln
@@ -0,0 +1,61 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.8.34408.163
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svg", "..\Source\Svg.csproj", "{886A98C5-37C0-4E8B-885E-30C1D2F98B47}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A417AF1E-BEDB-4715-B4FD-D795579217F9}"
+ ProjectSection(SolutionItems) = preProject
+ ..\Source\.editorconfig = ..\Source\.editorconfig
+ ..\Source\version.json = ..\Source\version.json
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{2EC3F3A0-F097-43EF-A603-9B82E3061469}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svg.Generators", "..\Generators\Svg.Generators.csproj", "{BACDD1F4-B97D-4E27-BD09-6957633FF484}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svg.Benchmark", "Svg.Benchmark\Svg.Benchmark.csproj", "{8DEB3EA7-5915-4EB9-8052-85A7AC4379EC}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Generators", "Generators", "{FAFD6DC7-5203-4CED-A151-66379DD43695}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svg.Tests.Common", "Svg.Tests.Common\Svg.Tests.Common.csproj", "{D7C625E8-79EA-4859-A457-2C4A90786790}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {886A98C5-37C0-4E8B-885E-30C1D2F98B47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {886A98C5-37C0-4E8B-885E-30C1D2F98B47}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {886A98C5-37C0-4E8B-885E-30C1D2F98B47}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {886A98C5-37C0-4E8B-885E-30C1D2F98B47}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BACDD1F4-B97D-4E27-BD09-6957633FF484}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BACDD1F4-B97D-4E27-BD09-6957633FF484}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BACDD1F4-B97D-4E27-BD09-6957633FF484}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BACDD1F4-B97D-4E27-BD09-6957633FF484}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8DEB3EA7-5915-4EB9-8052-85A7AC4379EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8DEB3EA7-5915-4EB9-8052-85A7AC4379EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8DEB3EA7-5915-4EB9-8052-85A7AC4379EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8DEB3EA7-5915-4EB9-8052-85A7AC4379EC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D7C625E8-79EA-4859-A457-2C4A90786790}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D7C625E8-79EA-4859-A457-2C4A90786790}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D7C625E8-79EA-4859-A457-2C4A90786790}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D7C625E8-79EA-4859-A457-2C4A90786790}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {BACDD1F4-B97D-4E27-BD09-6957633FF484} = {FAFD6DC7-5203-4CED-A151-66379DD43695}
+ {8DEB3EA7-5915-4EB9-8052-85A7AC4379EC} = {2EC3F3A0-F097-43EF-A603-9B82E3061469}
+ {D7C625E8-79EA-4859-A457-2C4A90786790} = {2EC3F3A0-F097-43EF-A603-9B82E3061469}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {5096EEB3-8F41-44B5-BCF9-58743A59AB21}
+ EndGlobalSection
+ GlobalSection(TestCaseManagementSettings) = postSolution
+ CategoryFile = Svg.vsmdi
+ EndGlobalSection
+EndGlobal
diff --git a/Tests/Svg.Benchmark/CoordinateParserBenchmarks.cs b/Tests/Svg.Benchmark/CoordinateParserBenchmarks.cs
index cb5e13b88..6ffcedef2 100644
--- a/Tests/Svg.Benchmark/CoordinateParserBenchmarks.cs
+++ b/Tests/Svg.Benchmark/CoordinateParserBenchmarks.cs
@@ -12,7 +12,7 @@ public void CoordinateParser_TryGetBool()
{
var chars = "false".AsSpan().Trim();
var state = new CoordinateParserState(ref chars);
- CoordinateParser.TryGetBool(out var result, ref chars, ref state);
+ CoordinateParser.TryGetBool(out var result, chars, ref state);
}
[Benchmark]
@@ -20,7 +20,7 @@ public void CoordinateParser_TryGetFloat_Points()
{
var chars = "1.6,3.2 1.2,5".AsSpan().Trim();
var state = new CoordinateParserState(ref chars);
- while (CoordinateParser.TryGetFloat(out var result, ref chars, ref state))
+ while (CoordinateParser.TryGetFloat(out var result, chars, ref state))
{
}
}
diff --git a/Tests/Svg.Benchmark/Svg.Benchmark.csproj b/Tests/Svg.Benchmark/Svg.Benchmark.csproj
index 77a488fda..b7f578e4d 100644
--- a/Tests/Svg.Benchmark/Svg.Benchmark.csproj
+++ b/Tests/Svg.Benchmark/Svg.Benchmark.csproj
@@ -1,15 +1,16 @@
Exe
- net6.0;netcoreapp3.1;net462
+ net8.0;net6.0;netcoreapp3.1;net462
false
- 8.0
+ 10.0
True
..\Svg.UnitTests\svgkey.snk
+ Debug;Release
- $(NoWarn);CS0618;NETSDK1138
+ $(NoWarn);NETSDK1138
$(NoWarn);CS1591;CS0618;NETSDK1138
diff --git a/Tests/Svg.Tests.Common/Svg.Tests.Common.csproj b/Tests/Svg.Tests.Common/Svg.Tests.Common.csproj
index 35ccfeac6..474d0f0bd 100644
--- a/Tests/Svg.Tests.Common/Svg.Tests.Common.csproj
+++ b/Tests/Svg.Tests.Common/Svg.Tests.Common.csproj
@@ -1,13 +1,14 @@
- net6.0;netcoreapp3.1;net462
+ net8.0;net6.0;netcoreapp3.1;net462
False
False
False
True
svgkey.snk
false
+ Debug;Release
diff --git a/Tests/Svg.UnitTests.sln b/Tests/Svg.UnitTests.sln
new file mode 100644
index 000000000..f34c94715
--- /dev/null
+++ b/Tests/Svg.UnitTests.sln
@@ -0,0 +1,61 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.8.34408.163
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svg", "..\Source\Svg.csproj", "{886A98C5-37C0-4E8B-885E-30C1D2F98B47}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svg.UnitTests", "Svg.UnitTests\Svg.UnitTests.csproj", "{E702EB7D-D01D-438A-BADD-E72D4E49109F}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A417AF1E-BEDB-4715-B4FD-D795579217F9}"
+ ProjectSection(SolutionItems) = preProject
+ ..\Source\.editorconfig = ..\Source\.editorconfig
+ ..\Source\version.json = ..\Source\version.json
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{2EC3F3A0-F097-43EF-A603-9B82E3061469}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svg.Generators", "..\Generators\Svg.Generators.csproj", "{BACDD1F4-B97D-4E27-BD09-6957633FF484}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Generators", "Generators", "{FAFD6DC7-5203-4CED-A151-66379DD43695}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svg.Tests.Common", "Svg.Tests.Common\Svg.Tests.Common.csproj", "{D7C625E8-79EA-4859-A457-2C4A90786790}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {886A98C5-37C0-4E8B-885E-30C1D2F98B47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {886A98C5-37C0-4E8B-885E-30C1D2F98B47}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {886A98C5-37C0-4E8B-885E-30C1D2F98B47}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {886A98C5-37C0-4E8B-885E-30C1D2F98B47}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E702EB7D-D01D-438A-BADD-E72D4E49109F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E702EB7D-D01D-438A-BADD-E72D4E49109F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E702EB7D-D01D-438A-BADD-E72D4E49109F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E702EB7D-D01D-438A-BADD-E72D4E49109F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BACDD1F4-B97D-4E27-BD09-6957633FF484}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BACDD1F4-B97D-4E27-BD09-6957633FF484}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BACDD1F4-B97D-4E27-BD09-6957633FF484}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BACDD1F4-B97D-4E27-BD09-6957633FF484}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D7C625E8-79EA-4859-A457-2C4A90786790}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D7C625E8-79EA-4859-A457-2C4A90786790}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D7C625E8-79EA-4859-A457-2C4A90786790}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D7C625E8-79EA-4859-A457-2C4A90786790}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {E702EB7D-D01D-438A-BADD-E72D4E49109F} = {2EC3F3A0-F097-43EF-A603-9B82E3061469}
+ {BACDD1F4-B97D-4E27-BD09-6957633FF484} = {FAFD6DC7-5203-4CED-A151-66379DD43695}
+ {D7C625E8-79EA-4859-A457-2C4A90786790} = {2EC3F3A0-F097-43EF-A603-9B82E3061469}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {5096EEB3-8F41-44B5-BCF9-58743A59AB21}
+ EndGlobalSection
+ GlobalSection(TestCaseManagementSettings) = postSolution
+ CategoryFile = Svg.vsmdi
+ EndGlobalSection
+EndGlobal
diff --git a/Tests/Svg.UnitTests/Svg.UnitTests.csproj b/Tests/Svg.UnitTests/Svg.UnitTests.csproj
index 18742e445..7c83e6e8c 100644
--- a/Tests/Svg.UnitTests/Svg.UnitTests.csproj
+++ b/Tests/Svg.UnitTests/Svg.UnitTests.csproj
@@ -1,18 +1,17 @@
true
- net6.0;netcoreapp3.1;net462
+ net8.0;net6.0;netcoreapp3.1;net462
false
true
svgkey.snk
false
false
Debug;Release
- 1591
- $(NoWarn);CS0618;NETSDK1138
+ $(NoWarn);NETSDK1138
$(NoWarn);CS1591;CS0618;NETSDK1138
diff --git a/Tests/SvgW3CTestRunner/Properties/AssemblyInfo.cs b/Tests/SvgW3CTestRunner/Properties/AssemblyInfo.cs
index 7934a66cb..3ae937249 100644
--- a/Tests/SvgW3CTestRunner/Properties/AssemblyInfo.cs
+++ b/Tests/SvgW3CTestRunner/Properties/AssemblyInfo.cs
@@ -33,3 +33,6 @@
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
+#if NET5_0_OR_GREATER
+[assembly: System.Runtime.Versioning.SupportedOSPlatform("windows7.0")]
+#endif
diff --git a/Tests/SvgW3CTestRunner/SvgW3CTestRunner.csproj b/Tests/SvgW3CTestRunner/SvgW3CTestRunner.csproj
index 73a030143..455775860 100644
--- a/Tests/SvgW3CTestRunner/SvgW3CTestRunner.csproj
+++ b/Tests/SvgW3CTestRunner/SvgW3CTestRunner.csproj
@@ -2,15 +2,16 @@
WinExe
- net6.0-windows;netcoreapp3.1;net462
+ net8.0-windows;net6.0-windows;netcoreapp3.1;net462
true
false
True
true
+ Debug;Release
- $(NoWarn);CS0618;NETSDK1138
+ $(NoWarn);NETSDK1138
$(NoWarn);CS1591;CS0618;NETSDK1138
diff --git a/doc/ReleaseNotes.md b/doc/ReleaseNotes.md
index d9581d71a..1b06f3847 100644
--- a/doc/ReleaseNotes.md
+++ b/doc/ReleaseNotes.md
@@ -4,9 +4,15 @@ The release versions are NuGet releases.
## Unreleased
### Changes
-* added SvgOptions with css parameter to Open so that this can be used for transforming the svgdocument.
+* Added: A class, `SvgOptions`, with external css parameters for styling or transforming the `SvgDocument`.
* Split tests SVG/PNG files into Issues and W3C Test Suite. W3C Test Suite files are not automatically downloaded.
* Repository clean-up, reducing the download zip size from 22MB to 4.5MB.
+* Added: Support for .NET 4.7.2, .NET 4.8.1 and .NET 8.0.
+* Added: A new project, `Tests/Svg.Tests.Common` for sharing codes between test applications.
+* [Breaking change] The support for .NET 8 resulted in a breaking change to the signature of methods in `CoordinateParser`.
+ * The changes are needed to fix a compiler error `CS8352`.
+ * The use of read-only arguments as referenced variable is not necessary.
+ * The use of `ref` in the function arguements resulting in `CS8352` error are all removed.
### Enhancements
* made exceptions serializable to be able to cross AppDomain boundaries (see [#826](https://github.com/svg-net/SVG/pull/826))