@@ -118,21 +118,27 @@ SegmentInfo IPathInternals.PointAlongPath(float distance)
118118 IReadOnlyList < InternalPath > IInternalPathOwner . GetRingsAsInternalPath ( ) => new [ ] { this . InnerPath } ;
119119
120120 /// <summary>
121- /// Converts an svg path into a Path
121+ /// Converts an SVG path string into an <see cref="IPath"/>.
122122 /// </summary>
123- /// <param name="data">data</param>
124- /// <param name="value">path</param>
125- /// <returns>true if successful</returns>
126- public static bool TryParseSvgPath ( string data , out IPath value )
127- => TryParseSvgPath ( data . AsSpan ( ) , out value ) ;
123+ /// <param name="svgPath">The string containing the SVG path data.</param>
124+ /// <param name="value">
125+ /// When this method returns, contains the logic path converted from the given SVG path string; otherwise, <see langword="null"/>.
126+ /// This parameter is passed uninitialized.
127+ /// </param>
128+ /// <returns><see langword="true"/> if the input value can be parsed and converted; otherwise, <see langword="false"/>.</returns>
129+ public static bool TryParseSvgPath ( string svgPath , out IPath value )
130+ => TryParseSvgPath ( svgPath . AsSpan ( ) , out value ) ;
128131
129132 /// <summary>
130- /// Converts an svg path into a Path
133+ /// Converts an SVG path string into an <see cref="IPath"/>.
131134 /// </summary>
132- /// <param name="data">data</param>
133- /// <param name="value">path</param>
134- /// <returns>true if successful</returns>
135- public static bool TryParseSvgPath ( ReadOnlySpan < char > data , out IPath value )
135+ /// <param name="svgPath">The string containing the SVG path data.</param>
136+ /// <param name="value">
137+ /// When this method returns, contains the logic path converted from the given SVG path string; otherwise, <see langword="null"/>.
138+ /// This parameter is passed uninitialized.
139+ /// </param>
140+ /// <returns><see langword="true"/> if the input value can be parsed and converted; otherwise, <see langword="false"/>.</returns>
141+ public static bool TryParseSvgPath ( ReadOnlySpan < char > svgPath , out IPath value )
136142 {
137143 value = null ;
138144
@@ -150,24 +156,24 @@ public static bool TryParseSvgPath(ReadOnlySpan<char> data, out IPath value)
150156 bool relative = false ;
151157 while ( true )
152158 {
153- data = data . TrimStart ( ) ;
154- if ( data . Length == 0 )
159+ svgPath = svgPath . TrimStart ( ) ;
160+ if ( svgPath . Length == 0 )
155161 {
156162 break ;
157163 }
158164
159- char ch = data [ 0 ] ;
165+ char ch = svgPath [ 0 ] ;
160166 if ( char . IsDigit ( ch ) || ch == '-' || ch == '+' || ch == '.' )
161167 {
162168 // Are we are the end of the string or we are at the end of the path?
163- if ( data . Length == 0 || op == 'Z' )
169+ if ( svgPath . Length == 0 || op == 'Z' )
164170 {
165171 return false ;
166172 }
167173 }
168174 else if ( IsSeparator ( ch ) )
169175 {
170- data = TrimSeparator ( data ) ;
176+ svgPath = TrimSeparator ( svgPath ) ;
171177 }
172178 else
173179 {
@@ -179,25 +185,25 @@ public static bool TryParseSvgPath(ReadOnlySpan<char> data, out IPath value)
179185 relative = true ;
180186 }
181187
182- data = TrimSeparator ( data . Slice ( 1 ) ) ;
188+ svgPath = TrimSeparator ( svgPath . Slice ( 1 ) ) ;
183189 }
184190
185191 switch ( op )
186192 {
187193 case 'M' :
188- data = FindPoint ( data , out point1 , relative , c ) ;
194+ svgPath = FindPoint ( svgPath , out point1 , relative , c ) ;
189195 builder . MoveTo ( point1 ) ;
190196 previousOp = '\0 ' ;
191197 op = 'L' ;
192198 c = point1 ;
193199 break ;
194200 case 'L' :
195- data = FindPoint ( data , out point1 , relative , c ) ;
201+ svgPath = FindPoint ( svgPath , out point1 , relative , c ) ;
196202 builder . LineTo ( point1 ) ;
197203 c = point1 ;
198204 break ;
199205 case 'H' :
200- data = FindScaler ( data , out float x ) ;
206+ svgPath = FindScaler ( svgPath , out float x ) ;
201207 if ( relative )
202208 {
203209 x += c . X ;
@@ -207,7 +213,7 @@ public static bool TryParseSvgPath(ReadOnlySpan<char> data, out IPath value)
207213 c . X = x ;
208214 break ;
209215 case 'V' :
210- data = FindScaler ( data , out float y ) ;
216+ svgPath = FindScaler ( svgPath , out float y ) ;
211217 if ( relative )
212218 {
213219 y += c . Y ;
@@ -217,16 +223,16 @@ public static bool TryParseSvgPath(ReadOnlySpan<char> data, out IPath value)
217223 c . Y = y ;
218224 break ;
219225 case 'C' :
220- data = FindPoint ( data , out point1 , relative , c ) ;
221- data = FindPoint ( data , out point2 , relative , c ) ;
222- data = FindPoint ( data , out point3 , relative , c ) ;
226+ svgPath = FindPoint ( svgPath , out point1 , relative , c ) ;
227+ svgPath = FindPoint ( svgPath , out point2 , relative , c ) ;
228+ svgPath = FindPoint ( svgPath , out point3 , relative , c ) ;
223229 builder . CubicBezierTo ( point1 , point2 , point3 ) ;
224230 lastc = point2 ;
225231 c = point3 ;
226232 break ;
227233 case 'S' :
228- data = FindPoint ( data , out point2 , relative , c ) ;
229- data = FindPoint ( data , out point3 , relative , c ) ;
234+ svgPath = FindPoint ( svgPath , out point2 , relative , c ) ;
235+ svgPath = FindPoint ( svgPath , out point3 , relative , c ) ;
230236 point1 = c ;
231237 if ( previousOp is 'C' or 'S' )
232238 {
@@ -239,14 +245,14 @@ public static bool TryParseSvgPath(ReadOnlySpan<char> data, out IPath value)
239245 c = point3 ;
240246 break ;
241247 case 'Q' : // Quadratic Bezier Curve
242- data = FindPoint ( data , out point1 , relative , c ) ;
243- data = FindPoint ( data , out point2 , relative , c ) ;
248+ svgPath = FindPoint ( svgPath , out point1 , relative , c ) ;
249+ svgPath = FindPoint ( svgPath , out point2 , relative , c ) ;
244250 builder . QuadraticBezierTo ( point1 , point2 ) ;
245251 lastc = point1 ;
246252 c = point2 ;
247253 break ;
248254 case 'T' :
249- data = FindPoint ( data , out point2 , relative , c ) ;
255+ svgPath = FindPoint ( svgPath , out point2 , relative , c ) ;
250256 point1 = c ;
251257 if ( previousOp is 'Q' or 'T' )
252258 {
@@ -259,18 +265,18 @@ public static bool TryParseSvgPath(ReadOnlySpan<char> data, out IPath value)
259265 c = point2 ;
260266 break ;
261267 case 'A' :
262- data = FindScaler ( data , out float radiiX ) ;
263- data = TrimSeparator ( data ) ;
264- data = FindScaler ( data , out float radiiY ) ;
265- data = TrimSeparator ( data ) ;
266- data = FindScaler ( data , out float angle ) ;
267- data = TrimSeparator ( data ) ;
268- data = FindScaler ( data , out float largeArc ) ;
269- data = TrimSeparator ( data ) ;
270- data = FindScaler ( data , out float sweep ) ;
271-
272- data = FindPoint ( data , out PointF point , relative , c ) ;
273- if ( data . Length > 0 )
268+ svgPath = FindScaler ( svgPath , out float radiiX ) ;
269+ svgPath = TrimSeparator ( svgPath ) ;
270+ svgPath = FindScaler ( svgPath , out float radiiY ) ;
271+ svgPath = TrimSeparator ( svgPath ) ;
272+ svgPath = FindScaler ( svgPath , out float angle ) ;
273+ svgPath = TrimSeparator ( svgPath ) ;
274+ svgPath = FindScaler ( svgPath , out float largeArc ) ;
275+ svgPath = TrimSeparator ( svgPath ) ;
276+ svgPath = FindScaler ( svgPath , out float sweep ) ;
277+
278+ svgPath = FindPoint ( svgPath , out PointF point , relative , c ) ;
279+ if ( svgPath . Length > 0 )
274280 {
275281 builder . ArcTo ( radiiX , radiiY , angle , largeArc == 1 , sweep == 1 , point ) ;
276282 c = point ;
@@ -282,8 +288,8 @@ public static bool TryParseSvgPath(ReadOnlySpan<char> data, out IPath value)
282288 c = first ;
283289 break ;
284290 case '~' :
285- data = FindPoint ( data , out point1 , relative , c ) ;
286- data = FindPoint ( data , out point2 , relative , c ) ;
291+ svgPath = FindPoint ( svgPath , out point1 , relative , c ) ;
292+ svgPath = FindPoint ( svgPath , out point2 , relative , c ) ;
287293 builder . MoveTo ( point1 ) ;
288294 builder . LineTo ( point2 ) ;
289295 break ;
0 commit comments