[Libreoffice-commits] libmspub.git: src/lib
David Tardon
dtardon at redhat.com
Fri Feb 13 08:13:04 PST 2015
src/lib/MSPUBBlockID.h | 1 +
src/lib/MSPUBCollector.cpp | 14 +++++++++++++-
src/lib/MSPUBParser.cpp | 35 ++++++++++-------------------------
src/lib/TableInfo.h | 8 ++++----
4 files changed, 28 insertions(+), 30 deletions(-)
New commits:
commit b5bab87065d029d8e1f7ddb214619511e2d1e23d
Author: David Tardon <dtardon at redhat.com>
Date: Fri Feb 13 14:26:48 2015 +0100
tdf#89061 parse table row/column sizes
Change-Id: I5471eac69e89eec51018572ff3b541e6953c43be
diff --git a/src/lib/MSPUBBlockID.h b/src/lib/MSPUBBlockID.h
index c99f22a..a4cafa4 100644
--- a/src/lib/MSPUBBlockID.h
+++ b/src/lib/MSPUBBlockID.h
@@ -73,6 +73,7 @@ enum MSPUBBlockID // Don't be alarmed by multiple elements with the same value;
TABLE_NUM_COLS = 0x67,
TABLE_ROWCOL_ARRAY = 0x6D,
TABLE_ROWCOL_OFFSET = 0x01,
+ TABLE_ROWCOL_SIZE = 0x02,
FONT_CONTAINER_ARRAY = 0x02,
EMBEDDED_EOT = 0x0C,
EMBEDDED_FONT_NAME = 0x04,
diff --git a/src/lib/MSPUBCollector.cpp b/src/lib/MSPUBCollector.cpp
index e2cd967..af6224f 100644
--- a/src/lib/MSPUBCollector.cpp
+++ b/src/lib/MSPUBCollector.cpp
@@ -1005,6 +1005,15 @@ boost::function<void(void)> MSPUBCollector::paintShape(const ShapeInfo &info, co
if (isTable)
{
+ librevenge::RVNGPropertyListVector columnWidths;
+ for (unsigned col = 0; col < (get(info.m_tableInfo).m_columnWidthsInEmu.size()); ++col)
+ {
+ librevenge::RVNGPropertyList columnWidth;
+ columnWidth.insert("style:column-width", double(get(info.m_tableInfo).m_columnWidthsInEmu[col]) / EMUS_IN_INCH);
+ columnWidths.append(columnWidth);
+ }
+ props.insert("librevenge:table-columns", columnWidths);
+
m_painter->startTableObject(props);
const std::map<unsigned, std::vector<unsigned> >::const_iterator it = m_tableCellTextEndsByTextId.find(get(info.m_textId));
@@ -1019,7 +1028,10 @@ boost::function<void(void)> MSPUBCollector::paintShape(const ShapeInfo &info, co
for (unsigned row = 0; row != tableLayout.shape()[0]; ++row)
{
- m_painter->openTableRow(librevenge::RVNGPropertyList());
+ librevenge::RVNGPropertyList rowProps;
+ if (row < (get(info.m_tableInfo).m_rowHeightsInEmu.size()))
+ rowProps.insert("librevenge:row-height", double(get(info.m_tableInfo).m_rowHeightsInEmu[row]) / EMUS_IN_INCH);
+ m_painter->openTableRow(rowProps);
for (unsigned col = 0; col != tableLayout.shape()[1]; ++col)
{
diff --git a/src/lib/MSPUBParser.cpp b/src/lib/MSPUBParser.cpp
index 2f2b805..b680f71 100644
--- a/src/lib/MSPUBParser.cpp
+++ b/src/lib/MSPUBParser.cpp
@@ -707,10 +707,8 @@ bool MSPUBParser::parseShape(librevenge::RVNGInputStream *input,
unsigned nc = numCols.get();
unsigned rcao = rowcolArrayOffset.get();
unsigned csn = cellsSeqNum.get();
- std::vector<unsigned> rowOffsetsInEmu;
- std::vector<unsigned> columnOffsetsInEmu;
- unsigned rowFirstOffset = 0;
- unsigned columnFirstOffset = 0;
+ std::vector<unsigned> rowHeightsInEmu;
+ std::vector<unsigned> columnWidthsInEmu;
input->seek(rcao, librevenge::RVNG_SEEK_SET);
unsigned arrayLength = readU32(input);
while (stillReading(input, rcao + arrayLength))
@@ -722,30 +720,17 @@ bool MSPUBParser::parseShape(librevenge::RVNGInputStream *input,
while (stillReading(input, info.dataOffset + info.dataLength))
{
MSPUBBlockInfo subInfo = parseBlock(input, true);
- if (subInfo.id == TABLE_ROWCOL_OFFSET)
+ if (subInfo.id == TABLE_ROWCOL_SIZE)
{
- unsigned rowcolOffset = readU32(input);
- if (columnOffsetsInEmu.size() < nc)
- {
- if (columnOffsetsInEmu.empty())
- {
- columnFirstOffset = rowcolOffset;
- }
- columnOffsetsInEmu.push_back(rowcolOffset - columnFirstOffset);
- }
- else if (rowOffsetsInEmu.size() < nr)
- {
- if (rowOffsetsInEmu.empty())
- {
- rowFirstOffset = rowcolOffset;
- }
- rowOffsetsInEmu.push_back(rowcolOffset - rowFirstOffset);
- }
+ if (columnWidthsInEmu.size() < nc)
+ columnWidthsInEmu.push_back(subInfo.data);
+ else if (rowHeightsInEmu.size() < nr)
+ rowHeightsInEmu.push_back(subInfo.data);
}
}
}
}
- if (rowOffsetsInEmu.size() != nr || columnOffsetsInEmu.size() != nc)
+ if (rowHeightsInEmu.size() != nr || columnWidthsInEmu.size() != nc)
{
MSPUB_DEBUG_MSG(("ERROR: Wrong number of rows or columns found in table definition.\n"));
return false;
@@ -761,8 +746,8 @@ bool MSPUBParser::parseShape(librevenge::RVNGInputStream *input,
}
TableInfo ti(nr, nc);
- ti.m_rowOffsetsInEmu = rowOffsetsInEmu;
- ti.m_columnOffsetsInEmu = columnOffsetsInEmu;
+ ti.m_rowHeightsInEmu = rowHeightsInEmu;
+ ti.m_columnWidthsInEmu = columnWidthsInEmu;
if (!index)
{
diff --git a/src/lib/TableInfo.h b/src/lib/TableInfo.h
index 7869c7c..d661d16 100644
--- a/src/lib/TableInfo.h
+++ b/src/lib/TableInfo.h
@@ -33,13 +33,13 @@ struct CellInfo
struct TableInfo
{
- std::vector<unsigned> m_rowOffsetsInEmu;
- std::vector<unsigned> m_columnOffsetsInEmu;
+ std::vector<unsigned> m_rowHeightsInEmu;
+ std::vector<unsigned> m_columnWidthsInEmu;
unsigned m_numRows;
unsigned m_numColumns;
std::vector<CellInfo> m_cells;
- TableInfo(unsigned numRows, unsigned numColumns) : m_rowOffsetsInEmu(),
- m_columnOffsetsInEmu(), m_numRows(numRows), m_numColumns(numColumns),
+ TableInfo(unsigned numRows, unsigned numColumns) : m_rowHeightsInEmu(),
+ m_columnWidthsInEmu(), m_numRows(numRows), m_numColumns(numColumns),
m_cells()
{
}
More information about the Libreoffice-commits
mailing list