21#include "KPrClosedLineObject.h"
22#include "KPrPointObject.h"
23#include "KPrGradient.h"
24#include "KPrSVGPathParser.h"
25#include <KoTextZoomHandler.h>
33#include <KoOasisContext.h>
41KPrClosedLineObject::KPrClosedLineObject()
46KPrClosedLineObject::KPrClosedLineObject(
const KoPointArray &_points,
const KoSize &_size,
const KoPen &_pen,
const TQBrush &_brush,
47 FillType _fillType,
const TQColor &_gColor1,
const TQColor &_gColor2, BCType _gType,
48 bool _unbalanced,
int _xfactor,
int _yfactor,
const TQString _typeString )
49 : KPr2DObject( _pen, _brush, _fillType, _gColor1, _gColor2, _gType, _unbalanced, _xfactor, _yfactor )
51 points = KoPointArray( _points );
53 typeString = _typeString;
56KPrClosedLineObject::KPrClosedLineObject(
const KPrPointObject &
object )
57: KPr2DObject( object.getPen(), TQt::NoBrush, FT_BRUSH, TQColor(), TQColor(), BCT_PLAIN, false, 0, 0 )
59 ext =
object.getSize();
60 orig =
object.getOrig();
61 objectName =
object.getObjectName();
62 points =
object.getPoints().copy();
63 points.putPoints( points.count(), 1, points.at( 0 ).x(), points.at( 0 ).y() );
64 switch (
object.getType() )
67 typeString = i18n(
"Closed Freehand" );
70 typeString = i18n(
"Closed Polyline" );
72 case OT_CUBICBEZIERCURVE:
73 typeString = i18n(
"Closed Cubic Bezier Curve" );
75 case OT_QUADRICBEZIERCURVE:
76 typeString = i18n(
"Closed Quadric Bezier Curve" );
84KPrClosedLineObject &KPrClosedLineObject::operator=(
const KPrClosedLineObject & )
90DCOPObject* KPrClosedLineObject::dcopObject()
93 dcop =
new KPClosedLineObjectIface(
this );
98TQDomDocumentFragment KPrClosedLineObject::save( TQDomDocument& doc,
double offset )
100 TQDomDocumentFragment fragment = KPr2DObject::save( doc, offset );
102 TQDomElement elemObjectsName = doc.createElement(
"OBJECTSNAME" );
104 elemObjectsName.setAttribute(
"NAME", typeString );
106 fragment.appendChild( elemObjectsName );
108 if ( !points.isNull() ) {
109 TQDomElement elemPoints = doc.createElement(
"POINTS" );
110 KoPointArray::ConstIterator it;
111 for ( it = points.begin(); it != points.end(); ++it ) {
112 TQDomElement elemPoint = doc.createElement(
"Point" );
113 KoPoint point = (*it);
114 elemPoint.setAttribute(
"point_x", point.x() );
115 elemPoint.setAttribute(
"point_y", point.y() );
117 elemPoints.appendChild( elemPoint );
119 fragment.appendChild( elemPoints );
125bool KPrClosedLineObject::saveOasisObjectAttributes( KPOasisSaveContext &sc )
const
131const char * KPrClosedLineObject::getOasisElementName()
const
133 return "draw:polygon";
137double KPrClosedLineObject::load(
const TQDomElement &element )
139 double offset = KPr2DObject::load( element );
141 TQDomElement e = element.namedItem(
"OBJECTSNAME" ).toElement();
143 if ( e.hasAttribute(
"NAME" ) )
144 typeString = e.attribute(
"NAME" );
147 e = element.namedItem(
"POINTS" ).toElement();
149 TQDomElement elemPoint = e.firstChild().toElement();
150 unsigned int index = 0;
151 while ( !elemPoint.isNull() ) {
152 if ( elemPoint.tagName() ==
"Point" ) {
155 if( elemPoint.hasAttribute(
"point_x" ) )
156 tmpX = elemPoint.attribute(
"point_x" ).toDouble();
157 if( elemPoint.hasAttribute(
"point_y" ) )
158 tmpY = elemPoint.attribute(
"point_y" ).toDouble();
160 points.putPoints( index, 1, tmpX,tmpY );
162 elemPoint = elemPoint.nextSibling().toElement();
169void KPrClosedLineObject::setSize(
double _width,
double _height )
171 KoSize origSize( ext );
172 KPrObject::setSize( _width, _height );
174 double fx = ext.width() / origSize.width();
175 double fy = ext.height() / origSize.height();
177 updatePoints( fx, fy );
180void KPrClosedLineObject::updatePoints(
double _fx,
double _fy )
183 KoPointArray tmpPoints;
184 KoPointArray::ConstIterator it;
185 for ( it = points.begin(); it != points.end(); ++it ) {
186 KoPoint point = (*it);
187 double tmpX = point.x() * _fx;
188 double tmpY = point.y() * _fy;
190 tmpPoints.putPoints( index, 1, tmpX,tmpY );
196void KPrClosedLineObject::paint( TQPainter* _painter,KoTextZoomHandler*_zoomHandler,
197 int ,
bool drawingShadow,
bool drawContour )
199 int _w = ( pen.style() == TQt::NoPen ) ? 1 : int( pen.pointWidth() );
202 TQPointArray pointArray2 = points.zoomPointArray( _zoomHandler );
203 TQPen pen3( TQt::black, 1, TQt::DotLine );
204 _painter->setPen( pen3 );
205 _painter->setRasterOp( TQt::NotXorROP );
206 _painter->drawPolygon( pointArray2 );
210 TQPointArray pointArray = points.zoomPointArray( _zoomHandler, _w );
211 TQPen pen2 = pen.zoomedPen( _zoomHandler );
213 if ( drawingShadow || getFillType() == FT_BRUSH || !gradient ) {
214 _painter->setPen( pen2 );
215 _painter->setBrush( getBrush() );
216 _painter->drawPolygon( pointArray );
219 TQSize size( _zoomHandler->zoomSize( ext ) );
220 if ( m_redrawGradientPix || gradient->size() != size )
222 m_redrawGradientPix =
false;
223 gradient->setSize( size );
224 TQRegion clipregion( pointArray );
225 m_gradientPix.resize( size );
226 m_gradientPix.fill( TQt::white );
229 p.begin( &m_gradientPix );
230 p.setClipRegion( clipregion );
231 p.drawPixmap( 0, 0, gradient->pixmap() );
234 m_gradientPix.setMask( m_gradientPix.createHeuristicMask() );
237 TQRect _rect = pointArray.boundingRect();
238 _painter->drawPixmap( 0, 0, m_gradientPix, 0, 0, _rect.width(), _rect.height() );
240 _painter->setPen( pen2 );
241 _painter->setBrush( TQt::NoBrush );
242 _painter->drawPolygon( pointArray );
246void KPrClosedLineObject::flip(
bool horizontal )
248 KPr2DObject::flip( horizontal );
250 KoPointArray tmpPoints;
254 KoPointArray::ConstIterator it;
255 double horiz = getSize().height()/2;
256 for ( it = points.begin(); it != points.end(); ++it ) {
257 KoPoint point = (*it);
258 if ( point.y()> horiz )
259 tmpPoints.putPoints( index, 1, point.x(),point.y()- 2*(point.y()-horiz) );
261 tmpPoints.putPoints( index, 1, point.x(),point.y()+ 2*(horiz - point.y()) );
267 KoPointArray::ConstIterator it;
268 double vert = getSize().width()/2;
269 for ( it = points.begin(); it != points.end(); ++it ) {
270 KoPoint point = (*it);
271 if ( point.x()> vert )
272 tmpPoints.putPoints( index, 1, point.x()- 2*(point.x()-vert), point.y() );
274 tmpPoints.putPoints( index, 1, point.x()+ 2*(vert - point.x()),point.y() );
281void KPrClosedLineObject::loadOasis(
const TQDomElement &element, KoOasisContext & context,
KPrLoadingInfo *info )
283 kdDebug()<<
"void KPrClosedLineObject::loadOasis( const TQDomElement &element )***********\n";
284 KPr2DObject::loadOasis( element,context, info );
285 TQString tag( element.tagName() );
286 if ( tag ==
"polygon" )
290 else if ( tag ==
"path" )
292 TQString d = element.attributeNS( KoXmlNS::svg,
"d", TQString());
293 kdDebug(33001) <<
"path d: " << d << endl;
295 KPrSVGPathParser parser;
296 points = parser.getPoints( d,
true );
299 else if ( tag ==
"custom-shape" )
301 TQDomElement enhancedGeometry = KoDom::namedItemNS( element, KoXmlNS::draw,
"enhanced-geometry" );
303 if ( !enhancedGeometry.isNull() )
305 TQString d = enhancedGeometry.attributeNS( KoXmlNS::draw,
"enhanced-path", TQString() );
306 TQRegExp rx(
"^([0-9 MLZ]+)N$" );
307 if ( rx.search( d ) != -1 )
310 kdDebug(33001) <<
"enhanced-path d: " << d << endl;
312 KPrSVGPathParser parser;
313 points = parser.getPoints( d,
true );
320 kdDebug(33001) <<
"KPrClosedLineObject::loadOasis unsupported tag" << endl;
324KoSize KPrClosedLineObject::getRealSize()
const {
326 KoPoint realOrig( orig );
327 KoPointArray p( points );
328 getRealSizeAndOrigFromPoints( p, angle, size, realOrig );
332KoPoint KPrClosedLineObject::getRealOrig()
const {
334 KoPoint realOrig( orig );
335 KoPointArray p( points );
336 getRealSizeAndOrigFromPoints( p, angle, size, realOrig );
Temporary information used only during loading.
bool loadOasisDrawPoints(KoPointArray &points, const TQDomElement &element, KoOasisContext &context, KPrLoadingInfo *info)
Helper method for loading draw:points.
bool loadOasisApplyViewBox(const TQDomElement &element, KoPointArray &points)
Apply the svg:viewBox attribute to the points.
static bool saveOasisDrawPoints(const KoPointArray &points, KPOasisSaveContext &sc)
Helper method for saving draw:points.