| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkParse.h" | 10 #include "SkParse.h" |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 while (--remaining10s >= 0) | 194 while (--remaining10s >= 0) |
| 195 n *= 10; | 195 n *= 10; |
| 196 if (value) | 196 if (value) |
| 197 *value = (n ^ sign) - sign; | 197 *value = (n ^ sign) - sign; |
| 198 return str; | 198 return str; |
| 199 } | 199 } |
| 200 | 200 |
| 201 const char* SkParse::FindScalar(const char str[], SkScalar* value) { | 201 const char* SkParse::FindScalar(const char str[], SkScalar* value) { |
| 202 SkASSERT(str); | 202 SkASSERT(str); |
| 203 str = skip_ws(str); | 203 str = skip_ws(str); |
| 204 #ifdef SK_SCALAR_IS_FLOAT | 204 |
| 205 char* stop; | 205 char* stop; |
| 206 float v = (float)strtod(str, &stop); | 206 float v = (float)strtod(str, &stop); |
| 207 if (str == stop) { | 207 if (str == stop) { |
| 208 return NULL; | 208 return NULL; |
| 209 } | 209 } |
| 210 if (value) { | 210 if (value) { |
| 211 *value = v; | 211 *value = v; |
| 212 } | 212 } |
| 213 return stop; | 213 return stop; |
| 214 #else | |
| 215 int sign = 0; | |
| 216 if (*str == '-') | |
| 217 { | |
| 218 sign = -1; | |
| 219 str += 1; | |
| 220 } | |
| 221 | |
| 222 if (!is_digit(*str) && *str != '.') | |
| 223 return NULL; | |
| 224 | |
| 225 int n = 0; | |
| 226 while (is_digit(*str)) | |
| 227 { | |
| 228 n = 10*n + *str - '0'; | |
| 229 if (n > 0x7FFF) | |
| 230 return NULL; | |
| 231 str += 1; | |
| 232 } | |
| 233 n <<= 16; | |
| 234 | |
| 235 if (*str == '.') | |
| 236 { | |
| 237 static const int gFractions[] = { (1 << 24) / 10, (1 << 24) / 100, (1
<< 24) / 1000, | |
| 238 (1 << 24) / 10000, (1 << 24) / 100000 }; | |
| 239 str += 1; | |
| 240 int d = 0; | |
| 241 const int* fraction = gFractions; | |
| 242 const int* end = &fraction[SK_ARRAY_COUNT(gFractions)]; | |
| 243 while (is_digit(*str) && fraction < end) | |
| 244 d += (*str++ - '0') * *fraction++; | |
| 245 d += 0x80; // round | |
| 246 n += d >> 8; | |
| 247 } | |
| 248 while (is_digit(*str)) | |
| 249 str += 1; | |
| 250 if (value) | |
| 251 { | |
| 252 n = (n ^ sign) - sign; // apply the sign | |
| 253 *value = SkFixedToScalar(n); | |
| 254 } | |
| 255 #endif | |
| 256 return str; | |
| 257 } | 214 } |
| 258 | 215 |
| 259 const char* SkParse::FindScalars(const char str[], SkScalar value[], int count) | 216 const char* SkParse::FindScalars(const char str[], SkScalar value[], int count) |
| 260 { | 217 { |
| 261 SkASSERT(count >= 0); | 218 SkASSERT(count >= 0); |
| 262 | 219 |
| 263 if (count > 0) | 220 if (count > 0) |
| 264 { | 221 { |
| 265 for (;;) | 222 for (;;) |
| 266 { | 223 { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 return -1; | 286 return -1; |
| 330 } | 287 } |
| 331 | 288 |
| 332 #ifdef SK_SUPPORT_UNITTEST | 289 #ifdef SK_SUPPORT_UNITTEST |
| 333 void SkParse::UnitTest() | 290 void SkParse::UnitTest() |
| 334 { | 291 { |
| 335 // !!! additional parse tests go here | 292 // !!! additional parse tests go here |
| 336 SkParse::TestColor(); | 293 SkParse::TestColor(); |
| 337 } | 294 } |
| 338 #endif | 295 #endif |
| OLD | NEW |