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 |