| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/fonts/shaping/ShapeResultBuffer.h" | 5 #include "platform/fonts/shaping/ShapeResultBuffer.h" |
| 6 | 6 |
| 7 #include "platform/fonts/CharacterRange.h" | 7 #include "platform/fonts/CharacterRange.h" |
| 8 #include "platform/fonts/GlyphBuffer.h" | 8 #include "platform/fonts/GlyphBuffer.h" |
| 9 #include "platform/fonts/SimpleFontData.h" | 9 #include "platform/fonts/SimpleFontData.h" |
| 10 #include "platform/fonts/shaping/ShapeResultInlineHeaders.h" | 10 #include "platform/fonts/shaping/ShapeResultInlineHeaders.h" |
| 11 #include "platform/geometry/FloatPoint.h" | 11 #include "platform/geometry/FloatPoint.h" |
| 12 #include "platform/text/Character.h" | 12 #include "platform/text/Character.h" |
| 13 #include "platform/text/TextBreakIterator.h" | 13 #include "platform/text/TextBreakIterator.h" |
| 14 #include "platform/text/TextDirection.h" | 14 #include "platform/text/TextDirection.h" |
| 15 | 15 |
| 16 namespace blink { | 16 namespace blink { |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 inline void addGlyphToBuffer(GlyphBuffer* glyphBuffer, | 20 inline void addGlyphToBuffer(GlyphBuffer* glyphBuffer, |
| 21 float advance, | 21 float advance, |
| 22 hb_direction_t direction, | 22 hb_direction_t direction, |
| 23 const SimpleFontData* fontData, | 23 const SimpleFontData* fontData, |
| 24 const HarfBuzzRunGlyphData& glyphData) { | 24 const HarfBuzzRunGlyphData& glyphData, |
| 25 unsigned characterIndex) { |
| 25 FloatPoint startOffset = HB_DIRECTION_IS_HORIZONTAL(direction) | 26 FloatPoint startOffset = HB_DIRECTION_IS_HORIZONTAL(direction) |
| 26 ? FloatPoint(advance, 0) | 27 ? FloatPoint(advance, 0) |
| 27 : FloatPoint(0, advance); | 28 : FloatPoint(0, advance); |
| 28 glyphBuffer->add(glyphData.glyph, fontData, startOffset + glyphData.offset); | 29 glyphBuffer->add(glyphData.glyph, fontData, startOffset + glyphData.offset, |
| 30 characterIndex); |
| 29 } | 31 } |
| 30 | 32 |
| 31 inline void addEmphasisMark(GlyphBuffer* buffer, | 33 inline void addEmphasisMark(GlyphBuffer* buffer, |
| 32 const GlyphData* emphasisData, | 34 const GlyphData* emphasisData, |
| 33 FloatPoint glyphCenter, | 35 FloatPoint glyphCenter, |
| 34 float midGlyphOffset) { | 36 float midGlyphOffset) { |
| 35 ASSERT(buffer); | 37 ASSERT(buffer); |
| 36 ASSERT(emphasisData); | 38 ASSERT(emphasisData); |
| 37 | 39 |
| 38 const SimpleFontData* emphasisFontData = emphasisData->fontData; | 40 const SimpleFontData* emphasisFontData = emphasisData->fontData; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 uint16_t currentCharacterIndex = | 93 uint16_t currentCharacterIndex = |
| 92 run->m_startIndex + glyphData.characterIndex + runOffset; | 94 run->m_startIndex + glyphData.characterIndex + runOffset; |
| 93 if ((direction == TextDirection::Rtl && currentCharacterIndex >= to) || | 95 if ((direction == TextDirection::Rtl && currentCharacterIndex >= to) || |
| 94 (direction == TextDirection::Ltr && currentCharacterIndex < from)) { | 96 (direction == TextDirection::Ltr && currentCharacterIndex < from)) { |
| 95 advanceSoFar += glyphData.advance; | 97 advanceSoFar += glyphData.advance; |
| 96 } else if ((direction == TextDirection::Rtl && | 98 } else if ((direction == TextDirection::Rtl && |
| 97 currentCharacterIndex >= from) || | 99 currentCharacterIndex >= from) || |
| 98 (direction == TextDirection::Ltr && | 100 (direction == TextDirection::Ltr && |
| 99 currentCharacterIndex < to)) { | 101 currentCharacterIndex < to)) { |
| 100 addGlyphToBuffer(glyphBuffer, advanceSoFar, run->m_direction, | 102 addGlyphToBuffer(glyphBuffer, advanceSoFar, run->m_direction, |
| 101 run->m_fontData.get(), glyphData); | 103 run->m_fontData.get(), glyphData, currentCharacterIndex); |
| 102 advanceSoFar += glyphData.advance; | 104 advanceSoFar += glyphData.advance; |
| 103 } | 105 } |
| 104 } | 106 } |
| 105 return advanceSoFar - initialAdvance; | 107 return advanceSoFar - initialAdvance; |
| 106 } | 108 } |
| 107 | 109 |
| 108 float ShapeResultBuffer::fillGlyphBufferForTextEmphasisRun( | 110 float ShapeResultBuffer::fillGlyphBufferForTextEmphasisRun( |
| 109 GlyphBuffer* glyphBuffer, | 111 GlyphBuffer* glyphBuffer, |
| 110 const ShapeResult::RunInfo* run, | 112 const ShapeResult::RunInfo* run, |
| 111 const TextRun& textRun, | 113 const TextRun& textRun, |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 return advanceSoFar - initialAdvance; | 197 return advanceSoFar - initialAdvance; |
| 196 } | 198 } |
| 197 | 199 |
| 198 float ShapeResultBuffer::fillFastHorizontalGlyphBuffer( | 200 float ShapeResultBuffer::fillFastHorizontalGlyphBuffer( |
| 199 GlyphBuffer* glyphBuffer, | 201 GlyphBuffer* glyphBuffer, |
| 200 TextDirection dir) const { | 202 TextDirection dir) const { |
| 201 ASSERT(!hasVerticalOffsets()); | 203 ASSERT(!hasVerticalOffsets()); |
| 202 | 204 |
| 203 float advance = 0; | 205 float advance = 0; |
| 204 | 206 |
| 207 unsigned characterIndex = 0; |
| 205 for (unsigned i = 0; i < m_results.size(); ++i) { | 208 for (unsigned i = 0; i < m_results.size(); ++i) { |
| 206 const auto& wordResult = isLeftToRightDirection(dir) | 209 const auto& wordResult = isLeftToRightDirection(dir) |
| 207 ? m_results[i] | 210 ? m_results[i] |
| 208 : m_results[m_results.size() - 1 - i]; | 211 : m_results[m_results.size() - 1 - i]; |
| 209 ASSERT(!wordResult->hasVerticalOffsets()); | 212 ASSERT(!wordResult->hasVerticalOffsets()); |
| 210 | 213 |
| 211 for (const auto& run : wordResult->m_runs) { | 214 for (const auto& run : wordResult->m_runs) { |
| 212 ASSERT(run); | 215 ASSERT(run); |
| 213 ASSERT(HB_DIRECTION_IS_HORIZONTAL(run->m_direction)); | 216 ASSERT(HB_DIRECTION_IS_HORIZONTAL(run->m_direction)); |
| 214 | 217 |
| 215 for (const auto& glyphData : run->m_glyphData) { | 218 for (const auto& glyphData : run->m_glyphData) { |
| 216 ASSERT(!glyphData.offset.height()); | 219 ASSERT(!glyphData.offset.height()); |
| 217 | 220 |
| 218 glyphBuffer->add(glyphData.glyph, run->m_fontData.get(), | 221 glyphBuffer->add(glyphData.glyph, run->m_fontData.get(), |
| 219 advance + glyphData.offset.width()); | 222 advance + glyphData.offset.width(), |
| 223 characterIndex + glyphData.characterIndex); |
| 220 advance += glyphData.advance; | 224 advance += glyphData.advance; |
| 221 } | 225 } |
| 222 } | 226 } |
| 227 characterIndex += wordResult->m_numCharacters; |
| 223 } | 228 } |
| 224 | 229 |
| 225 ASSERT(!glyphBuffer->hasVerticalOffsets()); | 230 ASSERT(!glyphBuffer->hasVerticalOffsets()); |
| 226 | 231 |
| 227 return advance; | 232 return advance; |
| 228 } | 233 } |
| 229 | 234 |
| 230 float ShapeResultBuffer::fillGlyphBuffer(GlyphBuffer* glyphBuffer, | 235 float ShapeResultBuffer::fillGlyphBuffer(GlyphBuffer* glyphBuffer, |
| 231 const TextRun& textRun, | 236 const TextRun& textRun, |
| 232 unsigned from, | 237 unsigned from, |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 totalOffset += offsetForWord; | 452 totalOffset += offsetForWord; |
| 448 if (targetX >= 0 && targetX <= wordResult->width()) | 453 if (targetX >= 0 && targetX <= wordResult->width()) |
| 449 return totalOffset; | 454 return totalOffset; |
| 450 targetX -= wordResult->width(); | 455 targetX -= wordResult->width(); |
| 451 } | 456 } |
| 452 } | 457 } |
| 453 return totalOffset; | 458 return totalOffset; |
| 454 } | 459 } |
| 455 | 460 |
| 456 } // namespace blink | 461 } // namespace blink |
| OLD | NEW |