| 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 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 | 219 |
| 220 bool lastCharacterWasWhiteSpace; | 220 bool lastCharacterWasWhiteSpace; |
| 221 unsigned valueListPosition; | 221 unsigned valueListPosition; |
| 222 }; | 222 }; |
| 223 | 223 |
| 224 // Struct for updating SVGTextLayoutAttributes. If an SVGCharacterDataMap is | 224 // Struct for updating SVGTextLayoutAttributes. If an SVGCharacterDataMap is |
| 225 // available, the attribute's character data map will also be updated. | 225 // available, the attribute's character data map will also be updated. |
| 226 // TreeWalkTextState should be used to maintain the value list position which | 226 // TreeWalkTextState should be used to maintain the value list position which |
| 227 // indexes into the SVGCharacterDataMap of all characters. | 227 // indexes into the SVGCharacterDataMap of all characters. |
| 228 struct UpdateAttributes { | 228 struct UpdateAttributes { |
| 229 UpdateAttributes(SVGTextLayoutAttributes& textAttributes, const SVGCharacter
DataMap* allCharacters) | 229 UpdateAttributes( |
| 230 : attributes(textAttributes) | 230 SVGTextLayoutAttributes& textAttributes, |
| 231 Vector<SVGTextMetrics>& metricsList, |
| 232 const SVGCharacterDataMap* allCharacters) |
| 233 : metricsList(metricsList) |
| 234 , attributes(textAttributes) |
| 231 , allCharactersMap(allCharacters) { } | 235 , allCharactersMap(allCharacters) { } |
| 232 | 236 |
| 233 void clearExistingAttributes() | 237 void clearExistingAttributes() |
| 234 { | 238 { |
| 239 metricsList.clear(); |
| 240 |
| 235 if (allCharactersMap) | 241 if (allCharactersMap) |
| 236 attributes.clear(); | 242 attributes.clear(); |
| 237 else | |
| 238 attributes.textMetricsValues().clear(); | |
| 239 } | 243 } |
| 240 | 244 |
| 241 void addMetrics(SVGTextMetrics metrics) | 245 void addMetrics(SVGTextMetrics metrics) |
| 242 { | 246 { |
| 243 attributes.textMetricsValues().append(metrics); | 247 metricsList.append(metrics); |
| 244 } | 248 } |
| 245 | 249 |
| 246 void updateCharacterDataMap(unsigned valueListPosition, unsigned currentText
Position) | 250 void updateCharacterDataMap(unsigned valueListPosition, unsigned currentText
Position) |
| 247 { | 251 { |
| 248 if (!allCharactersMap) | 252 if (!allCharactersMap) |
| 249 return; | 253 return; |
| 250 const SVGCharacterDataMap::const_iterator it = allCharactersMap->find(va
lueListPosition); | 254 const SVGCharacterDataMap::const_iterator it = allCharactersMap->find(va
lueListPosition); |
| 251 if (it != allCharactersMap->end()) | 255 if (it != allCharactersMap->end()) |
| 252 attributes.characterDataMap().set(currentTextPosition, it->value); | 256 attributes.characterDataMap().set(currentTextPosition, it->value); |
| 253 } | 257 } |
| 254 | 258 |
| 259 Vector<SVGTextMetrics>& metricsList; |
| 255 SVGTextLayoutAttributes& attributes; | 260 SVGTextLayoutAttributes& attributes; |
| 256 const SVGCharacterDataMap* allCharactersMap; | 261 const SVGCharacterDataMap* allCharactersMap; |
| 257 }; | 262 }; |
| 258 | 263 |
| 259 void walkInlineText(LayoutSVGInlineText* text, TreeWalkTextState& textState, Upd
ateAttributes* attributesToUpdate = nullptr) | 264 void walkInlineText(LayoutSVGInlineText* text, TreeWalkTextState& textState, Upd
ateAttributes* attributesToUpdate = nullptr) |
| 260 { | 265 { |
| 261 if (attributesToUpdate) | 266 if (attributesToUpdate) |
| 262 attributesToUpdate->clearExistingAttributes(); | 267 attributesToUpdate->clearExistingAttributes(); |
| 263 | 268 |
| 264 if (!text->textLength()) | 269 if (!text->textLength()) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 | 301 |
| 297 void walkTree(LayoutSVGText* start, LayoutSVGInlineText* stopAtText, SVGCharacte
rDataMap* allCharactersMap = nullptr) | 302 void walkTree(LayoutSVGText* start, LayoutSVGInlineText* stopAtText, SVGCharacte
rDataMap* allCharactersMap = nullptr) |
| 298 { | 303 { |
| 299 TreeWalkTextState textState; | 304 TreeWalkTextState textState; |
| 300 LayoutObject* child = start->firstChild(); | 305 LayoutObject* child = start->firstChild(); |
| 301 while (child) { | 306 while (child) { |
| 302 if (child->isSVGInlineText()) { | 307 if (child->isSVGInlineText()) { |
| 303 LayoutSVGInlineText* text = toLayoutSVGInlineText(child); | 308 LayoutSVGInlineText* text = toLayoutSVGInlineText(child); |
| 304 OwnPtr<UpdateAttributes> attributesToUpdate = nullptr; | 309 OwnPtr<UpdateAttributes> attributesToUpdate = nullptr; |
| 305 if (!stopAtText || stopAtText == text) | 310 if (!stopAtText || stopAtText == text) |
| 306 attributesToUpdate = adoptPtr(new UpdateAttributes(*text->layout
Attributes(), allCharactersMap)); | 311 attributesToUpdate = adoptPtr(new UpdateAttributes(*text->layout
Attributes(), text->metricsList(), allCharactersMap)); |
| 307 walkInlineText(text, textState, attributesToUpdate.get()); | 312 walkInlineText(text, textState, attributesToUpdate.get()); |
| 308 if (stopAtText == text) | 313 if (stopAtText == text) |
| 309 return; | 314 return; |
| 310 } else if (child->isSVGInline()) { | 315 } else if (child->isSVGInline()) { |
| 311 // Visit children of text content elements. | 316 // Visit children of text content elements. |
| 312 if (LayoutObject* inlineChild = toLayoutSVGInline(child)->firstChild
()) { | 317 if (LayoutObject* inlineChild = toLayoutSVGInline(child)->firstChild
()) { |
| 313 child = inlineChild; | 318 child = inlineChild; |
| 314 continue; | 319 continue; |
| 315 } | 320 } |
| 316 } | 321 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 327 walkTree(textRoot, text); | 332 walkTree(textRoot, text); |
| 328 } | 333 } |
| 329 | 334 |
| 330 void SVGTextMetricsBuilder::buildMetricsAndLayoutAttributes(LayoutSVGText* textR
oot, LayoutSVGInlineText* stopAtText, SVGCharacterDataMap& allCharactersMap) | 335 void SVGTextMetricsBuilder::buildMetricsAndLayoutAttributes(LayoutSVGText* textR
oot, LayoutSVGInlineText* stopAtText, SVGCharacterDataMap& allCharactersMap) |
| 331 { | 336 { |
| 332 ASSERT(textRoot); | 337 ASSERT(textRoot); |
| 333 walkTree(textRoot, stopAtText, &allCharactersMap); | 338 walkTree(textRoot, stopAtText, &allCharactersMap); |
| 334 } | 339 } |
| 335 | 340 |
| 336 } // namespace blink | 341 } // namespace blink |
| OLD | NEW |