@@ -133,29 +133,79 @@ public static bool TryParse (string hexString, out SKColor color)
133
133
return false ;
134
134
}
135
135
136
+ #if NETCOREAPP3_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER
136
137
// clean up string
137
- hexString = hexString . Trim ( ) . ToUpperInvariant ( ) ;
138
- if ( hexString [ 0 ] == '#' )
139
- hexString = hexString . Substring ( 1 ) ;
138
+ var hexSpan = hexString . AsSpan ( ) . Trim ( ) . TrimStart ( '#' ) ;
140
139
141
- var len = hexString . Length ;
140
+ var len = hexSpan . Length ;
142
141
if ( len == 3 || len == 4 ) {
143
142
byte a ;
144
143
// parse [A]
145
144
if ( len == 4 ) {
146
- if ( ! byte . TryParse ( string . Concat ( hexString [ len - 4 ] , hexString [ len - 4 ] ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out a ) ) {
145
+ if ( ! byte . TryParse ( hexSpan . Slice ( 0 , 1 ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out a ) ) {
147
146
// error
148
147
color = SKColor . Empty ;
149
148
return false ;
150
149
}
150
+ a = ( byte ) ( a << 4 | a ) ;
151
151
} else {
152
152
a = 255 ;
153
153
}
154
154
155
155
// parse RGB
156
- if ( ! byte . TryParse ( string . Concat ( hexString [ len - 3 ] , hexString [ len - 3 ] ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var r ) ||
157
- ! byte . TryParse ( string . Concat ( hexString [ len - 2 ] , hexString [ len - 2 ] ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var g ) ||
158
- ! byte . TryParse ( string . Concat ( hexString [ len - 1 ] , hexString [ len - 1 ] ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var b ) ) {
156
+ if ( ! byte . TryParse ( hexSpan . Slice ( len - 3 , 1 ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var r ) ||
157
+ ! byte . TryParse ( hexSpan . Slice ( len - 2 , 1 ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var g ) ||
158
+ ! byte . TryParse ( hexSpan . Slice ( len - 1 , 1 ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var b ) ) {
159
+ // error
160
+ color = SKColor . Empty ;
161
+ return false ;
162
+ }
163
+
164
+ // success
165
+ color = new SKColor ( ( byte ) ( r << 4 | r ) , ( byte ) ( g << 4 | g ) , ( byte ) ( b << 4 | b ) , a ) ;
166
+ return true ;
167
+ }
168
+
169
+ if ( len == 6 || len == 8 ) {
170
+ // parse [AA]RRGGBB
171
+ if ( ! uint . TryParse ( hexSpan , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var number ) ) {
172
+ // error
173
+ color = SKColor . Empty ;
174
+ return false ;
175
+ }
176
+
177
+ // success
178
+ color = ( SKColor ) number ;
179
+
180
+ // alpha was not provided, so use 255
181
+ if ( len == 6 ) {
182
+ color = color . WithAlpha ( 255 ) ;
183
+ }
184
+ return true ;
185
+ }
186
+ #else
187
+ // clean up string
188
+ hexString = hexString . Trim ( ) ;
189
+ var startIndex = hexString [ 0 ] == '#' ? 1 : 0 ;
190
+
191
+ var len = hexString . Length - startIndex ;
192
+ if ( len == 3 || len == 4 ) {
193
+ byte a ;
194
+ // parse [A]
195
+ if ( len == 4 ) {
196
+ if ( ! byte . TryParse ( string . Concat ( new string ( hexString [ len - 4 + startIndex ] , 2 ) ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out a ) ) {
197
+ // error
198
+ color = SKColor . Empty ;
199
+ return false ;
200
+ }
201
+ } else {
202
+ a = 255 ;
203
+ }
204
+
205
+ // parse RGB
206
+ if ( ! byte . TryParse ( new string ( hexString [ len - 3 + startIndex ] , 2 ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var r ) ||
207
+ ! byte . TryParse ( new string ( hexString [ len - 2 + startIndex ] , 2 ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var g ) ||
208
+ ! byte . TryParse ( new string ( hexString [ len - 1 + startIndex ] , 2 ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var b ) ) {
159
209
// error
160
210
color = SKColor . Empty ;
161
211
return false ;
@@ -168,7 +218,7 @@ public static bool TryParse (string hexString, out SKColor color)
168
218
169
219
if ( len == 6 || len == 8 ) {
170
220
// parse [AA]RRGGBB
171
- if ( ! uint . TryParse ( hexString , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var number ) ) {
221
+ if ( ! uint . TryParse ( hexString . Substring ( startIndex ) , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var number ) ) {
172
222
// error
173
223
color = SKColor . Empty ;
174
224
return false ;
@@ -183,6 +233,7 @@ public static bool TryParse (string hexString, out SKColor color)
183
233
}
184
234
return true ;
185
235
}
236
+ #endif
186
237
187
238
// error
188
239
color = SKColor . Empty ;
0 commit comments