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

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

Issue 1235163007: Revert of Reland "Change fallback font collection in HarfBuzzShaper" (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: Created 5 years, 5 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 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 return charactersSoFar + index; 474 return charactersSoFar + index;
475 } 475 }
476 charactersSoFar += m_runs[i]->m_numCharacters; 476 charactersSoFar += m_runs[i]->m_numCharacters;
477 currentX = nextX; 477 currentX = nextX;
478 } 478 }
479 } 479 }
480 480
481 return charactersSoFar; 481 return charactersSoFar;
482 } 482 }
483 483
484 void ShapeResult::fallbackFonts(HashSet<const SimpleFontData*>* fallback) const
485 {
486 ASSERT(fallback);
487 for (unsigned i = 0; i < m_runs.size(); ++i) {
488 if (m_runs[i] && m_runs[i]->m_fontData != m_primaryFont)
489 fallback->add(m_runs[i]->m_fontData);
490 }
491 }
492
493 unsigned ShapeResult::numberOfRunsForTesting() const 484 unsigned ShapeResult::numberOfRunsForTesting() const
494 { 485 {
495 return m_runs.size(); 486 return m_runs.size();
496 } 487 }
497 488
498 bool ShapeResult::runInfoForTesting(unsigned runIndex, unsigned& startIndex, 489 bool ShapeResult::runInfoForTesting(unsigned runIndex, unsigned& startIndex,
499 unsigned& numGlyphs, hb_script_t& script) 490 unsigned& numGlyphs, hb_script_t& script)
500 { 491 {
501 if (runIndex < m_runs.size() && m_runs[runIndex]) { 492 if (runIndex < m_runs.size() && m_runs[runIndex]) {
502 startIndex = m_runs[runIndex]->m_startIndex; 493 startIndex = m_runs[runIndex]->m_startIndex;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
569 else if (Character::treatAsSpace(character) && character != tabulationCh aracter) 560 else if (Character::treatAsSpace(character) && character != tabulationCh aracter)
570 character = spaceCharacter; 561 character = spaceCharacter;
571 else if (Character::treatAsZeroWidthSpaceInComplexScript(character)) 562 else if (Character::treatAsZeroWidthSpaceInComplexScript(character))
572 character = zeroWidthSpaceCharacter; 563 character = zeroWidthSpaceCharacter;
573 564
574 U16_APPEND(destination, *destinationLength, length, character, error); 565 U16_APPEND(destination, *destinationLength, length, character, error);
575 ASSERT_UNUSED(error, !error); 566 ASSERT_UNUSED(error, !error);
576 } 567 }
577 } 568 }
578 569
579 HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run) 570 HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run,
580 : Shaper(font, run) 571 HashSet<const SimpleFontData*>* fallbackFonts)
572 : Shaper(font, run, nullptr, fallbackFonts)
581 , m_normalizedBufferLength(0) 573 , m_normalizedBufferLength(0)
582 , m_wordSpacingAdjustment(font->fontDescription().wordSpacing()) 574 , m_wordSpacingAdjustment(font->fontDescription().wordSpacing())
583 , m_letterSpacing(font->fontDescription().letterSpacing()) 575 , m_letterSpacing(font->fontDescription().letterSpacing())
584 , m_expansionOpportunityCount(0) 576 , m_expansionOpportunityCount(0)
585 { 577 {
578 // TODO(eae): Once SimpleShaper is gone the ownership of this should shift
579 // to HarfBuzzShaper.
580 ASSERT(fallbackFonts);
586 m_normalizedBuffer = adoptArrayPtr(new UChar[m_textRun.length() + 1]); 581 m_normalizedBuffer = adoptArrayPtr(new UChar[m_textRun.length() + 1]);
587 normalizeCharacters(m_textRun, m_textRun.length(), m_normalizedBuffer.get(), &m_normalizedBufferLength); 582 normalizeCharacters(m_textRun, m_textRun.length(), m_normalizedBuffer.get(), &m_normalizedBufferLength);
588 setExpansion(m_textRun.expansion()); 583 setExpansion(m_textRun.expansion());
589 setFontFeatures(); 584 setFontFeatures();
590 } 585 }
591 586
592 float HarfBuzzShaper::nextExpansionPerOpportunity() 587 float HarfBuzzShaper::nextExpansionPerOpportunity()
593 { 588 {
594 if (!m_expansionOpportunityCount) { 589 if (!m_expansionOpportunityCount) {
595 ASSERT_NOT_REACHED(); // failures indicate that the logic in HarfBuzzSha per does not match to the one in expansionOpportunityCount() 590 ASSERT_NOT_REACHED(); // failures indicate that the logic in HarfBuzzSha per does not match to the one in expansionOpportunityCount()
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 hb_direction_t harfBuzzDirection = isVerticalAnyUpright(orientation) && !fon tData->isTextOrientationFallback() ? HB_DIRECTION_TTB : HB_DIRECTION_LTR; 932 hb_direction_t harfBuzzDirection = isVerticalAnyUpright(orientation) && !fon tData->isTextOrientationFallback() ? HB_DIRECTION_TTB : HB_DIRECTION_LTR;
938 return dir == RTL ? HB_DIRECTION_REVERSE(harfBuzzDirection) : harfBuzzDirect ion; 933 return dir == RTL ? HB_DIRECTION_REVERSE(harfBuzzDirection) : harfBuzzDirect ion;
939 } 934 }
940 935
941 void HarfBuzzShaper::addHarfBuzzRun(unsigned startCharacter, 936 void HarfBuzzShaper::addHarfBuzzRun(unsigned startCharacter,
942 unsigned endCharacter, const SimpleFontData* fontData, 937 unsigned endCharacter, const SimpleFontData* fontData,
943 UScriptCode script) 938 UScriptCode script)
944 { 939 {
945 ASSERT(endCharacter > startCharacter); 940 ASSERT(endCharacter > startCharacter);
946 ASSERT(script != USCRIPT_INVALID_CODE); 941 ASSERT(script != USCRIPT_INVALID_CODE);
942 if (m_fallbackFonts)
943 trackNonPrimaryFallbackFont(fontData);
947 944
948 hb_direction_t direction = TextDirectionToHBDirection(m_textRun.direction(), 945 hb_direction_t direction = TextDirectionToHBDirection(m_textRun.direction(),
949 m_font->fontDescription().orientation(), fontData); 946 m_font->fontDescription().orientation(), fontData);
950 HarfBuzzRun harfBuzzRun = { 947 HarfBuzzRun harfBuzzRun = {
951 fontData, startCharacter, endCharacter - startCharacter, 948 fontData, startCharacter, endCharacter - startCharacter,
952 direction, ICUScriptToHBScript(script) 949 direction, ICUScriptToHBScript(script)
953 }; 950 };
954 m_harfBuzzRuns.append(harfBuzzRun); 951 m_harfBuzzRuns.append(harfBuzzRun);
955 } 952 }
956 953
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1098 totalAdvance += advance; 1095 totalAdvance += advance;
1099 1096
1100 FloatRect glyphBounds = currentFontData->boundsForGlyph(glyph); 1097 FloatRect glyphBounds = currentFontData->boundsForGlyph(glyph);
1101 glyphBounds.move(glyphOrigin.x(), glyphOrigin.y()); 1098 glyphBounds.move(glyphOrigin.x(), glyphOrigin.y());
1102 result->m_glyphBoundingBox.unite(glyphBounds); 1099 result->m_glyphBoundingBox.unite(glyphBounds);
1103 glyphOrigin += FloatSize(advance + offsetX, offsetY); 1100 glyphOrigin += FloatSize(advance + offsetX, offsetY);
1104 } 1101 }
1105 1102
1106 run->m_width = totalAdvance > 0.0 ? totalAdvance : 0.0; 1103 run->m_width = totalAdvance > 0.0 ? totalAdvance : 0.0;
1107 result->m_width += run->m_width; 1104 result->m_width += run->m_width;
1105 result->m_fallbackFonts = *m_fallbackFonts;
1108 } 1106 }
1109 1107
1110 float HarfBuzzShaper::adjustSpacing(ShapeResult::RunInfo* run, size_t glyphIndex , unsigned currentCharacterIndex, float& offset, float& totalAdvance) 1108 float HarfBuzzShaper::adjustSpacing(ShapeResult::RunInfo* run, size_t glyphIndex , unsigned currentCharacterIndex, float& offset, float& totalAdvance)
1111 { 1109 {
1112 float spacing = 0; 1110 float spacing = 0;
1113 UChar32 character = m_normalizedBuffer[currentCharacterIndex]; 1111 UChar32 character = m_normalizedBuffer[currentCharacterIndex];
1114 if (m_letterSpacing && !Character::treatAsZeroWidthSpace(character)) 1112 if (m_letterSpacing && !Character::treatAsZeroWidthSpace(character))
1115 spacing += m_letterSpacing; 1113 spacing += m_letterSpacing;
1116 1114
1117 bool treatAsSpace = Character::treatAsSpace(character); 1115 bool treatAsSpace = Character::treatAsSpace(character);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1157 return spacing; 1155 return spacing;
1158 } 1156 }
1159 1157
1160 // Don't need to check m_textRun.allowsTrailingExpansion() since it's covere d by !m_expansionOpportunityCount above 1158 // Don't need to check m_textRun.allowsTrailingExpansion() since it's covere d by !m_expansionOpportunityCount above
1161 spacing += nextExpansionPerOpportunity(); 1159 spacing += nextExpansionPerOpportunity();
1162 m_isAfterExpansion = true; 1160 m_isAfterExpansion = true;
1163 return spacing; 1161 return spacing;
1164 } 1162 }
1165 1163
1166 } // namespace blink 1164 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/fonts/shaping/HarfBuzzShaper.h ('k') | Source/platform/fonts/shaping/HarfBuzzShaperTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698