19#include "kivioglobal.h"
20#include "kivio_line_style.h"
21#include "kivio_point.h"
22#include "kivio_screen_painter.h"
27#include <tqsimplerichtext.h>
32#define PAINTER_CHECK() { if(!m_pPainter) { kdDebug(43000) << "KivioScreenPainter::PAINTER_CHECK() - no TQPainter exists." << endl; } }
35KivioScreenPainter::KivioScreenPainter()
43KivioScreenPainter::KivioScreenPainter(TQPainter* painter)
51KivioScreenPainter::~KivioScreenPainter()
55 kdDebug(43000) <<
"KivioScreenPainter::~KivioScreenPainter - A TQPainter slipped through the cracks" << endl;
70bool KivioScreenPainter::start( TQPaintDevice *dev )
75 kdDebug(43000) <<
"KivioScreenPainter::start() - A TQPainter already exists" << endl;
80 m_pPainter =
new TQPainter(dev);
92bool KivioScreenPainter::stop()
98 kdDebug(43000) <<
"KivioScreenPainter::stop() called without previous call to start" << endl;
122void KivioScreenPainter::drawLine(
float x1,
float y1,
float x2,
float y2 )
126 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
128 m_pPainter->drawLine(
int(x1),
int(y1),
int(x2),
int(y2) );
145void KivioScreenPainter::drawArc(
float x1,
float y1,
float w1,
float h1,
float a1,
float a2 )
149 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
151 m_pPainter->drawArc(
int(x1),
int(y1),
int(w1),
int(h1),
int(a1),
int(a2) );
163void KivioScreenPainter::drawBezier( TQPointArray &pArray )
167 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
169 m_pPainter->drawCubicBezier(pArray);
181void KivioScreenPainter::drawRect(
float x1,
float y1,
float w1,
float h1 )
185 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
186 m_pPainter->setBrush(TQBrush::NoBrush);
187 m_pPainter->drawRect(
int(x1),
int(y1),
int(w1),
int(h1) );
202void KivioScreenPainter::fillRect(
float x1,
float y1,
float w1,
float h1 )
207 b = m_pFillStyle->brush();
209 if(m_pFillStyle->colorStyle() == KivioFillStyle::kcsGradient) {
210 TQPixmap pix((
int)w1, (
int)h1);
211 TQImage image = KImageEffect::gradient(pix.size(), m_pFillStyle->color(), m_pFillStyle->color2(),
212 (KImageEffect::GradientType) m_pFillStyle->gradientType());
213 pix.convertFromImage(image);
215 m_pPainter->setBrushOrigin(
int(x1 + m_transX),
int(y1 + m_transY));
218 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
219 m_pPainter->setBrush(b);
220 m_pPainter->drawRect(
int(x1),
int(y1),
int(w1),
int(h1) );
221 m_pPainter->setBrushOrigin(0, 0);
238void KivioScreenPainter::drawRoundRect(
float x1,
float y1,
float w1,
float h1,
float a1,
float a2 )
242 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
243 m_pPainter->setBrush(TQBrush::NoBrush);
244 m_pPainter->drawRoundRect(
int(x1),
int(y1),
int(w1),
int(h1),
int(a1),
int(a2) );
262void KivioScreenPainter::fillRoundRect(
float x1,
float y1,
float w1,
float h1,
float a1,
float a2 )
267 b = m_pFillStyle->brush();
269 if(m_pFillStyle->colorStyle() == KivioFillStyle::kcsGradient) {
270 TQPixmap pix((
int)w1, (
int)h1);
271 TQImage image = KImageEffect::gradient(pix.size(), m_pFillStyle->color(), m_pFillStyle->color2(),
272 (KImageEffect::GradientType) m_pFillStyle->gradientType());
273 pix.convertFromImage(image);
275 m_pPainter->setBrushOrigin(
int(x1 + m_transX),
int(y1 + m_transY));
278 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
279 m_pPainter->setBrush(b);
280 m_pPainter->drawRoundRect(
int(x1),
int(y1),
int(w1),
int(h1),
int(a1),
int(a2) );
281 m_pPainter->setBrushOrigin(0, 0);
298void KivioScreenPainter::drawPie(
float x1,
float y1,
float w1,
float h1,
float a1,
float a2 )
302 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
303 m_pPainter->setBrush(TQBrush::NoBrush);
304 m_pPainter->drawPie(
int(x1),
int(y1),
int(w1),
int(h1),
int(a1),
int(a2) );
321void KivioScreenPainter::fillPie(
float x1,
float y1,
float w1,
float h1,
float a1,
float a2 )
326 b = m_pFillStyle->brush();
328 if(m_pFillStyle->colorStyle() == KivioFillStyle::kcsGradient) {
329 TQPixmap pix((
int)w1, (
int)h1);
330 TQImage image = KImageEffect::gradient(pix.size(), m_pFillStyle->color(), m_pFillStyle->color2(),
331 (KImageEffect::GradientType) m_pFillStyle->gradientType());
332 pix.convertFromImage(image);
334 m_pPainter->setBrushOrigin(
int(x1 + m_transX),
int(y1 + m_transY));
337 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
338 m_pPainter->setBrush(b);
339 m_pPainter->drawPie(
int(x1),
int(y1),
int(w1),
int(h1),
int(a1),
int(a2) );
340 m_pPainter->setBrushOrigin(0, 0);
357void KivioScreenPainter::drawChord(
float x1,
float y1,
float w1,
float h1,
float a1,
float a2 )
361 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
362 m_pPainter->setBrush(TQBrush::NoBrush);
363 m_pPainter->drawChord(
int(x1),
int(y1),
int(w1),
int(h1),
int(a1),
int(a2) );
380void KivioScreenPainter::fillChord(
float x1,
float y1,
float w1,
float h1,
float a1,
float a2 )
385 b = m_pFillStyle->brush();
387 if(m_pFillStyle->colorStyle() == KivioFillStyle::kcsGradient) {
388 TQPixmap pix((
int)w1, (
int)h1);
389 TQImage image = KImageEffect::gradient(pix.size(), m_pFillStyle->color(),
390 m_pFillStyle->color2(), m_pFillStyle->gradientType());
391 pix.convertFromImage(image);
393 m_pPainter->setBrushOrigin(
int(x1 + m_transX),
int(y1 + m_transY));
396 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
397 m_pPainter->setBrush(b);
398 m_pPainter->drawChord(
int(x1),
int(y1),
int(w1),
int(h1),
int(a1),
int(a2) );
399 m_pPainter->setBrushOrigin(0, 0);
414void KivioScreenPainter::drawEllipse(
float x1,
float y1,
float w1,
float h1 )
418 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
419 m_pPainter->setBrush(TQBrush::NoBrush);
420 m_pPainter->drawEllipse(
int(x1),
int(y1),
int(w1),
int(h1) );
435void KivioScreenPainter::fillEllipse(
float x1,
float y1,
float w1,
float h1 )
440 b = m_pFillStyle->brush();
442 if(m_pFillStyle->colorStyle() == KivioFillStyle::kcsGradient) {
443 TQPixmap pix((
int)w1, (
int)h1);
444 TQImage image = KImageEffect::gradient(pix.size(), m_pFillStyle->color(), m_pFillStyle->color2(),
445 (KImageEffect::GradientType) m_pFillStyle->gradientType());
446 pix.convertFromImage(image);
448 m_pPainter->setBrushOrigin(
int(x1 + m_transX),
int(y1 + m_transY));
451 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
452 m_pPainter->setBrush(b);
453 m_pPainter->drawEllipse(
int(x1),
int(y1),
int(w1),
int(h1) );
454 m_pPainter->setBrushOrigin(0, 0);
466void KivioScreenPainter::drawLineArray( TQPtrList<KivioPoint> *pList )
471 TQPointArray points(pList->count());
475 b.setStyle( TQt::NoBrush );
478 pPoint = pList->first();
481 points.setPoint( i++,
int(pPoint->x()),
int(pPoint->y()) );
483 pPoint = pList->next();
486 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
487 m_pPainter->setBrush(b);
489 m_pPainter->drawLineSegments(points);
500void KivioScreenPainter::drawPolyline( TQPtrList<KivioPoint> *pList )
505 TQPointArray points( pList->count() );
507 pPoint = pList->first();
511 points.setPoint(i++,
int(pPoint->x()),
int(pPoint->y()) );
512 pPoint = pList->next();
515 drawPolyline(points);
527void KivioScreenPainter::drawPolygon( TQPtrList<KivioPoint> *pList )
532 TQPointArray points( pList->count() );
534 pPoint = pList->first();
538 points.setPoint(i++,
int(pPoint->x()),
int(pPoint->y()) );
539 pPoint = pList->next();
545void KivioScreenPainter::drawPolyline( TQPointArray &pArray )
549 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
550 m_pPainter->setBrush( TQBrush::NoBrush );
552 m_pPainter->drawPolyline( pArray, 0, pArray.size() );
555void KivioScreenPainter::drawPolygon( TQPointArray &pArray )
560 b = m_pFillStyle->brush();
562 if(m_pFillStyle->colorStyle() == KivioFillStyle::kcsGradient) {
568 for(
unsigned int i = 0; i < pArray.count(); i++) {
569 x1 = TQMIN(x1, pArray[i].x());
570 y1 = TQMIN(y1, pArray[i].y());
571 w1 = TQMAX(w1, pArray[i].x());
572 h1 = TQMAX(h1, pArray[i].y());
578 TQPixmap pix(w1, h1);
579 TQImage image = KImageEffect::gradient(pix.size(), m_pFillStyle->color(), m_pFillStyle->color2(),
580 (KImageEffect::GradientType) m_pFillStyle->gradientType());
581 pix.convertFromImage(image);
583 m_pPainter->setBrushOrigin(x1 + (
int)m_transX, y1 + (
int)m_transY);
586 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
587 m_pPainter->setBrush(b);
589 m_pPainter->drawPolygon( pArray,
true );
590 m_pPainter->setBrushOrigin(0, 0);
593void KivioScreenPainter::drawLineArray( TQPointArray &pArray )
597 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
598 m_pPainter->setBrush(TQBrush::NoBrush);
600 m_pPainter->drawLineSegments(pArray);
612void KivioScreenPainter::drawClosedPath( TQPtrList<KivioPoint> *pPoints )
618 KivioPoint *pPoint, *pPoint2, *pPoint3, *pPoint4;
619 TQPtrList <KivioPoint> *pPointList = pPoints;
620 TQPointArray controlPoints(4), bPoints(0), tmpPoints;
623 pPoint = pPointList->first();
626 if( pPoint->pointType() == KivioPoint::kptNormal )
628 bPoints.putPoints( pointIndex, 1,
int(pPoint->x()),
int(pPoint->y()) );
631 else if( pPoint->pointType() == KivioPoint::kptBezier )
633 pPoint2 = pPointList->next();
634 pPoint3 = pPointList->next();
635 pPoint4 = pPointList->next();
637 if( !pPoint2 || !pPoint3 || !pPoint4 )
639 kdDebug(43000) <<
"drawClosedPath() - incorrect # of bezier points" << endl;
643 if( pPoint2->pointType() != KivioPoint::kptBezier ||
644 pPoint3->pointType() != KivioPoint::kptBezier ||
645 pPoint4->pointType() != KivioPoint::kptBezier )
647 kdDebug(43000) <<
"drawClosedPath() - bezier curves must have 4 points" << endl;
651 controlPoints.setPoint( 0, tqRound(pPoint->x()), tqRound(pPoint->y()) );
652 controlPoints.setPoint( 1, tqRound(pPoint2->x()), tqRound(pPoint2->y()) );
653 controlPoints.setPoint( 2, tqRound(pPoint3->x()), tqRound(pPoint3->y()) );
654 controlPoints.setPoint( 3, tqRound(pPoint4->x()), tqRound(pPoint4->y()) );
656 tmpPoints = controlPoints.cubicBezier();
658 for(
int j=0; j<int(tmpPoints.size()); j++ )
660 bPoints.putPoints( pointIndex, 1, tmpPoints.point(j).x(), tmpPoints.point(j).y() );
664 else if( pPoint->pointType() == KivioPoint::kptArc )
666 pPoint2 = pPointList->next();
667 pPoint3 = pPointList->next();
669 if( !pPoint2 || !pPoint3 )
671 kdDebug(43000) <<
"drawClosedPath() - incorrect # of arc points" << endl;
674 if( pPoint2->pointType() != KivioPoint::kptArc ||
675 pPoint3->pointType() != KivioPoint::kptArc )
677 kdDebug(43000) <<
"drawClosedPath() - Arc points must come in triplets" << endl;
681 tmpPoints.makeArc( tqRound(pPoint->x()), tqRound(pPoint->y()), tqRound(pPoint2->x()), tqRound(pPoint2->y()),
682 tqRound(pPoint3->x()), tqRound(pPoint3->y()) );
684 for(
int j=0; j<int(tmpPoints.size()); j++ )
686 bPoints.putPoints( pointIndex, 1, tmpPoints.point(j).x(),tmpPoints.point(j).y());
692 kdDebug(43000) <<
"drawClosedPath() - Unknown point type discovered. WOOO!!!" << endl;
695 pPoint = pPointList->next();
699 switch( m_pFillStyle->colorStyle() )
701 case KivioFillStyle::kcsNone:
703 drawPolyline( bPoints );
706 case KivioFillStyle::kcsSolid:
707 case KivioFillStyle::kcsGradient:
709 drawPolygon(bPoints);
714 kdDebug(43000) <<
"drawClosedPath() - Unknown colors style" << endl;
719void KivioScreenPainter::drawOpenPath( TQPtrList<KivioPoint> *pPoints )
725 KivioPoint *pPoint, *pPoint2, *pPoint3, *pPoint4;
726 TQPtrList <KivioPoint> *pPointList = pPoints;
727 TQPointArray controlPoints(4), bPoints(0), tmpPoints;
730 pPoint = pPointList->first();
733 if( pPoint->pointType() == KivioPoint::kptNormal )
735 bPoints.putPoints( pointIndex, 1,
int(pPoint->x()),
int(pPoint->y()) );
738 else if( pPoint->pointType() == KivioPoint::kptBezier )
740 pPoint2 = pPointList->next();
741 pPoint3 = pPointList->next();
742 pPoint4 = pPointList->next();
744 if( !pPoint2 || !pPoint3 || !pPoint4 )
746 kdDebug(43000) <<
"drawOpenPath() - incorrect # of bezier points" << endl;
750 if( pPoint2->pointType() != KivioPoint::kptBezier ||
751 pPoint3->pointType() != KivioPoint::kptBezier ||
752 pPoint4->pointType() != KivioPoint::kptBezier )
754 kdDebug(43000) <<
"drawOpenPath() - bezier curves must have 4 points" << endl;
758 controlPoints.setPoint( 0, tqRound(pPoint->x()), tqRound(pPoint->y()) );
759 controlPoints.setPoint( 1, tqRound(pPoint2->x()), tqRound(pPoint2->y()) );
760 controlPoints.setPoint( 2, tqRound(pPoint3->x()), tqRound(pPoint3->y()) );
761 controlPoints.setPoint( 3, tqRound(pPoint4->x()), tqRound(pPoint4->y()) );
763 tmpPoints = controlPoints.cubicBezier();
765 for(
int j=0; j<int(tmpPoints.size()); j++ )
767 bPoints.putPoints( pointIndex, 1, tmpPoints.point(j).x(), tmpPoints.point(j).y() );
771 else if( pPoint->pointType() == KivioPoint::kptArc )
773 pPoint2 = pPointList->next();
774 pPoint3 = pPointList->next();
776 if( !pPoint2 || !pPoint3 )
778 kdDebug(43000) <<
"drawOpenPath() - incorrect # of arc points" << endl;
781 if( pPoint2->pointType() != KivioPoint::kptArc ||
782 pPoint3->pointType() != KivioPoint::kptArc )
784 kdDebug(43000) <<
"drawOpenPath() - Arc points must come in triplets" << endl;
788 tmpPoints.makeArc( tqRound(pPoint->x()), tqRound(pPoint->y()), tqRound(pPoint2->x()), tqRound(pPoint2->y()),
789 tqRound(pPoint3->x()), tqRound(pPoint3->y()) );
791 for(
int j=0; j<int(tmpPoints.size()); j++ )
793 bPoints.putPoints( pointIndex, 1, tmpPoints.point(j).x(),tmpPoints.point(j).y());
799 kdDebug(43000) <<
"drawOpenPath() - Unknown point type discovered. WOOO!!!" << endl;
802 pPoint = pPointList->next();
805 m_pPainter->setPen(m_pLineStyle->pen(1.0f));
806 m_pPainter->setBrush( TQBrush::NoBrush );
808 m_pPainter->drawPolyline( bPoints );
811void KivioScreenPainter::setFont(
const TQFont &f )
815 m_pPainter->setFont( f );
818void KivioScreenPainter::drawText(
int x,
int y,
int w,
int h,
int tf,
const TQString &str )
822 m_pPainter->setPen( m_textColor );
823 m_pPainter->drawText( x, y, w, h, tf, str );
833TQRect KivioScreenPainter::boundingRect(
int x,
int y,
int w,
int h,
int tf,
const TQString &str )
837 return m_pPainter->boundingRect( x,y,w,h, tf, str );
840void KivioScreenPainter::drawPixmap(
float x,
float y,
const TQPixmap &pix )
843 m_pPainter->drawPixmap( (
int)x, (
int)y, pix );
846void KivioScreenPainter::drawHandle(
float x,
float y,
int flags )
849 TQColor fillColor, penColor;
853 const float HW = 6.0f;
854 const float HWP1 = HW+1.0f;
855 const float HWo2 = HW/2.0f;
860 if( flags & cpfLock )
865 m_pPainter->drawPixmap( tqRound(x1), tqRound(y1), Kivio::lockPixmap() );
869 if( flags & cpfConnected )
871 fillColor = TQColor(200,0,0);
875 fillColor = TQColor(0,200,0);
878 penColor.setRgb(0, 0, 0);
880 b.setColor(fillColor);
881 b.setStyle(TQt::SolidPattern);
882 p.setColor(penColor);
883 m_pPainter->setPen(p);
884 m_pPainter->setBrush(b);
894 m_pPainter->drawEllipse( tqRound(x1), tqRound(y1), tqRound(HWP1), tqRound(HWP1) );
896 m_pPainter->drawRect( tqRound(x1), tqRound(y1), tqRound(HWP1), tqRound(HWP1) );
900 if( flags & cpfConnectable )
902 b.setColor(TQColor(0,0,0));
904 m_pPainter->fillRect(tqRound(x-1),tqRound(y-1),3,3, b);
908void KivioScreenPainter::drawSelectionBox(
const TQRect& r )
912 p.setColor(TQColor(0,200,0));
913 p.setStyle(TQt::DashLine);
914 m_pPainter->setBrush(TQt::NoBrush);
915 m_pPainter->setPen(p);
916 m_pPainter->drawRect(r);
919void KivioScreenPainter::saveState()
926void KivioScreenPainter::restoreState()
930 m_pPainter->restore();
933void KivioScreenPainter::setTranslation(
float _x,
float _y )
940 m_pPainter->translate(_x, _y);
943void KivioScreenPainter::translateBy(
float _x,
float _y )
950 m_pPainter->translate( m_transX, m_transY );
953void KivioScreenPainter::setRotation(
int _d )
959 m_pPainter->rotate(_d);
962void KivioScreenPainter::rotateBy(
int _d )
968 m_pPainter->rotate(m_rotation);
971int KivioScreenPainter::rotation()
976void KivioScreenPainter::setWorldMatrix(TQWMatrix m,
bool c)
979 m_pPainter->setWorldMatrix(m, c);