diff options
author | Fridrich Štrba <fridrich.strba@bluewin.ch> | 2021-03-26 12:08:40 +0100 |
---|---|---|
committer | Fridrich Štrba <fridrich.strba@bluewin.ch> | 2021-03-26 12:08:40 +0100 |
commit | 19eba0c9a6143a10ad847bf97da18806673df58f (patch) | |
tree | bf5414734a51ca89cb4b6bbe57fae55c61ce9c7d | |
parent | 628c79ed597f720706b6a09a0426697ea1544687 (diff) |
Fixes of txsm for 7 - 15
Change-Id: I212fa6a5a5243d57e6941d3398b20f830de4b26c
-rw-r--r-- | src/lib/CDRParser.cpp | 78 |
1 files changed, 68 insertions, 10 deletions
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp index 66ae391..c04351c 100644 --- a/src/lib/CDRParser.cpp +++ b/src/lib/CDRParser.cpp @@ -2483,11 +2483,28 @@ void libcdr::CDRParser::readTxsm(librevenge::RVNGInputStream *input, unsigned le if (m_version >= 1600) return readTxsm16(input); - input->seek(0x24, librevenge::RVNG_SEEK_CUR); + unsigned frameFlag = readU32(input); + input->seek(0x20, librevenge::RVNG_SEEK_CUR); if (m_version >= 1500) input->seek(1, librevenge::RVNG_SEEK_CUR); - else if (m_version < 800) - input->seek(4, librevenge::RVNG_SEEK_CUR); + + if (m_version <= 700) + { + unsigned textOnPath = readU32(input); + + if (textOnPath == 1) + { + input->seek(4, librevenge::RVNG_SEEK_CUR); // var1 + input->seek(4, librevenge::RVNG_SEEK_CUR); // var3 + input->seek(4, librevenge::RVNG_SEEK_CUR); // Offset + input->seek(4, librevenge::RVNG_SEEK_CUR); // var4 + input->seek(4, librevenge::RVNG_SEEK_CUR); // Distance + input->seek(4, librevenge::RVNG_SEEK_CUR); // var5 + input->seek(4, librevenge::RVNG_SEEK_CUR); // var6 + input->seek(4, librevenge::RVNG_SEEK_CUR); // var7 + } + } + unsigned numFrames = readU32(input); unsigned textId = 0; for (unsigned i=0; i < numFrames; ++i) @@ -2495,13 +2512,49 @@ void libcdr::CDRParser::readTxsm(librevenge::RVNGInputStream *input, unsigned le unsigned frameId = readU32(input); textId = frameId; input->seek(48, librevenge::RVNG_SEEK_CUR); - input->seek(36, librevenge::RVNG_SEEK_CUR); - if (m_version > 800) - input->seek(2, librevenge::RVNG_SEEK_CUR); - if (m_version > 1300) - input->seek(2, librevenge::RVNG_SEEK_CUR); - if (m_version > 1400) - input->seek(12, librevenge::RVNG_SEEK_CUR); + if (m_version > 700) + { + unsigned textOnPath = readU32(input); + if (textOnPath == 1) + { + input->seek(4, librevenge::RVNG_SEEK_CUR); // var1 + if (m_version > 1200) + { + input->seek(4, librevenge::RVNG_SEEK_CUR); // Orientation + input->seek(4, librevenge::RVNG_SEEK_CUR); // var2 + } + input->seek(4, librevenge::RVNG_SEEK_CUR); // var3 + input->seek(4, librevenge::RVNG_SEEK_CUR); // Offset + input->seek(4, librevenge::RVNG_SEEK_CUR); // var4 + input->seek(4, librevenge::RVNG_SEEK_CUR); // Distance + input->seek(4, librevenge::RVNG_SEEK_CUR); // var5 + input->seek(4, librevenge::RVNG_SEEK_CUR); // Mirror Vert + input->seek(4, librevenge::RVNG_SEEK_CUR); // Mirror Hor + if (m_version >= 1500) + { + input->seek(4, librevenge::RVNG_SEEK_CUR); // var6 + input->seek(4, librevenge::RVNG_SEEK_CUR); // var7 + } + } + else if (m_version >= 1500) + input->seek(8, librevenge::RVNG_SEEK_CUR); + } + + if (!frameFlag) + { + if (m_version >= 1500) + input->seek(40, librevenge::RVNG_SEEK_CUR); + else if (m_version >= 1400) + input->seek(36, librevenge::RVNG_SEEK_CUR); + else if (m_version > 800) + input->seek(34, librevenge::RVNG_SEEK_CUR); + else if (m_version >= 800) + input->seek(32, librevenge::RVNG_SEEK_CUR); + else if (m_version >= 700) + input->seek(36, librevenge::RVNG_SEEK_CUR); // !!! txt-on-path is before frame, hence things are rearranged + } + else if (m_version >= 1500) + input->seek(4, librevenge::RVNG_SEEK_CUR); } unsigned numPara = readU32(input); @@ -2510,6 +2563,9 @@ void libcdr::CDRParser::readTxsm(librevenge::RVNGInputStream *input, unsigned le { unsigned stlId = readU32(input); input->seek(1, librevenge::RVNG_SEEK_CUR); + if (m_version > 1200 && frameFlag) + input->seek(1, librevenge::RVNG_SEEK_CUR); + unsigned numStyles = readU32(input); std::map<unsigned, CDRStyle> styles; for (unsigned i = 0; i < numStyles; ++i) @@ -2611,7 +2667,9 @@ void libcdr::CDRParser::readTxsm(librevenge::RVNGInputStream *input, unsigned le input->seek(1, librevenge::RVNG_SEEK_CUR); //skip the 0 ending character if (!textData.empty() || !styles.empty()) + { m_collector->collectText(textId, stlId, textData, charDescriptions, styles); + } } #ifndef DEBUG } |