[Libreoffice-commits] libvisio.git: src/lib

Fridrich Å trba fridrich.strba at bluewin.ch
Sun Apr 21 06:41:57 PDT 2013


 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 <fridrich.strba at bluewin.ch>
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 */


More information about the Libreoffice-commits mailing list