From 3286647f279b58e3e01efc448d6df6b02e93cf06 Mon Sep 17 00:00:00 2001 From: gouldtj Date: Mon, 31 Jul 2006 05:14:32 +0000 Subject: [PATCH] r13106@tres: ted | 2006-07-30 11:10:02 -0700 Stealing some example code from the libwpg guys to make this alot easier. --- src/extension/internal/wpg-input.cpp | 298 +++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 src/extension/internal/wpg-input.cpp diff --git a/src/extension/internal/wpg-input.cpp b/src/extension/internal/wpg-input.cpp new file mode 100644 index 000000000..bc65ad5b9 --- /dev/null +++ b/src/extension/internal/wpg-input.cpp @@ -0,0 +1,298 @@ +/* libwpg + * Copyright (C) 2006 Ariya Hidayat (ariya@kde.org) + * Copyright (C) 2005 Fridrich Strba (fridrich.strba@bluewin.ch) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * For further information visit http://libwpg.sourceforge.net + */ + +/* "This product is not manufactured, approved, or supported by + * Corel Corporation or Corel Corporation Limited." + */ + +#include + +#include "libwpg.h" +#include "WPGStreamImplementation.h" + +using namespace libwpg; + +class SvgPainter : public libwpg::WPGPaintInterface { +public: + SvgPainter(); + + void startDocument(double imageWidth, double imageHeight); + void endDocument(); + void startLayer(unsigned int id); + void endLayer(unsigned int id); + + void setPen(const WPGPen& pen); + void setBrush(const WPGBrush& brush); + void setFillRule(FillRule rule); + + void drawRectangle(const WPGRect& rect, double rx, double ry); + void drawEllipse(const WPGPoint& center, double rx, double ry); + void drawPolygon(const WPGPointArray& vertices); + void drawPath(const WPGPath& path); + +private: + WPGPen m_pen; + WPGBrush m_brush; + FillRule m_fillRule; + int m_gradientIndex; + void writeStyle(); +}; + +SvgPainter::SvgPainter(): m_fillRule(AlternatingFill), m_gradientIndex(1) +{ +} + +void SvgPainter::startDocument(double width, double height) +{ + printf("\n"); + printf("\n"); + + printf("\n", LIBWPG_VERSION_STRING); + + printf("\n", 72*width, 72*height); + + m_gradientIndex = 1; +} + +void SvgPainter::endDocument() +{ + printf("\n"); +} + +void SvgPainter::setPen(const WPGPen& pen) +{ + m_pen = pen; +} + +void SvgPainter::setBrush(const WPGBrush& brush) +{ + m_brush = brush; + + if(m_brush.style == WPGBrush::Gradient) + { + double angle = m_brush.gradient.angle(); + + printf("\n"); + printf(" \n", m_gradientIndex++); + for(unsigned c = 0; c < m_brush.gradient.count(); c++) + { + // round to nearest percentage + int ofs = (int)(100.0*m_brush.gradient.stopOffset(c)+0.5); + + WPGColor color = m_brush.gradient.stopColor(c); + printf(" \n", + ofs, color.red, color.green, color.blue); + } + printf(" \n"); + + // not a simple horizontal gradient + if(angle != -90.0) + { + printf(" \n"); + printf(" \n"); + } + + printf("\n"); + } +} + +void SvgPainter::setFillRule(FillRule rule) +{ + m_fillRule = rule; +} + +void SvgPainter::startLayer(unsigned int id) +{ + printf("\n", id); +} + +void SvgPainter::endLayer(unsigned int) +{ + printf("\n"); +} + +void SvgPainter::drawRectangle(const WPGRect& rect, double rx, double ry) +{ + printf("\n"); +} + +void SvgPainter::drawEllipse(const WPGPoint& center, double rx, double ry) +{ + printf("\n"); +} + +void SvgPainter::drawPolygon(const WPGPointArray& vertices) +{ + if(vertices.count() < 2) + return; + + if(vertices.count() == 2) + { + const WPGPoint& p1 = vertices[0]; + const WPGPoint& p2 = vertices[1]; + printf("\n"); + } + else + { + printf("\n"); + } +} + +void SvgPainter::drawPath(const WPGPath& path) +{ + printf("\n"); +} + +// create "style" attribute based on current pen and brush +void SvgPainter::writeStyle() +{ + printf("style=\""); + + const WPGColor& color = m_pen.foreColor; + printf("stroke-width: %f; ", 72*m_pen.width); + if(m_pen.width > 0.0) + { + printf("stroke: rgb(%d,%d,%d); ", color.red, color.green, color.blue); + if(color.alpha != 0) + // alpha = 0 means opacity = 1.0, alpha = 256 means opacity = 0 + printf("stroke-opacity: %f; ", 1.0-(color.alpha/256.0)); + } + + if(!m_pen.solid) + { + printf("stroke-dasharray: "); + for(unsigned i = 0; i < m_pen.dashArray.count(); i++) + { + printf("%f", 72*m_pen.dashArray.at(i)*m_pen.width); + if(i < m_pen.dashArray.count()-1) + printf(", "); + } + printf("; "); + } + + if(m_brush.style == WPGBrush::NoBrush) + printf("fill: none; "); + + if(m_fillRule == SvgPainter::WindingFill) + printf("fill-rule: nonzero; "); + else if(m_fillRule == SvgPainter::AlternatingFill) + printf("fill-rule: evenodd; "); + + if(m_brush.style == WPGBrush::Gradient) + printf("fill: url(#grad%d); ", m_gradientIndex-1); + + if(m_brush.style == WPGBrush::Solid) + printf("fill: rgb(%d,%d,%d); ", m_brush.foreColor.red, + m_brush.foreColor.green, m_brush.foreColor.blue); + + printf("\""); // style +} + + +int main(int argc, char *argv[]) +{ + if (argc < 2) + { + printf("usage: wpg2svg \n"); + return -1; + } + + const char* filename = argv[1]; + WPGInputStream* input = new WPGFileStream(filename); + if (input->isOle()) + { + WPGInputStream* olestream = input->getWPGOleStream(); + if (olestream) + { + delete input; + input = olestream; + } + } + + if (!WPGraphics::isSupported(input)) + { + fprintf(stderr, "ERROR: Unsupported file format (unsupported version) or file is encrypted!\n"); + return 1; + } + + SvgPainter painter; + WPGraphics::parse(input, &painter); + + return 0; +} -- 2.30.2