[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