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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 m_dy += dy; | 105 m_dy += dy; |
106 } | 106 } |
107 | 107 |
108 return; | 108 return; |
109 } | 109 } |
110 | 110 |
111 m_dx = dx; | 111 m_dx = dx; |
112 m_dy = dy; | 112 m_dy = dy; |
113 } | 113 } |
114 | 114 |
115 void SVGTextLayoutEngine::recordTextFragment(SVGInlineTextBox* textBox, Vector<S
VGTextMetrics>& textMetricsValues) | 115 void SVGTextLayoutEngine::recordTextFragment(SVGInlineTextBox* textBox, const Ve
ctor<SVGTextMetrics>& textMetricsValues) |
116 { | 116 { |
117 ASSERT(!m_currentTextFragment.length); | 117 ASSERT(!m_currentTextFragment.length); |
118 ASSERT(m_visualMetricsListOffset > 0); | 118 ASSERT(m_visualMetricsListOffset > 0); |
119 | 119 |
120 // Figure out length of fragment. | 120 // Figure out length of fragment. |
121 m_currentTextFragment.length = m_visualCharacterOffset - m_currentTextFragme
nt.characterOffset; | 121 m_currentTextFragment.length = m_visualCharacterOffset - m_currentTextFragme
nt.characterOffset; |
122 | 122 |
123 // Figure out fragment metrics. | 123 // Figure out fragment metrics. |
124 SVGTextMetrics& lastCharacterMetrics = textMetricsValues.at(m_visualMetricsL
istOffset - 1); | 124 const SVGTextMetrics& lastCharacterMetrics = textMetricsValues.at(m_visualMe
tricsListOffset - 1); |
125 m_currentTextFragment.width = lastCharacterMetrics.width(); | 125 m_currentTextFragment.width = lastCharacterMetrics.width(); |
126 m_currentTextFragment.height = lastCharacterMetrics.height(); | 126 m_currentTextFragment.height = lastCharacterMetrics.height(); |
127 | 127 |
128 if (m_currentTextFragment.length > 1) { | 128 if (m_currentTextFragment.length > 1) { |
129 // SVGTextLayoutAttributesBuilder assures that the length of the range i
s equal to the sum of the individual lengths of the glyphs. | 129 // SVGTextLayoutAttributesBuilder assures that the length of the range i
s equal to the sum of the individual lengths of the glyphs. |
130 float length = 0; | 130 float length = 0; |
131 if (m_isVerticalText) { | 131 if (m_isVerticalText) { |
132 for (unsigned i = m_currentTextFragment.metricsListOffset; i < m_vis
ualMetricsListOffset; ++i) | 132 for (unsigned i = m_currentTextFragment.metricsListOffset; i < m_vis
ualMetricsListOffset; ++i) |
133 length += textMetricsValues.at(i).height(); | 133 length += textMetricsValues.at(i).height(); |
134 m_currentTextFragment.height = length; | 134 m_currentTextFragment.height = length; |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 return false; | 351 return false; |
352 | 352 |
353 logicalAttributes = m_layoutAttributes[m_layoutAttributesPosition]; | 353 logicalAttributes = m_layoutAttributes[m_layoutAttributesPosition]; |
354 m_logicalMetricsListOffset = 0; | 354 m_logicalMetricsListOffset = 0; |
355 m_logicalCharacterOffset = 0; | 355 m_logicalCharacterOffset = 0; |
356 return true; | 356 return true; |
357 } | 357 } |
358 | 358 |
359 bool SVGTextLayoutEngine::currentLogicalCharacterMetrics(SVGTextLayoutAttributes
*& logicalAttributes, SVGTextMetrics& logicalMetrics) | 359 bool SVGTextLayoutEngine::currentLogicalCharacterMetrics(SVGTextLayoutAttributes
*& logicalAttributes, SVGTextMetrics& logicalMetrics) |
360 { | 360 { |
361 Vector<SVGTextMetrics>* textMetricsValues = &logicalAttributes->textMetricsV
alues(); | 361 const Vector<SVGTextMetrics>* textMetricsValues = &logicalAttributes->textMe
tricsValues(); |
362 unsigned textMetricsSize = textMetricsValues->size(); | 362 unsigned textMetricsSize = textMetricsValues->size(); |
363 while (true) { | 363 while (true) { |
364 if (m_logicalMetricsListOffset == textMetricsSize) { | 364 if (m_logicalMetricsListOffset == textMetricsSize) { |
365 if (!currentLogicalCharacterAttributes(logicalAttributes)) | 365 if (!currentLogicalCharacterAttributes(logicalAttributes)) |
366 return false; | 366 return false; |
367 | 367 |
368 textMetricsValues = &logicalAttributes->textMetricsValues(); | 368 textMetricsValues = &logicalAttributes->textMetricsValues(); |
369 textMetricsSize = textMetricsValues->size(); | 369 textMetricsSize = textMetricsValues->size(); |
370 continue; | 370 continue; |
371 } | 371 } |
372 | 372 |
373 ASSERT(textMetricsSize); | 373 ASSERT(textMetricsSize); |
374 ASSERT(m_logicalMetricsListOffset < textMetricsSize); | 374 ASSERT(m_logicalMetricsListOffset < textMetricsSize); |
375 logicalMetrics = textMetricsValues->at(m_logicalMetricsListOffset); | 375 logicalMetrics = textMetricsValues->at(m_logicalMetricsListOffset); |
376 if (logicalMetrics.isEmpty() || (!logicalMetrics.width() && !logicalMetr
ics.height())) { | 376 if (logicalMetrics.isEmpty() || (!logicalMetrics.width() && !logicalMetr
ics.height())) { |
377 advanceToNextLogicalCharacter(logicalMetrics); | 377 advanceToNextLogicalCharacter(logicalMetrics); |
378 continue; | 378 continue; |
379 } | 379 } |
380 | 380 |
381 // Stop if we found the next valid logical text metrics object. | 381 // Stop if we found the next valid logical text metrics object. |
382 return true; | 382 return true; |
383 } | 383 } |
384 | 384 |
385 ASSERT_NOT_REACHED(); | 385 ASSERT_NOT_REACHED(); |
386 return true; | 386 return true; |
387 } | 387 } |
388 | 388 |
389 bool SVGTextLayoutEngine::currentVisualCharacterMetrics(SVGInlineTextBox* textBo
x, Vector<SVGTextMetrics>& visualMetricsValues, SVGTextMetrics& visualMetrics) | 389 bool SVGTextLayoutEngine::currentVisualCharacterMetrics(SVGInlineTextBox* textBo
x, const Vector<SVGTextMetrics>& visualMetricsValues, SVGTextMetrics& visualMetr
ics) |
390 { | 390 { |
391 ASSERT(!visualMetricsValues.isEmpty()); | 391 ASSERT(!visualMetricsValues.isEmpty()); |
392 unsigned textMetricsSize = visualMetricsValues.size(); | 392 unsigned textMetricsSize = visualMetricsValues.size(); |
393 unsigned boxStart = textBox->start(); | 393 unsigned boxStart = textBox->start(); |
394 unsigned boxLength = textBox->len(); | 394 unsigned boxLength = textBox->len(); |
395 | 395 |
396 while (m_visualMetricsListOffset < textMetricsSize) { | 396 while (m_visualMetricsListOffset < textMetricsSize) { |
397 // Advance to text box start location. | 397 // Advance to text box start location. |
398 if (m_visualCharacterOffset < boxStart) { | 398 if (m_visualCharacterOffset < boxStart) { |
399 advanceToNextVisualCharacter(visualMetricsValues[m_visualMetricsList
Offset]); | 399 advanceToNextVisualCharacter(visualMetricsValues[m_visualMetricsList
Offset]); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 SVGElement* lengthContext = toSVGElement(text->parent()->node()); | 431 SVGElement* lengthContext = toSVGElement(text->parent()->node()); |
432 | 432 |
433 RenderObject* textParent = text->parent(); | 433 RenderObject* textParent = text->parent(); |
434 bool definesTextLength = textParent ? parentDefinesTextLength(textParent) :
false; | 434 bool definesTextLength = textParent ? parentDefinesTextLength(textParent) :
false; |
435 | 435 |
436 const SVGRenderStyle& svgStyle = style->svgStyle(); | 436 const SVGRenderStyle& svgStyle = style->svgStyle(); |
437 | 437 |
438 m_visualMetricsListOffset = 0; | 438 m_visualMetricsListOffset = 0; |
439 m_visualCharacterOffset = 0; | 439 m_visualCharacterOffset = 0; |
440 | 440 |
441 Vector<SVGTextMetrics>& visualMetricsValues = text->layoutAttributes()->text
MetricsValues(); | 441 const Vector<SVGTextMetrics>& visualMetricsValues = text->layoutAttributes()
->textMetricsValues(); |
442 ASSERT(!visualMetricsValues.isEmpty()); | 442 ASSERT(!visualMetricsValues.isEmpty()); |
443 | 443 |
444 const Font& font = style->font(); | 444 const Font& font = style->font(); |
445 | 445 |
446 SVGTextLayoutEngineSpacing spacingLayout(font, style->effectiveZoom()); | 446 SVGTextLayoutEngineSpacing spacingLayout(font, style->effectiveZoom()); |
447 SVGTextLayoutEngineBaseline baselineLayout(font); | 447 SVGTextLayoutEngineBaseline baselineLayout(font); |
448 | 448 |
449 bool didStartTextFragment = false; | 449 bool didStartTextFragment = false; |
450 bool applySpacingToNextCharacter = false; | 450 bool applySpacingToNextCharacter = false; |
451 | 451 |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 } | 643 } |
644 | 644 |
645 if (!didStartTextFragment) | 645 if (!didStartTextFragment) |
646 return; | 646 return; |
647 | 647 |
648 // Close last open fragment, if needed. | 648 // Close last open fragment, if needed. |
649 recordTextFragment(textBox, visualMetricsValues); | 649 recordTextFragment(textBox, visualMetricsValues); |
650 } | 650 } |
651 | 651 |
652 } | 652 } |
OLD | NEW |