summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFridrich Štrba <fridrich.strba@bluewin.ch>2016-07-18 12:55:22 +0200
committerFridrich Štrba <fridrich.strba@bluewin.ch>2016-07-18 12:55:22 +0200
commit4c41d9c89edeaa96208c68e3d1b0c1849c7c1c42 (patch)
tree5886b6c1fb89e00dbc2d251985f37c148b9097e8
parent296365202a94801885625350817522c2d6ef1587 (diff)
Assure that we know fill/line properties when parsing the full colour fill
Change-Id: I6bf3f779a9e846d3aa476a91989046757aebe58b
-rw-r--r--src/lib/CDRCollector.cpp3
-rw-r--r--src/lib/CDRCollector.h10
-rw-r--r--src/lib/CDRContentCollector.cpp14
-rw-r--r--src/lib/CDRContentCollector.h8
-rw-r--r--src/lib/CDRParser.cpp23
-rw-r--r--src/lib/CDRParser.h2
-rw-r--r--src/lib/CDRStylesCollector.cpp10
-rw-r--r--src/lib/CDRStylesCollector.h7
-rw-r--r--src/lib/CMXParser.cpp21
9 files changed, 58 insertions, 40 deletions
diff --git a/src/lib/CDRCollector.cpp b/src/lib/CDRCollector.cpp
index 939eca4..7b52258 100644
--- a/src/lib/CDRCollector.cpp
+++ b/src/lib/CDRCollector.cpp
@@ -14,7 +14,8 @@
#include "libcdr_utils.h"
libcdr::CDRParserState::CDRParserState()
- : m_bmps(), m_patterns(), m_vects(), m_pages(), m_documentPalette(), m_texts(), m_styles(),
+ : m_bmps(), m_patterns(), m_vects(), m_pages(), m_documentPalette(), m_texts(),
+ m_styles(), m_fillStyles(), m_lineStyles(),
m_colorTransformCMYK2RGB(0), m_colorTransformLab2RGB(0), m_colorTransformRGB2RGB(0)
{
cmsHPROFILE tmpRGBProfile = cmsCreate_sRGBProfile();
diff --git a/src/lib/CDRCollector.h b/src/lib/CDRCollector.h
index 32d1c55..52c626a 100644
--- a/src/lib/CDRCollector.h
+++ b/src/lib/CDRCollector.h
@@ -41,6 +41,8 @@ public:
std::map<unsigned, CDRColor> m_documentPalette;
std::map<unsigned, std::vector<CDRTextLine> > m_texts;
std::map<unsigned, CDRStyle> m_styles;
+ std::map<unsigned, CDRFillStyle> m_fillStyles;
+ std::map<unsigned, CDRLineStyle> m_lineStyles;
unsigned _getRGBColor(const CDRColor &color);
unsigned getBMPColor(const CDRColor &color);
@@ -73,10 +75,10 @@ public:
virtual void collectPath(const CDRPath &path) = 0;
virtual void collectLevel(unsigned level) = 0;
virtual void collectTransform(const CDRTransforms &transforms, bool considerGroupTransform) = 0;
- virtual void collectFillStyle(unsigned short fillType, const CDRColor &color1, const CDRColor &color2, const CDRGradient &gradient, const CDRImageFill &imageFill) = 0;
- virtual void collectLineStyle(unsigned short lineType, unsigned short capsType, unsigned short joinType, double lineWidth,
- double stretch, double angle, const CDRColor &color, const std::vector<unsigned> &dashArray,
- const CDRPath &startMarker, const CDRPath &endMarker) = 0;
+ virtual void collectFillStyle(unsigned id, const CDRFillStyle &fillStyle) = 0;
+ virtual void collectFillStyleId(unsigned id) = 0;
+ virtual void collectLineStyle(unsigned id, const CDRLineStyle &lineStyle) = 0;
+ virtual void collectLineStyleId(unsigned id) = 0;
virtual void collectRotate(double angle, double cx, double cy) = 0;
virtual void collectFlags(unsigned flags, bool considerFlags) = 0;
virtual void collectPageSize(double width, double height, double offsetX, double offsetY) = 0;
diff --git a/src/lib/CDRContentCollector.cpp b/src/lib/CDRContentCollector.cpp
index 860bf30..a703e6d 100644
--- a/src/lib/CDRContentCollector.cpp
+++ b/src/lib/CDRContentCollector.cpp
@@ -641,16 +641,18 @@ void libcdr::CDRContentCollector::collectLevel(unsigned level)
}
}
-void libcdr::CDRContentCollector::collectFillStyle(unsigned short fillType, const CDRColor &color1, const CDRColor &color2, const CDRGradient &gradient, const CDRImageFill &imageFill)
+void libcdr::CDRContentCollector::collectFillStyleId(unsigned id)
{
- m_currentFillStyle = CDRFillStyle(fillType, color1, color2, gradient, imageFill);
+ std::map<unsigned, CDRFillStyle>::const_iterator iter = m_ps.m_fillStyles.find(id);
+ if (iter != m_ps.m_fillStyles.end())
+ m_currentFillStyle = iter->second;
}
-void libcdr::CDRContentCollector::collectLineStyle(unsigned short lineType, unsigned short capsType, unsigned short joinType, double lineWidth,
- double stretch, double angle, const CDRColor &color, const std::vector<unsigned> &dashArray,
- const CDRPath &startMarker, const CDRPath &endMarker)
+void libcdr::CDRContentCollector::collectLineStyleId(unsigned id)
{
- m_currentLineStyle = CDRLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarker, endMarker);
+ std::map<unsigned, CDRLineStyle>::const_iterator iter = m_ps.m_lineStyles.find(id);
+ if (iter != m_ps.m_lineStyles.end())
+ m_currentLineStyle = iter->second;
}
void libcdr::CDRContentCollector::collectRotate(double angle, double cx, double cy)
diff --git a/src/lib/CDRContentCollector.h b/src/lib/CDRContentCollector.h
index 2261454..30c1546 100644
--- a/src/lib/CDRContentCollector.h
+++ b/src/lib/CDRContentCollector.h
@@ -39,10 +39,10 @@ public:
void collectPath(const CDRPath &path);
void collectLevel(unsigned level);
void collectTransform(const CDRTransforms &transforms, bool considerGroupTransform);
- void collectFillStyle(unsigned short fillType, const CDRColor &color1, const CDRColor &color2, const CDRGradient &gradient, const CDRImageFill &imageFill);
- void collectLineStyle(unsigned short lineType, unsigned short capsType, unsigned short joinType, double lineWidth,
- double stretch, double angle, const CDRColor &color, const std::vector<unsigned> &dashArray,
- const CDRPath &startMarker, const CDRPath &endMarker);
+ void collectFillStyle(unsigned,const CDRFillStyle &) {}
+ void collectFillStyleId(unsigned id);
+ void collectLineStyle(unsigned,const CDRLineStyle &) {}
+ void collectLineStyleId(unsigned id);
void collectRotate(double angle, double cx, double cy);
void collectFlags(unsigned flags, bool considerFlags);
void collectPageSize(double, double, double, double) {}
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index db463eb..960df3e 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -155,7 +155,7 @@ static int parseColourString(const char *colourString, libcdr::CDRColor &colour,
libcdr::CDRParser::CDRParser(const std::vector<librevenge::RVNGInputStream *> &externalStreams, libcdr::CDRCollector *collector)
: CommonParser(collector), m_externalStreams(externalStreams),
- m_fonts(), m_fillStyles(), m_lineStyles(), m_arrows(), m_version(0) {}
+ m_fonts(), m_fillStyles(), m_lineStyles(), m_arrows(), m_version(0), m_waldoOutlId(0), m_waldoFillId(0) {}
libcdr::CDRParser::~CDRParser()
{
@@ -1561,7 +1561,8 @@ void libcdr::CDRParser::readWaldoOutl(librevenge::RVNGInputStream *input)
CDRPath endMarker;
if (iter != m_arrows.end())
endMarker = iter->second;
- m_collector->collectLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarker, endMarker);
+ m_collector->collectLineStyle(++m_waldoOutlId, CDRLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarker, endMarker));
+ m_collector->collectLineStyleId(m_waldoOutlId);
}
void libcdr::CDRParser::readWaldoFill(librevenge::RVNGInputStream *input)
@@ -1654,7 +1655,8 @@ void libcdr::CDRParser::readWaldoFill(librevenge::RVNGInputStream *input)
default:
break;
}
- m_collector->collectFillStyle(fillType, color1, color2, gradient, imageFill);
+ m_collector->collectFillStyle(++m_waldoFillId, CDRFillStyle(fillType, color1, color2, gradient, imageFill));
+ m_collector->collectFillStyleId(m_waldoFillId);
}
void libcdr::CDRParser::readTrfd(librevenge::RVNGInputStream *input, unsigned length)
@@ -2014,6 +2016,7 @@ void libcdr::CDRParser::readFild(librevenge::RVNGInputStream *input, unsigned le
break;
}
m_fillStyles[fillId] = CDRFillStyle(fillType, color1, color2, gradient, imageFill);
+ m_collector->collectFillStyle(fillId, CDRFillStyle(fillType, color1, color2, gradient, imageFill));
}
void libcdr::CDRParser::readOutl(librevenge::RVNGInputStream *input, unsigned length)
@@ -2074,6 +2077,7 @@ void libcdr::CDRParser::readOutl(librevenge::RVNGInputStream *input, unsigned le
if (iter != m_arrows.end())
endMarker = iter->second;
m_lineStyles[lineId] = CDRLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarker, endMarker);
+ m_collector->collectLineStyle(lineId, CDRLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarker, endMarker));
}
void libcdr::CDRParser::readLoda(librevenge::RVNGInputStream *input, unsigned length)
@@ -2138,10 +2142,8 @@ void libcdr::CDRParser::readLoda(librevenge::RVNGInputStream *input, unsigned le
else
{
unsigned fillId = readU32(input);
- std::map<unsigned, CDRFillStyle>::const_iterator iter = m_fillStyles.find(fillId);
- if (iter != m_fillStyles.end())
- m_collector->collectFillStyle(iter->second.fillType, iter->second.color1, iter->second.color2,
- iter->second.gradient, iter->second.imageFill);
+ if (fillId)
+ m_collector->collectFillStyleId(fillId);
}
}
else if (argTypes[i] == 0x0a)
@@ -2151,11 +2153,8 @@ void libcdr::CDRParser::readLoda(librevenge::RVNGInputStream *input, unsigned le
else
{
unsigned outlId = readU32(input);
- std::map<unsigned, CDRLineStyle>::const_iterator iter = m_lineStyles.find(outlId);
- if (iter != m_lineStyles.end())
- m_collector->collectLineStyle(iter->second.lineType, iter->second.capsType, iter->second.joinType, iter->second.lineWidth,
- iter->second.stretch, iter->second.angle, iter->second.color, iter->second.dashArray,
- iter->second.startMarker, iter->second.endMarker);
+ if (outlId)
+ m_collector->collectLineStyleId(outlId);
}
}
else if (argTypes[i] == 0xc8)
diff --git a/src/lib/CDRParser.h b/src/lib/CDRParser.h
index ca30d50..2521cd3 100644
--- a/src/lib/CDRParser.h
+++ b/src/lib/CDRParser.h
@@ -104,6 +104,8 @@ private:
std::map<unsigned, CDRPath> m_arrows;
unsigned m_version;
+ unsigned m_waldoOutlId;
+ unsigned m_waldoFillId;
};
diff --git a/src/lib/CDRStylesCollector.cpp b/src/lib/CDRStylesCollector.cpp
index 3119cc2..093dad8 100644
--- a/src/lib/CDRStylesCollector.cpp
+++ b/src/lib/CDRStylesCollector.cpp
@@ -269,4 +269,14 @@ void libcdr::CDRStylesCollector::collectStld(unsigned id, const CDRStyle &style)
m_ps.m_styles[id] = style;
}
+void libcdr::CDRStylesCollector::collectFillStyle(unsigned id, const CDRFillStyle &fillStyle)
+{
+ m_ps.m_fillStyles[id] = fillStyle;
+}
+
+void libcdr::CDRStylesCollector::collectLineStyle(unsigned id, const CDRLineStyle &lineStyle)
+{
+ m_ps.m_lineStyles[id] = lineStyle;
+}
+
/* vim:set shiftwidth=2 softtabstop=2 expandtab: */
diff --git a/src/lib/CDRStylesCollector.h b/src/lib/CDRStylesCollector.h
index 8b1433d..009692f 100644
--- a/src/lib/CDRStylesCollector.h
+++ b/src/lib/CDRStylesCollector.h
@@ -39,9 +39,10 @@ public:
void collectPath(const CDRPath &) {}
void collectLevel(unsigned) {}
void collectTransform(const CDRTransforms &, bool) {}
- void collectFillStyle(unsigned short, const CDRColor &, const CDRColor &, const CDRGradient &, const CDRImageFill &) {}
- void collectLineStyle(unsigned short, unsigned short, unsigned short, double, double, double, const CDRColor &,
- const std::vector<unsigned> &, const CDRPath &, const CDRPath &) {}
+ void collectFillStyle(unsigned id, const CDRFillStyle &fillStyle);
+ void collectFillStyleId(unsigned) {}
+ void collectLineStyle(unsigned id, const CDRLineStyle &lineStyle);
+ void collectLineStyleId(unsigned) {}
void collectRotate(double,double,double) {}
void collectFlags(unsigned, bool) {}
void collectPageSize(double width, double height, double offsetX, double offsetY);
diff --git a/src/lib/CMXParser.cpp b/src/lib/CMXParser.cpp
index bf3f818..f82f4f1 100644
--- a/src/lib/CMXParser.cpp
+++ b/src/lib/CMXParser.cpp
@@ -957,8 +957,9 @@ bool libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input)
libcdr::CDRColor color2;
libcdr::CDRImageFill imageFill;
libcdr::CDRGradient gradient;
- unsigned fillIdentifier = readU16(input, m_bigEndian);
- switch (fillIdentifier)
+ unsigned fillId = (unsigned)input->tell();
+ unsigned fillType = readU16(input, m_bigEndian);
+ switch (fillType)
{
case 1: // Uniform
if (m_precision == libcdr::PRECISION_32BIT)
@@ -1103,11 +1104,11 @@ bool libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input)
tagId = readU8(input, m_bigEndian);
if (tagId == CMX_Tag_EndTag)
{
- CDR_DEBUG_MSG((" %s fill - tagId %i\n", fillIdentifier == 7 ? "Two-Color Pattern" : "Monochrome with transparent bitmap", tagId));
+ CDR_DEBUG_MSG((" %s fill - tagId %i\n", fillType == 7 ? "Two-Color Pattern" : "Monochrome with transparent bitmap", tagId));
break;
}
tagLength = readU16(input, m_bigEndian);
- CDR_DEBUG_MSG((" %s fill - tagId %i, tagLength %u\n", fillIdentifier == 7 ? "Two-Color Pattern" : "Monochrome with transparent bitmap", tagId, tagLength));
+ CDR_DEBUG_MSG((" %s fill - tagId %i, tagLength %u\n", fillType == 7 ? "Two-Color Pattern" : "Monochrome with transparent bitmap", tagId, tagLength));
switch (tagId)
{
case CMX_Tag_RenderAttr_FillSpec_MonoBM:
@@ -1145,7 +1146,7 @@ bool libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input)
}
else if (m_precision == libcdr::PRECISION_16BIT)
{
- CDR_DEBUG_MSG((" %s fill\n", fillIdentifier == 7 ? "Two-Color Pattern" : "Monochrome with transparent bitmap"));
+ CDR_DEBUG_MSG((" %s fill\n", fillType == 7 ? "Two-Color Pattern" : "Monochrome with transparent bitmap"));
unsigned short patternId = readU16(input, m_bigEndian);
int tmpWidth = readU16(input, m_bigEndian);
int tmpHeight = readU16(input, m_bigEndian);
@@ -1368,7 +1369,8 @@ bool libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input)
return false;
break;
}
- m_collector->collectFillStyle(fillIdentifier, color1, color2, gradient, imageFill);
+ m_collector->collectFillStyle(fillId, CDRFillStyle(fillType, color1, color2, gradient, imageFill));
+ m_collector->collectFillStyleId(fillId);
return true;
}
@@ -1414,6 +1416,7 @@ bool libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *inp
if (bitMask & 0x02) // outline
{
CDRLineStyle lineStyle;
+ unsigned lineStyleId = (unsigned)input->tell();
if (m_precision == libcdr::PRECISION_32BIT)
{
do
@@ -1444,10 +1447,8 @@ bool libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *inp
CDR_DEBUG_MSG((" Outline specification\n"));
lineStyle = getLineStyle(readU16(input, m_bigEndian));
}
- m_collector->collectLineStyle(lineStyle.lineType, lineStyle.capsType, lineStyle.joinType,
- lineStyle.lineWidth, lineStyle.stretch, lineStyle.angle,
- lineStyle.color, lineStyle.dashArray,
- lineStyle.startMarker, lineStyle.endMarker);
+ m_collector->collectLineStyle(lineStyleId, lineStyle);
+ m_collector->collectLineStyleId(lineStyleId);
}
if (bitMask & 0x04) // lens
{