| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) Research In Motion Limited 2010-2012. All rights reserved. | 2 * Copyright (C) Research In Motion Limited 2010-2012. All rights reserved. |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 , m_fontScalingFactor(m_text.scalingFactor()) | 120 , m_fontScalingFactor(m_text.scalingFactor()) |
| 121 , m_cachedFontHeight(m_text.scaledFont().getFontMetrics().floatHeight() / m_
fontScalingFactor) | 121 , m_cachedFontHeight(m_text.scaledFont().getFontMetrics().floatHeight() / m_
fontScalingFactor) |
| 122 , m_run(constructTextRun(m_text, 0, m_text.textLength(), m_text.styleRef().d
irection())) | 122 , m_run(constructTextRun(m_text, 0, m_text.textLength(), m_text.styleRef().d
irection())) |
| 123 , m_bidiRun(nullptr) | 123 , m_bidiRun(nullptr) |
| 124 { | 124 { |
| 125 setupBidiRuns(); | 125 setupBidiRuns(); |
| 126 } | 126 } |
| 127 | 127 |
| 128 SVGTextMetricsCalculator::~SVGTextMetricsCalculator() | 128 SVGTextMetricsCalculator::~SVGTextMetricsCalculator() |
| 129 { | 129 { |
| 130 if (m_bidiRun) | 130 m_bidiResolver.runs().deleteRuns(); |
| 131 m_bidiResolver.runs().deleteRuns(); | |
| 132 } | 131 } |
| 133 | 132 |
| 134 void SVGTextMetricsCalculator::setupBidiRuns() | 133 void SVGTextMetricsCalculator::setupBidiRuns() |
| 135 { | 134 { |
| 136 if (isOverride(m_text.styleRef().unicodeBidi())) | |
| 137 return; | |
| 138 BidiStatus status(LTR, false); | |
| 139 status.last = status.lastStrong = WTF::Unicode::OtherNeutral; | |
| 140 m_bidiResolver.setStatus(status); | |
| 141 m_bidiResolver.setPositionIgnoringNestedIsolates(TextRunIterator(&m_run, 0))
; | |
| 142 const bool hardLineBreak = false; | |
| 143 const bool reorderRuns = false; | |
| 144 m_bidiResolver.createBidiRunsForLine(TextRunIterator(&m_run, m_run.length())
, NoVisualOverride, hardLineBreak, reorderRuns); | |
| 145 BidiRunList<BidiCharacterRun>& bidiRuns = m_bidiResolver.runs(); | 135 BidiRunList<BidiCharacterRun>& bidiRuns = m_bidiResolver.runs(); |
| 136 bool bidiOverride = isOverride(m_text.styleRef().unicodeBidi()); |
| 137 BidiStatus status(LTR, bidiOverride); |
| 138 if (m_run.is8Bit() || bidiOverride) { |
| 139 WTF::Unicode::CharDirection direction = WTF::Unicode::LeftToRight; |
| 140 // If BiDi override is in effect, use the specified direction. |
| 141 if (bidiOverride && !m_text.styleRef().isLeftToRightDirection()) |
| 142 direction = WTF::Unicode::RightToLeft; |
| 143 bidiRuns.addRun(new BidiCharacterRun(0, m_run.charactersLength(), status
.context.get(), direction)); |
| 144 } else { |
| 145 status.last = status.lastStrong = WTF::Unicode::OtherNeutral; |
| 146 m_bidiResolver.setStatus(status); |
| 147 m_bidiResolver.setPositionIgnoringNestedIsolates(TextRunIterator(&m_run,
0)); |
| 148 const bool hardLineBreak = false; |
| 149 const bool reorderRuns = false; |
| 150 m_bidiResolver.createBidiRunsForLine(TextRunIterator(&m_run, m_run.lengt
h()), NoVisualOverride, hardLineBreak, reorderRuns); |
| 151 } |
| 146 m_bidiRun = bidiRuns.firstRun(); | 152 m_bidiRun = bidiRuns.firstRun(); |
| 147 } | 153 } |
| 148 | 154 |
| 149 bool SVGTextMetricsCalculator::advancePosition() | 155 bool SVGTextMetricsCalculator::advancePosition() |
| 150 { | 156 { |
| 151 m_currentPosition += currentCharacterStartsSurrogatePair() ? 2 : 1; | 157 m_currentPosition += currentCharacterStartsSurrogatePair() ? 2 : 1; |
| 152 return m_currentPosition < characterCount(); | 158 return m_currentPosition < characterCount(); |
| 153 } | 159 } |
| 154 | 160 |
| 155 unsigned SVGTextMetricsCalculator::updateSubrunRangesForCurrentPosition() | 161 unsigned SVGTextMetricsCalculator::updateSubrunRangesForCurrentPosition() |
| 156 { | 162 { |
| 157 if (m_bidiRun) { | 163 ASSERT(m_bidiRun); |
| 158 if (m_currentPosition >= static_cast<unsigned>(m_bidiRun->stop())) { | 164 if (m_currentPosition >= static_cast<unsigned>(m_bidiRun->stop())) { |
| 159 m_bidiRun = m_bidiRun->next(); | 165 m_bidiRun = m_bidiRun->next(); |
| 160 // Ensure new subrange ranges are computed below. | 166 // Ensure new subrange ranges are computed below. |
| 161 m_subrunRanges.clear(); | 167 m_subrunRanges.clear(); |
| 162 } | |
| 163 ASSERT(m_bidiRun); | |
| 164 ASSERT(static_cast<int>(m_currentPosition) < m_bidiRun->stop()); | |
| 165 } | 168 } |
| 169 ASSERT(m_bidiRun); |
| 170 ASSERT(static_cast<int>(m_currentPosition) < m_bidiRun->stop()); |
| 166 | 171 |
| 167 unsigned positionInRun = m_bidiRun ? m_currentPosition - m_bidiRun->start()
: m_currentPosition; | 172 unsigned positionInRun = m_currentPosition - m_bidiRun->start(); |
| 168 if (positionInRun >= m_subrunRanges.size()) { | 173 if (positionInRun >= m_subrunRanges.size()) { |
| 169 unsigned subrunStart = m_bidiRun ? m_bidiRun->start() : 0; | 174 TextRun subRun = constructTextRun(m_text, |
| 170 unsigned subrunEnd = m_bidiRun ? m_bidiRun->stop() : m_run.charactersLen
gth(); | 175 m_bidiRun->start(), m_bidiRun->stop() - m_bidiRun->start(), m_bidiRu
n->direction()); |
| 171 TextDirection subrunDirection = m_bidiRun ? m_bidiRun->direction() : m_t
ext.styleRef().direction(); | |
| 172 TextRun subRun = constructTextRun(m_text, subrunStart, subrunEnd - subru
nStart, subrunDirection); | |
| 173 m_subrunRanges = m_text.scaledFont().individualCharacterRanges(subRun); | 176 m_subrunRanges = m_text.scaledFont().individualCharacterRanges(subRun); |
| 174 | 177 |
| 175 // TODO(pdr): We only have per-glyph data so we need to synthesize per- | 178 // TODO(pdr): We only have per-glyph data so we need to synthesize per- |
| 176 // grapheme data. E.g., if 'fi' is shaped into a single glyph, we do not | 179 // grapheme data. E.g., if 'fi' is shaped into a single glyph, we do not |
| 177 // know the 'i' position. The code below synthesizes an average glyph | 180 // know the 'i' position. The code below synthesizes an average glyph |
| 178 // width when characters share a position. This will incorrectly split | 181 // width when characters share a position. This will incorrectly split |
| 179 // combining diacritics. See: https://crbug.com/473476. | 182 // combining diacritics. See: https://crbug.com/473476. |
| 180 unsigned distributeCount = 0; | 183 unsigned distributeCount = 0; |
| 181 for (int rangeIndex = static_cast<int>(m_subrunRanges.size()) - 1; range
Index >= 0; --rangeIndex) { | 184 for (int rangeIndex = static_cast<int>(m_subrunRanges.size()) - 1; range
Index >= 0; --rangeIndex) { |
| 182 CharacterRange& currentRange = m_subrunRanges[rangeIndex]; | 185 CharacterRange& currentRange = m_subrunRanges[rangeIndex]; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 walkTree(textRoot, text); | 327 walkTree(textRoot, text); |
| 325 } | 328 } |
| 326 | 329 |
| 327 void SVGTextMetricsBuilder::buildMetricsAndLayoutAttributes(LayoutSVGText* textR
oot, LayoutSVGInlineText* stopAtText, SVGCharacterDataMap& allCharactersMap) | 330 void SVGTextMetricsBuilder::buildMetricsAndLayoutAttributes(LayoutSVGText* textR
oot, LayoutSVGInlineText* stopAtText, SVGCharacterDataMap& allCharactersMap) |
| 328 { | 331 { |
| 329 ASSERT(textRoot); | 332 ASSERT(textRoot); |
| 330 walkTree(textRoot, stopAtText, &allCharactersMap); | 333 walkTree(textRoot, stopAtText, &allCharactersMap); |
| 331 } | 334 } |
| 332 | 335 |
| 333 } // namespace blink | 336 } // namespace blink |
| OLD | NEW |