From fe3f260ff9b6b3f4c7c33f2b20502b281baab689 Mon Sep 17 00:00:00 2001 From: fmalita Date: Tue, 3 Feb 2015 17:47:12 -0800 Subject: [SkSVGDevice] Initial text support R=reed@google.com,mtklein@google.com Review URL: https://codereview.chromium.org/899683002 --- src/xml/SkXMLWriter.cpp | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) (limited to 'src/xml') diff --git a/src/xml/SkXMLWriter.cpp b/src/xml/SkXMLWriter.cpp index ec351b728b..56e0889388 100644 --- a/src/xml/SkXMLWriter.cpp +++ b/src/xml/SkXMLWriter.cpp @@ -51,6 +51,17 @@ void SkXMLWriter::addScalarAttribute(const char name[], SkScalar value) this->addAttribute(name, tmp.c_str()); } +void SkXMLWriter::addText(const char text[]) +{ + if (fElems.isEmpty()) { + return; + } + + this->onAddText(text); + + fElems.top()->fHasText = true; +} + void SkXMLWriter::doEnd(Elem* elem) { delete elem; @@ -63,9 +74,7 @@ bool SkXMLWriter::doStart(const char name[], size_t length) if (firstChild) fElems[level-1]->fHasChildren = true; Elem** elem = fElems.push(); - *elem = new Elem; - (*elem)->fName.set(name, length); - (*elem)->fHasChildren = 0; + *elem = new Elem(name, length); return firstChild; } @@ -212,7 +221,7 @@ SkXMLStreamWriter::~SkXMLStreamWriter() void SkXMLStreamWriter::onAddAttributeLen(const char name[], const char value[], size_t length) { - SkASSERT(!fElems.top()->fHasChildren); + SkASSERT(!fElems.top()->fHasChildren && !fElems.top()->fHasText); fStream.writeText(" "); fStream.writeText(name); fStream.writeText("=\""); @@ -220,18 +229,32 @@ void SkXMLStreamWriter::onAddAttributeLen(const char name[], const char value[], fStream.writeText("\""); } +void SkXMLStreamWriter::onAddText(const char text[]) +{ + Elem* elem = fElems.top(); + + if (!elem->fHasChildren && !elem->fHasText) { + fStream.writeText(">"); + fStream.newline(); + } + + tab(fStream, fElems.count() + 1); + fStream.writeText(text); + fStream.newline(); +} + void SkXMLStreamWriter::onEndElement() { Elem* elem = getEnd(); - if (elem->fHasChildren) + if (elem->fHasChildren || elem->fHasText) { tab(fStream, fElems.count()); fStream.writeText("fName.c_str()); fStream.writeText(">"); - } - else + } else { fStream.writeText("/>"); + } fStream.newline(); doEnd(elem); } @@ -274,11 +297,16 @@ SkXMLParserWriter::~SkXMLParserWriter() void SkXMLParserWriter::onAddAttributeLen(const char name[], const char value[], size_t length) { - SkASSERT(fElems.count() == 0 || !fElems.top()->fHasChildren); + SkASSERT(fElems.count() == 0 || (!fElems.top()->fHasChildren && !fElems.top()->fHasText)); SkString str(value, length); fParser.addAttribute(name, str.c_str()); } +void SkXMLParserWriter::onAddText(const char text[]) +{ + fParser.text(text, SkToInt(strlen(text))); +} + void SkXMLParserWriter::onEndElement() { Elem* elem = this->getEnd(); -- cgit v1.2.3