src/lib/CDRCollector.h | 2 +- src/lib/CDRContentCollector.cpp | 4 ++-- src/lib/CDRContentCollector.h | 2 +- src/lib/CDRParser.cpp | 28 ++++++++++++++++++++++------ src/lib/CDRParser.h | 1 + src/lib/CDRPath.cpp | 14 ++++++++++++++ src/lib/CDRPath.h | 8 +++----- src/lib/CDRStylesCollector.h | 2 +- src/lib/CDRTypes.h | 12 ++++++------ 9 files changed, 51 insertions(+), 22 deletions(-)
New commits: commit a15af9bca619989202c73d9d5ea436c0ac89294f Author: Fridrich Å trba <[email protected]> Date: Sat Jun 29 22:19:17 2013 +0200 Get the arrow information to the collector diff --git a/src/lib/CDRCollector.h b/src/lib/CDRCollector.h index 47aa00e..c26307b 100644 --- a/src/lib/CDRCollector.h +++ b/src/lib/CDRCollector.h @@ -94,7 +94,7 @@ public: 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, - unsigned startMarkerId, unsigned endMarkerId) = 0; + const CDRPath &startMarker, const CDRPath &endMarker) = 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 dd0b495..ee82c3a 100644 --- a/src/lib/CDRContentCollector.cpp +++ b/src/lib/CDRContentCollector.cpp @@ -569,9 +569,9 @@ void libcdr::CDRContentCollector::collectFillStyle(unsigned short fillType, cons 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, - unsigned startMarkerId, unsigned endMarkerId) + const CDRPath &startMarker, const CDRPath &endMarker) { - m_currentLineStyle = CDRLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarkerId, endMarkerId); + m_currentLineStyle = CDRLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarker, endMarker); } void libcdr::CDRContentCollector::collectRotate(double angle, double cx, double cy) diff --git a/src/lib/CDRContentCollector.h b/src/lib/CDRContentCollector.h index 47f56aa..f65fb11 100644 --- a/src/lib/CDRContentCollector.h +++ b/src/lib/CDRContentCollector.h @@ -61,7 +61,7 @@ public: 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, - unsigned startMarkerId, unsigned endMarkerId); + const CDRPath &startMarker, const CDRPath &endMarker); 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 bff872b..c9bab09 100644 --- a/src/lib/CDRParser.cpp +++ b/src/lib/CDRParser.cpp @@ -254,7 +254,7 @@ static void _readX6StyleString(WPXInputStream *input, unsigned length, libcdr::C libcdr::CDRParser::CDRParser(const std::vector<WPXInputStream *> &externalStreams, libcdr::CDRCollector *collector) : CommonParser(collector), m_externalStreams(externalStreams), - m_fonts(), m_fillStyles(), m_lineStyles(), m_version(0) {} + m_fonts(), m_fillStyles(), m_lineStyles(), m_arrows(), m_version(0) {} libcdr::CDRParser::~CDRParser() { @@ -1488,8 +1488,7 @@ void libcdr::CDRParser::readArrw(WPXInputStream *input, unsigned length) CDR_DEBUG_MSG(("CDRParser::readArrw\n")); if (!_redirectX6Chunk(&input, length)) throw GenericException(); - /* unsigned arrowId = */ - readU32(input); + unsigned arrowId = readU32(input); input->seek(4, WPX_SEEK_CUR); unsigned short pointNum = readU16(input); input->seek(4, WPX_SEEK_CUR); @@ -1506,6 +1505,7 @@ void libcdr::CDRParser::readArrw(WPXInputStream *input, unsigned length) pointTypes.push_back(readU8(input)); CDRPath path; processPath(points, pointTypes, path); + m_arrows[arrowId] = path; } void libcdr::CDRParser::readBitmap(WPXInputStream *input) @@ -1591,8 +1591,16 @@ void libcdr::CDRParser::readWaldoOutl(WPXInputStream *input) unsigned short joinType = readU16(input); unsigned short capsType = readU16(input); unsigned startMarkerId = readU32(input); + std::map<unsigned, CDRPath>::const_iterator iter = m_arrows.find(startMarkerId); + CDRPath startMarker; + if (iter != m_arrows.end()) + startMarker = iter->second; unsigned endMarkerId = readU32(input); - m_collector->collectLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarkerId, endMarkerId); + iter = m_arrows.find(endMarkerId); + CDRPath endMarker; + if (iter != m_arrows.end()) + endMarker = iter->second; + m_collector->collectLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarker, endMarker); } void libcdr::CDRParser::readWaldoFill(WPXInputStream *input) @@ -2083,8 +2091,16 @@ void libcdr::CDRParser::readOutl(WPXInputStream *input, unsigned length) else input->seek(fixPosition + 22, WPX_SEEK_SET); unsigned startMarkerId = readU32(input); + std::map<unsigned, CDRPath>::const_iterator iter = m_arrows.find(startMarkerId); + CDRPath startMarker; + if (iter != m_arrows.end()) + startMarker = iter->second; unsigned endMarkerId = readU32(input); - m_lineStyles[lineId] = CDRLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarkerId, endMarkerId); + iter = m_arrows.find(endMarkerId); + CDRPath endMarker; + if (iter != m_arrows.end()) + endMarker = iter->second; + m_lineStyles[lineId] = CDRLineStyle(lineType, capsType, joinType, lineWidth, stretch, angle, color, dashArray, startMarker, endMarker); } void libcdr::CDRParser::readLoda(WPXInputStream *input, unsigned length) @@ -2155,7 +2171,7 @@ void libcdr::CDRParser::readLoda(WPXInputStream *input, unsigned length) 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.startMarkerId, iter->second.endMarkerId); + iter->second.startMarker, iter->second.endMarker); } } else if (argTypes[i] == 0x2af8) diff --git a/src/lib/CDRParser.h b/src/lib/CDRParser.h index 64f4b43..7b159f1 100644 --- a/src/lib/CDRParser.h +++ b/src/lib/CDRParser.h @@ -119,6 +119,7 @@ private: std::map<unsigned, CDRFont> m_fonts; std::map<unsigned, CDRFillStyle> m_fillStyles; std::map<unsigned, CDRLineStyle> m_lineStyles; + std::map<unsigned, CDRPath> m_arrows; unsigned m_version; diff --git a/src/lib/CDRPath.cpp b/src/lib/CDRPath.cpp index b7d42f2..2d3e0b5 100644 --- a/src/lib/CDRPath.cpp +++ b/src/lib/CDRPath.cpp @@ -29,6 +29,7 @@ #include <math.h> #include "CDRPath.h" +#include "CDRTypes.h" #ifndef M_PI #define M_PI 3.14159265358979323846 @@ -406,6 +407,19 @@ libcdr::CDRPath::CDRPath(const libcdr::CDRPath &path) : m_elements(), m_isClosed m_isClosed = path.isClosed(); } +libcdr::CDRPath &libcdr::CDRPath::operator=(const libcdr::CDRPath &path) +{ + // Check for self-assignment + if (this == &path) + return *this; + clear(); + for (std::vector<CDRPathElement *>::const_iterator iter = path.m_elements.begin(); iter != path.m_elements.end(); ++iter) + m_elements.push_back((*iter)->clone()); + m_isClosed = path.isClosed(); + return *this; +} + + libcdr::CDRPath::~CDRPath() { clear(); diff --git a/src/lib/CDRPath.h b/src/lib/CDRPath.h index 44c1071..ccff6d2 100644 --- a/src/lib/CDRPath.h +++ b/src/lib/CDRPath.h @@ -33,12 +33,11 @@ #include <vector> #include <libwpd/libwpd.h> -#include "CDRTypes.h" - namespace libcdr { class CDRTransform; +class CDRTransforms; class CDRPathElement { @@ -59,6 +58,8 @@ public: CDRPath(const CDRPath &path); ~CDRPath(); + CDRPath &operator=(const CDRPath &path); + void appendMoveTo(double x, double y); void appendLineTo(double x, double y); void appendCubicBezierTo(double x1, double y1, double x2, double y2, double x, double y); @@ -78,9 +79,6 @@ public: bool isClosed() const; private: - CDRPath &operator=(const CDRPath &path); - -private: std::vector<CDRPathElement *> m_elements; bool m_isClosed; }; diff --git a/src/lib/CDRStylesCollector.h b/src/lib/CDRStylesCollector.h index d037931..d206a4d 100644 --- a/src/lib/CDRStylesCollector.h +++ b/src/lib/CDRStylesCollector.h @@ -61,7 +61,7 @@ public: 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> &, unsigned, unsigned) {} + const std::vector<unsigned> &, const CDRPath &, const CDRPath &) {} void collectRotate(double,double,double) {} void collectFlags(unsigned, bool) {} void collectPageSize(double width, double height, double offsetX, double offsetY); diff --git a/src/lib/CDRTypes.h b/src/lib/CDRTypes.h index 6b1228b..9790338 100644 --- a/src/lib/CDRTypes.h +++ b/src/lib/CDRTypes.h @@ -33,11 +33,11 @@ #include <math.h> #include <libwpd/libwpd.h> #include "CDRTransforms.h" +#include "CDRPath.h" #include "libcdr_utils.h" namespace libcdr { -class CDRPath; struct CDRBox { @@ -138,18 +138,18 @@ struct CDRLineStyle double angle; CDRColor color; std::vector<unsigned> dashArray; - unsigned startMarkerId; - unsigned endMarkerId; + CDRPath startMarker; + CDRPath endMarker; CDRLineStyle() : lineType((unsigned short)-1), capsType(0), joinType(0), lineWidth(0.0), stretch(0.0), angle(0.0), color(), dashArray(), - startMarkerId(0), endMarkerId(0) {} + startMarker(), endMarker() {} CDRLineStyle(unsigned short lt, unsigned short ct, unsigned short jt, double lw, double st, double a, const CDRColor &c, const std::vector<unsigned> &da, - unsigned smi, unsigned emi) + const CDRPath &sm, const CDRPath &em) : lineType(lt), capsType(ct), joinType(jt), lineWidth(lw), stretch(st), angle(a), color(c), dashArray(da), - startMarkerId(smi), endMarkerId(emi) {} + startMarker(sm), endMarker(em) {} }; struct CDRCharacterStyle
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
