src/lib/VDXParser.cpp | 4 ++++ src/lib/VSDCollector.h | 1 + src/lib/VSDContentCollector.cpp | 8 +++++++- src/lib/VSDContentCollector.h | 3 +++ src/lib/VSDParser.cpp | 22 +++++++++++++++++++++- src/lib/VSDParser.h | 3 +++ src/lib/VSDStylesCollector.cpp | 5 +++++ src/lib/VSDStylesCollector.h | 1 + src/lib/VSDXMLParserBase.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/lib/VSDXMLParserBase.h | 1 + src/lib/VSDXParser.cpp | 25 +++++++++++++++++++++++++ src/lib/VSDXParser.h | 1 + src/lib/tokens.txt | 1 + 13 files changed, 110 insertions(+), 2 deletions(-)
New commits: commit b5c9438c238c17a7128cbd37249ff284a3e46f94 Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Fri Dec 11 11:53:09 2015 +0100 Reading some of the layer information in xml parsers too Change-Id: Ifae38d2131e3f9bae403f93f3f15cfe2bb9f7982 diff --git a/src/lib/VDXParser.cpp b/src/lib/VDXParser.cpp index a409b11..e644999 100644 --- a/src/lib/VDXParser.cpp +++ b/src/lib/VDXParser.cpp @@ -241,6 +241,10 @@ void libvisio::VDXParser::processXmlNode(xmlTextReaderPtr reader) if (XML_READER_TYPE_ELEMENT == tokenType) readGeometry(reader); break; + case XML_LAYER: + if (XML_READER_TYPE_ELEMENT == tokenType) + readLayerIX(reader); + break; case XML_PARA: if (XML_READER_TYPE_ELEMENT == tokenType) readParaIX(reader); diff --git a/src/lib/VSDCollector.h b/src/lib/VSDCollector.h index 594fcf0..814e377 100644 --- a/src/lib/VSDCollector.h +++ b/src/lib/VSDCollector.h @@ -102,6 +102,7 @@ public: virtual void collectName(unsigned id, unsigned level, const librevenge::RVNGBinaryData &name, TextFormat format) = 0; virtual void collectPageSheet(unsigned id, unsigned level) = 0; virtual void collectMisc(unsigned level, const VSDMisc &misc) = 0; + virtual void collectLayerList(unsigned level, const VSDLayerList &layerList) = 0; // Style collectors virtual void collectStyleSheet(unsigned id, unsigned level,unsigned parentLineStyle, unsigned parentFillStyle, unsigned parentTextStyle) = 0; diff --git a/src/lib/VSDContentCollector.cpp b/src/lib/VSDContentCollector.cpp index 8f2759a..fdcf9fa 100644 --- a/src/lib/VSDContentCollector.cpp +++ b/src/lib/VSDContentCollector.cpp @@ -57,7 +57,7 @@ libvisio::VSDContentCollector::VSDContentCollector( m_textFormat(VSD_TEXT_ANSI), m_charFormats(), m_paraFormats(), m_lineStyle(), m_fillStyle(), m_textBlockStyle(), m_themeReference(), m_defaultCharStyle(), m_defaultParaStyle(), m_currentStyleSheet(0), m_styles(styles), m_stencils(stencils), m_stencilShape(0), m_isStencilStarted(false), m_currentGeometryCount(0), - m_backgroundPageID(MINUS_ONE), m_currentPageID(0), m_currentPage(), m_pages(), + m_backgroundPageID(MINUS_ONE), m_currentPageID(0), m_currentPage(), m_pages(), m_layerList(), m_splineControlPoints(), m_splineKnotVector(), m_splineX(0.0), m_splineY(0.0), m_splineLastKnot(0.0), m_splineDegree(0), m_splineLevel(0), m_currentShapeLevel(0), m_isBackgroundPage(false) @@ -2973,4 +2973,10 @@ void libvisio::VSDContentCollector::collectMisc(unsigned level, const VSDMisc &m m_misc = misc; } +void libvisio::VSDContentCollector::collectLayerList(unsigned level, const VSDLayerList &layerList) +{ + _handleLevelChange(level); + m_layerList = layerList; +} + /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ diff --git a/src/lib/VSDContentCollector.h b/src/lib/VSDContentCollector.h index a7d148a..7836935 100644 --- a/src/lib/VSDContentCollector.h +++ b/src/lib/VSDContentCollector.h @@ -122,6 +122,7 @@ public: void collectName(unsigned id, unsigned level, const librevenge::RVNGBinaryData &name, TextFormat format); void collectPageSheet(unsigned id, unsigned level); void collectMisc(unsigned level, const VSDMisc &misc); + void collectLayerList(unsigned level, const VSDLayerList &layerList); // Style collectors @@ -292,6 +293,8 @@ private: VSDPage m_currentPage; VSDPages m_pages; + VSDLayerList m_layerList; + std::vector<std::pair<double, double> > m_splineControlPoints; std::vector<double> m_splineKnotVector; double m_splineX, m_splineY; diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp index b348cbf..7d7ec48 100644 --- a/src/lib/VSDParser.cpp +++ b/src/lib/VSDParser.cpp @@ -24,7 +24,7 @@ libvisio::VSDParser::VSDParser(librevenge::RVNGInputStream *input, librevenge::RVNGDrawingInterface *painter, librevenge::RVNGInputStream *container) : m_input(input), m_painter(painter), m_container(container), m_header(), m_collector(0), m_shapeList(), m_currentLevel(0), m_stencils(), m_currentStencil(0), m_shape(), m_isStencilStarted(false), m_isInStyles(false), - m_currentShapeLevel(0), m_currentShapeID(MINUS_ONE), m_extractStencils(false), m_colours(), + m_currentShapeLevel(0), m_currentShapeID(MINUS_ONE), m_currentLayerListLevel(0), m_extractStencils(false), m_colours(), m_isBackgroundPage(false), m_isShapeStarted(false), m_shadowOffsetX(0.0), m_shadowOffsetY(0.0), m_currentGeometryList(0), m_currentGeomListCount(0), m_fonts(), m_names(), m_namesMapMap(), m_currentPageName(), m_currentLayerList() @@ -593,6 +593,9 @@ void libvisio::VSDParser::handleChunk(librevenge::RVNGInputStream *input) case VSD_LAYER_LIST: readLayerList(input); break; + case VSD_LAYER: + readLayer(input); + break; default: m_collector->collectUnhandledChunk(m_header.id, m_header.level); } @@ -673,6 +676,10 @@ void libvisio::VSDParser::_handleLevelChange(unsigned level) { if (level == m_currentLevel) return; + if (level <= m_currentLayerListLevel) + { + m_collector->collectLayerList(level, m_currentLayerList); + } if (level <= m_currentShapeLevel+1) { if (!m_shape.m_geometries.empty() && m_currentGeometryList && m_currentGeometryList->empty()) @@ -935,9 +942,22 @@ void libvisio::VSDParser::readPropList(librevenge::RVNGInputStream * /* input */ void libvisio::VSDParser::readLayerList(librevenge::RVNGInputStream * /* input */) { + m_currentLayerListLevel = m_header.level; m_currentLayerList.clear(); } +void libvisio::VSDParser::readLayer(librevenge::RVNGInputStream *input) +{ + VSDLayer layer; + input->seek(8, librevenge::RVNG_SEEK_CUR); + layer.m_colourId = readU8(input); + layer.m_colour.r = readU8(input); + layer.m_colour.g = readU8(input); + layer.m_colour.b = readU8(input); + layer.m_colour.a = readU8(input); + m_currentLayerList.addLayer(m_header.id, layer); +} + void libvisio::VSDParser::readPage(librevenge::RVNGInputStream *input) { input->seek(8, librevenge::RVNG_SEEK_CUR); //sub header length and children list length diff --git a/src/lib/VSDParser.h b/src/lib/VSDParser.h index e879790..973b134 100644 --- a/src/lib/VSDParser.h +++ b/src/lib/VSDParser.h @@ -113,6 +113,7 @@ protected: void readMisc(librevenge::RVNGInputStream *input); virtual void readLayerList(librevenge::RVNGInputStream *input); + virtual void readLayer(librevenge::RVNGInputStream *input); // parser of one pass bool parseDocument(librevenge::RVNGInputStream *input, unsigned shift); @@ -153,6 +154,8 @@ protected: unsigned m_currentShapeLevel; unsigned m_currentShapeID; + unsigned m_currentLayerListLevel; + bool m_extractStencils; std::vector<Colour> m_colours; diff --git a/src/lib/VSDStylesCollector.cpp b/src/lib/VSDStylesCollector.cpp index 12e3643..0db64d2 100644 --- a/src/lib/VSDStylesCollector.cpp +++ b/src/lib/VSDStylesCollector.cpp @@ -249,6 +249,11 @@ void libvisio::VSDStylesCollector::collectMisc(unsigned level, const VSDMisc & / _handleLevelChange(level); } +void libvisio::VSDStylesCollector::collectLayerList(unsigned level, const VSDLayerList & /* layerList */) +{ + _handleLevelChange(level); +} + void libvisio::VSDStylesCollector::collectUnhandledChunk(unsigned /* id */, unsigned level) { _handleLevelChange(level); diff --git a/src/lib/VSDStylesCollector.h b/src/lib/VSDStylesCollector.h index 22f73a1..5f91abb 100644 --- a/src/lib/VSDStylesCollector.h +++ b/src/lib/VSDStylesCollector.h @@ -115,6 +115,7 @@ public: void collectName(unsigned id, unsigned level, const librevenge::RVNGBinaryData &name, TextFormat format); void collectPageSheet(unsigned id, unsigned level); void collectMisc(unsigned level, const VSDMisc &misc); + void collectLayerList(unsigned level, const VSDLayerList &layerList); // Style collectors void collectStyleSheet(unsigned id, unsigned level,unsigned parentLineStyle, unsigned parentFillStyle, unsigned parentTextStyle); diff --git a/src/lib/VSDXMLParserBase.cpp b/src/lib/VSDXMLParserBase.cpp index 7f38bca..257fddc 100644 --- a/src/lib/VSDXMLParserBase.cpp +++ b/src/lib/VSDXMLParserBase.cpp @@ -1335,6 +1335,43 @@ void libvisio::VSDXMLParserBase::readCharIX(xmlTextReaderPtr reader) } } +void libvisio::VSDXMLParserBase::readLayerIX(xmlTextReaderPtr reader) +{ + if (xmlTextReaderIsEmptyElement(reader)) + return; + + // unsigned ix = getIX(reader); + + int ret = 1; + int tokenId = XML_TOKEN_INVALID; + int tokenType = -1; + // int level = getElementDepth(reader); + + Colour colour; + + do + { + ret = xmlTextReaderRead(reader); + tokenId = getElementToken(reader); + if (XML_TOKEN_INVALID == tokenId) + { + VSD_DEBUG_MSG(("VSDXMLParserBase::readLayerIX: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + + switch (tokenId) + { + case XML_COLOR: + if (XML_READER_TYPE_ELEMENT == tokenType) + ret = readExtendedColourData(colour, reader); + break; + default: + break; + } + } + while (((XML_LAYER != tokenId && XML_ROW != tokenId) || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret && (!m_watcher || !m_watcher->isError())); +} + void libvisio::VSDXMLParserBase::readParaIX(xmlTextReaderPtr reader) { if (xmlTextReaderIsEmptyElement(reader)) diff --git a/src/lib/VSDXMLParserBase.h b/src/lib/VSDXMLParserBase.h index 6698a9d..f60d920 100644 --- a/src/lib/VSDXMLParserBase.h +++ b/src/lib/VSDXMLParserBase.h @@ -111,6 +111,7 @@ protected: void readText(xmlTextReaderPtr reader); void readCharIX(xmlTextReaderPtr reader); void readParaIX(xmlTextReaderPtr reader); + void readLayerIX(xmlTextReaderPtr reader); void readStyleSheet(xmlTextReaderPtr reader); void readPageSheet(xmlTextReaderPtr reader); diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index 9a6a49d..43871db 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -845,6 +845,10 @@ void libvisio::VSDXParser::readStyleProperties(xmlTextReaderPtr reader) if (XML_READER_TYPE_ELEMENT == tokenType) ret = readByteData(textDirection, reader); break; + case XML_LAYER: + if (XML_READER_TYPE_ELEMENT == tokenType) + readLayer(reader); + break; case XML_PARAGRAPH: if (XML_READER_TYPE_ELEMENT == tokenType) readParagraph(reader); @@ -1276,6 +1280,27 @@ void libvisio::VSDXParser::readShapeProperties(xmlTextReaderPtr reader) processXmlNode(reader); } +void libvisio::VSDXParser::readLayer(xmlTextReaderPtr reader) +{ + int ret = 1; + int tokenId = XML_TOKEN_INVALID; + int tokenType = -1; + + do + { + ret = xmlTextReaderRead(reader); + tokenId = getElementToken(reader); + if (XML_TOKEN_INVALID == tokenId) + { + VSD_DEBUG_MSG(("VSDXParser::readLayer: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + if (XML_ROW == tokenId && XML_READER_TYPE_ELEMENT == tokenType) + readLayerIX(reader); + } + while ((XML_SECTION != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret && (!m_watcher || !m_watcher->isError())); +} + void libvisio::VSDXParser::readParagraph(xmlTextReaderPtr reader) { int ret = 1; diff --git a/src/lib/VSDXParser.h b/src/lib/VSDXParser.h index 9eef41e..fa1fca3 100644 --- a/src/lib/VSDXParser.h +++ b/src/lib/VSDXParser.h @@ -70,6 +70,7 @@ private: void getBinaryData(xmlTextReaderPtr reader); + void readLayer(xmlTextReaderPtr reader); void readParagraph(xmlTextReaderPtr reader); void readCharacter(xmlTextReaderPtr reader); void readFonts(xmlTextReaderPtr reader); diff --git a/src/lib/tokens.txt b/src/lib/tokens.txt index c165c0f..3a0bc69 100644 --- a/src/lib/tokens.txt +++ b/src/lib/tokens.txt @@ -104,6 +104,7 @@ IndFirst IndLeft IndRight InfiniteLine +Layer LeftMargin Line LineCap
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits