[Libreoffice-commits] libcdr.git: src/lib
Fridrich Å trba
fridrich.strba at bluewin.ch
Sat Jun 29 06:59:37 PDT 2013
src/lib/CDRCollector.h | 1 +
src/lib/CDRContentCollector.cpp | 6 ++++++
src/lib/CDRContentCollector.h | 1 +
src/lib/CDRParser.cpp | 26 ++++++++++++++++++++++++++
src/lib/CDRParser.h | 1 +
src/lib/CDRStylesCollector.h | 1 +
src/lib/CommonParser.cpp | 24 ++++++++++++++++--------
src/lib/CommonParser.h | 2 ++
8 files changed, 54 insertions(+), 8 deletions(-)
New commits:
commit c5b8d15ce18f1ebd63a5c3774c44f5ca60a8b8fb
Author: Fridrich Å trba <fridrich.strba at bluewin.ch>
Date: Sat Jun 29 15:59:10 2013 +0200
Initial reading of arrw records
diff --git a/src/lib/CDRCollector.h b/src/lib/CDRCollector.h
index ffbb08e..68cc236 100644
--- a/src/lib/CDRCollector.h
+++ b/src/lib/CDRCollector.h
@@ -94,6 +94,7 @@ public:
virtual void collectLineTo(double x, double y) = 0;
virtual void collectArcTo(double rx, double ry, bool largeArc, bool sweep, double x, double y) = 0;
virtual void collectClosePath() = 0;
+ 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;
diff --git a/src/lib/CDRContentCollector.cpp b/src/lib/CDRContentCollector.cpp
index 4076f56..07e1f58 100644
--- a/src/lib/CDRContentCollector.cpp
+++ b/src/lib/CDRContentCollector.cpp
@@ -189,6 +189,12 @@ void libcdr::CDRContentCollector::collectClosePath()
m_currentPath.appendClosePath();
}
+void libcdr::CDRContentCollector::collectPath(const CDRPath &path)
+{
+ CDR_DEBUG_MSG(("CDRContentCollector::collectPath\n"));
+ m_currentPath.appendPath(path);
+}
+
void libcdr::CDRContentCollector::_flushCurrentPath()
{
CDR_DEBUG_MSG(("CDRContentCollector::collectFlushPath\n"));
diff --git a/src/lib/CDRContentCollector.h b/src/lib/CDRContentCollector.h
index 5bca65f..5242b1c 100644
--- a/src/lib/CDRContentCollector.h
+++ b/src/lib/CDRContentCollector.h
@@ -61,6 +61,7 @@ public:
void collectLineTo(double x, double y);
void collectArcTo(double rx, double ry, bool largeArc, bool sweep, double x, double y);
void collectClosePath();
+ 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);
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 9e1e8ed..9f024b8 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -717,6 +717,7 @@ void libcdr::CDRParser::readRecord(unsigned fourCC, unsigned length, WPXInputStr
readFild(input, length);
break;
case CDR_FOURCC_arrw:
+ readArrw(input, length);
break;
case CDR_FOURCC_flgs:
readFlags(input, length);
@@ -1478,6 +1479,31 @@ void libcdr::CDRParser::readPath(WPXInputStream *input)
outputPath(points, pointTypes);
}
+void libcdr::CDRParser::readArrw(WPXInputStream *input, unsigned length)
+{
+ CDR_DEBUG_MSG(("CDRParser::readArrw\n"));
+ if (!_redirectX6Chunk(&input, length))
+ throw GenericException();
+ /* unsigned arrowId = */
+ readU32(input);
+ input->seek(4, WPX_SEEK_CUR);
+ unsigned short pointNum = readU16(input);
+ input->seek(4, WPX_SEEK_CUR);
+ std::vector<std::pair<double, double> > points;
+ std::vector<unsigned char> pointTypes;
+ for (unsigned j=0; j<pointNum; j++)
+ {
+ std::pair<double, double> point;
+ point.first = (double)readCoordinate(input);
+ point.second = (double)readCoordinate(input);
+ points.push_back(point);
+ }
+ for (unsigned k=0; k<pointNum; k++)
+ pointTypes.push_back(readU8(input));
+ CDRPath path;
+ processPath(points, pointTypes, path);
+}
+
void libcdr::CDRParser::readBitmap(WPXInputStream *input)
{
CDR_DEBUG_MSG(("CDRParser::readBitmap\n"));
diff --git a/src/lib/CDRParser.h b/src/lib/CDRParser.h
index fc9116c..64f4b43 100644
--- a/src/lib/CDRParser.h
+++ b/src/lib/CDRParser.h
@@ -88,6 +88,7 @@ private:
void readFlags(WPXInputStream *input, unsigned length);
void readMcfg(WPXInputStream *input, unsigned length);
void readPath(WPXInputStream *input);
+ void readArrw(WPXInputStream *input, unsigned length);
void readPolygonCoords(WPXInputStream *input);
void readPolygonTransform(WPXInputStream *input);
void readBmp(WPXInputStream *input, unsigned length);
diff --git a/src/lib/CDRStylesCollector.h b/src/lib/CDRStylesCollector.h
index e788e86..d7e26a9 100644
--- a/src/lib/CDRStylesCollector.h
+++ b/src/lib/CDRStylesCollector.h
@@ -62,6 +62,7 @@ public:
void collectLineTo(double, double) {}
void collectArcTo(double, double, bool, bool, double, double) {}
void collectClosePath() {}
+ void collectPath(const CDRPath &) {}
void collectLevel(unsigned) {}
void collectTransform(const CDRTransforms &, bool) {}
void collectFillStyle(unsigned short, const CDRColor &, const CDRColor &, const CDRGradient &, const CDRImageFill &) {}
diff --git a/src/lib/CommonParser.cpp b/src/lib/CommonParser.cpp
index 9a8bfaf..184be1e 100644
--- a/src/lib/CommonParser.cpp
+++ b/src/lib/CommonParser.cpp
@@ -90,6 +90,14 @@ double libcdr::CommonParser::readAngle(WPXInputStream *input, bool bigEndian)
void libcdr::CommonParser::outputPath(const std::vector<std::pair<double, double> > &points,
const std::vector<unsigned char> &types)
{
+ CDRPath path;
+ processPath(points, types, path);
+ m_collector->collectPath(path);
+}
+
+void libcdr::CommonParser::processPath(const std::vector<std::pair<double, double> > &points,
+ const std::vector<unsigned char> &types, CDRPath &path)
+{
bool isClosedPath = false;
std::vector<std::pair<double, double> >tmpPoints;
for (unsigned k=0; k<points.size(); k++)
@@ -114,25 +122,25 @@ void libcdr::CommonParser::outputPath(const std::vector<std::pair<double, double
if (!(type & 0x40) && !(type & 0x80))
{
tmpPoints.clear();
- m_collector->collectMoveTo(points[k].first, points[k].second);
+ path.appendMoveTo(points[k].first, points[k].second);
}
else if ((type & 0x40) && !(type & 0x80))
{
tmpPoints.clear();
- m_collector->collectLineTo(points[k].first, points[k].second);
+ path.appendLineTo(points[k].first, points[k].second);
if (isClosedPath)
- m_collector->collectClosePath();
+ path.appendClosePath();
}
else if (!(type & 0x40) && (type & 0x80))
{
if (tmpPoints.size() >= 2)
- m_collector->collectCubicBezier(tmpPoints[0].first, tmpPoints[0].second,
- tmpPoints[1].first, tmpPoints[1].second,
- points[k].first, points[k].second);
+ path.appendCubicBezierTo(tmpPoints[0].first, tmpPoints[0].second,
+ tmpPoints[1].first, tmpPoints[1].second,
+ points[k].first, points[k].second);
else
- m_collector->collectLineTo(points[k].first, points[k].second);
+ path.appendLineTo(points[k].first, points[k].second);
if (isClosedPath)
- m_collector->collectClosePath();
+ path.appendClosePath();
tmpPoints.clear();
}
else if((type & 0x40) && (type & 0x80))
diff --git a/src/lib/CommonParser.h b/src/lib/CommonParser.h
index 14d757b..f9c0cc0 100644
--- a/src/lib/CommonParser.h
+++ b/src/lib/CommonParser.h
@@ -31,6 +31,7 @@
#define __COMMONPARSER_H__
#include "CDRCollector.h"
+#include "CDRPath.h"
class WPXInputSTream;
@@ -60,6 +61,7 @@ protected:
int readInteger(WPXInputStream *input, bool bigEndian = false);
double readAngle(WPXInputStream *input, bool bigEndian = false);
+ void processPath(const std::vector<std::pair<double, double> > &points, const std::vector<unsigned char> &types, CDRPath &path);
void outputPath(const std::vector<std::pair<double, double> > &points, const std::vector<unsigned char> &types);
CDRCollector *m_collector;
More information about the Libreoffice-commits
mailing list