src/lib/VDXParser.cpp | 31 +++++++++++++++++++++++++++++++ src/lib/VDXParser.h | 1 + src/lib/VSDCollector.h | 1 + src/lib/VSDContentCollector.cpp | 15 ++++++++++++--- src/lib/VSDContentCollector.h | 2 ++ src/lib/VSDParser.cpp | 15 +++++++++++++++ src/lib/VSDParser.h | 2 ++ src/lib/VSDStencils.cpp | 8 ++++++-- src/lib/VSDStencils.h | 1 + src/lib/VSDStylesCollector.cpp | 5 +++++ src/lib/VSDStylesCollector.h | 1 + src/lib/VSDTypes.h | 7 +++++++ 12 files changed, 84 insertions(+), 5 deletions(-)
New commits: commit 5213878fe1e0f99a1ad1f82341e832bbbd35f5f0 Author: Fridrich Å trba <[email protected]> Date: Sun Apr 21 15:41:31 2013 +0200 HideText for VSD diff --git a/src/lib/VDXParser.cpp b/src/lib/VDXParser.cpp index d0b8c8a..e85f9a9 100644 --- a/src/lib/VDXParser.cpp +++ b/src/lib/VDXParser.cpp @@ -250,6 +250,10 @@ void libvisio::VDXParser::processXmlNode(xmlTextReaderPtr reader) if (XML_READER_TYPE_ELEMENT == tokenType) readXFormData(reader); break; + case XML_MISC: + if (XML_READER_TYPE_ELEMENT == tokenType) + readMisc(reader); + break; case XML_GEOM: if (XML_READER_TYPE_ELEMENT == tokenType) readGeometry(reader); @@ -462,6 +466,33 @@ void libvisio::VDXParser::readFillAndShadow(xmlTextReaderPtr reader) } } +void libvisio::VDXParser::readMisc(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(("VDXParser::readMisc: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + switch (tokenId) + { + case XML_HIDETEXT: + if (XML_READER_TYPE_ELEMENT == tokenType) + ret = readBoolData(m_shape.m_misc.m_hideText, reader); + break; + default: + break; + } + } + while ((XML_MISC != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); +} + void libvisio::VDXParser::readXFormData(xmlTextReaderPtr reader) { int ret = 1; diff --git a/src/lib/VDXParser.h b/src/lib/VDXParser.h index 909835c..32038a6 100644 --- a/src/lib/VDXParser.h +++ b/src/lib/VDXParser.h @@ -74,6 +74,7 @@ private: void readLine(xmlTextReaderPtr reader); void readFillAndShadow(xmlTextReaderPtr reader); void readXFormData(xmlTextReaderPtr reader); + void readMisc(xmlTextReaderPtr reader); void readTxtXForm(xmlTextReaderPtr reader); void readPageProps(xmlTextReaderPtr reader); void readFonts(xmlTextReaderPtr reader); diff --git a/src/lib/VSDCollector.h b/src/lib/VSDCollector.h index f53545b..2313e83 100644 --- a/src/lib/VSDCollector.h +++ b/src/lib/VSDCollector.h @@ -120,6 +120,7 @@ public: virtual void collectNameList(unsigned id, unsigned level) = 0; virtual void collectName(unsigned id, unsigned level, const ::WPXBinaryData &name, TextFormat format) = 0; virtual void collectPageSheet(unsigned id, unsigned level) = 0; + virtual void collectMisc(unsigned level, const VSDMisc &misc) = 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 e668666..0f80948 100644 --- a/src/lib/VSDContentCollector.cpp +++ b/src/lib/VSDContentCollector.cpp @@ -84,8 +84,8 @@ libvisio::VSDContentCollector::VSDContentCollector( ) : m_painter(painter), m_isPageStarted(false), m_pageWidth(0.0), m_pageHeight(0.0), m_shadowOffsetX(0.0), m_shadowOffsetY(0.0), - m_scale(1.0), m_x(0.0), m_y(0.0), m_originalX(0.0), m_originalY(0.0), m_xform(), - m_txtxform(0), m_currentFillGeometry(), m_currentLineGeometry(), m_groupXForms(groupXFormsSequence.empty() ? 0 : &groupXFormsSequence[0]), + m_scale(1.0), m_x(0.0), m_y(0.0), m_originalX(0.0), m_originalY(0.0), m_xform(), m_txtxform(0), m_misc(), + m_currentFillGeometry(), m_currentLineGeometry(), m_groupXForms(groupXFormsSequence.empty() ? 0 : &groupXFormsSequence[0]), m_currentForeignData(), m_currentOLEData(), m_currentForeignProps(), m_currentShapeId(0), m_foreignType((unsigned)-1), m_foreignFormat(0), m_foreignOffsetX(0.0), m_foreignOffsetY(0.0), m_foreignWidth(0.0), m_foreignHeight(0.0), m_noLine(false), m_noFill(false), m_noShow(false), m_fonts(), @@ -400,7 +400,8 @@ void libvisio::VSDContentCollector::_flushCurrentPath() void libvisio::VSDContentCollector::_flushText() { - if (!m_textStream.size()) return; + if (!m_textStream.size() || m_misc.m_hideText) + return; double xmiddle = m_txtxform ? m_txtxform->width / 2.0 : m_xform.width / 2.0; double ymiddle = m_txtxform ? m_txtxform->height / 2.0 : m_xform.height / 2.0; @@ -1739,6 +1740,8 @@ void libvisio::VSDContentCollector::collectShape(unsigned id, unsigned level, un m_noShow = false; m_isFirstGeometry = true; + m_misc = VSDMisc(); + // Save line colour and pattern, fill type and pattern m_textStream.clear(); m_charFormats.clear(); @@ -2759,4 +2762,10 @@ void libvisio::VSDContentCollector::_appendField(WPXString &text) m_fieldIndex++; } +void libvisio::VSDContentCollector::collectMisc(unsigned level, const VSDMisc &misc) +{ + _handleLevelChange(level); + m_misc = misc; +} + /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ diff --git a/src/lib/VSDContentCollector.h b/src/lib/VSDContentCollector.h index 362a883..df4e475 100644 --- a/src/lib/VSDContentCollector.h +++ b/src/lib/VSDContentCollector.h @@ -141,6 +141,7 @@ public: void collectNameList(unsigned id, unsigned level); void collectName(unsigned id, unsigned level, const WPXBinaryData &name, TextFormat format); void collectPageSheet(unsigned id, unsigned level); + void collectMisc(unsigned level, const VSDMisc &misc); // Style collectors @@ -231,6 +232,7 @@ private: double m_originalY; XForm m_xform; XForm *m_txtxform; + VSDMisc m_misc; std::vector<WPXPropertyList> m_currentFillGeometry; std::vector<WPXPropertyList> m_currentLineGeometry; std::map<unsigned, XForm> *m_groupXForms; diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp index 083e7c9..0f0a7d2 100644 --- a/src/lib/VSDParser.cpp +++ b/src/lib/VSDParser.cpp @@ -573,6 +573,9 @@ void libvisio::VSDParser::handleChunk(WPXInputStream *input) case VSD_FONTFACE: // substreams of FONTAFACES stream, ver 11 only readFont(input); break; + case VSD_MISC: + readMisc(input); + break; default: m_collector->collectUnhandledChunk(m_header.id, m_header.level); } @@ -589,6 +592,8 @@ void libvisio::VSDParser::_flushShape() m_collector->collectXFormData(m_currentShapeLevel+2, m_shape.m_xform); + m_collector->collectMisc(m_currentShapeLevel+2, m_shape.m_misc); + if (m_shape.m_txtxform) m_collector->collectTxtXForm(m_currentShapeLevel+2, *(m_shape.m_txtxform)); @@ -1116,6 +1121,7 @@ void libvisio::VSDParser::readShape(WPXInputStream *input) m_shape.m_foreign = new ForeignData(*(tmpShape->m_foreign)); m_shape.m_text = tmpShape->m_text; m_shape.m_textFormat = tmpShape->m_textFormat; + m_shape.m_misc = tmpShape->m_misc; } m_shape.m_lineStyleId = lineStyle; @@ -1924,6 +1930,15 @@ void libvisio::VSDParser::readTextField(WPXInputStream *input) } } +void libvisio::VSDParser::readMisc(WPXInputStream *input) +{ + unsigned char flags = readU8(input); + if (flags & 0x20) + m_shape.m_misc.m_hideText = true; + else + m_shape.m_misc.m_hideText = false; +} + libvisio::Colour libvisio::VSDParser::_colourFromIndex(unsigned idx) { if (idx < m_colours.size()) diff --git a/src/lib/VSDParser.h b/src/lib/VSDParser.h index 4e89631..2ac7d77 100644 --- a/src/lib/VSDParser.h +++ b/src/lib/VSDParser.h @@ -131,6 +131,8 @@ protected: virtual void readNameIDX(WPXInputStream *input); virtual void readNameIDX123(WPXInputStream *input); + void readMisc(WPXInputStream *input); + // parser of one pass bool parseDocument(WPXInputStream *input, unsigned shift); diff --git a/src/lib/VSDStencils.cpp b/src/lib/VSDStencils.cpp index 10ad0ae..e963f72 100644 --- a/src/lib/VSDStencils.cpp +++ b/src/lib/VSDStencils.cpp @@ -36,7 +36,7 @@ libvisio::VSDShape::VSDShape() m_masterShape(MINUS_ONE), m_shapeId(MINUS_ONE), m_lineStyleId(MINUS_ONE), m_fillStyleId(MINUS_ONE), m_textStyleId(MINUS_ONE), m_lineStyle(), m_fillStyle(), m_textBlockStyle(), m_charStyle(), m_charList(), m_paraStyle(), m_paraList(), m_text(), m_names(), m_textFormat(libvisio::VSD_TEXT_UTF16), - m_nurbsData(), m_polylineData(), m_xform(), m_txtxform(0) + m_nurbsData(), m_polylineData(), m_xform(), m_txtxform(0), m_misc() { } @@ -49,7 +49,9 @@ libvisio::VSDShape::VSDShape(const libvisio::VSDShape &shape) m_charStyle(shape.m_charStyle), m_charList(shape.m_charList), m_paraStyle(shape.m_paraStyle), m_paraList(shape.m_paraList), m_text(shape.m_text), m_names(shape.m_names), m_textFormat(shape.m_textFormat), m_nurbsData(shape.m_nurbsData), m_polylineData(shape.m_polylineData), - m_xform(shape.m_xform), m_txtxform(shape.m_txtxform ? new XForm(*(shape.m_txtxform)) : 0) {} + m_xform(shape.m_xform), m_txtxform(shape.m_txtxform ? new XForm(*(shape.m_txtxform)) : 0), m_misc(shape.m_misc) +{ +} libvisio::VSDShape::~VSDShape() { @@ -89,6 +91,7 @@ libvisio::VSDShape &libvisio::VSDShape::operator=(const libvisio::VSDShape &shap if (m_txtxform) delete m_txtxform; m_txtxform = shape.m_txtxform ? new XForm(*(shape.m_txtxform)) : 0; + m_misc = shape.m_misc; } return *this; } @@ -125,6 +128,7 @@ void libvisio::VSDShape::clear() m_fillStyleId = MINUS_ONE; m_textStyleId = MINUS_ONE; m_textFormat = libvisio::VSD_TEXT_UTF16; + m_misc = VSDMisc(); } libvisio::VSDStencil::VSDStencil() diff --git a/src/lib/VSDStencils.h b/src/lib/VSDStencils.h index b521d00..b888584 100644 --- a/src/lib/VSDStencils.h +++ b/src/lib/VSDStencils.h @@ -73,6 +73,7 @@ public: std::map<unsigned, PolylineData> m_polylineData; XForm m_xform; XForm *m_txtxform; + VSDMisc m_misc; }; class VSDStencil diff --git a/src/lib/VSDStylesCollector.cpp b/src/lib/VSDStylesCollector.cpp index be586ee..879f255 100644 --- a/src/lib/VSDStylesCollector.cpp +++ b/src/lib/VSDStylesCollector.cpp @@ -260,6 +260,11 @@ void libvisio::VSDStylesCollector::collectShape(unsigned id, unsigned level, uns m_groupMemberships[m_currentShapeId] = parent; } +void libvisio::VSDStylesCollector::collectMisc(unsigned level, const VSDMisc & /* misc */) +{ + _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 6cdf30b..89a43d8 100644 --- a/src/lib/VSDStylesCollector.h +++ b/src/lib/VSDStylesCollector.h @@ -134,6 +134,7 @@ public: } void collectName(unsigned id, unsigned level, const ::WPXBinaryData &name, TextFormat format); void collectPageSheet(unsigned id, unsigned level); + void collectMisc(unsigned level, const VSDMisc &misc); // Style collectors void collectStyleSheet(unsigned id, unsigned level,unsigned parentLineStyle, unsigned parentFillStyle, unsigned parentTextStyle); diff --git a/src/lib/VSDTypes.h b/src/lib/VSDTypes.h index 809e9e6..51d177a 100644 --- a/src/lib/VSDTypes.h +++ b/src/lib/VSDTypes.h @@ -208,6 +208,13 @@ struct VSDFont m_name(font.m_name), m_encoding(font.m_encoding) {} }; +struct VSDMisc +{ + bool m_hideText; + VSDMisc() : m_hideText(false) {} + VSDMisc(const VSDMisc &misc) : m_hideText(misc.m_hideText) {} +}; + } // namespace libvisio #endif /* VSDTYPES_H */
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
