summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorALONSO Laurent <laurent.alonso@inria.fr>2021-08-19 15:37:07 +0200
committerALONSO Laurent <laurent.alonso@inria.fr>2021-08-19 15:37:07 +0200
commite9c31adff66680493754bfcbc721e598f6f5b657 (patch)
tree08a5db1df0c5bf08a870b08742cf9eb8ad2da93f
parent871fc9f39f9430e39c010ad2221409d24194195a (diff)
iwa[spreadsheet]: try to read more than 256 rows...
Change-Id: I04929778697f53a6a369e78557c5597726b9f680
-rw-r--r--src/lib/IWAParser.cpp49
-rw-r--r--src/lib/IWAParser.h2
2 files changed, 42 insertions, 9 deletions
diff --git a/src/lib/IWAParser.cpp b/src/lib/IWAParser.cpp
index 1fdeae7..cdcb199 100644
--- a/src/lib/IWAParser.cpp
+++ b/src/lib/IWAParser.cpp
@@ -2440,7 +2440,8 @@ void IWAParser::parseTabularModel(const unsigned id)
}
}
- optional<unsigned> tileRef;
+ std::map<unsigned,unsigned> idToTileRefMap;
+ std::map<unsigned,unsigned> idToTileDecalRowMap;
if (get(msg).message(4))
{
@@ -2477,8 +2478,31 @@ void IWAParser::parseTabularModel(const unsigned id)
m_currentTable->m_table->setSizes(makeSizes(m_currentTable->m_columnHeader.m_sizes), makeSizes(m_currentTable->m_rowHeader.m_sizes));
- if (grid.message(3) && grid.message(3).message(1))
- tileRef = readRef(get(grid.message(3).message(1)), 2);
+ if (grid.message(3))
+ {
+ for (auto const &it : grid.message(3).message(1))
+ {
+ auto tileRef = readRef(it, 2);
+ if (!it.uint32(1) || !bool(tileRef))
+ {
+ ETONYEK_DEBUG_MSG(("IWAParser::parseTabularModel: oops, can not find some tile ref\n"));
+ continue;
+ }
+ idToTileRefMap[get(it.uint32(1))]=get(tileRef);
+ }
+ }
+ if (grid.message(9))
+ {
+ for (auto const &it : grid.message(9).message(1))
+ {
+ if (!it.uint32(1) || !it.uint32(2))
+ {
+ ETONYEK_DEBUG_MSG(("IWAParser::parseTabularModel: oops, can not find some grid decal data\n"));
+ continue;
+ }
+ idToTileDecalRowMap[get(it.uint32(2))]=get(it.uint32(1));
+ }
+ }
}
if (get(msg).string(8))
{
@@ -2551,9 +2575,18 @@ void IWAParser::parseTabularModel(const unsigned id)
m_currentTable->m_table->setBorders(gridLines[0],gridLines[1],gridLines[2],gridLines[3]);
}
- // handle table
- if (tileRef)
- parseTile(get(tileRef));
+ // handle tables
+ for (auto const &tileIt : idToTileRefMap)
+ {
+ auto const &decalIt=idToTileDecalRowMap.find(tileIt.first);
+ if (decalIt==idToTileDecalRowMap.end())
+ {
+ ETONYEK_DEBUG_MSG(("IWAParser::parseTabularModel: oops, can not find some decal for id=%x, assume 0\n", tileIt.first));
+ parseTile(tileIt.second, 0);
+ }
+ else
+ parseTile(tileIt.second, decalIt->second);
+ }
m_collector.collectTable(m_currentTable->m_table);
m_currentTable.reset();
}
@@ -2648,7 +2681,7 @@ void IWAParser::parseDataList(const unsigned id, DataList_t &dataList)
}
}
-void IWAParser::parseTile(const unsigned id)
+void IWAParser::parseTile(const unsigned id, const unsigned decalY)
{
const ObjectMessage msg(*this, id, IWAObjectType::Tile);
if (!msg)
@@ -2663,7 +2696,7 @@ void IWAParser::parseTile(const unsigned id)
{
if (!it.uint32(1) || !it.bytes(3) || !it.bytes(4))
continue;
- const unsigned row = get(it.uint32(1));
+ const unsigned row = get(it.uint32(1))+decalY;
if (row >= m_currentTable->m_rows)
{
ETONYEK_DEBUG_MSG(("IWAParser::parseTile: invalid row: %u\n", row));
diff --git a/src/lib/IWAParser.h b/src/lib/IWAParser.h
index 4161aa6..a168294 100644
--- a/src/lib/IWAParser.h
+++ b/src/lib/IWAParser.h
@@ -204,7 +204,7 @@ private:
void parseTabularModel(unsigned id);
void parseDataList(unsigned id, DataList_t &dataList);
- void parseTile(unsigned id);
+ void parseTile(unsigned id, unsigned decalY);
void parseTableHeaders(unsigned id, TableHeader &header);
void parseTableGridLines(unsigned id, IWORKGridLineMap_t (&gridLines)[4]);
void parseTableGridLine(unsigned id, IWORKGridLineMap_t &gridLines);