summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/VSD6Parser.cpp35
-rw-r--r--src/lib/VSDParser.cpp40
2 files changed, 72 insertions, 3 deletions
diff --git a/src/lib/VSD6Parser.cpp b/src/lib/VSD6Parser.cpp
index 8f2bb0b..34cde71 100644
--- a/src/lib/VSD6Parser.cpp
+++ b/src/lib/VSD6Parser.cpp
@@ -401,11 +401,46 @@ void libvisio::VSD6Parser::readTextField(librevenge::RVNGInputStream *input)
void libvisio::VSD6Parser::readMisc(librevenge::RVNGInputStream *input)
{
+ unsigned long initialPosition = input->tell();
unsigned char flags = readU8(input);
if (flags & 0x20)
m_shape.m_misc.m_hideText = true;
else
m_shape.m_misc.m_hideText = false;
+
+ input->seek(initialPosition+23, librevenge::RVNG_SEEK_SET);
+ while (!input->isEnd() && (unsigned long) input->tell() < (unsigned long)(initialPosition+m_header.dataLength+m_header.trailer))
+ {
+ unsigned long inputPos = input->tell();
+ unsigned length = readU32(input);
+ if (!length)
+ break;
+ unsigned blockType = readU8(input);
+ input->seek(1, librevenge::RVNG_SEEK_CUR);
+ if (blockType == 2)
+ {
+ if (0x74 == readU8(input))
+ {
+ if (0x6000004e == readU32(input))
+ {
+ unsigned shapeId = readU32(input);
+ if (0x7a == readU8(input))
+ {
+ if (0x40000073 == readU32(input))
+ {
+ if (!m_shape.m_xform1d)
+ m_shape.m_xform1d = new XForm1D();
+ if (m_shape.m_xform1d->beginId == MINUS_ONE)
+ m_shape.m_xform1d->beginId = shapeId;
+ else if (m_shape.m_xform1d->endId == MINUS_ONE)
+ m_shape.m_xform1d->endId = shapeId;
+ }
+ }
+ }
+ }
+ }
+ input->seek(inputPos + length, librevenge::RVNG_SEEK_SET);
+ }
}
/* vim:set shiftwidth=2 softtabstop=2 expandtab: */
diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp
index 22b356e..26b1d9c 100644
--- a/src/lib/VSDParser.cpp
+++ b/src/lib/VSDParser.cpp
@@ -1119,9 +1119,8 @@ void libvisio::VSDParser::readXFormData(librevenge::RVNGInputStream *input)
void libvisio::VSDParser::readXForm1D(librevenge::RVNGInputStream *input)
{
- if (m_shape.m_xform1d)
- delete m_shape.m_xform1d;
- m_shape.m_xform1d = new XForm1D();
+ if (!m_shape.m_xform1d)
+ m_shape.m_xform1d = new XForm1D();
input->seek(1, librevenge::RVNG_SEEK_CUR);
m_shape.m_xform1d->beginX = readDouble(input);
input->seek(1, librevenge::RVNG_SEEK_CUR);
@@ -2155,11 +2154,46 @@ void libvisio::VSDParser::readTextField(librevenge::RVNGInputStream *input)
void libvisio::VSDParser::readMisc(librevenge::RVNGInputStream *input)
{
+ unsigned long initialPosition = input->tell();
unsigned char flags = readU8(input);
if (flags & 0x20)
m_shape.m_misc.m_hideText = true;
else
m_shape.m_misc.m_hideText = false;
+
+ input->seek(initialPosition+45, librevenge::RVNG_SEEK_SET);
+ while (!input->isEnd() && (unsigned long) input->tell() < (unsigned long)(initialPosition+m_header.dataLength+m_header.trailer))
+ {
+ unsigned long inputPos = input->tell();
+ unsigned length = readU32(input);
+ if (!length)
+ break;
+ unsigned blockType = readU8(input);
+ input->seek(1, librevenge::RVNG_SEEK_CUR);
+ if (blockType == 2)
+ {
+ if (0x74 == readU8(input))
+ {
+ if (0x6000004e == readU32(input))
+ {
+ unsigned shapeId = readU32(input);
+ if (0x7a == readU8(input))
+ {
+ if (0x40000073 == readU32(input))
+ {
+ if (!m_shape.m_xform1d)
+ m_shape.m_xform1d = new XForm1D();
+ if (m_shape.m_xform1d->beginId == MINUS_ONE)
+ m_shape.m_xform1d->beginId = shapeId;
+ else if (m_shape.m_xform1d->endId == MINUS_ONE)
+ m_shape.m_xform1d->endId = shapeId;
+ }
+ }
+ }
+ }
+ }
+ input->seek(inputPos + length, librevenge::RVNG_SEEK_SET);
+ }
}
libvisio::Colour libvisio::VSDParser::_colourFromIndex(unsigned idx)