diff options
Diffstat (limited to 'kpresenter/KPrPointObject.cpp')
-rw-r--r-- | kpresenter/KPrPointObject.cpp | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/kpresenter/KPrPointObject.cpp b/kpresenter/KPrPointObject.cpp new file mode 100644 index 00000000..5295228b --- /dev/null +++ b/kpresenter/KPrPointObject.cpp @@ -0,0 +1,276 @@ +// -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*- +/* This file is part of the KDE project + Copyright (C) 2004-2005 Thorsten Zachmann <zachmann@kde.org> + + 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; 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 "KPrPointObject.h" +#include "KPrUtils.h" +#include "KPrDocument.h" +#include "KPrSVGPathParser.h" +#include <KoTextZoomHandler.h> +#include <KoUnit.h> +#include <qdom.h> +#include <qpainter.h> +#include <KoStyleStack.h> +#include <KoOasisContext.h> +#include <KoXmlNS.h> + +KPrPointObject::KPrPointObject() + : KPrShadowObject(), KPrStartEndLine( L_NORMAL, L_NORMAL ) +{ +} + + +KPrPointObject::KPrPointObject( const KoPen &_pen, LineEnd _lineBegin, LineEnd _lineEnd ) + : KPrShadowObject( _pen ), KPrStartEndLine(_lineBegin, _lineEnd) +{ +} + + +KoSize KPrPointObject::getRealSize() const +{ + KoSize size( ext ); + KoPoint realOrig( orig ); + KoPointArray p( getDrawingPoints() ); + getRealSizeAndOrigFromPoints( p, angle, size, realOrig ); + return size; +} + + +KoPoint KPrPointObject::getRealOrig() const +{ + KoSize size( ext ); + KoPoint realOrig( orig ); + KoPointArray p( getDrawingPoints() ); + getRealSizeAndOrigFromPoints( p, angle, size, realOrig ); + return realOrig; +} + + +void KPrPointObject::loadOasis( const QDomElement &element, KoOasisContext & context, KPrLoadingInfo* info ) +{ + kdDebug(33001) << "KPrPointObject::loadOasis" << endl; + + KPrShadowObject::loadOasis( element, context, info ); + QString d = element.attributeNS( KoXmlNS::svg, "d", QString::null); + kdDebug(33001) << "path d: " << d << endl; + + KPrSVGPathParser parser; + points = parser.getPoints( d, getType() == OT_FREEHAND ); + loadOasisApplyViewBox( element, points ); +} + + +QDomDocumentFragment KPrPointObject::save( QDomDocument& doc, double offset ) +{ + QDomDocumentFragment fragment = KPrShadowObject::save( doc, offset ); + if ( !points.isNull() ) { + QDomElement elemPoints = doc.createElement( "POINTS" ); + KoPointArray::ConstIterator it; + for ( it = points.begin(); it != points.end(); ++it ) { + QDomElement elemPoint = doc.createElement( "Point" ); + KoPoint point = (*it); + elemPoint.setAttribute( "point_x", point.x() ); + elemPoint.setAttribute( "point_y", point.y() ); + + elemPoints.appendChild( elemPoint ); + } + fragment.appendChild( elemPoints ); + } + + KPrStartEndLine::save( fragment,doc ); + + return fragment; +} + +const char * KPrPointObject::getOasisElementName() const +{ + return "draw:custom-shape"; +} + +void KPrPointObject::loadOasisMarker( KoOasisContext & context ) +{ + loadOasisMarkerElement( context, "marker-start", lineBegin ); + loadOasisMarkerElement( context, "marker-end", lineEnd ); +} + +void KPrPointObject::fillStyle( KoGenStyle& styleObjectAuto, KoGenStyles& mainStyles ) const +{ + KPrShadowObject::fillStyle( styleObjectAuto, mainStyles ); + saveOasisMarkerElement( mainStyles, styleObjectAuto ); +} + + +double KPrPointObject::load( const QDomElement &element ) +{ + double offset = KPrShadowObject::load( element ); + + QDomElement e = element.namedItem( "POINTS" ).toElement(); + if ( !e.isNull() ) { + QDomElement elemPoint = e.firstChild().toElement(); + unsigned int index = 0; + while ( !elemPoint.isNull() ) { + if ( elemPoint.tagName() == "Point" ) { + double tmpX = 0; + double tmpY = 0; + if( elemPoint.hasAttribute( "point_x" ) ) + tmpX = elemPoint.attribute( "point_x" ).toDouble(); + if( elemPoint.hasAttribute( "point_y" ) ) + tmpY = elemPoint.attribute( "point_y" ).toDouble(); + + points.putPoints( index, 1, tmpX,tmpY ); + } + elemPoint = elemPoint.nextSibling().toElement(); + ++index; + } + } + KPrStartEndLine::load( element ); + return offset; +} + + +void KPrPointObject::setSize( double _width, double _height ) +{ + KoSize origSize( ext ); + KPrObject::setSize( _width, _height ); + + double fx = ext.width() / origSize.width(); + double fy = ext.height() / origSize.height(); + + updatePoints( fx, fy ); +} + + +void KPrPointObject::flip( bool horizontal ) +{ + KPrObject::flip( horizontal ); + + KoPointArray tmpPoints; + int index = 0; + if ( ! horizontal ) + { + KoPointArray::ConstIterator it; + double horiz = getSize().height()/2; + for ( it = points.begin(); it != points.end(); ++it ) { + KoPoint point = (*it); + if ( point.y()> horiz ) + tmpPoints.putPoints( index, 1, point.x(),point.y()- 2*(point.y()-horiz) ); + else + tmpPoints.putPoints( index, 1, point.x(),point.y()+ 2*(horiz - point.y()) ); + ++index; + } + } + else + { + KoPointArray::ConstIterator it; + double vert = getSize().width()/2; + for ( it = points.begin(); it != points.end(); ++it ) { + KoPoint point = (*it); + if ( point.x()> vert ) + tmpPoints.putPoints( index, 1, point.x()- 2*(point.x()-vert), point.y() ); + else + tmpPoints.putPoints( index, 1, point.x()+ 2*(vert - point.x()),point.y() ); + ++index; + } + } + + points = tmpPoints; +} + + +void KPrPointObject::paint( QPainter* _painter, KoTextZoomHandler*_zoomHandler, + int /* pageNum */, bool /*drawingShadow*/, bool drawContour ) +{ + int _w = int( pen.pointWidth() ); + + QPen pen2; + if ( drawContour ) { + pen2 = QPen( Qt::black, 1, Qt::DotLine ); + _painter->setRasterOp( Qt::NotXorROP ); + } + else { + pen2 = pen.zoomedPen( _zoomHandler ); + } + _painter->setPen( pen2 ); + + QPointArray pointArray = getDrawingPoints().zoomPointArray( _zoomHandler, _w ); + _painter->drawPolyline( pointArray ); + + if ( lineBegin != L_NORMAL && !drawContour ) { + QPoint startPoint; + bool first = true; + QPointArray::ConstIterator it1; + for ( it1 = pointArray.begin(); it1 != pointArray.end(); ++it1 ) { + if ( first ) { + startPoint = (*it1); + first = false; + } + + QPoint point = (*it1); + if ( startPoint != point ) { + float angle = KoPoint::getAngle( KoPoint( startPoint ), KoPoint( point ) ); + drawFigureWithOffset( lineBegin, _painter, startPoint, pen2.color(), _w, angle,_zoomHandler ); + + break; + } + } + } + + if ( lineEnd != L_NORMAL && !drawContour ) { + QPoint endPoint; + bool last = true; + QPointArray::ConstIterator it2 = pointArray.end(); + for ( it2 = it2 - 1; it2 != pointArray.begin(); --it2 ) { + if ( last ) { + endPoint = (*it2); + last = false; + } + + QPoint point = (*it2); + if ( endPoint != point ) { + float angle = KoPoint::getAngle( KoPoint( endPoint ), KoPoint( point ) ); + drawFigureWithOffset( lineEnd, _painter, endPoint, pen2.color(), _w, angle,_zoomHandler ); + + break; + } + } + } +} + + +void KPrPointObject::updatePoints( double _fx, double _fy ) +{ + int index = 0; + KoPointArray tmpPoints; + KoPointArray::ConstIterator it; + for ( it = points.begin(); it != points.end(); ++it ) { + KoPoint point = (*it); + double tmpX = point.x() * _fx; + double tmpY = point.y() * _fy; + + tmpPoints.putPoints( index, 1, tmpX,tmpY ); + ++index; + } + points = tmpPoints; +} + + +KoPointArray KPrPointObject::getDrawingPoints() const +{ + return points; +} |