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 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 m_textPathStartOffset = 0; | 200 m_textPathStartOffset = 0; |
201 m_textPathCurrentOffset = 0; | 201 m_textPathCurrentOffset = 0; |
202 m_textPathSpacing = 0; | 202 m_textPathSpacing = 0; |
203 m_textPathScaling = 1; | 203 m_textPathScaling = 1; |
204 } | 204 } |
205 | 205 |
206 void SVGTextLayoutEngine::layoutInlineTextBox(SVGInlineTextBox* textBox) | 206 void SVGTextLayoutEngine::layoutInlineTextBox(SVGInlineTextBox* textBox) |
207 { | 207 { |
208 ASSERT(textBox); | 208 ASSERT(textBox); |
209 | 209 |
210 LayoutSVGInlineText& text = toLayoutSVGInlineText(textBox->layoutObject()); | 210 LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->li
neLayoutItem()); |
211 ASSERT(text.parent()); | 211 ASSERT(textLineLayout.parent()); |
212 ASSERT(text.parent()->node()); | 212 ASSERT(textLineLayout.parent().node()); |
213 ASSERT(text.parent()->node()->isSVGElement()); | 213 ASSERT(textLineLayout.parent().node()->isSVGElement()); |
214 | 214 |
215 const ComputedStyle& style = text.styleRef(); | 215 const ComputedStyle& style = textLineLayout.styleRef(); |
216 | 216 |
217 textBox->clearTextFragments(); | 217 textBox->clearTextFragments(); |
218 m_isVerticalText = !style.isHorizontalWritingMode(); | 218 m_isVerticalText = !style.isHorizontalWritingMode(); |
219 layoutTextOnLineOrPath(textBox, text, style); | 219 layoutTextOnLineOrPath(textBox, textLineLayout, style); |
220 | 220 |
221 if (m_inPathLayout) | 221 if (m_inPathLayout) |
222 return; | 222 return; |
223 | 223 |
224 m_lineLayoutBoxes.append(textBox); | 224 m_lineLayoutBoxes.append(textBox); |
225 } | 225 } |
226 | 226 |
227 static bool definesTextLengthWithSpacing(const InlineFlowBox* start) | 227 static bool definesTextLengthWithSpacing(const InlineFlowBox* start) |
228 { | 228 { |
229 SVGTextContentElement* textContentElement = SVGTextContentElement::elementFr
omLayoutObject(&start->layoutObject()); | 229 SVGTextContentElement* textContentElement = SVGTextContentElement::elementFr
omLayoutObject(&start->layoutObject()); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 ASSERT_NOT_REACHED(); | 322 ASSERT_NOT_REACHED(); |
323 return true; | 323 return true; |
324 } | 324 } |
325 | 325 |
326 void SVGTextLayoutEngine::advanceToNextLogicalCharacter(const SVGTextMetrics& lo
gicalMetrics) | 326 void SVGTextLayoutEngine::advanceToNextLogicalCharacter(const SVGTextMetrics& lo
gicalMetrics) |
327 { | 327 { |
328 ++m_logicalMetricsListOffset; | 328 ++m_logicalMetricsListOffset; |
329 m_logicalCharacterOffset += logicalMetrics.length(); | 329 m_logicalCharacterOffset += logicalMetrics.length(); |
330 } | 330 } |
331 | 331 |
332 void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, cons
t LayoutSVGInlineText& text, const ComputedStyle& style) | 332 void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, Line
LayoutSVGInlineText textLineLayout, const ComputedStyle& style) |
333 { | 333 { |
334 if (m_inPathLayout && !m_textPathCalculator) | 334 if (m_inPathLayout && !m_textPathCalculator) |
335 return; | 335 return; |
336 | 336 |
337 // Find the start of the current text box in the metrics list. | 337 // Find the start of the current text box in the metrics list. |
338 m_visualMetricsIterator.advanceToTextStart(&text, textBox->start()); | 338 m_visualMetricsIterator.advanceToTextStart(&textLineLayout, textBox->start()
); |
339 | 339 |
340 const Font& font = style.font(); | 340 const Font& font = style.font(); |
341 | 341 |
342 SVGTextLayoutEngineSpacing spacingLayout(font, style.effectiveZoom()); | 342 SVGTextLayoutEngineSpacing spacingLayout(font, style.effectiveZoom()); |
343 SVGTextLayoutEngineBaseline baselineLayout(font, style.effectiveZoom()); | 343 SVGTextLayoutEngineBaseline baselineLayout(font, style.effectiveZoom()); |
344 | 344 |
345 bool didStartTextFragment = false; | 345 bool didStartTextFragment = false; |
346 bool applySpacingToNextCharacter = false; | 346 bool applySpacingToNextCharacter = false; |
347 | 347 |
348 float lastAngle = 0; | 348 float lastAngle = 0; |
349 float baselineShift = baselineLayout.calculateBaselineShift(style); | 349 float baselineShift = baselineLayout.calculateBaselineShift(style); |
350 baselineShift -= baselineLayout.calculateAlignmentBaselineShift(m_isVertical
Text, &text); | 350 baselineShift -= baselineLayout.calculateAlignmentBaselineShift(m_isVertical
Text, textLineLayout); |
351 | 351 |
352 // Main layout algorithm. | 352 // Main layout algorithm. |
353 const unsigned boxEndOffset = textBox->start() + textBox->len(); | 353 const unsigned boxEndOffset = textBox->start() + textBox->len(); |
354 while (!m_visualMetricsIterator.isAtEnd() && m_visualMetricsIterator.charact
erOffset() < boxEndOffset) { | 354 while (!m_visualMetricsIterator.isAtEnd() && m_visualMetricsIterator.charact
erOffset() < boxEndOffset) { |
355 const SVGTextMetrics& visualMetrics = m_visualMetricsIterator.metrics(); | 355 const SVGTextMetrics& visualMetrics = m_visualMetricsIterator.metrics(); |
356 if (visualMetrics.isEmpty()) { | 356 if (visualMetrics.isEmpty()) { |
357 m_visualMetricsIterator.next(); | 357 m_visualMetricsIterator.next(); |
358 continue; | 358 continue; |
359 } | 359 } |
360 | 360 |
(...skipping 18 matching lines...) Expand all Loading... |
379 // When we've advanced to the box start offset, determine using the orig
inal x/y values, | 379 // When we've advanced to the box start offset, determine using the orig
inal x/y values, |
380 // whether this character starts a new text chunk, before doing any furt
her processing. | 380 // whether this character starts a new text chunk, before doing any furt
her processing. |
381 if (m_visualMetricsIterator.characterOffset() == textBox->start()) | 381 if (m_visualMetricsIterator.characterOffset() == textBox->start()) |
382 textBox->setStartsNewTextChunk(logicalAttributes->context()->charact
erStartsNewTextChunk(m_logicalCharacterOffset)); | 382 textBox->setStartsNewTextChunk(logicalAttributes->context()->charact
erStartsNewTextChunk(m_logicalCharacterOffset)); |
383 | 383 |
384 float angle = SVGTextLayoutAttributes::isEmptyValue(data.rotate) ? 0 : d
ata.rotate; | 384 float angle = SVGTextLayoutAttributes::isEmptyValue(data.rotate) ? 0 : d
ata.rotate; |
385 | 385 |
386 // Calculate glyph orientation angle. | 386 // Calculate glyph orientation angle. |
387 // Font::width() calculates the resolved FontOrientation for each charac
ter, | 387 // Font::width() calculates the resolved FontOrientation for each charac
ter, |
388 // but is not exposed today to avoid the API complexity. | 388 // but is not exposed today to avoid the API complexity. |
389 UChar32 currentCharacter = text.codepointAt(m_visualMetricsIterator.char
acterOffset()); | 389 UChar32 currentCharacter = textLineLayout.codepointAt(m_visualMetricsIte
rator.characterOffset()); |
390 FontOrientation fontOrientation = font.fontDescription().orientation(); | 390 FontOrientation fontOrientation = font.fontDescription().orientation(); |
391 fontOrientation = adjustOrientationForCharacterInMixedVertical(fontOrien
tation, currentCharacter); | 391 fontOrientation = adjustOrientationForCharacterInMixedVertical(fontOrien
tation, currentCharacter); |
392 | 392 |
393 // Calculate glyph advance. | 393 // Calculate glyph advance. |
394 // Shaping engine takes care of x/y orientation shifts for different fon
tOrientation values. | 394 // Shaping engine takes care of x/y orientation shifts for different fon
tOrientation values. |
395 float glyphAdvance = visualMetrics.advance(fontOrientation); | 395 float glyphAdvance = visualMetrics.advance(fontOrientation); |
396 | 396 |
397 // Assign current text position to x/y values, if needed. | 397 // Assign current text position to x/y values, if needed. |
398 updateCharacterPositionIfNeeded(x, y); | 398 updateCharacterPositionIfNeeded(x, y); |
399 | 399 |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 } | 536 } |
537 | 537 |
538 if (!didStartTextFragment) | 538 if (!didStartTextFragment) |
539 return; | 539 return; |
540 | 540 |
541 // Close last open fragment, if needed. | 541 // Close last open fragment, if needed. |
542 recordTextFragment(textBox); | 542 recordTextFragment(textBox); |
543 } | 543 } |
544 | 544 |
545 } | 545 } |
OLD | NEW |