summaryrefslogtreecommitdiffstats
path: root/karbon/core/vstroke.cc
diff options
context:
space:
mode:
Diffstat (limited to 'karbon/core/vstroke.cc')
-rw-r--r--karbon/core/vstroke.cc265
1 files changed, 265 insertions, 0 deletions
diff --git a/karbon/core/vstroke.cc b/karbon/core/vstroke.cc
new file mode 100644
index 00000000..b7431be5
--- /dev/null
+++ b/karbon/core/vstroke.cc
@@ -0,0 +1,265 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001, The Karbon Developers
+ Copyright (C) 2002, The Karbon Developers
+
+ 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 <qdom.h>
+
+#include <KoGenStyles.h>
+#include <KoStyleStack.h>
+#include <KoUnit.h>
+#include <KoXmlNS.h>
+
+#include "vobject.h"
+#include "vstroke.h"
+#include <kdebug.h>
+
+VStroke::VStroke()
+: m_parent(0L), m_lineWidth(1.0), m_lineCap(capButt), m_lineJoin(joinMiter), m_miterLimit(10.0), m_type(none)
+{}
+
+VStroke::VStroke( VObject* parent, float width, const VLineCap cap, const VLineJoin join,
+ float miterLimit )
+{
+ m_parent = parent;
+ m_type = solid;
+ m_lineWidth = width;
+ m_lineCap = cap;
+ m_lineJoin = join;
+ m_miterLimit = miterLimit;
+}
+
+VStroke::VStroke( const VColor &c, VObject* parent, float width, const VLineCap cap, const VLineJoin join,
+ float miterLimit )
+{
+ m_parent = parent;
+ m_type = solid;
+ m_lineWidth = width;
+ m_lineCap = cap;
+ m_lineJoin = join;
+ m_miterLimit = miterLimit;
+ m_color = c;
+}
+
+VStroke::VStroke( const VStroke& stroke )
+{
+ // doesn't copy parent:
+ *this = stroke;
+}
+
+void
+VStroke::setLineWidth( float width )
+{
+ m_lineWidth = width;
+
+ // tell our parent so he can update his bbox:
+ if( m_parent )
+ m_parent->invalidateBoundingBox();
+}
+
+void
+VStroke::save( QDomElement& element ) const
+{
+ QDomElement me = element.ownerDocument().createElement( "STROKE" );
+ element.appendChild( me );
+
+ // save stroke parameters:
+ if( m_lineWidth != 1.0 )
+ me.setAttribute( "lineWidth", m_lineWidth );
+ if( !( m_lineCap == capButt ) )
+ me.setAttribute( "lineCap", m_lineCap );
+ if( !( m_lineJoin == joinMiter ) )
+ me.setAttribute( "lineJoin", m_lineJoin );
+ if( m_miterLimit != 10.0 )
+ me.setAttribute( "miterLimit", m_miterLimit );
+
+ if( m_type == solid )
+ {
+ // save color:
+ m_color.save( me );
+ }
+ else if( m_type == grad )
+ {
+ // save gradient:
+ m_gradient.save( me );
+ }
+ else if( m_type == patt )
+ {
+ // save pattern:
+ m_pattern.save( me );
+ }
+
+ // save dashpattern:
+ m_dashPattern.save( me );
+}
+
+void
+VStroke::saveOasis( KoGenStyle &style ) const
+{
+ if( m_type == solid )
+ {
+ style.addProperty( "draw:stroke", "solid" );
+ style.addProperty( "svg:stroke-color", QColor( m_color ).name() );
+ style.addPropertyPt( "svg:stroke-width", m_lineWidth );
+ if( m_color.opacity() < 1 )
+ style.addProperty( "svg:stroke-opacity", QString( "%1%" ).arg( m_color.opacity() * 100. ) );
+ }
+ else if( m_type == none )
+ style.addProperty( "draw:stroke", "none" );
+ /*else if( m_type == grad )
+ style.addProperty( "draw:stroke", "gradient" );
+ else if( m_type == patt )
+ style.addProperty( "draw:stroke", "hatch" );*/
+
+ if( m_lineJoin == joinRound )
+ style.addProperty( "draw:stroke-linejoin", "round" );
+ else if( m_lineJoin == joinBevel )
+ style.addProperty( "draw:stroke-linejoin", "bevel" );
+ else if( m_lineJoin == joinMiter )
+ style.addProperty( "draw:stroke-linejoin", "miter" );
+}
+
+void
+VStroke::loadOasis( const KoStyleStack &stack )
+{
+ if( stack.hasAttributeNS( KoXmlNS::draw, "stroke" ))
+ {
+ if( stack.attributeNS( KoXmlNS::draw, "stroke" ) == "solid" )
+ {
+ setType( VStroke::solid );
+ setColor( QColor( stack.attributeNS( KoXmlNS::svg, "stroke-color" ) ) );
+ if( stack.hasAttributeNS( KoXmlNS::svg, "stroke-opacity" ) )
+ m_color.setOpacity( stack.attributeNS( KoXmlNS::svg, "stroke-opacity" ).remove( '%' ).toFloat() / 100. );
+ QString join = stack.attributeNS( KoXmlNS::draw, "stroke-linejoin" );
+ if( !join.isEmpty() )
+ {
+ if( join == "round" )
+ m_lineJoin = joinRound;
+ else if( join == "bevel" )
+ m_lineJoin = joinBevel;
+ else
+ m_lineJoin = joinMiter;
+ }
+ }
+ else if( stack.attributeNS( KoXmlNS::draw, "stroke" ) == "none" )
+ setType( VStroke::none );
+ }
+ if( stack.hasAttributeNS( KoXmlNS::svg, "stroke-width" ) )
+ m_lineWidth = KoUnit::parseValue( stack.attributeNS( KoXmlNS::svg, "stroke-width" ) );
+ if( m_lineWidth < 0.0 )
+ m_lineWidth = 0.0;
+}
+
+void
+VStroke::load( const QDomElement& element )
+{
+ m_type = none;
+ // load stroke parameters:
+ m_lineWidth = element.attribute( "lineWidth", "1.0" ).toDouble();
+ if( m_lineWidth < 0.0 )
+ m_lineWidth = 0.0;
+
+ switch( element.attribute( "lineCap", "0" ).toUShort() )
+ {
+ case 1:
+ m_lineCap = capRound; break;
+ case 2:
+ m_lineCap = capSquare; break;
+ default:
+ m_lineCap = capButt;
+ }
+
+ switch( element.attribute( "lineJoin", "0" ).toUShort() )
+ {
+ case 1:
+ m_lineJoin = joinRound; break;
+ case 2:
+ m_lineJoin = joinBevel; break;
+ default:
+ m_lineJoin = joinMiter;
+ }
+
+ m_miterLimit = element.attribute( "miterLimit", "10.0" ).toDouble();
+ if( m_miterLimit < 0.0 )
+ m_miterLimit = 0.0;
+
+
+ // load color:
+ QDomNodeList list = element.childNodes();
+ for( uint i = 0; i < list.count(); ++i )
+ {
+ if( list.item( i ).isElement() )
+ {
+ QDomElement e = list.item( i ).toElement();
+ if( e.tagName() == "COLOR" )
+ {
+ m_color.load( e );
+ m_type = solid;
+ }
+ else if( e.tagName() == "DASHPATTERN" )
+ {
+ m_dashPattern.load( e );
+ }
+ else if( e.tagName() == "GRADIENT" )
+ {
+ m_type = grad;
+ m_gradient.load( e );
+ }
+ else if( e.tagName() == "PATTERN" )
+ {
+ m_type = patt;
+ m_pattern.load( e );
+ }
+ }
+ }
+}
+
+
+VStroke&
+VStroke::operator=( const VStroke& stroke )
+{
+ if( this != &stroke )
+ {
+ // dont copy the parent!
+ m_type = stroke.m_type;
+
+ m_lineWidth = stroke.m_lineWidth;
+ // Tell our parent about the linewidth change, so he can update his bbox:
+ //if( m_parent )
+ // m_parent->invalidateBoundingBox();
+
+ m_lineCap = stroke.m_lineCap;
+ m_lineJoin = stroke.m_lineJoin;
+ m_miterLimit = stroke.m_miterLimit;
+ m_color = stroke.m_color;
+ m_dashPattern = stroke.m_dashPattern;
+ m_gradient = stroke.m_gradient;
+ m_pattern = stroke.m_pattern;
+ }
+
+ return *this;
+}
+
+void
+VStroke::transform( const QWMatrix& m )
+{
+ if( type() == VStroke::grad )
+ gradient().transform( m );
+ else if( type() == VStroke::patt )
+ pattern().transform( m );
+}