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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 | 106 |
107 return; | 107 return; |
108 } | 108 } |
109 | 109 |
110 m_dx = dx; | 110 m_dx = dx; |
111 m_dy = dy; | 111 m_dy = dy; |
112 } | 112 } |
113 | 113 |
114 static void computeGlyphOverflow(SVGInlineTextBox* textBox, SVGTextFragment& tex
tFragment) | 114 static void computeGlyphOverflow(SVGInlineTextBox* textBox, SVGTextFragment& tex
tFragment) |
115 { | 115 { |
116 LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->li
neLayoutItem()); | 116 LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->ge
tLineLayoutItem()); |
117 TextRun run = SVGTextMetrics::constructTextRun(textLineLayout, textFragment.
characterOffset, textFragment.length, textLineLayout.styleRef().direction()); | 117 TextRun run = SVGTextMetrics::constructTextRun(textLineLayout, textFragment.
characterOffset, textFragment.length, textLineLayout.styleRef().direction()); |
118 | 118 |
119 float scalingFactor = textLineLayout.scalingFactor(); | 119 float scalingFactor = textLineLayout.scalingFactor(); |
120 ASSERT(scalingFactor); | 120 ASSERT(scalingFactor); |
121 const Font& scaledFont = textLineLayout.scaledFont(); | 121 const Font& scaledFont = textLineLayout.scaledFont(); |
122 FloatRect glyphOverflowBounds; | 122 FloatRect glyphOverflowBounds; |
123 | 123 |
124 float width = scaledFont.width(run, nullptr, &glyphOverflowBounds); | 124 float width = scaledFont.width(run, nullptr, &glyphOverflowBounds); |
125 float ascent = scaledFont.fontMetrics().floatAscent(); | 125 float ascent = scaledFont.fontMetrics().floatAscent(); |
126 float descent = scaledFont.fontMetrics().floatDescent(); | 126 float descent = scaledFont.fontMetrics().floatDescent(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 | 166 |
167 void SVGTextLayoutEngine::beginTextPathLayout(SVGInlineFlowBox* flowBox) | 167 void SVGTextLayoutEngine::beginTextPathLayout(SVGInlineFlowBox* flowBox) |
168 { | 168 { |
169 // Build text chunks for all <textPath> children, using the line layout algo
rithm. | 169 // Build text chunks for all <textPath> children, using the line layout algo
rithm. |
170 // This is needeed as text-anchor is just an additional startOffset for text
paths. | 170 // This is needeed as text-anchor is just an additional startOffset for text
paths. |
171 SVGTextLayoutEngine lineLayout(m_layoutAttributes); | 171 SVGTextLayoutEngine lineLayout(m_layoutAttributes); |
172 lineLayout.m_textLengthSpacingInEffect = m_textLengthSpacingInEffect; | 172 lineLayout.m_textLengthSpacingInEffect = m_textLengthSpacingInEffect; |
173 lineLayout.layoutCharactersInTextBoxes(flowBox); | 173 lineLayout.layoutCharactersInTextBoxes(flowBox); |
174 | 174 |
175 m_inPathLayout = true; | 175 m_inPathLayout = true; |
176 LineLayoutSVGTextPath textPath = LineLayoutSVGTextPath(flowBox->lineLayoutIt
em()); | 176 LineLayoutSVGTextPath textPath = LineLayoutSVGTextPath(flowBox->getLineLayou
tItem()); |
177 | 177 |
178 m_textPath = textPath.layoutPath(); | 178 m_textPath = textPath.layoutPath(); |
179 if (!m_textPath) | 179 if (!m_textPath) |
180 return; | 180 return; |
181 m_textPathStartOffset = textPath.calculateStartOffset(m_textPath->length()); | 181 m_textPathStartOffset = textPath.calculateStartOffset(m_textPath->length()); |
182 | 182 |
183 SVGTextPathChunkBuilder textPathChunkLayoutBuilder; | 183 SVGTextPathChunkBuilder textPathChunkLayoutBuilder; |
184 textPathChunkLayoutBuilder.processTextChunks(lineLayout.m_lineLayoutBoxes); | 184 textPathChunkLayoutBuilder.processTextChunks(lineLayout.m_lineLayoutBoxes); |
185 | 185 |
186 m_textPathStartOffset += textPathChunkLayoutBuilder.totalTextAnchorShift(); | 186 m_textPathStartOffset += textPathChunkLayoutBuilder.totalTextAnchorShift(); |
(...skipping 29 matching lines...) Expand all Loading... |
216 m_textPathStartOffset = 0; | 216 m_textPathStartOffset = 0; |
217 m_textPathCurrentOffset = 0; | 217 m_textPathCurrentOffset = 0; |
218 m_textPathSpacing = 0; | 218 m_textPathSpacing = 0; |
219 m_textPathScaling = 1; | 219 m_textPathScaling = 1; |
220 } | 220 } |
221 | 221 |
222 void SVGTextLayoutEngine::layoutInlineTextBox(SVGInlineTextBox* textBox) | 222 void SVGTextLayoutEngine::layoutInlineTextBox(SVGInlineTextBox* textBox) |
223 { | 223 { |
224 ASSERT(textBox); | 224 ASSERT(textBox); |
225 | 225 |
226 LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->li
neLayoutItem()); | 226 LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->ge
tLineLayoutItem()); |
227 ASSERT(textLineLayout.parent()); | 227 ASSERT(textLineLayout.parent()); |
228 ASSERT(textLineLayout.parent().node()); | 228 ASSERT(textLineLayout.parent().node()); |
229 ASSERT(textLineLayout.parent().node()->isSVGElement()); | 229 ASSERT(textLineLayout.parent().node()->isSVGElement()); |
230 | 230 |
231 const ComputedStyle& style = textLineLayout.styleRef(); | 231 const ComputedStyle& style = textLineLayout.styleRef(); |
232 | 232 |
233 textBox->clearTextFragments(); | 233 textBox->clearTextFragments(); |
234 m_isVerticalText = !style.isHorizontalWritingMode(); | 234 m_isVerticalText = !style.isHorizontalWritingMode(); |
235 layoutTextOnLineOrPath(textBox, textLineLayout, style); | 235 layoutTextOnLineOrPath(textBox, textLineLayout, style); |
236 | 236 |
237 if (m_inPathLayout) | 237 if (m_inPathLayout) |
238 return; | 238 return; |
239 | 239 |
240 m_lineLayoutBoxes.append(textBox); | 240 m_lineLayoutBoxes.append(textBox); |
241 } | 241 } |
242 | 242 |
243 static bool definesTextLengthWithSpacing(const InlineFlowBox* start) | 243 static bool definesTextLengthWithSpacing(const InlineFlowBox* start) |
244 { | 244 { |
245 SVGTextContentElement* textContentElement = SVGTextContentElement::elementFr
omLineLayoutItem(start->lineLayoutItem()); | 245 SVGTextContentElement* textContentElement = SVGTextContentElement::elementFr
omLineLayoutItem(start->getLineLayoutItem()); |
246 return textContentElement | 246 return textContentElement |
247 && textContentElement->lengthAdjust()->currentValue()->enumValue() == SV
GLengthAdjustSpacing | 247 && textContentElement->lengthAdjust()->currentValue()->enumValue() == SV
GLengthAdjustSpacing |
248 && textContentElement->textLengthIsSpecifiedByUser(); | 248 && textContentElement->textLengthIsSpecifiedByUser(); |
249 } | 249 } |
250 | 250 |
251 void SVGTextLayoutEngine::layoutCharactersInTextBoxes(InlineFlowBox* start) | 251 void SVGTextLayoutEngine::layoutCharactersInTextBoxes(InlineFlowBox* start) |
252 { | 252 { |
253 bool textLengthSpacingInEffect = m_textLengthSpacingInEffect || definesTextL
engthWithSpacing(start); | 253 bool textLengthSpacingInEffect = m_textLengthSpacingInEffect || definesTextL
engthWithSpacing(start); |
254 TemporaryChange<bool> textLengthSpacingScope(m_textLengthSpacingInEffect, te
xtLengthSpacingInEffect); | 254 TemporaryChange<bool> textLengthSpacingScope(m_textLengthSpacingInEffect, te
xtLengthSpacingInEffect); |
255 | 255 |
256 for (InlineBox* child = start->firstChild(); child; child = child->nextOnLin
e()) { | 256 for (InlineBox* child = start->firstChild(); child; child = child->nextOnLin
e()) { |
257 if (child->isSVGInlineTextBox()) { | 257 if (child->isSVGInlineTextBox()) { |
258 ASSERT(child->lineLayoutItem().isSVGInlineText()); | 258 ASSERT(child->getLineLayoutItem().isSVGInlineText()); |
259 layoutInlineTextBox(toSVGInlineTextBox(child)); | 259 layoutInlineTextBox(toSVGInlineTextBox(child)); |
260 } else { | 260 } else { |
261 // Skip generated content. | 261 // Skip generated content. |
262 Node* node = child->lineLayoutItem().node(); | 262 Node* node = child->getLineLayoutItem().node(); |
263 if (!node) | 263 if (!node) |
264 continue; | 264 continue; |
265 | 265 |
266 SVGInlineFlowBox* flowBox = toSVGInlineFlowBox(child); | 266 SVGInlineFlowBox* flowBox = toSVGInlineFlowBox(child); |
267 bool isTextPath = isSVGTextPathElement(*node); | 267 bool isTextPath = isSVGTextPathElement(*node); |
268 if (isTextPath) | 268 if (isTextPath) |
269 beginTextPathLayout(flowBox); | 269 beginTextPathLayout(flowBox); |
270 | 270 |
271 layoutCharactersInTextBoxes(flowBox); | 271 layoutCharactersInTextBoxes(flowBox); |
272 | 272 |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 } | 548 } |
549 | 549 |
550 if (!didStartTextFragment) | 550 if (!didStartTextFragment) |
551 return; | 551 return; |
552 | 552 |
553 // Close last open fragment, if needed. | 553 // Close last open fragment, if needed. |
554 recordTextFragment(textBox); | 554 recordTextFragment(textBox); |
555 } | 555 } |
556 | 556 |
557 } // namespace blink | 557 } // namespace blink |
OLD | NEW |