OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 Google Inc. All rights reserved. | 2 * Copyright (c) 2012 Google Inc. All rights reserved. |
3 * Copyright (C) 2013 BlackBerry Limited. All rights reserved. | 3 * Copyright (C) 2013 BlackBerry Limited. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
352 bool error = false; | 352 bool error = false; |
353 const UChar* source; | 353 const UChar* source; |
354 String stringFor8BitRun; | 354 String stringFor8BitRun; |
355 if (run.is8Bit()) { | 355 if (run.is8Bit()) { |
356 stringFor8BitRun = String::make16BitFrom8BitSource(run.characters8(), ru n.length()); | 356 stringFor8BitRun = String::make16BitFrom8BitSource(run.characters8(), ru n.length()); |
357 source = stringFor8BitRun.characters16(); | 357 source = stringFor8BitRun.characters16(); |
358 } else { | 358 } else { |
359 source = run.characters16(); | 359 source = run.characters16(); |
360 } | 360 } |
361 | 361 |
362 // Convert to NFC form if the text has diacritical marks. | |
363 icu::UnicodeString normalizedString; | |
364 UErrorCode errorICU = U_ZERO_ERROR; | |
365 | |
366 for (unsigned i = 0; i < (unsigned)run.length(); ++i) { | |
eae
2015/02/10 15:40:12
Here and elsewhere, use static_cast instead of C-s
h.joshi
2015/02/17 03:44:47
Done.
| |
367 UChar ch = source[i]; | |
eae
2015/02/10 15:40:12
Only used once, no need for local variable.
h.joshi
2015/02/17 03:44:47
Done.
| |
368 if (::ublock_getCode(ch) == UBLOCK_COMBINING_DIACRITICAL_MARKS) { | |
369 icu::Normalizer::normalize(icu::UnicodeString(source, | |
370 run.length()), UNORM_NFC, 0 /* no options */, | |
371 normalizedString, errorICU); | |
372 if (U_FAILURE(errorICU)) | |
373 normalizedString.remove(); | |
374 break; | |
375 } | |
376 } | |
377 | |
378 if (normalizedString.isEmpty()) { | |
379 length = (unsigned)run.length(); | |
380 } else { | |
381 length = (unsigned)normalizedString.length(); | |
382 source = normalizedString.getBuffer(); | |
383 } | |
384 | |
362 *destinationLength = 0; | 385 *destinationLength = 0; |
363 while (position < length) { | 386 while (position < length) { |
364 UChar32 character; | 387 UChar32 character; |
365 U16_NEXT(source, position, length, character); | 388 U16_NEXT(source, position, length, character); |
366 // Don't normalize tabs as they are not treated as spaces for word-end. | 389 // Don't normalize tabs as they are not treated as spaces for word-end. |
367 if (run.normalizeSpace() && Character::isNormalizedCanvasSpaceCharacter( character)) | 390 if (run.normalizeSpace() && Character::isNormalizedCanvasSpaceCharacter( character)) |
368 character = space; | 391 character = space; |
369 else if (Character::treatAsSpace(character) && character != characterTab ulation) | 392 else if (Character::treatAsSpace(character) && character != characterTab ulation) |
370 character = space; | 393 character = space; |
371 else if (Character::treatAsZeroWidthSpaceInComplexScript(character)) | 394 else if (Character::treatAsZeroWidthSpaceInComplexScript(character)) |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
557 } | 580 } |
558 | 581 |
559 static inline int handleMultipleUChar( | 582 static inline int handleMultipleUChar( |
560 UChar32 character, | 583 UChar32 character, |
561 unsigned clusterLength, | 584 unsigned clusterLength, |
562 const SimpleFontData* currentFontData, | 585 const SimpleFontData* currentFontData, |
563 const UChar* currentCharacterPosition, | 586 const UChar* currentCharacterPosition, |
564 const UChar* markCharactersEnd, | 587 const UChar* markCharactersEnd, |
565 const UChar* normalizedBufferEnd) | 588 const UChar* normalizedBufferEnd) |
566 { | 589 { |
590 ASSERT(currentFontData); | |
567 if (U_GET_GC_MASK(character) & U_GC_M_MASK) { | 591 if (U_GET_GC_MASK(character) & U_GC_M_MASK) { |
592 /* If current font does not have Unicode, we should not go further. | |
593 Blink will fallback to some other font to display this Unicode. | |
594 */ | |
595 if (!currentFontData->fontHasGlyphForCharacter(character)) | |
596 return 0; | |
597 | |
568 int markLength = clusterLength; | 598 int markLength = clusterLength; |
569 while (markCharactersEnd < normalizedBufferEnd) { | 599 while (markCharactersEnd < normalizedBufferEnd) { |
570 UChar32 nextCharacter; | 600 UChar32 nextCharacter; |
571 int nextCharacterLength = 0; | 601 int nextCharacterLength = 0; |
572 U16_NEXT(markCharactersEnd, nextCharacterLength, normalizedBufferEnd - markCharactersEnd, nextCharacter); | 602 U16_NEXT(markCharactersEnd, nextCharacterLength, normalizedBufferEnd - markCharactersEnd, nextCharacter); |
603 if (!currentFontData->fontHasGlyphForCharacter(nextCharacter)) | |
604 return 0; | |
573 if (!(U_GET_GC_MASK(nextCharacter) & U_GC_M_MASK)) | 605 if (!(U_GET_GC_MASK(nextCharacter) & U_GC_M_MASK)) |
574 break; | 606 break; |
575 markLength += nextCharacterLength; | 607 markLength += nextCharacterLength; |
576 markCharactersEnd += nextCharacterLength; | 608 markCharactersEnd += nextCharacterLength; |
577 } | 609 } |
578 | 610 |
579 if (currentFontData->canRenderCombiningCharacterSequence(currentCharacte rPosition, markCharactersEnd - currentCharacterPosition)) { | 611 if (currentFontData->canRenderCombiningCharacterSequence(currentCharacte rPosition, markCharactersEnd - currentCharacterPosition)) { |
580 return markLength; | 612 return markLength; |
581 } | 613 } |
582 } | 614 } |
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1200 // possibly invalid from, to arguments. | 1232 // possibly invalid from, to arguments. |
1201 if (!foundToX && !foundFromX) | 1233 if (!foundToX && !foundFromX) |
1202 fromX = toX = 0; | 1234 fromX = toX = 0; |
1203 | 1235 |
1204 if (fromX < toX) | 1236 if (fromX < toX) |
1205 return FloatRect(point.x() + fromX, point.y(), toX - fromX, height); | 1237 return FloatRect(point.x() + fromX, point.y(), toX - fromX, height); |
1206 return FloatRect(point.x() + toX, point.y(), fromX - toX, height); | 1238 return FloatRect(point.x() + toX, point.y(), fromX - toX, height); |
1207 } | 1239 } |
1208 | 1240 |
1209 } // namespace blink | 1241 } // namespace blink |
OLD | NEW |