Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(336)

Side by Side Diff: third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp

Issue 1625683003: [Line Layout API] Some harder SVGTextLayoutEngine changes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@3_api_easy_svg
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 164
165 void SVGTextLayoutEngine::beginTextPathLayout(SVGInlineFlowBox* flowBox) 165 void SVGTextLayoutEngine::beginTextPathLayout(SVGInlineFlowBox* flowBox)
166 { 166 {
167 // Build text chunks for all <textPath> children, using the line layout algo rithm. 167 // Build text chunks for all <textPath> children, using the line layout algo rithm.
168 // This is needeed as text-anchor is just an additional startOffset for text paths. 168 // This is needeed as text-anchor is just an additional startOffset for text paths.
169 SVGTextLayoutEngine lineLayout(m_layoutAttributes); 169 SVGTextLayoutEngine lineLayout(m_layoutAttributes);
170 lineLayout.m_textLengthSpacingInEffect = m_textLengthSpacingInEffect; 170 lineLayout.m_textLengthSpacingInEffect = m_textLengthSpacingInEffect;
171 lineLayout.layoutCharactersInTextBoxes(flowBox); 171 lineLayout.layoutCharactersInTextBoxes(flowBox);
172 172
173 m_inPathLayout = true; 173 m_inPathLayout = true;
174 // Do we need to add a LineLayoutSVGTextPath class to handle this logic?
175 // I'd imagine it'd only have 2 methods, startOffset() and layoutPath().
174 LayoutSVGTextPath* textPath = &toLayoutSVGTextPath(flowBox->layoutObject()); 176 LayoutSVGTextPath* textPath = &toLayoutSVGTextPath(flowBox->layoutObject());
175 177
178 // Actually, what would I do with Path here? Would we have to add a LineLayo utPath
179 // class too? And then what would we do about PositionCalculator?
180 // Does this pattern bring to mind any examples I can look at?
176 Path path = textPath->layoutPath(); 181 Path path = textPath->layoutPath();
177 if (path.isEmpty()) 182 if (path.isEmpty())
178 return; 183 return;
179 m_textPathCalculator = new Path::PositionCalculator(path); 184 m_textPathCalculator = new Path::PositionCalculator(path);
180 m_textPathStartOffset = textPath->startOffset(); 185 m_textPathStartOffset = textPath->startOffset();
181 m_textPathLength = path.length(); 186 m_textPathLength = path.length();
182 if (m_textPathStartOffset > 0 && m_textPathStartOffset <= 1) 187 if (m_textPathStartOffset > 0 && m_textPathStartOffset <= 1)
183 m_textPathStartOffset *= m_textPathLength; 188 m_textPathStartOffset *= m_textPathLength;
184 189
185 SVGTextPathChunkBuilder textPathChunkLayoutBuilder; 190 SVGTextPathChunkBuilder textPathChunkLayoutBuilder;
186 textPathChunkLayoutBuilder.processTextChunks(lineLayout.m_lineLayoutBoxes); 191 textPathChunkLayoutBuilder.processTextChunks(lineLayout.m_lineLayoutBoxes);
187 192
188 m_textPathStartOffset += textPathChunkLayoutBuilder.totalTextAnchorShift(); 193 m_textPathStartOffset += textPathChunkLayoutBuilder.totalTextAnchorShift();
189 m_textPathCurrentOffset = m_textPathStartOffset; 194 m_textPathCurrentOffset = m_textPathStartOffset;
190 195
191 // Eventually handle textLength adjustments. 196 // Eventually handle textLength adjustments.
192 SVGLengthAdjustType lengthAdjust = SVGLengthAdjustUnknown; 197 SVGLengthAdjustType lengthAdjust = SVGLengthAdjustUnknown;
193 float desiredTextLength = 0; 198 float desiredTextLength = 0;
194 199
195 if (SVGTextContentElement* textContentElement = SVGTextContentElement::eleme ntFromLayoutObject(textPath)) { 200 if (SVGTextContentElement* textContentElement = SVGTextContentElement::eleme ntFromLayoutObject(flowBox->lineLayoutItem())) {
196 SVGLengthContext lengthContext(textContentElement); 201 SVGLengthContext lengthContext(textContentElement);
197 lengthAdjust = textContentElement->lengthAdjust()->currentValue()->enumV alue(); 202 lengthAdjust = textContentElement->lengthAdjust()->currentValue()->enumV alue();
198 if (textContentElement->textLengthIsSpecifiedByUser()) 203 if (textContentElement->textLengthIsSpecifiedByUser())
199 desiredTextLength = textContentElement->textLength()->currentValue() ->value(lengthContext); 204 desiredTextLength = textContentElement->textLength()->currentValue() ->value(lengthContext);
200 else 205 else
201 desiredTextLength = 0; 206 desiredTextLength = 0;
202 } 207 }
203 208
204 if (!desiredTextLength) 209 if (!desiredTextLength)
205 return; 210 return;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 layoutTextOnLineOrPath(textBox, textLineLayout, style); 244 layoutTextOnLineOrPath(textBox, textLineLayout, style);
240 245
241 if (m_inPathLayout) 246 if (m_inPathLayout)
242 return; 247 return;
243 248
244 m_lineLayoutBoxes.append(textBox); 249 m_lineLayoutBoxes.append(textBox);
245 } 250 }
246 251
247 static bool definesTextLengthWithSpacing(const InlineFlowBox* start) 252 static bool definesTextLengthWithSpacing(const InlineFlowBox* start)
248 { 253 {
249 SVGTextContentElement* textContentElement = SVGTextContentElement::elementFr omLayoutObject(&start->layoutObject()); 254 SVGTextContentElement* textContentElement = SVGTextContentElement::elementFr omLayoutObject(start->lineLayoutItem());
250 return textContentElement 255 return textContentElement
251 && textContentElement->lengthAdjust()->currentValue()->enumValue() == SV GLengthAdjustSpacing 256 && textContentElement->lengthAdjust()->currentValue()->enumValue() == SV GLengthAdjustSpacing
252 && textContentElement->textLengthIsSpecifiedByUser(); 257 && textContentElement->textLengthIsSpecifiedByUser();
253 } 258 }
254 259
255 void SVGTextLayoutEngine::layoutCharactersInTextBoxes(InlineFlowBox* start) 260 void SVGTextLayoutEngine::layoutCharactersInTextBoxes(InlineFlowBox* start)
256 { 261 {
257 bool textLengthSpacingInEffect = m_textLengthSpacingInEffect || definesTextL engthWithSpacing(start); 262 bool textLengthSpacingInEffect = m_textLengthSpacingInEffect || definesTextL engthWithSpacing(start);
258 TemporaryChange<bool> textLengthSpacingScope(m_textLengthSpacingInEffect, te xtLengthSpacingInEffect); 263 TemporaryChange<bool> textLengthSpacingScope(m_textLengthSpacingInEffect, te xtLengthSpacingInEffect);
259 264
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 } 557 }
553 558
554 if (!didStartTextFragment) 559 if (!didStartTextFragment)
555 return; 560 return;
556 561
557 // Close last open fragment, if needed. 562 // Close last open fragment, if needed.
558 recordTextFragment(textBox); 563 recordTextFragment(textBox);
559 } 564 }
560 565
561 } 566 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698