Hallo again, here are two patches for improving libmspub
Greetings, Franz Schmid
>From c24205bf034a5f4759638f5c2c7d7e09823d32ab Mon Sep 17 00:00:00 2001 From: Franz Schmid <fr...@linux-hp-i7.site> Date: Sun, 14 Apr 2013 10:51:31 +0200 Subject: [PATCH 2/3] Added output of the wrap path as an svg clip path. --- src/lib/EscherFieldIds.h | 1 + src/lib/MSPUBCollector.cpp | 18 +++++++++++++++++- src/lib/MSPUBCollector.h | 1 + src/lib/MSPUBParser.cpp | 8 ++++++++ src/lib/PolygonUtils.cpp | 25 +++++++++++++++++++++++++ src/lib/PolygonUtils.h | 1 + src/lib/ShapeInfo.h | 3 ++- 7 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/lib/EscherFieldIds.h b/src/lib/EscherFieldIds.h index 7c7446e..7b3ff22 100644 --- a/src/lib/EscherFieldIds.h +++ b/src/lib/EscherFieldIds.h @@ -78,6 +78,7 @@ #define FIELDID_GEO_BOTTOM 0x0143 #define FIELDID_P_VERTICES 0xC145 #define FIELDID_P_SEGMENTS 0xC146 +#define FIELDID_P_WRAPPOLYGONVERTICES 0xC383 #define FIELDID_P_CONNECTION_SITES 0xC151 #define FIELDID_P_ADJUST_HANDLES 0xC155 #define FIELDID_P_GUIDES 0xC156 diff --git a/src/lib/MSPUBCollector.cpp b/src/lib/MSPUBCollector.cpp index 82b7cca..36f51ca 100644 --- a/src/lib/MSPUBCollector.cpp +++ b/src/lib/MSPUBCollector.cpp @@ -222,6 +222,11 @@ void libmspub::MSPUBCollector::setShapeCustomPath(unsigned seqNum, m_shapeInfosBySeqNum[seqNum].m_customShape = shape; } +void libmspub::MSPUBCollector::setShapeClipPath(unsigned seqNum, const std::vector<libmspub::Vertex> &clip) +{ + m_shapeInfosBySeqNum[seqNum].m_clipPath = clip; +} + void libmspub::MSPUBCollector::beginGroup() { ShapeGroupElement *tmp = new ShapeGroupElement(m_currentShapeGroup); @@ -409,7 +414,18 @@ boost::function<void(void)> libmspub::MSPUBCollector::paintShape(const ShapeInfo (hasStroke && hasFill) || (hasStroke && hasText) || (hasFill && hasText); if (makeLayer) { - m_painter->startLayer(WPXPropertyList()); + if (info.m_clipPath.size() > 0) + { + const Coordinate &coord = info.m_coordinates.get_value_or(Coordinate()); + double x, y, height, width; + x = coord.getXIn(m_width); + y = coord.getYIn(m_height); + height = coord.getHeightIn(); + width = coord.getWidthIn(); + m_painter->startLayer(calcClipPath(info.m_clipPath, x, y, height, width, foldedTransform, info.getCustomShape())); + } + else + m_painter->startLayer(WPXPropertyList()); } graphicsProps.insert("draw:stroke", "none"); const Coordinate &coord = info.m_coordinates.get_value_or(Coordinate()); diff --git a/src/lib/MSPUBCollector.h b/src/lib/MSPUBCollector.h index 719eb1e..5755043 100644 --- a/src/lib/MSPUBCollector.h +++ b/src/lib/MSPUBCollector.h @@ -105,6 +105,7 @@ public: void setShapeCoordinatesRotated90(unsigned seqNum); void setShapeCustomPath(unsigned seqNum, const DynamicCustomShape &shape); + void setShapeClipPath(unsigned seqNum, const std::vector<libmspub::Vertex> &clip); void setShapeVerticalTextAlign(unsigned seqNum, VerticalAlign va); void designateMasterPage(unsigned seqNum); void setMasterPage(unsigned pageSeqNum, unsigned masterSeqNum); diff --git a/src/lib/MSPUBParser.cpp b/src/lib/MSPUBParser.cpp index 21ade39..9050a1c 100644 --- a/src/lib/MSPUBParser.cpp +++ b/src/lib/MSPUBParser.cpp @@ -1767,6 +1767,13 @@ void libmspub::MSPUBParser::parseEscherShape(WPXInputStream *input, const Escher guideData, p_geoRight ? *p_geoRight : 21600, p_geoBottom ? *p_geoBottom : 21600)); } + const std::vector<unsigned char> wrapVertexData = foptValues.m_complexValues[FIELDID_P_WRAPPOLYGONVERTICES]; + if (!wrapVertexData.empty()) + { + std::vector<libmspub::Vertex> ret = parseVertices(wrapVertexData); + m_collector->setShapeClipPath(*shapeSeqNum, ret); + MSPUB_DEBUG_MSG(("Current Escher shape has wrap Path\n")); + } } if (foundAnchor) { @@ -2161,6 +2168,7 @@ libmspub::FOPTValues libmspub::MSPUBParser::extractFOPTValues(WPXInputStream *in unsigned short id = readU16(input); unsigned value = readU32(input); ret.m_scalarValues[id] = value; + MSPUB_DEBUG_MSG(("EscherFopt ID %u Value %u\n", id, value)); bool complex = id & 0x8000; if (complex) { diff --git a/src/lib/PolygonUtils.cpp b/src/lib/PolygonUtils.cpp index 8fb4c7c..df72a16 100644 --- a/src/lib/PolygonUtils.cpp +++ b/src/lib/PolygonUtils.cpp @@ -5896,6 +5896,31 @@ void getRayEllipseIntersection(double initX, double initY, double rx, double ry, yOut += cy; } +WPXPropertyList libmspub::calcClipPath(const std::vector<libmspub::Vertex> &verts, double x, double y, double height, double width, VectorTransformation2D transform, boost::shared_ptr<const CustomShape> shape) +{ + WPXPropertyList vertices; + Vector2D center(x + width / 2, y + height / 2); + double scaleX = width / shape->m_coordWidth; + double scaleY = height / shape->m_coordHeight; + WPXString clipString; + Vector2D vector(x + scaleX * verts[0].m_x, y + scaleY * verts[0].m_y); + vector = transform.transformWithOrigin(vector, center); + WPXString sValue; + sValue.sprintf("M %f %f", (double)vector.m_x, (double)vector.m_y); + clipString.append(sValue); + for (unsigned i = 1; i < verts.size(); ++i) + { + Vector2D vector2(x + scaleX * verts[i].m_x, y + scaleY * verts[i].m_y); + vector2 = transform.transformWithOrigin(vector2, center); + WPXString sValue2; + sValue2.sprintf(" L %f %f", (double)vector2.m_x, (double)vector2.m_y); + clipString.append(sValue2); + } + clipString.append(" Z"); + vertices.insert("svg:clip-path", clipString); + return vertices; +} + void libmspub::writeCustomShape(ShapeType shapeType, WPXPropertyList &graphicsProps, libwpg::WPGPaintInterface *painter, double x, double y, double height, double width, bool closeEverything, VectorTransformation2D transform, std::vector<Line> lines, boost::function<double(unsigned index)> calculator, const std::vector<Color> &palette, boost::shared_ptr<const CustomShape> shape) { MSPUB_DEBUG_MSG(("***STARTING CUSTOM SHAPE***\n")); diff --git a/src/lib/PolygonUtils.h b/src/lib/PolygonUtils.h index 73d652d..f4ed419 100644 --- a/src/lib/PolygonUtils.h +++ b/src/lib/PolygonUtils.h @@ -133,6 +133,7 @@ boost::shared_ptr<const CustomShape> getFromDynamicCustomShape(const DynamicCust const CustomShape *getCustomShape(ShapeType type); bool isShapeTypeRectangle(ShapeType type); +WPXPropertyList calcClipPath(const std::vector<libmspub::Vertex> &verts, double x, double y, double height, double width, VectorTransformation2D transform, boost::shared_ptr<const CustomShape> shape); void writeCustomShape(ShapeType shapeType, WPXPropertyList &graphicsProps, libwpg::WPGPaintInterface *painter, double x, double y, double height, double width, bool closeEverything, VectorTransformation2D transform, std::vector<Line> lines, boost::function<double(unsigned index)> calculator, const std::vector<Color> &palette, boost::shared_ptr<const CustomShape> shape); } // libmspub diff --git a/src/lib/ShapeInfo.h b/src/lib/ShapeInfo.h index 8f33247..9bbac5c 100644 --- a/src/lib/ShapeInfo.h +++ b/src/lib/ShapeInfo.h @@ -80,6 +80,7 @@ struct ShapeInfo boost::optional<ColorReference> m_pictureRecolor; boost::optional<Shadow> m_shadow; boost::optional<int> m_innerRotation; + std::vector<libmspub::Vertex> m_clipPath; ShapeInfo() : m_type(), m_cropType(), m_imgIndex(), m_borderImgIndex(), m_coordinates(), m_lines(), m_pageSeqNum(), m_textId(), m_adjustValuesByIndex(), m_adjustValues(), @@ -88,7 +89,7 @@ struct ShapeInfo m_lineBackColor(), m_dash(), m_tableInfo(), m_tableCellTextEnds(), m_numColumns(), m_columnSpacing(0), m_beginArrow(), m_endArrow(), - m_verticalAlign(), m_pictureRecolor(), m_shadow(), m_innerRotation() + m_verticalAlign(), m_pictureRecolor(), m_shadow(), m_innerRotation(), m_clipPath() { } boost::shared_ptr<const CustomShape> getCustomShape() const -- 1.7.1
>From f8657d35a0d7658f42b5c00794df521b3e69e24f Mon Sep 17 00:00:00 2001 From: Franz Schmid <fr...@linux-hp-i7.site> Date: Sun, 14 Apr 2013 12:17:12 +0200 Subject: [PATCH 3/3] Added output of the dash style value as libmspub:dashstyle property --- src/lib/MSPUBCollector.cpp | 9 ++++++++- src/lib/MSPUBCollector.h | 2 +- src/lib/MSPUBParser.cpp | 4 ++-- src/lib/ShapeInfo.h | 3 ++- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/lib/MSPUBCollector.cpp b/src/lib/MSPUBCollector.cpp index 36f51ca..032908b 100644 --- a/src/lib/MSPUBCollector.cpp +++ b/src/lib/MSPUBCollector.cpp @@ -760,6 +760,12 @@ boost::function<void(void)> libmspub::MSPUBCollector::paintShape(const ShapeInfo graphicsProps.insert(length.cstr(), dash.m_dots[i].m_length.get(), WPX_INCH); } } + if (info.m_dashStyle.is_initialized()) + { + WPXString dst; + dst.sprintf("%d", info.m_dashStyle.get()); + graphicsProps.insert("libmspub:dashstyle", dst); + } } else { @@ -1101,9 +1107,10 @@ void libmspub::MSPUBCollector::setShapeImgIndex(unsigned seqNum, unsigned index) m_shapeInfosBySeqNum[seqNum].m_imgIndex = index; } -void libmspub::MSPUBCollector::setShapeDash(unsigned seqNum, const Dash &dash) +void libmspub::MSPUBCollector::setShapeDash(unsigned seqNum, unsigned dashStyle, const Dash &dash) { m_shapeInfosBySeqNum[seqNum].m_dash = dash; + m_shapeInfosBySeqNum[seqNum].m_dashStyle = dashStyle; } void libmspub::MSPUBCollector::setShapeFill(unsigned seqNum, boost::shared_ptr<Fill> fill, bool skipIfNotBg) diff --git a/src/lib/MSPUBCollector.h b/src/lib/MSPUBCollector.h index 5755043..e23ba5e 100644 --- a/src/lib/MSPUBCollector.h +++ b/src/lib/MSPUBCollector.h @@ -96,7 +96,7 @@ public: void setShapeCoordinatesInEmu(unsigned seqNum, int xs, int ys, int xe, int ye); void setShapeImgIndex(unsigned seqNum, unsigned index); void setShapeFill(unsigned seqNum, boost::shared_ptr<Fill> fill, bool skipIfNotBg); - void setShapeDash(unsigned seqNum, const Dash &dash); + void setShapeDash(unsigned seqNum, unsigned dashStyle, const Dash &dash); void setAdjustValue(unsigned seqNum, unsigned index, int adjust); void setShapeRotation(unsigned seqNum, double rotation); void setShapeFlip(unsigned, bool, bool); diff --git a/src/lib/MSPUBParser.cpp b/src/lib/MSPUBParser.cpp index 9050a1c..a02915f 100644 --- a/src/lib/MSPUBParser.cpp +++ b/src/lib/MSPUBParser.cpp @@ -1679,7 +1679,7 @@ void libmspub::MSPUBParser::parseEscherShape(WPXInputStream *input, const Escher } if (ptr_lineDashing) { - m_collector->setShapeDash(*shapeSeqNum, getDash( + m_collector->setShapeDash(*shapeSeqNum, *ptr_lineDashing, getDash( static_cast<MSPUBDashStyle>(*ptr_lineDashing), lineWidth, dotStyle)); } @@ -1901,7 +1901,7 @@ boost::shared_ptr<libmspub::Fill> libmspub::MSPUBParser::getNewFill(const std::m boost::shared_ptr<GradientFill> ret(new GradientFill(m_collector, angle, (int)fillType)); ret->setFillCenter(fillLeftVal, fillTopVal, fillRightVal, fillBottomVal); - + const unsigned *ptr_fillGrad = getIfExists_const(foptProperties, FIELDID_FILL_SHADE_COMPLEX); if (ptr_fillGrad) { diff --git a/src/lib/ShapeInfo.h b/src/lib/ShapeInfo.h index 9bbac5c..fd4eaad 100644 --- a/src/lib/ShapeInfo.h +++ b/src/lib/ShapeInfo.h @@ -70,6 +70,7 @@ struct ShapeInfo bool m_stretchBorderArt; boost::optional<ColorReference> m_lineBackColor; boost::optional<Dash> m_dash; + boost::optional<unsigned> m_dashStyle; boost::optional<TableInfo> m_tableInfo; boost::optional<std::vector<unsigned> > m_tableCellTextEnds; boost::optional<unsigned> m_numColumns; @@ -86,7 +87,7 @@ struct ShapeInfo m_textId(), m_adjustValuesByIndex(), m_adjustValues(), m_rotation(), m_flips(), m_margins(), m_borderPosition(), m_fill(), m_customShape(), m_stretchBorderArt(false), - m_lineBackColor(), m_dash(), m_tableInfo(), + m_lineBackColor(), m_dash(), m_dashStyle(0), m_tableInfo(), m_tableCellTextEnds(), m_numColumns(), m_columnSpacing(0), m_beginArrow(), m_endArrow(), m_verticalAlign(), m_pictureRecolor(), m_shadow(), m_innerRotation(), m_clipPath() -- 1.7.1
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice