| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2002, 2003 The Karbon Developers | 2 * Copyright (C) 2002, 2003 The Karbon Developers |
| 3 * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org> | 3 * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org> |
| 4 * Copyright (C) 2006, 2007 Rob Buis <buis@kde.org> | 4 * Copyright (C) 2006, 2007 Rob Buis <buis@kde.org> |
| 5 * Copyright (C) 2007, 2009, 2013 Apple Inc. All rights reserved. | 5 * Copyright (C) 2007, 2009, 2013 Apple Inc. All rights reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 if (string.is8Bit()) { | 244 if (string.is8Bit()) { |
| 245 const LChar* ptr = string.characters8(); | 245 const LChar* ptr = string.characters8(); |
| 246 const LChar* end = ptr + string.length(); | 246 const LChar* end = ptr + string.length(); |
| 247 return genericParseNumberOrPercentage(ptr, end, number); | 247 return genericParseNumberOrPercentage(ptr, end, number); |
| 248 } | 248 } |
| 249 const UChar* ptr = string.characters16(); | 249 const UChar* ptr = string.characters16(); |
| 250 const UChar* end = ptr + string.length(); | 250 const UChar* end = ptr + string.length(); |
| 251 return genericParseNumberOrPercentage(ptr, end, number); | 251 return genericParseNumberOrPercentage(ptr, end, number); |
| 252 } | 252 } |
| 253 | 253 |
| 254 #if ENABLE(SVG_FONTS) | |
| 255 template<typename CharType> | |
| 256 static bool parseGlyphName(const CharType*& ptr, const CharType* end, HashSet<St
ring>& values) | |
| 257 { | |
| 258 skipOptionalSVGSpaces(ptr, end); | |
| 259 | |
| 260 while (ptr < end) { | |
| 261 // Leading and trailing white space, and white space before and after se
parators, will be ignored. | |
| 262 const CharType* inputStart = ptr; | |
| 263 while (ptr < end && *ptr != ',') | |
| 264 ++ptr; | |
| 265 | |
| 266 if (ptr == inputStart) | |
| 267 break; | |
| 268 | |
| 269 // walk backwards from the ; to ignore any whitespace | |
| 270 const CharType* inputEnd = ptr - 1; | |
| 271 while (inputStart < inputEnd && isHTMLSpace<CharType>(*inputEnd)) | |
| 272 --inputEnd; | |
| 273 | |
| 274 values.add(String(inputStart, inputEnd - inputStart + 1)); | |
| 275 skipOptionalSVGSpacesOrDelimiter(ptr, end, ','); | |
| 276 } | |
| 277 | |
| 278 return true; | |
| 279 } | |
| 280 | |
| 281 bool parseGlyphName(const String& input, HashSet<String>& values) | |
| 282 { | |
| 283 // FIXME: Parsing error detection is missing. | |
| 284 values.clear(); | |
| 285 if (input.isEmpty()) | |
| 286 return true; | |
| 287 if (input.is8Bit()) { | |
| 288 const LChar* ptr = input.characters8(); | |
| 289 const LChar* end = ptr + input.length(); | |
| 290 return parseGlyphName(ptr, end, values); | |
| 291 } | |
| 292 const UChar* ptr = input.characters16(); | |
| 293 const UChar* end = ptr + input.length(); | |
| 294 return parseGlyphName(ptr, end, values); | |
| 295 } | |
| 296 | |
| 297 template<typename CharType> | |
| 298 static bool parseUnicodeRange(const CharType* characters, unsigned length, Unico
deRange& range) | |
| 299 { | |
| 300 if (length < 2 || characters[0] != 'U' || characters[1] != '+') | |
| 301 return false; | |
| 302 | |
| 303 // Parse the starting hex number (or its prefix). | |
| 304 unsigned startRange = 0; | |
| 305 unsigned startLength = 0; | |
| 306 | |
| 307 const CharType* ptr = characters + 2; | |
| 308 const CharType* end = characters + length; | |
| 309 while (ptr < end) { | |
| 310 if (!isASCIIHexDigit(*ptr)) | |
| 311 break; | |
| 312 ++startLength; | |
| 313 if (startLength > 6) | |
| 314 return false; | |
| 315 startRange = (startRange << 4) | toASCIIHexValue(*ptr); | |
| 316 ++ptr; | |
| 317 } | |
| 318 | |
| 319 // Handle the case of ranges separated by "-" sign. | |
| 320 if (2 + startLength < length && *ptr == '-') { | |
| 321 if (!startLength) | |
| 322 return false; | |
| 323 | |
| 324 // Parse the ending hex number (or its prefix). | |
| 325 unsigned endRange = 0; | |
| 326 unsigned endLength = 0; | |
| 327 ++ptr; | |
| 328 while (ptr < end) { | |
| 329 if (!isASCIIHexDigit(*ptr)) | |
| 330 break; | |
| 331 ++endLength; | |
| 332 if (endLength > 6) | |
| 333 return false; | |
| 334 endRange = (endRange << 4) | toASCIIHexValue(*ptr); | |
| 335 ++ptr; | |
| 336 } | |
| 337 | |
| 338 if (!endLength) | |
| 339 return false; | |
| 340 | |
| 341 range.first = startRange; | |
| 342 range.second = endRange; | |
| 343 return true; | |
| 344 } | |
| 345 | |
| 346 // Handle the case of a number with some optional trailing question marks. | |
| 347 unsigned endRange = startRange; | |
| 348 while (ptr < end) { | |
| 349 if (*ptr != '?') | |
| 350 break; | |
| 351 ++startLength; | |
| 352 if (startLength > 6) | |
| 353 return false; | |
| 354 startRange <<= 4; | |
| 355 endRange = (endRange << 4) | 0xF; | |
| 356 ++ptr; | |
| 357 } | |
| 358 | |
| 359 if (!startLength) | |
| 360 return false; | |
| 361 | |
| 362 range.first = startRange; | |
| 363 range.second = endRange; | |
| 364 return true; | |
| 365 } | |
| 366 | |
| 367 template<typename CharType> | |
| 368 static bool genericParseKerningUnicodeString(const CharType*& ptr, const CharTyp
e* end, UnicodeRanges& rangeList, HashSet<String>& stringList) | |
| 369 { | |
| 370 while (ptr < end) { | |
| 371 const CharType* inputStart = ptr; | |
| 372 while (ptr < end && *ptr != ',') | |
| 373 ++ptr; | |
| 374 | |
| 375 if (ptr == inputStart) | |
| 376 break; | |
| 377 | |
| 378 // Try to parse unicode range first | |
| 379 UnicodeRange range; | |
| 380 if (parseUnicodeRange(inputStart, ptr - inputStart, range)) | |
| 381 rangeList.append(range); | |
| 382 else | |
| 383 stringList.add(String(inputStart, ptr - inputStart)); | |
| 384 ++ptr; | |
| 385 } | |
| 386 | |
| 387 return true; | |
| 388 } | |
| 389 | |
| 390 bool parseKerningUnicodeString(const String& input, UnicodeRanges& rangeList, Ha
shSet<String>& stringList) | |
| 391 { | |
| 392 // FIXME: Parsing error detection is missing. | |
| 393 if (input.isEmpty()) | |
| 394 return true; | |
| 395 if (input.is8Bit()) { | |
| 396 const LChar* ptr = input.characters8(); | |
| 397 const LChar* end = ptr + input.length(); | |
| 398 return genericParseKerningUnicodeString(ptr, end, rangeList, stringList)
; | |
| 399 } | |
| 400 const UChar* ptr = input.characters16(); | |
| 401 const UChar* end = ptr + input.length(); | |
| 402 return genericParseKerningUnicodeString(ptr, end, rangeList, stringList); | |
| 403 } | |
| 404 | |
| 405 template<typename CharType> | |
| 406 static Vector<String> genericParseDelimitedString(const CharType*& ptr, const Ch
arType* end, const char seperator) | |
| 407 { | |
| 408 Vector<String> values; | |
| 409 | |
| 410 skipOptionalSVGSpaces(ptr, end); | |
| 411 | |
| 412 while (ptr < end) { | |
| 413 // Leading and trailing white space, and white space before and after se
micolon separators, will be ignored. | |
| 414 const CharType* inputStart = ptr; | |
| 415 while (ptr < end && *ptr != seperator) // careful not to ignore whitespa
ce inside inputs | |
| 416 ptr++; | |
| 417 | |
| 418 if (ptr == inputStart) | |
| 419 break; | |
| 420 | |
| 421 // walk backwards from the ; to ignore any whitespace | |
| 422 const CharType* inputEnd = ptr - 1; | |
| 423 while (inputStart < inputEnd && isHTMLSpace<CharType>(*inputEnd)) | |
| 424 inputEnd--; | |
| 425 | |
| 426 values.append(String(inputStart, inputEnd - inputStart + 1)); | |
| 427 skipOptionalSVGSpacesOrDelimiter(ptr, end, seperator); | |
| 428 } | |
| 429 | |
| 430 return values; | |
| 431 } | |
| 432 | |
| 433 Vector<String> parseDelimitedString(const String& input, const char seperator) | |
| 434 { | |
| 435 if (input.isEmpty()) | |
| 436 return Vector<String>(); | |
| 437 if (input.is8Bit()) { | |
| 438 const LChar* ptr = input.characters8(); | |
| 439 const LChar* end = ptr + input.length(); | |
| 440 return genericParseDelimitedString(ptr, end, seperator); | |
| 441 } | |
| 442 const UChar* ptr = input.characters16(); | |
| 443 const UChar* end = ptr + input.length(); | |
| 444 return genericParseDelimitedString(ptr, end, seperator); | |
| 445 } | |
| 446 #endif | |
| 447 | |
| 448 template <typename CharType> | 254 template <typename CharType> |
| 449 bool parseFloatPoint(const CharType*& current, const CharType* end, FloatPoint&
point) | 255 bool parseFloatPoint(const CharType*& current, const CharType* end, FloatPoint&
point) |
| 450 { | 256 { |
| 451 float x; | 257 float x; |
| 452 float y; | 258 float y; |
| 453 if (!parseNumber(current, end, x) | 259 if (!parseNumber(current, end, x) |
| 454 || !parseNumber(current, end, y)) | 260 || !parseNumber(current, end, y)) |
| 455 return false; | 261 return false; |
| 456 point = FloatPoint(x, y); | 262 point = FloatPoint(x, y); |
| 457 return true; | 263 return true; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 parseAndSkipTransformType(ptr, end, type); | 359 parseAndSkipTransformType(ptr, end, type); |
| 554 } else { | 360 } else { |
| 555 const UChar* ptr = string.characters16(); | 361 const UChar* ptr = string.characters16(); |
| 556 const UChar* end = ptr + string.length(); | 362 const UChar* end = ptr + string.length(); |
| 557 parseAndSkipTransformType(ptr, end, type); | 363 parseAndSkipTransformType(ptr, end, type); |
| 558 } | 364 } |
| 559 return type; | 365 return type; |
| 560 } | 366 } |
| 561 | 367 |
| 562 } | 368 } |
| OLD | NEW |