Code

r13106@tres: ted | 2006-07-30 11:10:02 -0700
authorgouldtj <gouldtj@users.sourceforge.net>
Mon, 31 Jul 2006 05:14:32 +0000 (05:14 +0000)
committergouldtj <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.

src/extension/internal/wpg-input.cpp [new file with mode: 0644]

diff --git a/src/extension/internal/wpg-input.cpp b/src/extension/internal/wpg-input.cpp
new file mode 100644 (file)
index 0000000..bc65ad5
--- /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