| 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 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 { | 616 { |
| 617 const UChar* normalizedBufferEnd = normalizedBuffer + bufferLength; | 617 const UChar* normalizedBufferEnd = normalizedBuffer + bufferLength; |
| 618 SurrogatePairAwareTextIterator iterator(normalizedBuffer, 0, bufferLength, b
ufferLength); | 618 SurrogatePairAwareTextIterator iterator(normalizedBuffer, 0, bufferLength, b
ufferLength); |
| 619 UChar32 character; | 619 UChar32 character; |
| 620 unsigned clusterLength = 0; | 620 unsigned clusterLength = 0; |
| 621 unsigned startIndexOfCurrentRun = 0; | 621 unsigned startIndexOfCurrentRun = 0; |
| 622 | 622 |
| 623 if (!iterator.consume(character, clusterLength)) | 623 if (!iterator.consume(character, clusterLength)) |
| 624 return false; | 624 return false; |
| 625 | 625 |
| 626 bool collectionForHeadingZWS = false; |
| 627 if (Character::treatAsZeroWidthSpace(character)) |
| 628 collectionForHeadingZWS = true; |
| 629 |
| 626 const SimpleFontData* nextFontData = font->glyphDataForCharacter(character,
false, isSpaceNormalize).fontData; | 630 const SimpleFontData* nextFontData = font->glyphDataForCharacter(character,
false, isSpaceNormalize).fontData; |
| 627 UErrorCode errorCode = U_ZERO_ERROR; | 631 UErrorCode errorCode = U_ZERO_ERROR; |
| 628 UScriptCode nextScript = uscript_getScript(character, &errorCode); | 632 UScriptCode nextScript = uscript_getScript(character, &errorCode); |
| 629 if (U_FAILURE(errorCode)) | 633 if (U_FAILURE(errorCode)) |
| 630 return false; | 634 return false; |
| 631 | 635 |
| 632 do { | 636 do { |
| 633 const UChar* currentCharacterPosition = iterator.characters(); | 637 const UChar* currentCharacterPosition = iterator.characters(); |
| 634 const SimpleFontData* currentFontData = nextFontData; | 638 const SimpleFontData* currentFontData = nextFontData; |
| 635 UScriptCode currentScript = nextScript; | 639 UScriptCode currentScript = nextScript; |
| 636 | 640 |
| 637 UChar32 lastCharacter = character; | 641 UChar32 lastCharacter = character; |
| 638 for (iterator.advance(clusterLength); iterator.consume(character, cluste
rLength); iterator.advance(clusterLength)) { | 642 for (iterator.advance(clusterLength); iterator.consume(character, cluste
rLength); iterator.advance(clusterLength)) { |
| 639 if (Character::treatAsZeroWidthSpace(character)) | 643 if (Character::treatAsZeroWidthSpace(character)) |
| 640 continue; | 644 continue; |
| 641 | 645 |
| 642 int length = handleMultipleUChar(character, clusterLength, currentFo
ntData, currentCharacterPosition, iterator.characters() + clusterLength, normali
zedBufferEnd); | 646 int length = handleMultipleUChar(character, clusterLength, currentFo
ntData, currentCharacterPosition, iterator.characters() + clusterLength, normali
zedBufferEnd); |
| 643 if (length) { | 647 if (length) { |
| 644 clusterLength = length; | 648 clusterLength = length; |
| 645 continue; | 649 continue; |
| 646 } | 650 } |
| 647 | 651 |
| 648 nextFontData = font->glyphDataForCharacter(character, false, isSpace
Normalize).fontData; | 652 nextFontData = font->glyphDataForCharacter(character, false, isSpace
Normalize).fontData; |
| 649 nextScript = uscript_getScript(character, &errorCode); | 653 nextScript = uscript_getScript(character, &errorCode); |
| 650 if (U_FAILURE(errorCode)) | 654 if (U_FAILURE(errorCode)) |
| 651 return false; | 655 return false; |
| 652 if (lastCharacter == zeroWidthJoiner) | 656 if (lastCharacter == zeroWidthJoiner) |
| 653 currentFontData = nextFontData; | 657 currentFontData = nextFontData; |
| 654 if ((nextFontData != currentFontData) || ((currentScript != nextScri
pt) && (nextScript != USCRIPT_INHERITED) && (!uscript_hasScript(character, curre
ntScript)))) | 658 if ((nextFontData != currentFontData) || ((currentScript != nextScri
pt) && (nextScript != USCRIPT_INHERITED) && (!uscript_hasScript(character, curre
ntScript)))) { |
| 655 break; | 659 if (!collectionForHeadingZWS) |
| 660 break; |
| 661 currentFontData = nextFontData; |
| 662 currentScript = nextScript; |
| 663 collectionForHeadingZWS = false; |
| 664 } |
| 656 currentCharacterPosition = iterator.characters(); | 665 currentCharacterPosition = iterator.characters(); |
| 657 lastCharacter = character; | 666 lastCharacter = character; |
| 658 } | 667 } |
| 659 | 668 |
| 660 CandidateRun run = { character, startIndexOfCurrentRun, iterator.current
Character(), currentFontData, currentScript }; | 669 CandidateRun run = { character, startIndexOfCurrentRun, iterator.current
Character(), currentFontData, currentScript }; |
| 661 runs->append(run); | 670 runs->append(run); |
| 662 | 671 |
| 663 startIndexOfCurrentRun = iterator.currentCharacter(); | 672 startIndexOfCurrentRun = iterator.currentCharacter(); |
| 664 } while (iterator.consume(character, clusterLength)); | 673 } while (iterator.consume(character, clusterLength)); |
| 665 | 674 |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1144 fromX = 0; | 1153 fromX = 0; |
| 1145 if (!foundToX) | 1154 if (!foundToX) |
| 1146 toX = m_run.rtl() ? 0 : m_totalWidth; | 1155 toX = m_run.rtl() ? 0 : m_totalWidth; |
| 1147 | 1156 |
| 1148 if (fromX < toX) | 1157 if (fromX < toX) |
| 1149 return FloatRect(point.x() + fromX, point.y(), toX - fromX, height); | 1158 return FloatRect(point.x() + fromX, point.y(), toX - fromX, height); |
| 1150 return FloatRect(point.x() + toX, point.y(), fromX - toX, height); | 1159 return FloatRect(point.x() + toX, point.y(), fromX - toX, height); |
| 1151 } | 1160 } |
| 1152 | 1161 |
| 1153 } // namespace blink | 1162 } // namespace blink |
| OLD | NEW |