| 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 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 if (m_currentLogicalTextNodeIndex == m_descendantTextNodes.size()) | 283 if (m_currentLogicalTextNodeIndex == m_descendantTextNodes.size()) |
| 284 return nullptr; | 284 return nullptr; |
| 285 | 285 |
| 286 m_logicalMetricsListOffset = 0; | 286 m_logicalMetricsListOffset = 0; |
| 287 m_logicalCharacterOffset = 0; | 287 m_logicalCharacterOffset = 0; |
| 288 return m_descendantTextNodes[m_currentLogicalTextNodeIndex]; | 288 return m_descendantTextNodes[m_currentLogicalTextNodeIndex]; |
| 289 } | 289 } |
| 290 | 290 |
| 291 const LayoutSVGInlineText* SVGTextLayoutEngine::currentLogicalCharacterMetrics(S
VGTextMetrics& logicalMetrics) | 291 const LayoutSVGInlineText* SVGTextLayoutEngine::currentLogicalCharacterMetrics(S
VGTextMetrics& logicalMetrics) |
| 292 { | 292 { |
| 293 // If we're consumed all text nodes, there can be no more metrics. | 293 // If we've consumed all text nodes, there can be no more metrics. |
| 294 if (m_currentLogicalTextNodeIndex == m_descendantTextNodes.size()) | 294 if (m_currentLogicalTextNodeIndex == m_descendantTextNodes.size()) |
| 295 return nullptr; | 295 return nullptr; |
| 296 | 296 |
| 297 const LayoutSVGInlineText* logicalTextNode = m_descendantTextNodes[m_current
LogicalTextNodeIndex]; | 297 const LayoutSVGInlineText* logicalTextNode = m_descendantTextNodes[m_current
LogicalTextNodeIndex]; |
| 298 // If we reached the end of the text node associated with the current set | |
| 299 // of layout attributes, try to move to the next text node/set of layout | |
| 300 // attributes. | |
| 301 ASSERT(m_logicalCharacterOffset <= logicalTextNode->textLength()); | |
| 302 if (m_logicalCharacterOffset == logicalTextNode->textLength()) { | |
| 303 logicalTextNode = nextLogicalTextNode(); | |
| 304 if (!logicalTextNode) | |
| 305 return nullptr; | |
| 306 } | |
| 307 | |
| 308 // We have set of layout attributes. Find the first non-collapsed text | |
| 309 // metrics cell. | |
| 310 const Vector<SVGTextMetrics>* metricsList = &logicalTextNode->metricsList(); | 298 const Vector<SVGTextMetrics>* metricsList = &logicalTextNode->metricsList(); |
| 311 unsigned metricsListSize = metricsList->size(); | 299 unsigned metricsListSize = metricsList->size(); |
| 300 ASSERT(m_logicalMetricsListOffset <= metricsListSize); |
| 301 |
| 302 // Find the next non-collapsed text metrics cell. |
| 312 while (true) { | 303 while (true) { |
| 313 // If we run out of metrics, move to the next set of layout attributes. | 304 // If we run out of metrics, move to the next set of non-empty layout |
| 305 // attributes. |
| 314 if (m_logicalMetricsListOffset == metricsListSize) { | 306 if (m_logicalMetricsListOffset == metricsListSize) { |
| 315 logicalTextNode = nextLogicalTextNode(); | 307 logicalTextNode = nextLogicalTextNode(); |
| 316 if (!logicalTextNode) | 308 if (!logicalTextNode) |
| 317 return nullptr; | 309 return nullptr; |
| 318 | |
| 319 metricsList = &logicalTextNode->metricsList(); | 310 metricsList = &logicalTextNode->metricsList(); |
| 320 metricsListSize = metricsList->size(); | 311 metricsListSize = metricsList->size(); |
| 312 // Return to the while so that we check if the new metrics list is |
| 313 // non-empty before using it. |
| 321 continue; | 314 continue; |
| 322 } | 315 } |
| 323 | 316 |
| 324 ASSERT(metricsListSize); | 317 ASSERT(metricsListSize); |
| 325 ASSERT(m_logicalMetricsListOffset < metricsListSize); | |
| 326 logicalMetrics = metricsList->at(m_logicalMetricsListOffset); | 318 logicalMetrics = metricsList->at(m_logicalMetricsListOffset); |
| 327 if (logicalMetrics.isEmpty() || (!logicalMetrics.width() && !logicalMetr
ics.height())) { | 319 // Stop if we found the next valid logical text metrics object. |
| 328 advanceToNextLogicalCharacter(logicalMetrics); | 320 if (!logicalMetrics.isEmpty()) |
| 329 continue; | 321 break; |
| 330 } | |
| 331 | 322 |
| 332 // Stop if we found the next valid logical text metrics object. | 323 advanceToNextLogicalCharacter(logicalMetrics); |
| 333 return logicalTextNode; | |
| 334 } | 324 } |
| 335 | 325 |
| 336 ASSERT_NOT_REACHED(); | 326 return logicalTextNode; |
| 337 return nullptr; | |
| 338 } | 327 } |
| 339 | 328 |
| 340 void SVGTextLayoutEngine::advanceToNextLogicalCharacter(const SVGTextMetrics& lo
gicalMetrics) | 329 void SVGTextLayoutEngine::advanceToNextLogicalCharacter(const SVGTextMetrics& lo
gicalMetrics) |
| 341 { | 330 { |
| 342 ++m_logicalMetricsListOffset; | 331 ++m_logicalMetricsListOffset; |
| 343 m_logicalCharacterOffset += logicalMetrics.length(); | 332 m_logicalCharacterOffset += logicalMetrics.length(); |
| 344 } | 333 } |
| 345 | 334 |
| 346 void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, Line
LayoutSVGInlineText textLineLayout, const ComputedStyle& style) | 335 void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, Line
LayoutSVGInlineText textLineLayout, const ComputedStyle& style) |
| 347 { | 336 { |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 } | 495 } |
| 507 | 496 |
| 508 if (!didStartTextFragment) | 497 if (!didStartTextFragment) |
| 509 return; | 498 return; |
| 510 | 499 |
| 511 // Close last open fragment, if needed. | 500 // Close last open fragment, if needed. |
| 512 recordTextFragment(textBox); | 501 recordTextFragment(textBox); |
| 513 } | 502 } |
| 514 | 503 |
| 515 } // namespace blink | 504 } // namespace blink |
| OLD | NEW |