summaryrefslogtreecommitdiffstats
path: root/filters/karbon/wmf/wmfimportparser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filters/karbon/wmf/wmfimportparser.cpp')
-rw-r--r--filters/karbon/wmf/wmfimportparser.cpp371
1 files changed, 371 insertions, 0 deletions
diff --git a/filters/karbon/wmf/wmfimportparser.cpp b/filters/karbon/wmf/wmfimportparser.cpp
new file mode 100644
index 000000000..275490fef
--- /dev/null
+++ b/filters/karbon/wmf/wmfimportparser.cpp
@@ -0,0 +1,371 @@
+/* This file is part of the KDE project
+ * Copyright (c) 2003 thierry lorthiois (lorthioist@wanadoo.fr)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <shapes/vellipse.h>
+#include <shapes/vrectangle.h>
+#include <shapes/vpolygon.h>
+#include <core/vstroke.h>
+#include <core/vfill.h>
+
+#include "wmfimportparser.h"
+
+/*
+bug : see motar.wmf
+*/
+
+WMFImportParser::WMFImportParser() : KoWmfRead() {
+}
+
+
+bool WMFImportParser::play( VDocument& doc )
+{
+ mDoc = &doc;
+ mScaleX = mScaleY = 1;
+
+ // Play the wmf file
+ return KoWmfRead::play( );
+}
+
+
+//-----------------------------------------------------------------------------
+// Virtual Painter
+
+bool WMFImportParser::begin() {
+ TQRect bounding = boundingRect();
+
+ mBackgroundMode = Qt::TransparentMode;
+ mCurrentOrg.setX( bounding.left() );
+ mCurrentOrg.setY( bounding.top() );
+
+ if ( isStandard() ) {
+ mDoc->setUnit( KoUnit::U_PT );
+ mDoc->setWidth( bounding.width() );
+ mDoc->setHeight( bounding.height() );
+ }
+ else {
+ // Placeable Wmf store the boundingRect() in pixel and the default DPI
+ // The placeable format doesn't have informations on witch Unit to use
+ // so we choose millimeters by default
+ mDoc->setUnit( KoUnit::U_MM );
+ mDoc->setWidth( INCH_TO_POINT( (double)bounding.width() / defaultDpi() ) );
+ mDoc->setHeight( INCH_TO_POINT( (double)bounding.height() / defaultDpi() ) );
+ }
+ if ( (bounding.width() != 0) && (bounding.height() != 0) ) {
+ mScaleX = mDoc->width() / (double)bounding.width();
+ mScaleY = mDoc->height() / (double)bounding.height();
+ }
+ return true;
+}
+
+
+bool WMFImportParser::end() {
+ return true;
+}
+
+
+void WMFImportParser::save() {
+}
+
+
+void WMFImportParser::restore() {
+}
+
+
+void WMFImportParser::setFont( const TQFont & ) {
+}
+
+
+void WMFImportParser::setPen( const TQPen &pen ) {
+ mPen = pen;
+}
+
+
+const TQPen &WMFImportParser::pen() const {
+ return mPen;
+}
+
+
+void WMFImportParser::setBrush( const TQBrush &brush ) {
+ mBrush = brush;
+}
+
+
+void WMFImportParser::setBackgroundColor( const TQColor &c ) {
+ mBackgroundColor = c;
+}
+
+
+void WMFImportParser::setBackgroundMode( Qt::BGMode mode ) {
+ mBackgroundMode = mode;
+}
+
+
+void WMFImportParser::setRasterOp( TQt::RasterOp ) {
+}
+
+
+void WMFImportParser::setWindowOrg( int left, int top ) {
+ mCurrentOrg.setX( left );
+ mCurrentOrg.setY( top );
+}
+
+
+void WMFImportParser::setWindowExt( int width, int height ) {
+ // the wmf file can change width/height during the drawing
+ if ( (width != 0) && (height != 0) ) {
+ mScaleX = mDoc->width() / (double)width;
+ mScaleY = mDoc->height() / (double)height;
+ }
+}
+
+
+void WMFImportParser::setWorldMatrix( const TQWMatrix &, bool ) {
+}
+
+
+void WMFImportParser::setClipRegion( const TQRegion & ) {
+}
+
+
+TQRegion WMFImportParser::clipRegion() {
+ return mClippingRegion;
+}
+
+
+void WMFImportParser::moveTo( int left, int top ) {
+ mCurrentPoint.setX( left );
+ mCurrentPoint.setY( top );
+}
+
+
+void WMFImportParser::lineTo( int left, int top ) {
+ VPath *line = new VPath( mDoc );
+ line->moveTo( KoPoint( coordX(mCurrentPoint.x()), coordY(mCurrentPoint.y()) ) );
+ line->lineTo( KoPoint( coordX(left), coordY(top) ) );
+ appendPen( *line );
+
+ mDoc->append( line );
+ mCurrentPoint.setX( left );
+ mCurrentPoint.setY( top );
+}
+
+
+void WMFImportParser::drawRect( int left, int top, int width, int height ) {
+ VRectangle *rectangle;
+
+ rectangle = new VRectangle( mDoc, KoPoint( coordX(left), coordY(top) ), scaleW(width), scaleH(height), 0 );
+ appendPen( *rectangle );
+ appendBrush( *rectangle );
+
+ mDoc->append( rectangle );
+}
+
+
+void WMFImportParser::drawRoundRect( int left, int top, int width, int height, int roudw, int ) {
+ VRectangle *rectangle;
+
+ // TODO : round rectangle
+ rectangle = new VRectangle( mDoc, KoPoint( coordX(left), coordY(top) ), scaleW(width), scaleH(height), roudw );
+ appendPen( *rectangle );
+ appendBrush( *rectangle );
+
+ mDoc->append( rectangle );
+}
+
+
+void WMFImportParser::drawEllipse( int left, int top, int width, int height ) {
+ VEllipse *ellipse;
+
+ ellipse = new VEllipse( mDoc, KoPoint( coordX(left), coordY(top+height) ), scaleW(width), scaleH(height) );
+ appendPen( *ellipse );
+ appendBrush( *ellipse );
+
+ mDoc->append( ellipse );
+}
+
+
+void WMFImportParser::drawArc( int x, int y, int w, int h, int aStart, int aLen ) {
+ double start = (aStart * 180) / 2880.0;
+ double end = (aLen * 180) / 2880.0;
+ end += start;
+ VEllipse::VEllipseType type = VEllipse::arc;
+
+ VEllipse *arc = new VEllipse( mDoc, KoPoint( coordX(x), coordY(y+h) ), scaleW(w), scaleH(h), type, start, end );
+ appendPen( *arc );
+
+ mDoc->append( arc );
+}
+
+
+void WMFImportParser::drawPie( int x, int y, int w, int h, int aStart, int aLen ) {
+ double start = (aStart * 180) / 2880.0;
+ double end = (aLen * 180) / 2880.0;
+ end += start;
+ VEllipse::VEllipseType type = VEllipse::cut;
+
+ VEllipse *arc = new VEllipse( mDoc, KoPoint( coordX(x), coordY(y+h) ), scaleW(w), scaleH(h), type, start, end );
+ appendPen( *arc );
+ appendBrush( *arc );
+
+ mDoc->append( arc );
+}
+
+
+void WMFImportParser::drawChord( int x, int y, int w, int h, int aStart, int aLen ) {
+ double start = (aStart * 180) / 2880.0;
+ double end = (aLen * 180) / 2880.0;
+ end += start;
+ VEllipse::VEllipseType type = VEllipse::section;
+
+ VEllipse *arc = new VEllipse( mDoc, KoPoint( coordX(x), coordY(y+h) ), scaleW(w), scaleH(h), type, start, end );
+ appendPen( *arc );
+ appendBrush( *arc );
+
+ mDoc->append( arc );
+}
+
+
+void WMFImportParser::drawPolyline( const TQPointArray &pa ) {
+ VPath *polyline = new VPath( mDoc );
+ appendPen( *polyline );
+ appendPoints( *polyline, pa );
+
+ mDoc->append( polyline );
+}
+
+
+void WMFImportParser::drawPolygon( const TQPointArray &pa, bool ) {
+ VPath *polygon = new VPath( mDoc );
+ appendPen( *polygon );
+ appendBrush( *polygon );
+ appendPoints( *polygon, pa );
+
+ polygon->close();
+ mDoc->append( polygon );
+}
+
+
+void WMFImportParser::drawPolyPolygon( TQPtrList<TQPointArray>& listPa, bool ) {
+ VPath *path = new VPath( mDoc );
+
+ if ( listPa.count() > 0 ) {
+ appendPen( *path );
+ appendBrush( *path );
+ appendPoints( *path, *listPa.first() );
+ path->close();
+
+ while ( listPa.next() ) {
+ VPath *newPath = new VPath( mDoc );
+ appendPoints( *newPath, *listPa.current() );
+ newPath->close();
+ path->combine( *newPath );
+ }
+
+ mDoc->append( path );
+ }
+}
+
+
+void WMFImportParser::drawImage( int , int , const TQImage &, int , int , int , int ) {}
+
+
+void WMFImportParser::drawText( int , int , int , int , int , const TQString& , double ) {}
+
+
+//-----------------------------------------------------------------------------
+// Utilities
+
+void WMFImportParser::appendPen( VObject& obj )
+{
+ VStroke stroke( mDoc );
+ stroke.setLineCap( VStroke::capRound );
+
+ if ( mPen.style() == TQt::NoPen ) {
+ stroke.setType( VStroke::none );
+ }
+ else {
+ TQValueList<float> dashes;
+ stroke.setType( VStroke::solid );
+ switch ( mPen.style() ) {
+ case TQt::DashLine :
+ stroke.dashPattern().setArray( dashes << MM_TO_POINT(3) << MM_TO_POINT(2) );
+ break;
+ case TQt::DotLine :
+ stroke.dashPattern().setArray( dashes << MM_TO_POINT(1) << MM_TO_POINT(1) );
+ break;
+ case TQt::DashDotLine :
+ stroke.dashPattern().setArray( dashes << MM_TO_POINT(3) << MM_TO_POINT(1) << MM_TO_POINT(1) << MM_TO_POINT(1) );
+ break;
+ case TQt::DashDotDotLine :
+ stroke.dashPattern().setArray( dashes << MM_TO_POINT(3) << MM_TO_POINT(1) << MM_TO_POINT(1) << MM_TO_POINT(1) << MM_TO_POINT(1) << MM_TO_POINT(1) );
+ break;
+ default:
+ break;
+ }
+ }
+ stroke.setColor( TQColor(mPen.color()) );
+ double width = mPen.width() * mScaleX;
+ stroke.setLineWidth( ((width < 0.99) ? 1 : width) );
+ obj.setStroke( stroke );
+}
+
+
+void WMFImportParser::appendBrush( VObject& obj )
+{
+ VFill fill( mBackgroundColor );
+ fill.setColor( TQColor(mBrush.color()) );
+
+ switch ( mBrush.style() ) {
+ case TQt::NoBrush :
+ fill.setType( VFill::none );
+ break;
+ case TQt::SolidPattern :
+ fill.setType( VFill::solid );
+ break;
+ case TQt::CustomPattern :
+ // TODO: bitmap pattern brush
+ fill.setType( VFill::solid );
+ //fill.pattern().
+ break;
+ default :
+ // TODO: pattern brush
+ if ( mBackgroundMode == TQt::OpaqueMode ) {
+ fill.setColor( mBackgroundColor );
+ fill.setType( VFill::solid );
+ }
+ else {
+ fill.setType( VFill::none );
+ }
+ break;
+ }
+ obj.setFill( fill );
+}
+
+
+void WMFImportParser::appendPoints(VPath &path, const TQPointArray& pa)
+{
+ // list of point array
+ if ( pa.size() > 0 ) {
+ path.moveTo( KoPoint( coordX(pa.point(0).x()), coordY(pa.point(0).y()) ) );
+ }
+ for ( uint i=1 ; i < pa.size() ; i++ ) {
+ path.lineTo( KoPoint( coordX(pa.point(i).x()), coordY(pa.point(i).y()) ) );
+ }
+}
+