summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 90c0f3f)
raw | patch | inline | side by side (parent: 90c0f3f)
author | gouldtj <gouldtj@users.sourceforge.net> | |
Mon, 31 Jul 2006 05:14:32 +0000 (05:14 +0000) | ||
committer | gouldtj <gouldtj@users.sourceforge.net> | |
Mon, 31 Jul 2006 05:14:32 +0000 (05:14 +0000) |
Stealing some example code from the libwpg guys to make this alot
easier.
easier.
src/extension/internal/wpg-input.cpp | [new file with mode: 0644] | patch | blob |
diff --git a/src/extension/internal/wpg-input.cpp b/src/extension/internal/wpg-input.cpp
--- /dev/null
@@ -0,0 +1,298 @@
+/* libwpg\r
+ * Copyright (C) 2006 Ariya Hidayat (ariya@kde.org)\r
+ * Copyright (C) 2005 Fridrich Strba (fridrich.strba@bluewin.ch)\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Library General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Library General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Library General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+ *\r
+ * For further information visit http://libwpg.sourceforge.net\r
+ */\r
+\r
+/* "This product is not manufactured, approved, or supported by\r
+ * Corel Corporation or Corel Corporation Limited."\r
+ */\r
+\r
+#include <stdio.h>\r
+\r
+#include "libwpg.h"\r
+#include "WPGStreamImplementation.h"\r
+\r
+using namespace libwpg;\r
+\r
+class SvgPainter : public libwpg::WPGPaintInterface {\r
+public:\r
+ SvgPainter();\r
+\r
+ void startDocument(double imageWidth, double imageHeight);\r
+ void endDocument();\r
+ void startLayer(unsigned int id);\r
+ void endLayer(unsigned int id);\r
+\r
+ void setPen(const WPGPen& pen);\r
+ void setBrush(const WPGBrush& brush);\r
+ void setFillRule(FillRule rule);\r
+\r
+ void drawRectangle(const WPGRect& rect, double rx, double ry);\r
+ void drawEllipse(const WPGPoint& center, double rx, double ry);\r
+ void drawPolygon(const WPGPointArray& vertices);\r
+ void drawPath(const WPGPath& path);\r
+\r
+private:\r
+ WPGPen m_pen;\r
+ WPGBrush m_brush;\r
+ FillRule m_fillRule;\r
+ int m_gradientIndex;\r
+ void writeStyle();\r
+};\r
+\r
+SvgPainter::SvgPainter(): m_fillRule(AlternatingFill), m_gradientIndex(1)\r
+{\r
+}\r
+\r
+void SvgPainter::startDocument(double width, double height) \r
+{\r
+ printf("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n");\r
+ printf("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"");\r
+ printf(" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");\r
+\r
+ printf("<!-- Created with wpg2svg/libwpg %s -->\n", LIBWPG_VERSION_STRING);\r
+\r
+ printf("<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" ");\r
+ printf("xmlns:xlink=\"http://www.w3.org/1999/xlink\" "); \r
+ printf("width=\"%g\" height=\"%f\" >\n", 72*width, 72*height);\r
+ \r
+ m_gradientIndex = 1;\r
+}\r
+\r
+void SvgPainter::endDocument()\r
+{\r
+ printf("</svg>\n");\r
+}\r
+\r
+void SvgPainter::setPen(const WPGPen& pen)\r
+{\r
+ m_pen = pen;\r
+}\r
+\r
+void SvgPainter::setBrush(const WPGBrush& brush)\r
+{\r
+ m_brush = brush;\r
+ \r
+ if(m_brush.style == WPGBrush::Gradient)\r
+ {\r
+ double angle = m_brush.gradient.angle();\r
+\r
+ printf("<defs>\n");\r
+ printf(" <linearGradient id=\"grad%d\" >\n", m_gradientIndex++);\r
+ for(unsigned c = 0; c < m_brush.gradient.count(); c++)\r
+ {\r
+ // round to nearest percentage\r
+ int ofs = (int)(100.0*m_brush.gradient.stopOffset(c)+0.5);\r
+\r
+ WPGColor color = m_brush.gradient.stopColor(c);\r
+ printf(" <stop offset=\"%d%%\" stop-color=\"#%02x%02x%02x\" />\n",\r
+ ofs, color.red, color.green, color.blue);\r
+ }\r
+ printf(" </linearGradient>\n");\r
+ \r
+ // not a simple horizontal gradient\r
+ if(angle != -90.0)\r
+ {\r
+ printf(" <linearGradient xlink:href=\"#grad%d\"", m_gradientIndex-1);\r
+ printf(" id=\"grad%d\" ", m_gradientIndex++);\r
+ printf("x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\" "); \r
+ printf("gradientTransform=\"rotate(%f)\" ", angle);\r
+ printf("gradientUnits=\"objectBoundingBox\" >\n");\r
+ printf(" </linearGradient>\n");\r
+ }\r
+ \r
+ printf("</defs>\n");\r
+ }\r
+}\r
+\r
+void SvgPainter::setFillRule(FillRule rule)\r
+{\r
+ m_fillRule = rule;\r
+}\r
+\r
+void SvgPainter::startLayer(unsigned int id)\r
+{\r
+ printf("<g id=\"Layer%d\" >\n", id);\r
+}\r
+\r
+void SvgPainter::endLayer(unsigned int)\r
+{\r
+ printf("</g>\n");\r
+}\r
+\r
+void SvgPainter::drawRectangle(const WPGRect& rect, double rx, double ry)\r
+{\r
+ printf("<rect ");\r
+ printf("x=\"%f\" y=\"%f\" ", 72*rect.x1, 72*rect.y1);\r
+ printf("width=\"%f\" height=\"%f\" ", 72*rect.width(), 72*rect.height());\r
+ if((rx !=0) || (ry !=0))\r
+ printf("rx=\"%f\" ry=\"%f\" ", 72*rx, 72*ry);\r
+ writeStyle();\r
+ printf("/>\n");\r
+}\r
+\r
+void SvgPainter::drawEllipse(const WPGPoint& center, double rx, double ry)\r
+{\r
+ printf("<ellipse ");\r
+ printf("cx=\"%f\" cy=\"%f\" ", 72*center.x, 72*center.y);\r
+ printf("rx=\"%f\" ry=\"%f\" ", 72*rx, 72*ry);\r
+ writeStyle();\r
+ printf("/>\n");\r
+}\r
+\r
+void SvgPainter::drawPolygon(const WPGPointArray& vertices)\r
+{\r
+ if(vertices.count() < 2)\r
+ return;\r
+\r
+ if(vertices.count() == 2)\r
+ {\r
+ const WPGPoint& p1 = vertices[0];\r
+ const WPGPoint& p2 = vertices[1];\r
+ printf("<line ");\r
+ printf("x1=\"%f\" y1=\"%f\" ", 72*p1.x, 72*p1.y);\r
+ printf("x2=\"%f\" y2=\"%f\"\n", 72*p2.x, 72*p2.y);\r
+ writeStyle();\r
+ printf("/>\n");\r
+ }\r
+ else\r
+ {\r
+ printf("<polyline ");\r
+ printf("points=\"");\r
+ for(unsigned i = 0; i < vertices.count(); i++)\r
+ {\r
+ printf("%f %f", 72*vertices[i].x, 72*vertices[i].y);\r
+ if(i < vertices.count()-1) printf(", ");\r
+ }\r
+ printf("\"\n");\r
+ writeStyle();\r
+ printf("/>\n");\r
+ }\r
+}\r
+\r
+void SvgPainter::drawPath(const WPGPath& path)\r
+{\r
+ printf("<path d=\"");\r
+ for(unsigned i = 0; i < path.count(); i++)\r
+ {\r
+ WPGPathElement element = path.element(i);\r
+ WPGPoint point = element.point;\r
+ switch(element.type)\r
+ {\r
+ case WPGPathElement::MoveToElement:\r
+ printf("\n M%f,%f ", 72*point.x, 72*point.y );\r
+ break;\r
+ \r
+ case WPGPathElement::LineToElement:\r
+ printf("\n L%f,%f ", 72*point.x, 72*point.y );\r
+ break;\r
+ \r
+ case WPGPathElement::CurveToElement:\r
+ printf("C");\r
+ printf("%f,%f ", 72*element.extra1.x, 72*element.extra1.y );\r
+ printf("%f,%f ", 72*element.extra2.x, 72*element.extra2.y );\r
+ printf("%f,%f", 72*point.x, 72*point.y );\r
+ break;\r
+ \r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ printf("\" \n");\r
+ writeStyle();\r
+ printf("/>\n");\r
+}\r
+\r
+// create "style" attribute based on current pen and brush\r
+void SvgPainter::writeStyle()\r
+{\r
+ printf("style=\"");\r
+\r
+ const WPGColor& color = m_pen.foreColor;\r
+ printf("stroke-width: %f; ", 72*m_pen.width);\r
+ if(m_pen.width > 0.0)\r
+ {\r
+ printf("stroke: rgb(%d,%d,%d); ", color.red, color.green, color.blue);\r
+ if(color.alpha != 0)\r
+ // alpha = 0 means opacity = 1.0, alpha = 256 means opacity = 0\r
+ printf("stroke-opacity: %f; ", 1.0-(color.alpha/256.0));\r
+ }\r
+\r
+ if(!m_pen.solid)\r
+ {\r
+ printf("stroke-dasharray: ");\r
+ for(unsigned i = 0; i < m_pen.dashArray.count(); i++)\r
+ {\r
+ printf("%f", 72*m_pen.dashArray.at(i)*m_pen.width);\r
+ if(i < m_pen.dashArray.count()-1) \r
+ printf(", ");\r
+ }\r
+ printf("; ");\r
+ }\r
+ \r
+ if(m_brush.style == WPGBrush::NoBrush)\r
+ printf("fill: none; ");\r
+\r
+ if(m_fillRule == SvgPainter::WindingFill)\r
+ printf("fill-rule: nonzero; ");\r
+ else if(m_fillRule == SvgPainter::AlternatingFill)\r
+ printf("fill-rule: evenodd; ");\r
+\r
+ if(m_brush.style == WPGBrush::Gradient)\r
+ printf("fill: url(#grad%d); ", m_gradientIndex-1);\r
+\r
+ if(m_brush.style == WPGBrush::Solid)\r
+ printf("fill: rgb(%d,%d,%d); ", m_brush.foreColor.red, \r
+ m_brush.foreColor.green, m_brush.foreColor.blue);\r
+\r
+ printf("\""); // style\r
+}\r
+\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ if (argc < 2)\r
+ {\r
+ printf("usage: wpg2svg <WordPerfect Graphic>\n");\r
+ return -1;\r
+ }\r
+\r
+ const char* filename = argv[1];\r
+ WPGInputStream* input = new WPGFileStream(filename);\r
+ if (input->isOle())\r
+ {\r
+ WPGInputStream* olestream = input->getWPGOleStream();\r
+ if (olestream)\r
+ {\r
+ delete input;\r
+ input = olestream;\r
+ }\r
+ }\r
+\r
+ if (!WPGraphics::isSupported(input))\r
+ {\r
+ fprintf(stderr, "ERROR: Unsupported file format (unsupported version) or file is encrypted!\n");\r
+ return 1;\r
+ }\r
+ \r
+ SvgPainter painter;\r
+ WPGraphics::parse(input, &painter);\r
+ \r
+ return 0;\r
+}\r