Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(772)

Side by Side Diff: Source/core/svg/SVGParserUtilities.cpp

Issue 656913006: Remove SVG fonts (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Update tests for landing Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698