summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFridrich Štrba <fridrich.strba@bluewin.ch>2021-03-25 09:48:38 +0100
committerFridrich Štrba <fridrich.strba@bluewin.ch>2021-03-25 09:48:38 +0100
commitdc41748757362fb3166c2ad4f6a838921ccdb64c (patch)
treec2708d5f0790355714aa28127a5ba683de68b29b
parent00c30046b1f85c814869544b1a79782a06f155bf (diff)
Some advance in txsm5
Change-Id: I52e03639bd8357cae4d1ad382089ddbf73512c7e
-rw-r--r--src/lib/CDRParser.cpp133
1 files changed, 72 insertions, 61 deletions
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 5ddced8..4ea95e0 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -2840,76 +2840,87 @@ void libcdr::CDRParser::readTxsm6(librevenge::RVNGInputStream *input)
void libcdr::CDRParser::readTxsm5(librevenge::RVNGInputStream *input)
{
- input->seek(4, librevenge::RVNG_SEEK_CUR);
- unsigned textId = readU16(input);
- input->seek(4, librevenge::RVNG_SEEK_CUR);
- unsigned stlId = readU16(input);
- unsigned numSt = readU16(input);
- unsigned i = 0;
- std::map<unsigned, CDRStyle> styles;
- for (; i<numSt && getRemainingLength(input) >= 34; ++i)
+ input->seek(2, librevenge::RVNG_SEEK_CUR);
+ unsigned numFrames = readU16(input);
+ unsigned textId = 0;
+ for (unsigned j=0; j<numFrames; ++j)
+ {
+ textId = readU16(input); // Bogus, not really needed and it is frame Id anyway
+ /* Possibly flags that might indicate frame styles, and the structure might
+ be of variable length, but for the while we have seen only zeros in those two
+ bytes in the documents we have. */
+ input->seek(2, librevenge::RVNG_SEEK_CUR);
+ }
+ unsigned numPara = readU16(input);
+ for (unsigned j=0; j<numPara; ++j)
{
- CDRStyle style;
- unsigned char flag = readU8(input);
- input->seek(1, librevenge::RVNG_SEEK_CUR);
- if (flag&0x01)
+ input->seek(2, librevenge::RVNG_SEEK_CUR);
+ unsigned numSt = readU16(input);
+ std::map<unsigned, CDRStyle> styles;
+ for (unsigned i= 0; i<numSt /* && getRemainingLength(input) >= 34 */; ++i)
{
- unsigned short fontId = readU8(input);
- std::map<unsigned, CDRFont>::const_iterator iterFont = m_fonts.find(fontId);
- if (iterFont != m_fonts.end())
+ CDRStyle style;
+ unsigned char flag = readU8(input);
+ input->seek(1, librevenge::RVNG_SEEK_CUR);
+ if (flag&0x01)
{
- style.m_fontName = iterFont->second.m_name;
- style.m_charSet = iterFont->second.m_encoding;
+ unsigned short fontId = readU8(input);
+ std::map<unsigned, CDRFont>::const_iterator iterFont = m_fonts.find(fontId);
+ if (iterFont != m_fonts.end())
+ {
+ style.m_fontName = iterFont->second.m_name;
+ style.m_charSet = iterFont->second.m_encoding;
+ }
+ unsigned short charSet = readU8(input);
+ if (charSet)
+ style.m_charSet = charSet;
}
- unsigned short charSet = readU8(input);
- if (charSet)
- style.m_charSet = charSet;
- }
- else
- input->seek(2, librevenge::RVNG_SEEK_CUR);
- input->seek(6, librevenge::RVNG_SEEK_CUR);
- if (flag&0x04)
- style.m_fontSize = readCoordinate(input);
- else
+ else
+ input->seek(2, librevenge::RVNG_SEEK_CUR);
+ input->seek(6, librevenge::RVNG_SEEK_CUR);
+ if (flag&0x04)
+ style.m_fontSize = readCoordinate(input);
+ else
+ input->seek(2, librevenge::RVNG_SEEK_CUR);
input->seek(2, librevenge::RVNG_SEEK_CUR);
- input->seek(2, librevenge::RVNG_SEEK_CUR);
- if (flag&0x10)
+ if (flag&0x10)
+ {
+ unsigned fillId = readU32(input);
+ std::map<unsigned, CDRFillStyle>::const_iterator iter = m_fillStyles.find(fillId);
+ if (iter != m_fillStyles.end())
+ style.m_fillStyle = iter->second;
+ }
+ else
+ input->seek(4, librevenge::RVNG_SEEK_CUR);
+ if (flag&0x20)
+ {
+ unsigned outlId = readU32(input);
+ std::map<unsigned, CDRLineStyle>::const_iterator iter = m_lineStyles.find(outlId);
+ if (iter != m_lineStyles.end())
+ style.m_lineStyle = iter->second;
+ }
+ else
+ input->seek(4, librevenge::RVNG_SEEK_CUR);
+ input->seek(14, librevenge::RVNG_SEEK_CUR);
+ styles[2*i] = style;
+ }
+ unsigned numChars = readU16(input);
+ if (numChars > getRemainingLength(input) / 8)
+ numChars = getRemainingLength(input) / 8;
+ std::vector<unsigned char> textData;
+ std::vector<unsigned char> charDescriptions;
+ textData.reserve(numChars);
+ charDescriptions.reserve(numChars);
+ for (unsigned i=0; i<numChars; ++i)
{
- unsigned fillId = readU32(input);
- std::map<unsigned, CDRFillStyle>::const_iterator iter = m_fillStyles.find(fillId);
- if (iter != m_fillStyles.end())
- style.m_fillStyle = iter->second;
- }
- else
input->seek(4, librevenge::RVNG_SEEK_CUR);
- if (flag&0x20)
- {
- unsigned outlId = readU32(input);
- std::map<unsigned, CDRLineStyle>::const_iterator iter = m_lineStyles.find(outlId);
- if (iter != m_lineStyles.end())
- style.m_lineStyle = iter->second;
+ textData.push_back(readU8(input));
+ input->seek(1, librevenge::RVNG_SEEK_CUR);
+ charDescriptions.push_back((readU16(input) >> 3) & 0xff);
}
- else
- input->seek(4, librevenge::RVNG_SEEK_CUR);
- input->seek(14, librevenge::RVNG_SEEK_CUR);
- styles[2*i] = style;
- }
- unsigned numChars = readU16(input);
- if (numChars > getRemainingLength(input) / 8)
- numChars = getRemainingLength(input) / 8;
- std::vector<unsigned char> textData;
- std::vector<unsigned char> charDescriptions;
- textData.reserve(numChars);
- charDescriptions.reserve(numChars);
- for (i=0; i<numChars; ++i)
- {
- input->seek(4, librevenge::RVNG_SEEK_CUR);
- textData.push_back(readU8(input));
- input->seek(1, librevenge::RVNG_SEEK_CUR);
- charDescriptions.push_back((readU16(input) >> 3) & 0xff);
+ if (!textData.empty())
+ m_collector->collectText(textId, 0, textData, charDescriptions, styles);
}
- if (!textData.empty())
- m_collector->collectText(textId, stlId, textData, charDescriptions, styles);
}
void libcdr::CDRParser::readUdta(librevenge::RVNGInputStream *input)