| 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 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 UErrorCode errorCode = U_ZERO_ERROR; | 629 UErrorCode errorCode = U_ZERO_ERROR; |
| 630 UScriptCode nextScript = uscript_getScript(character, &errorCode); | 630 UScriptCode nextScript = uscript_getScript(character, &errorCode); |
| 631 if (U_FAILURE(errorCode)) | 631 if (U_FAILURE(errorCode)) |
| 632 return false; | 632 return false; |
| 633 | 633 |
| 634 do { | 634 do { |
| 635 const UChar* currentCharacterPosition = iterator.characters(); | 635 const UChar* currentCharacterPosition = iterator.characters(); |
| 636 const SimpleFontData* currentFontData = nextFontData; | 636 const SimpleFontData* currentFontData = nextFontData; |
| 637 UScriptCode currentScript = nextScript; | 637 UScriptCode currentScript = nextScript; |
| 638 | 638 |
| 639 UChar32 lastCharacter = character; | |
| 640 for (iterator.advance(clusterLength); iterator.consume(character, cluste
rLength); iterator.advance(clusterLength)) { | 639 for (iterator.advance(clusterLength); iterator.consume(character, cluste
rLength); iterator.advance(clusterLength)) { |
| 641 if (Character::treatAsZeroWidthSpace(character)) | 640 if (Character::treatAsZeroWidthSpace(character)) |
| 642 continue; | 641 continue; |
| 643 | 642 |
| 644 int length = handleMultipleUChar(character, clusterLength, currentFo
ntData, currentCharacterPosition, iterator.characters() + clusterLength, normali
zedBufferEnd); | 643 int length = handleMultipleUChar(character, clusterLength, currentFo
ntData, currentCharacterPosition, iterator.characters() + clusterLength, normali
zedBufferEnd); |
| 645 if (length) { | 644 if (length) { |
| 646 clusterLength = length; | 645 clusterLength = length; |
| 647 continue; | 646 continue; |
| 648 } | 647 } |
| 649 | 648 |
| 650 nextFontData = font->glyphDataForCharacter(character, false).fontDat
a; | 649 nextFontData = font->glyphDataForCharacter(character, false).fontDat
a; |
| 651 nextScript = uscript_getScript(character, &errorCode); | 650 nextScript = uscript_getScript(character, &errorCode); |
| 652 if (U_FAILURE(errorCode)) | 651 if (U_FAILURE(errorCode)) |
| 653 return false; | 652 return false; |
| 654 if (lastCharacter == zeroWidthJoiner) | |
| 655 currentFontData = nextFontData; | |
| 656 if ((nextFontData != currentFontData) || ((currentScript != nextScri
pt) && (nextScript != USCRIPT_INHERITED) && (!uscript_hasScript(character, curre
ntScript)))) | 653 if ((nextFontData != currentFontData) || ((currentScript != nextScri
pt) && (nextScript != USCRIPT_INHERITED) && (!uscript_hasScript(character, curre
ntScript)))) |
| 657 break; | 654 break; |
| 658 currentCharacterPosition = iterator.characters(); | 655 currentCharacterPosition = iterator.characters(); |
| 659 lastCharacter = character; | |
| 660 } | 656 } |
| 661 | 657 |
| 662 CandidateRun run = { character, startIndexOfCurrentRun, iterator.current
Character(), currentFontData, currentScript }; | 658 CandidateRun run = { character, startIndexOfCurrentRun, iterator.current
Character(), currentFontData, currentScript }; |
| 663 runs->append(run); | 659 runs->append(run); |
| 664 | 660 |
| 665 startIndexOfCurrentRun = iterator.currentCharacter(); | 661 startIndexOfCurrentRun = iterator.currentCharacter(); |
| 666 } while (iterator.consume(character, clusterLength)); | 662 } while (iterator.consume(character, clusterLength)); |
| 667 | 663 |
| 668 return true; | 664 return true; |
| 669 } | 665 } |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 854 | 850 |
| 855 runCache.remove(cachedResults); | 851 runCache.remove(cachedResults); |
| 856 } | 852 } |
| 857 | 853 |
| 858 // Add a space as pre-context to the buffer. This prevents showing dotte
d-circle | 854 // Add a space as pre-context to the buffer. This prevents showing dotte
d-circle |
| 859 // for combining marks at the beginning of runs. | 855 // for combining marks at the beginning of runs. |
| 860 static const uint16_t preContext = ' '; | 856 static const uint16_t preContext = ' '; |
| 861 hb_buffer_add_utf16(harfBuzzBuffer.get(), &preContext, 1, 1, 0); | 857 hb_buffer_add_utf16(harfBuzzBuffer.get(), &preContext, 1, 1, 0); |
| 862 | 858 |
| 863 if (fontDescription.variant() == FontVariantSmallCaps && u_islower(m_nor
malizedBuffer[currentRun->startIndex()])) { | 859 if (fontDescription.variant() == FontVariantSmallCaps && u_islower(m_nor
malizedBuffer[currentRun->startIndex()])) { |
| 864 String upperText = String(m_normalizedBuffer.get() + currentRun->sta
rtIndex(), currentRun->numCharacters()).upper(); | 860 String upperText = String(m_normalizedBuffer.get(), m_normalizedBuff
erLength).upper(); |
| 865 ASSERT(!upperText.is8Bit()); // m_normalizedBuffer is 16 bit, theref
ore upperText is 16 bit, even after we call makeUpper(). | 861 ASSERT(!upperText.is8Bit()); // m_normalizedBuffer is 16 bit, theref
ore upperText is 16 bit, even after we call makeUpper(). |
| 866 hb_buffer_add_utf16(harfBuzzBuffer.get(), toUint16(upperText.charact
ers16()), currentRun->numCharacters(), 0, currentRun->numCharacters()); | 862 hb_buffer_add_utf16(harfBuzzBuffer.get(), toUint16(upperText.charact
ers16()), currentRun->startIndex(), currentRun->startIndex(), 0); |
| 863 hb_buffer_add_utf16(harfBuzzBuffer.get(), toUint16(upperText.charact
ers16() + currentRun->startIndex()), m_normalizedBufferLength - currentRun->star
tIndex(), 0, currentRun->numCharacters()); |
| 867 } else { | 864 } else { |
| 868 hb_buffer_add_utf16(harfBuzzBuffer.get(), toUint16(m_normalizedBuffe
r.get() + currentRun->startIndex()), currentRun->numCharacters(), 0, currentRun-
>numCharacters()); | 865 hb_buffer_add_utf16(harfBuzzBuffer.get(), toUint16(m_normalizedBuffe
r.get()), currentRun->startIndex(), currentRun->startIndex(), 0); |
| 866 hb_buffer_add_utf16(harfBuzzBuffer.get(), toUint16(m_normalizedBuffe
r.get() + currentRun->startIndex()), m_normalizedBufferLength - currentRun->star
tIndex(), 0, currentRun->numCharacters()); |
| 869 } | 867 } |
| 870 | 868 |
| 871 if (fontDescription.orientation() == Vertical) | 869 if (fontDescription.orientation() == Vertical) |
| 872 face->setScriptForVerticalGlyphSubstitution(harfBuzzBuffer.get()); | 870 face->setScriptForVerticalGlyphSubstitution(harfBuzzBuffer.get()); |
| 873 | 871 |
| 874 HarfBuzzScopedPtr<hb_font_t> harfBuzzFont(face->createFont(), hb_font_de
stroy); | 872 HarfBuzzScopedPtr<hb_font_t> harfBuzzFont(face->createFont(), hb_font_de
stroy); |
| 875 | 873 |
| 876 hb_shape(harfBuzzFont.get(), harfBuzzBuffer.get(), m_features.isEmpty()
? 0 : m_features.data(), m_features.size()); | 874 hb_shape(harfBuzzFont.get(), harfBuzzBuffer.get(), m_features.isEmpty()
? 0 : m_features.data(), m_features.size()); |
| 877 currentRun->applyShapeResult(harfBuzzBuffer.get()); | 875 currentRun->applyShapeResult(harfBuzzBuffer.get()); |
| 878 setGlyphPositionsForHarfBuzzRun(currentRun, harfBuzzBuffer.get()); | 876 setGlyphPositionsForHarfBuzzRun(currentRun, harfBuzzBuffer.get()); |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1141 point.x() + fromX, point.x() + toX, | 1139 point.x() + fromX, point.x() + toX, |
| 1142 point.y(), height); | 1140 point.y(), height); |
| 1143 } | 1141 } |
| 1144 | 1142 |
| 1145 return Font::pixelSnappedSelectionRect( | 1143 return Font::pixelSnappedSelectionRect( |
| 1146 point.x() + toX, point.x() + fromX, | 1144 point.x() + toX, point.x() + fromX, |
| 1147 point.y(), height); | 1145 point.y(), height); |
| 1148 } | 1146 } |
| 1149 | 1147 |
| 1150 } // namespace blink | 1148 } // namespace blink |
| OLD | NEW |