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

Side by Side Diff: src/xml/SkXMLWriter.cpp

Issue 899683002: [SkSVGDevice] Initial text support (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Created 5 years, 10 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 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkXMLWriter.h" 10 #include "SkXMLWriter.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 this->addAttribute(name, tmp.c_str()); 44 this->addAttribute(name, tmp.c_str());
45 } 45 }
46 46
47 void SkXMLWriter::addScalarAttribute(const char name[], SkScalar value) 47 void SkXMLWriter::addScalarAttribute(const char name[], SkScalar value)
48 { 48 {
49 SkString tmp; 49 SkString tmp;
50 tmp.appendScalar(value); 50 tmp.appendScalar(value);
51 this->addAttribute(name, tmp.c_str()); 51 this->addAttribute(name, tmp.c_str());
52 } 52 }
53 53
54 void SkXMLWriter::addText(const SkString& text)
55 {
56 if (fElems.isEmpty()) {
57 return;
58 }
59
60 this->onAddText(text);
61
62 fElems.top()->fHasText = true;
63 }
64
54 void SkXMLWriter::doEnd(Elem* elem) 65 void SkXMLWriter::doEnd(Elem* elem)
55 { 66 {
56 delete elem; 67 delete elem;
57 } 68 }
58 69
59 bool SkXMLWriter::doStart(const char name[], size_t length) 70 bool SkXMLWriter::doStart(const char name[], size_t length)
60 { 71 {
61 int level = fElems.count(); 72 int level = fElems.count();
62 bool firstChild = level > 0 && !fElems[level-1]->fHasChildren; 73 bool firstChild = level > 0 && !fElems[level-1]->fHasChildren;
63 if (firstChild) 74 if (firstChild)
64 fElems[level-1]->fHasChildren = true; 75 fElems[level-1]->fHasChildren = true;
65 Elem** elem = fElems.push(); 76 Elem** elem = fElems.push();
66 *elem = new Elem; 77 *elem = new Elem(name, length);
67 (*elem)->fName.set(name, length);
68 (*elem)->fHasChildren = 0;
69 return firstChild; 78 return firstChild;
70 } 79 }
71 80
72 SkXMLWriter::Elem* SkXMLWriter::getEnd() 81 SkXMLWriter::Elem* SkXMLWriter::getEnd()
73 { 82 {
74 Elem* elem; 83 Elem* elem;
75 fElems.pop(&elem); 84 fElems.pop(&elem);
76 return elem; 85 return elem;
77 } 86 }
78 87
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 { 214 {
206 } 215 }
207 216
208 SkXMLStreamWriter::~SkXMLStreamWriter() 217 SkXMLStreamWriter::~SkXMLStreamWriter()
209 { 218 {
210 this->flush(); 219 this->flush();
211 } 220 }
212 221
213 void SkXMLStreamWriter::onAddAttributeLen(const char name[], const char value[], size_t length) 222 void SkXMLStreamWriter::onAddAttributeLen(const char name[], const char value[], size_t length)
214 { 223 {
215 SkASSERT(!fElems.top()->fHasChildren); 224 SkASSERT(!fElems.top()->fHasChildren && !fElems.top()->fHasText);
216 fStream.writeText(" "); 225 fStream.writeText(" ");
217 fStream.writeText(name); 226 fStream.writeText(name);
218 fStream.writeText("=\""); 227 fStream.writeText("=\"");
219 fStream.write(value, length); 228 fStream.write(value, length);
220 fStream.writeText("\""); 229 fStream.writeText("\"");
221 } 230 }
222 231
232 void SkXMLStreamWriter::onAddText(const SkString& text)
233 {
234 Elem* elem = fElems.top();
235
236 if (!elem->fHasChildren && !elem->fHasText) {
237 fStream.writeText(">");
238 fStream.newline();
239 }
240
241 tab(fStream, fElems.count() + 1);
242 fStream.writeText(text.c_str());
243 fStream.newline();
244 }
245
223 void SkXMLStreamWriter::onEndElement() 246 void SkXMLStreamWriter::onEndElement()
224 { 247 {
225 Elem* elem = getEnd(); 248 Elem* elem = getEnd();
226 if (elem->fHasChildren) 249 if (elem->fHasChildren || elem->fHasText)
227 { 250 {
228 tab(fStream, fElems.count()); 251 tab(fStream, fElems.count());
229 fStream.writeText("</"); 252 fStream.writeText("</");
230 fStream.writeText(elem->fName.c_str()); 253 fStream.writeText(elem->fName.c_str());
231 fStream.writeText(">"); 254 fStream.writeText(">");
255 } else {
256 fStream.writeText("/>");
232 } 257 }
233 else
234 fStream.writeText("/>");
235 fStream.newline(); 258 fStream.newline();
236 doEnd(elem); 259 doEnd(elem);
237 } 260 }
238 261
239 void SkXMLStreamWriter::onStartElementLen(const char name[], size_t length) 262 void SkXMLStreamWriter::onStartElementLen(const char name[], size_t length)
240 { 263 {
241 int level = fElems.count(); 264 int level = fElems.count();
242 if (this->doStart(name, length)) 265 if (this->doStart(name, length))
243 { 266 {
244 // the first child, need to close with > 267 // the first child, need to close with >
(...skipping 22 matching lines...) Expand all
267 { 290 {
268 } 291 }
269 292
270 SkXMLParserWriter::~SkXMLParserWriter() 293 SkXMLParserWriter::~SkXMLParserWriter()
271 { 294 {
272 this->flush(); 295 this->flush();
273 } 296 }
274 297
275 void SkXMLParserWriter::onAddAttributeLen(const char name[], const char value[], size_t length) 298 void SkXMLParserWriter::onAddAttributeLen(const char name[], const char value[], size_t length)
276 { 299 {
277 SkASSERT(fElems.count() == 0 || !fElems.top()->fHasChildren); 300 SkASSERT(fElems.count() == 0 || (!fElems.top()->fHasChildren && !fElems.top( )->fHasText));
278 SkString str(value, length); 301 SkString str(value, length);
279 fParser.addAttribute(name, str.c_str()); 302 fParser.addAttribute(name, str.c_str());
280 } 303 }
281 304
305 void SkXMLParserWriter::onAddText(const SkString& text)
306 {
307 fParser.text(text.c_str(), text.size());
308 }
309
282 void SkXMLParserWriter::onEndElement() 310 void SkXMLParserWriter::onEndElement()
283 { 311 {
284 Elem* elem = this->getEnd(); 312 Elem* elem = this->getEnd();
285 fParser.endElement(elem->fName.c_str()); 313 fParser.endElement(elem->fName.c_str());
286 this->doEnd(elem); 314 this->doEnd(elem);
287 } 315 }
288 316
289 void SkXMLParserWriter::onStartElementLen(const char name[], size_t length) 317 void SkXMLParserWriter::onStartElementLen(const char name[], size_t length)
290 { 318 {
291 (void)this->doStart(name, length); 319 (void)this->doStart(name, length);
(...skipping 30 matching lines...) Expand all
322 w.endElement(); 350 w.endElement();
323 w.endElement(); 351 w.endElement();
324 w.startElement("elem2"); 352 w.startElement("elem2");
325 w.endElement(); 353 w.endElement();
326 w.endElement(); 354 w.endElement();
327 w.endElement(); 355 w.endElement();
328 #endif 356 #endif
329 } 357 }
330 358
331 #endif 359 #endif
OLDNEW
« experimental/svg/SkSVGDevice.cpp ('K') | « src/animator/SkXMLAnimatorWriter.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698