| Index: Source/platform/fonts/shaping/HarfBuzzShaper.cpp
|
| diff --git a/Source/platform/fonts/shaping/HarfBuzzShaper.cpp b/Source/platform/fonts/shaping/HarfBuzzShaper.cpp
|
| index 535e173526421151cab4f1cda52923fdc6747fea..7c8631223207d2132ba201fe01c4cc373191b7ba 100644
|
| --- a/Source/platform/fonts/shaping/HarfBuzzShaper.cpp
|
| +++ b/Source/platform/fonts/shaping/HarfBuzzShaper.cpp
|
| @@ -949,41 +949,45 @@ void HarfBuzzShaper::setGlyphPositionsForHarfBuzzRun(HarfBuzzRun* currentRun, hb
|
| m_totalWidth += currentRun->width();
|
| }
|
|
|
| -void HarfBuzzShaper::fillGlyphBufferFromHarfBuzzRun(GlyphBuffer* glyphBuffer,
|
| - HarfBuzzRun* currentRun, float& carryAdvance)
|
| +float HarfBuzzShaper::fillGlyphBufferFromHarfBuzzRun(GlyphBuffer* glyphBuffer,
|
| + HarfBuzzRun* currentRun, float initialAdvance)
|
| {
|
| FloatSize* offsets = currentRun->offsets();
|
| uint16_t* glyphs = currentRun->glyphs();
|
| float* advances = currentRun->advances();
|
| unsigned numGlyphs = currentRun->numGlyphs();
|
| uint16_t* glyphToCharacterIndexes = currentRun->glyphToCharacterIndexes();
|
| - FloatSize runStartOffset = FloatSize();
|
| + float advanceSoFar = initialAdvance;
|
| if (m_run.rtl()) {
|
| for (unsigned i = 0; i < numGlyphs; ++i) {
|
| uint16_t currentCharacterIndex = currentRun->startIndex() + glyphToCharacterIndexes[i];
|
| if (currentCharacterIndex >= m_toIndex) {
|
| - carryAdvance += advances[i];
|
| + advanceSoFar += advances[i];
|
| } else if (currentCharacterIndex >= m_fromIndex) {
|
| - runStartOffset = HB_DIRECTION_IS_HORIZONTAL(currentRun->direction()) ? FloatSize(carryAdvance, 0) : FloatSize(0, carryAdvance);
|
| - glyphBuffer->add(glyphs[i], currentRun->fontData(), runStartOffset + offsets[i], carryAdvance + advances[i]);
|
| - carryAdvance = 0;
|
| + FloatPoint runStartOffset = HB_DIRECTION_IS_HORIZONTAL(currentRun->direction()) ?
|
| + FloatPoint(advanceSoFar, 0) : FloatPoint(0, advanceSoFar);
|
| + glyphBuffer->add(glyphs[i], currentRun->fontData(), runStartOffset + offsets[i]);
|
| + advanceSoFar += advances[i];
|
| }
|
| }
|
| } else {
|
| for (unsigned i = 0; i < numGlyphs; ++i) {
|
| uint16_t currentCharacterIndex = currentRun->startIndex() + glyphToCharacterIndexes[i];
|
| if (currentCharacterIndex < m_fromIndex) {
|
| - carryAdvance += advances[i];
|
| + advanceSoFar += advances[i];
|
| } else if (currentCharacterIndex < m_toIndex) {
|
| - runStartOffset = HB_DIRECTION_IS_HORIZONTAL(currentRun->direction()) ? FloatSize(carryAdvance, 0) : FloatSize(0, carryAdvance);
|
| - glyphBuffer->add(glyphs[i], currentRun->fontData(), runStartOffset + offsets[i], carryAdvance + advances[i]);
|
| - carryAdvance = 0;
|
| + FloatPoint runStartOffset = HB_DIRECTION_IS_HORIZONTAL(currentRun->direction()) ?
|
| + FloatPoint(advanceSoFar, 0) : FloatPoint(0, advanceSoFar);
|
| + glyphBuffer->add(glyphs[i], currentRun->fontData(), runStartOffset + offsets[i]);
|
| + advanceSoFar += advances[i];
|
| }
|
| }
|
| }
|
| +
|
| + return advanceSoFar - initialAdvance;
|
| }
|
|
|
| -void HarfBuzzShaper::fillGlyphBufferForTextEmphasis(GlyphBuffer* glyphBuffer, HarfBuzzRun* currentRun)
|
| +float HarfBuzzShaper::fillGlyphBufferForTextEmphasis(GlyphBuffer* glyphBuffer, HarfBuzzRun* currentRun, float initialAdvance)
|
| {
|
| // FIXME: Instead of generating a synthetic GlyphBuffer here which is then used by the
|
| // drawEmphasisMarks method of FontFastPath, we should roll our own emphasis mark drawing function.
|
| @@ -1008,6 +1012,7 @@ void HarfBuzzShaper::fillGlyphBufferForTextEmphasis(GlyphBuffer* glyphBuffer, Ha
|
| else
|
| clusterStart = currentRun->startIndex() + glyphToCharacterIndexes[0];
|
|
|
| + float advanceSoFar = initialAdvance;
|
| for (unsigned i = 0; i < numGlyphs; ++i) {
|
| uint16_t currentCharacterIndex = currentRun->startIndex() + glyphToCharacterIndexes[i];
|
| bool isRunEnd = (i + 1 == numGlyphs);
|
| @@ -1029,44 +1034,33 @@ void HarfBuzzShaper::fillGlyphBufferForTextEmphasis(GlyphBuffer* glyphBuffer, Ha
|
| for (unsigned j = 0; j < graphemesInCluster; ++j) {
|
| // Do not put emphasis marks on space, separator, and control characters.
|
| Glyph glyphToAdd = Character::canReceiveTextEmphasis(m_run[currentCharacterIndex]) ? 1 : 0;
|
| - glyphBuffer->add(glyphToAdd, currentRun->fontData(), glyphAdvanceX);
|
| + // The emphasis code expects mid-glyph offsets.
|
| + glyphBuffer->add(glyphToAdd, currentRun->fontData(), advanceSoFar + glyphAdvanceX / 2);
|
| + advanceSoFar += glyphAdvanceX;
|
| }
|
| clusterStart = clusterEnd;
|
| clusterAdvance = 0;
|
| }
|
| }
|
| +
|
| + return advanceSoFar - initialAdvance;
|
| }
|
|
|
| bool HarfBuzzShaper::fillGlyphBuffer(GlyphBuffer* glyphBuffer)
|
| {
|
| + ASSERT(glyphBuffer);
|
| +
|
| unsigned numRuns = m_harfBuzzRuns.size();
|
| - float carryAdvance = 0;
|
| - if (m_run.rtl()) {
|
| - for (int runIndex = numRuns - 1; runIndex >= 0; --runIndex) {
|
| - HarfBuzzRun* currentRun = m_harfBuzzRuns[runIndex].get();
|
| - if (!currentRun->hasGlyphToCharacterIndexes()) {
|
| - // FIXME: bug 337886, 359664
|
| - continue;
|
| - }
|
| - if (m_forTextEmphasis == ForTextEmphasis) {
|
| - fillGlyphBufferForTextEmphasis(glyphBuffer, currentRun);
|
| - } else {
|
| - fillGlyphBufferFromHarfBuzzRun(glyphBuffer, currentRun, carryAdvance);
|
| - }
|
| - }
|
| - } else {
|
| - for (unsigned runIndex = 0; runIndex < numRuns; ++runIndex) {
|
| - HarfBuzzRun* currentRun = m_harfBuzzRuns[runIndex].get();
|
| - if (!currentRun->hasGlyphToCharacterIndexes()) {
|
| - // FIXME: bug 337886, 359664
|
| - continue;
|
| - }
|
| - if (m_forTextEmphasis == ForTextEmphasis) {
|
| - fillGlyphBufferForTextEmphasis(glyphBuffer, currentRun);
|
| - } else {
|
| - fillGlyphBufferFromHarfBuzzRun(glyphBuffer, currentRun, carryAdvance);
|
| - }
|
| + float advanceSoFar = 0;
|
| + for (unsigned runIndex = 0; runIndex < numRuns; ++runIndex) {
|
| + HarfBuzzRun* currentRun = m_harfBuzzRuns[m_run.ltr() ? runIndex : numRuns - runIndex - 1].get();
|
| + if (!currentRun->hasGlyphToCharacterIndexes()) {
|
| + // FIXME: bug 337886, 359664
|
| + continue;
|
| }
|
| + advanceSoFar += (m_forTextEmphasis == ForTextEmphasis)
|
| + ? fillGlyphBufferForTextEmphasis(glyphBuffer, currentRun, advanceSoFar)
|
| + : fillGlyphBufferFromHarfBuzzRun(glyphBuffer, currentRun, advanceSoFar);
|
| }
|
| return glyphBuffer->size();
|
| }
|
|
|