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 | 105 |
106 if (m_isComplexText) | 106 if (m_isComplexText) |
107 m_simpleWidthIterator.clear(); | 107 m_simpleWidthIterator.clear(); |
108 else | 108 else |
109 m_simpleWidthIterator = adoptPtr(new WidthIterator(&scaledFont, m_run)); | 109 m_simpleWidthIterator = adoptPtr(new WidthIterator(&scaledFont, m_run)); |
110 } | 110 } |
111 | 111 |
112 struct MeasureTextData { | 112 struct MeasureTextData { |
113 MeasureTextData(SVGCharacterDataMap* characterDataMap) | 113 MeasureTextData(SVGCharacterDataMap* characterDataMap) |
114 : allCharactersMap(characterDataMap) | 114 : allCharactersMap(characterDataMap) |
115 , hasLastCharacter(false) | 115 , lastCharacterWasWhiteSpace(true) |
116 , lastCharacter(0) | |
117 , processRenderer(false) | |
118 , valueListPosition(0) | 116 , valueListPosition(0) |
119 , skippedCharacters(0) | |
120 { | 117 { |
121 } | 118 } |
122 | 119 |
123 SVGCharacterDataMap* allCharactersMap; | 120 SVGCharacterDataMap* allCharactersMap; |
124 bool hasLastCharacter; | 121 bool lastCharacterWasWhiteSpace; |
125 UChar lastCharacter; | |
126 bool processRenderer; | |
127 unsigned valueListPosition; | 122 unsigned valueListPosition; |
128 unsigned skippedCharacters; | |
129 }; | 123 }; |
130 | 124 |
131 void SVGTextMetricsBuilder::measureTextRenderer(RenderSVGInlineText* text, Measu
reTextData* data) | 125 void SVGTextMetricsBuilder::measureTextRenderer(RenderSVGInlineText* text, Measu
reTextData* data, bool processRenderer) |
132 { | 126 { |
133 ASSERT(text); | 127 ASSERT(text); |
134 | 128 |
135 SVGTextLayoutAttributes* attributes = text->layoutAttributes(); | 129 SVGTextLayoutAttributes* attributes = text->layoutAttributes(); |
136 Vector<SVGTextMetrics>* textMetricsValues = &attributes->textMetricsValues()
; | 130 Vector<SVGTextMetrics>* textMetricsValues = &attributes->textMetricsValues()
; |
137 if (data->processRenderer) { | 131 if (processRenderer) { |
138 if (data->allCharactersMap) | 132 if (data->allCharactersMap) |
139 attributes->clear(); | 133 attributes->clear(); |
140 else | 134 else |
141 textMetricsValues->clear(); | 135 textMetricsValues->clear(); |
142 } | 136 } |
143 | 137 |
144 initializeMeasurementWithTextRenderer(text); | 138 initializeMeasurementWithTextRenderer(text); |
145 bool preserveWhiteSpace = text->style()->whiteSpace() == PRE; | 139 bool preserveWhiteSpace = text->style()->whiteSpace() == PRE; |
146 int surrogatePairCharacters = 0; | 140 unsigned surrogatePairCharacters = 0; |
| 141 unsigned skippedCharacters = 0; |
147 | 142 |
148 while (advance()) { | 143 while (advance()) { |
149 UChar currentCharacter = m_run[m_textPosition]; | 144 bool characterIsWhiteSpace = m_run[m_textPosition] == ' '; |
150 if (currentCharacter == ' ' && !preserveWhiteSpace && (!data->hasLastCha
racter || data->lastCharacter == ' ')) { | 145 if (characterIsWhiteSpace && !preserveWhiteSpace && data->lastCharacterW
asWhiteSpace) { |
151 if (data->processRenderer) | 146 if (processRenderer) |
152 textMetricsValues->append(SVGTextMetrics(SVGTextMetrics::Skipped
SpaceMetrics)); | 147 textMetricsValues->append(SVGTextMetrics(SVGTextMetrics::Skipped
SpaceMetrics)); |
153 if (data->allCharactersMap) | 148 if (data->allCharactersMap) |
154 data->skippedCharacters += m_currentMetrics.length(); | 149 skippedCharacters += m_currentMetrics.length(); |
155 continue; | 150 continue; |
156 } | 151 } |
157 | 152 |
158 if (data->processRenderer) { | 153 if (processRenderer) { |
159 if (data->allCharactersMap) { | 154 if (data->allCharactersMap) { |
160 const SVGCharacterDataMap::const_iterator it = data->allCharacte
rsMap->find(data->valueListPosition + m_textPosition - data->skippedCharacters -
surrogatePairCharacters + 1); | 155 const SVGCharacterDataMap::const_iterator it = data->allCharacte
rsMap->find(data->valueListPosition + m_textPosition - skippedCharacters - surro
gatePairCharacters + 1); |
161 if (it != data->allCharactersMap->end()) | 156 if (it != data->allCharactersMap->end()) |
162 attributes->characterDataMap().set(m_textPosition + 1, it->v
alue); | 157 attributes->characterDataMap().set(m_textPosition + 1, it->v
alue); |
163 } | 158 } |
164 textMetricsValues->append(m_currentMetrics); | 159 textMetricsValues->append(m_currentMetrics); |
165 } | 160 } |
166 | 161 |
167 if (data->allCharactersMap && currentCharacterStartsSurrogatePair()) | 162 if (data->allCharactersMap && currentCharacterStartsSurrogatePair()) |
168 surrogatePairCharacters++; | 163 surrogatePairCharacters++; |
169 | 164 |
170 data->hasLastCharacter = true; | 165 data->lastCharacterWasWhiteSpace = characterIsWhiteSpace; |
171 data->lastCharacter = currentCharacter; | |
172 } | 166 } |
173 | 167 |
174 if (!data->allCharactersMap) | 168 if (!data->allCharactersMap) |
175 return; | 169 return; |
176 | 170 |
177 data->valueListPosition += m_textPosition - data->skippedCharacters; | 171 data->valueListPosition += m_textPosition - skippedCharacters; |
178 data->skippedCharacters = 0; | |
179 } | 172 } |
180 | 173 |
181 void SVGTextMetricsBuilder::walkTree(RenderObject* start, RenderSVGInlineText* s
topAtLeaf, MeasureTextData* data) | 174 void SVGTextMetricsBuilder::walkTree(RenderObject* start, RenderSVGInlineText* s
topAtLeaf, MeasureTextData* data) |
182 { | 175 { |
183 RenderObject* child = start->firstChild(); | 176 RenderObject* child = start->firstChild(); |
184 while (child) { | 177 while (child) { |
185 if (child->isSVGInlineText()) { | 178 if (child->isSVGInlineText()) { |
186 RenderSVGInlineText* text = toRenderSVGInlineText(child); | 179 RenderSVGInlineText* text = toRenderSVGInlineText(child); |
187 data->processRenderer = !stopAtLeaf || stopAtLeaf == text; | 180 measureTextRenderer(text, data, !stopAtLeaf || stopAtLeaf == text); |
188 measureTextRenderer(text, data); | |
189 if (stopAtLeaf && stopAtLeaf == text) | 181 if (stopAtLeaf && stopAtLeaf == text) |
190 return; | 182 return; |
191 } else if (child->isSVGInline()) { | 183 } else if (child->isSVGInline()) { |
192 // Visit children of text content elements. | 184 // Visit children of text content elements. |
193 if (RenderObject* inlineChild = child->firstChild()) { | 185 if (RenderObject* inlineChild = child->firstChild()) { |
194 child = inlineChild; | 186 child = inlineChild; |
195 continue; | 187 continue; |
196 } | 188 } |
197 } | 189 } |
198 child = child->nextInPreOrderAfterChildren(start); | 190 child = child->nextInPreOrderAfterChildren(start); |
(...skipping 13 matching lines...) Expand all Loading... |
212 } | 204 } |
213 | 205 |
214 void SVGTextMetricsBuilder::buildMetricsAndLayoutAttributes(RenderSVGText* textR
oot, RenderSVGInlineText* stopAtLeaf, SVGCharacterDataMap& allCharactersMap) | 206 void SVGTextMetricsBuilder::buildMetricsAndLayoutAttributes(RenderSVGText* textR
oot, RenderSVGInlineText* stopAtLeaf, SVGCharacterDataMap& allCharactersMap) |
215 { | 207 { |
216 ASSERT(textRoot); | 208 ASSERT(textRoot); |
217 MeasureTextData data(&allCharactersMap); | 209 MeasureTextData data(&allCharactersMap); |
218 walkTree(textRoot, stopAtLeaf, &data); | 210 walkTree(textRoot, stopAtLeaf, &data); |
219 } | 211 } |
220 | 212 |
221 } | 213 } |
OLD | NEW |