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

Side by Side Diff: Source/platform/fonts/harfbuzz/HarfBuzzShaper.cpp

Issue 567543002: Avoid re-parsing of string in fillText and measureText in Canvas (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Updating test expectation file 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
OLDNEW
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 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 stringFor8BitRun = String::make16BitFrom8BitSource(run.characters8(), ru n.length()); 350 stringFor8BitRun = String::make16BitFrom8BitSource(run.characters8(), ru n.length());
351 source = stringFor8BitRun.characters16(); 351 source = stringFor8BitRun.characters16();
352 } else 352 } else
353 source = run.characters16(); 353 source = run.characters16();
354 354
355 *destinationLength = 0; 355 *destinationLength = 0;
356 while (position < length) { 356 while (position < length) {
357 UChar32 character; 357 UChar32 character;
358 U16_NEXT(source, position, length, character); 358 U16_NEXT(source, position, length, character);
359 // Don't normalize tabs as they are not treated as spaces for word-end. 359 // Don't normalize tabs as they are not treated as spaces for word-end.
360 if (Character::treatAsSpace(character) && character != characterTabulati on) 360 if (run.normalizeSpace() && Character::isNormalizedCanvasSpaceCharacter( character))
361 character = space;
362 else if (Character::treatAsSpace(character) && character != characterTab ulation)
361 character = space; 363 character = space;
362 else if (Character::treatAsZeroWidthSpaceInComplexScript(character)) 364 else if (Character::treatAsZeroWidthSpaceInComplexScript(character))
363 character = zeroWidthSpace; 365 character = zeroWidthSpace;
366
364 U16_APPEND(destination, *destinationLength, length, character, error); 367 U16_APPEND(destination, *destinationLength, length, character, error);
365 ASSERT_UNUSED(error, !error); 368 ASSERT_UNUSED(error, !error);
366 } 369 }
367 } 370 }
368 371
369 HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run, ForTextEmph asisOrNot forTextEmphasis, HashSet<const SimpleFontData*>* fallbackFonts) 372 HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run, ForTextEmph asisOrNot forTextEmphasis, HashSet<const SimpleFontData*>* fallbackFonts)
370 : m_font(font) 373 : m_font(font)
371 , m_normalizedBufferLength(0) 374 , m_normalizedBufferLength(0)
372 , m_run(run) 375 , m_run(run)
373 , m_wordSpacingAdjustment(font->fontDescription().wordSpacing()) 376 , m_wordSpacingAdjustment(font->fontDescription().wordSpacing())
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 608
606 struct CandidateRun { 609 struct CandidateRun {
607 UChar32 character; 610 UChar32 character;
608 unsigned start; 611 unsigned start;
609 unsigned end; 612 unsigned end;
610 const SimpleFontData* fontData; 613 const SimpleFontData* fontData;
611 UScriptCode script; 614 UScriptCode script;
612 }; 615 };
613 616
614 static inline bool collectCandidateRuns(const UChar* normalizedBuffer, 617 static inline bool collectCandidateRuns(const UChar* normalizedBuffer,
615 size_t bufferLength, const Font* font, Vector<CandidateRun>* runs) 618 size_t bufferLength, const Font* font, Vector<CandidateRun>* runs, bool isSp aceNormalize)
616 { 619 {
617 const UChar* normalizedBufferEnd = normalizedBuffer + bufferLength; 620 const UChar* normalizedBufferEnd = normalizedBuffer + bufferLength;
618 SurrogatePairAwareTextIterator iterator(normalizedBuffer, 0, bufferLength, b ufferLength); 621 SurrogatePairAwareTextIterator iterator(normalizedBuffer, 0, bufferLength, b ufferLength);
619 UChar32 character; 622 UChar32 character;
620 unsigned clusterLength = 0; 623 unsigned clusterLength = 0;
621 unsigned startIndexOfCurrentRun = 0; 624 unsigned startIndexOfCurrentRun = 0;
625
622 if (!iterator.consume(character, clusterLength)) 626 if (!iterator.consume(character, clusterLength))
623 return false; 627 return false;
624 628
625 const SimpleFontData* nextFontData = font->glyphDataForCharacter(character, false).fontData; 629 const SimpleFontData* nextFontData = font->glyphDataForCharacter(character, false, isSpaceNormalize).fontData;
626 UErrorCode errorCode = U_ZERO_ERROR; 630 UErrorCode errorCode = U_ZERO_ERROR;
627 UScriptCode nextScript = uscript_getScript(character, &errorCode); 631 UScriptCode nextScript = uscript_getScript(character, &errorCode);
628 if (U_FAILURE(errorCode)) 632 if (U_FAILURE(errorCode))
629 return false; 633 return false;
630 634
631 do { 635 do {
632 const UChar* currentCharacterPosition = iterator.characters(); 636 const UChar* currentCharacterPosition = iterator.characters();
633 const SimpleFontData* currentFontData = nextFontData; 637 const SimpleFontData* currentFontData = nextFontData;
634 UScriptCode currentScript = nextScript; 638 UScriptCode currentScript = nextScript;
635 639
636 UChar32 lastCharacter = character; 640 UChar32 lastCharacter = character;
637 for (iterator.advance(clusterLength); iterator.consume(character, cluste rLength); iterator.advance(clusterLength)) { 641 for (iterator.advance(clusterLength); iterator.consume(character, cluste rLength); iterator.advance(clusterLength)) {
638 if (Character::treatAsZeroWidthSpace(character)) 642 if (Character::treatAsZeroWidthSpace(character))
639 continue; 643 continue;
640 644
641 int length = handleMultipleUChar(character, clusterLength, currentFo ntData, currentCharacterPosition, iterator.characters() + clusterLength, normali zedBufferEnd); 645 int length = handleMultipleUChar(character, clusterLength, currentFo ntData, currentCharacterPosition, iterator.characters() + clusterLength, normali zedBufferEnd);
642 if (length) { 646 if (length) {
643 clusterLength = length; 647 clusterLength = length;
644 continue; 648 continue;
645 } 649 }
646 650
647 nextFontData = font->glyphDataForCharacter(character, false).fontDat a; 651 nextFontData = font->glyphDataForCharacter(character, false, isSpace Normalize).fontData;
648 nextScript = uscript_getScript(character, &errorCode); 652 nextScript = uscript_getScript(character, &errorCode);
649 if (U_FAILURE(errorCode)) 653 if (U_FAILURE(errorCode))
650 return false; 654 return false;
651 if (lastCharacter == zeroWidthJoiner) 655 if (lastCharacter == zeroWidthJoiner)
652 currentFontData = nextFontData; 656 currentFontData = nextFontData;
653 if ((nextFontData != currentFontData) || ((currentScript != nextScri pt) && (nextScript != USCRIPT_INHERITED) && (!uscript_hasScript(character, curre ntScript)))) 657 if ((nextFontData != currentFontData) || ((currentScript != nextScri pt) && (nextScript != USCRIPT_INHERITED) && (!uscript_hasScript(character, curre ntScript))))
654 break; 658 break;
655 currentCharacterPosition = iterator.characters(); 659 currentCharacterPosition = iterator.characters();
656 lastCharacter = character; 660 lastCharacter = character;
657 } 661 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 750
747 i = std::max(i, nextResolvedRun); 751 i = std::max(i, nextResolvedRun);
748 } 752 }
749 return true; 753 return true;
750 } 754 }
751 755
752 bool HarfBuzzShaper::createHarfBuzzRuns() 756 bool HarfBuzzShaper::createHarfBuzzRuns()
753 { 757 {
754 Vector<CandidateRun> candidateRuns; 758 Vector<CandidateRun> candidateRuns;
755 if (!collectCandidateRuns(m_normalizedBuffer.get(), 759 if (!collectCandidateRuns(m_normalizedBuffer.get(),
756 m_normalizedBufferLength, m_font, &candidateRuns)) 760 m_normalizedBufferLength, m_font, &candidateRuns, m_run.normalizeSpace() ))
757 return false; 761 return false;
758 762
759 if (!resolveCandidateRuns(candidateRuns)) 763 if (!resolveCandidateRuns(candidateRuns))
760 return false; 764 return false;
761 765
762 size_t length = candidateRuns.size(); 766 size_t length = candidateRuns.size();
763 for (size_t i = 0; i < length; ) { 767 for (size_t i = 0; i < length; ) {
764 CandidateRun& run = candidateRuns[i]; 768 CandidateRun& run = candidateRuns[i];
765 CandidateRun lastMatchingRun = run; 769 CandidateRun lastMatchingRun = run;
766 for (i++; i < length; i++) { 770 for (i++; i < length; i++) {
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 runCache.moveToBack(cachedResults); 856 runCache.moveToBack(cachedResults);
853 857
854 continue; 858 continue;
855 } 859 }
856 860
857 runCache.remove(cachedResults); 861 runCache.remove(cachedResults);
858 } 862 }
859 863
860 // Add a space as pre-context to the buffer. This prevents showing dotte d-circle 864 // Add a space as pre-context to the buffer. This prevents showing dotte d-circle
861 // for combining marks at the beginning of runs. 865 // for combining marks at the beginning of runs.
862 static const uint16_t preContext = ' '; 866 static const uint16_t preContext = space;
863 hb_buffer_add_utf16(harfBuzzBuffer.get(), &preContext, 1, 1, 0); 867 hb_buffer_add_utf16(harfBuzzBuffer.get(), &preContext, 1, 1, 0);
864 868
865 if (fontDescription.variant() == FontVariantSmallCaps && u_islower(m_nor malizedBuffer[currentRun->startIndex()])) { 869 if (fontDescription.variant() == FontVariantSmallCaps && u_islower(m_nor malizedBuffer[currentRun->startIndex()])) {
866 String upperText = String(m_normalizedBuffer.get() + currentRun->sta rtIndex(), currentRun->numCharacters()).upper(); 870 String upperText = String(m_normalizedBuffer.get() + currentRun->sta rtIndex(), currentRun->numCharacters()).upper();
867 ASSERT(!upperText.is8Bit()); // m_normalizedBuffer is 16 bit, theref ore upperText is 16 bit, even after we call makeUpper(). 871 ASSERT(!upperText.is8Bit()); // m_normalizedBuffer is 16 bit, theref ore upperText is 16 bit, even after we call makeUpper().
868 hb_buffer_add_utf16(harfBuzzBuffer.get(), toUint16(upperText.charact ers16()), currentRun->numCharacters(), 0, currentRun->numCharacters()); 872 hb_buffer_add_utf16(harfBuzzBuffer.get(), toUint16(upperText.charact ers16()), currentRun->numCharacters(), 0, currentRun->numCharacters());
869 } else { 873 } else {
870 hb_buffer_add_utf16(harfBuzzBuffer.get(), toUint16(m_normalizedBuffe r.get() + currentRun->startIndex()), currentRun->numCharacters(), 0, currentRun- >numCharacters()); 874 hb_buffer_add_utf16(harfBuzzBuffer.get(), toUint16(m_normalizedBuffe r.get() + currentRun->startIndex()), currentRun->numCharacters(), 0, currentRun- >numCharacters());
871 } 875 }
872 876
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 point.x() + fromX, point.x() + toX, 1147 point.x() + fromX, point.x() + toX,
1144 point.y(), height); 1148 point.y(), height);
1145 } 1149 }
1146 1150
1147 return Font::pixelSnappedSelectionRect( 1151 return Font::pixelSnappedSelectionRect(
1148 point.x() + toX, point.x() + fromX, 1152 point.x() + toX, point.x() + fromX,
1149 point.y(), height); 1153 point.y(), height);
1150 } 1154 }
1151 1155
1152 } // namespace blink 1156 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/fonts/WidthIterator.cpp ('k') | Source/platform/fonts/mac/FontComplexTextMac.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698