27#include "kis_canvas.h"
28#include "kis_canvas_painter.h"
29#include "kis_opengl_canvas_painter.h"
31KisOpenGLCanvasPainter::KisOpenGLCanvasPainter()
32: m_active(false), m_widget(0)
36KisOpenGLCanvasPainter::KisOpenGLCanvasPainter(TQGLWidget *widget)
37 : m_active(true), m_widget(widget)
42KisOpenGLCanvasPainter::~KisOpenGLCanvasPainter()
48 m_widget->doneCurrent();
52bool KisOpenGLCanvasPainter::begin(KisCanvasWidget *canvasWidget,
bool )
54 m_widget =
dynamic_cast<TQGLWidget *
>(canvasWidget);
65void KisOpenGLCanvasPainter::prepareForDrawing()
68 m_widget->makeCurrent();
71 glDrawBuffer(GL_FRONT);
72 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
75 glMatrixMode(GL_TEXTURE);
78 m_window = TQRect(0, 0, m_widget->width(), m_widget->height());
79 m_viewport = m_window;
80 updateViewTransformation();
82 glMatrixMode(GL_MODELVIEW);
89void KisOpenGLCanvasPainter::updateViewTransformation()
91 glMatrixMode(GL_PROJECTION);
96 glViewport(0, 0, m_widget->width(), m_widget->height());
97 glOrtho(0, m_widget->width(), m_widget->height(), 0, -1, 1);
99 glTranslatef(m_viewport.x(), m_viewport.y(), 0.0);
100 glScalef(
static_cast<float>(m_viewport.width()) / m_window.width(),
101 static_cast<float>(m_viewport.height()) / m_window.height(),
103 glTranslatef(-m_window.x(), -m_window.y(), 0.0);
106bool KisOpenGLCanvasPainter::end()
117void KisOpenGLCanvasPainter::save()
119 glPushAttrib(GL_ALL_ATTRIB_BITS);
120 glMatrixMode(GL_PROJECTION);
122 glMatrixMode(GL_MODELVIEW);
124 glMatrixMode(GL_TEXTURE);
128void KisOpenGLCanvasPainter::restore()
131 glMatrixMode(GL_PROJECTION);
133 glMatrixMode(GL_MODELVIEW);
135 glMatrixMode(GL_TEXTURE);
139void KisOpenGLCanvasPainter::setPenStyle(TQt::PenStyle penStyle)
141 if (penStyle == TQt::SolidLine) {
142 glDisable(GL_LINE_STIPPLE);
144 GLushort lineStipple;
152 lineStipple = 0x3fff;
155 lineStipple = 0x3333;
157 case TQt::DashDotLine:
158 lineStipple = 0x33ff;
160 case TQt::DashDotDotLine:
161 lineStipple = 0x333f;
165 glEnable(GL_LINE_STIPPLE);
166 glLineStipple(1, lineStipple);
170TQFontMetrics KisOpenGLCanvasPainter::fontMetrics()
const
172 return TQFontMetrics(TQFont());
175TQFontInfo KisOpenGLCanvasPainter::fontInfo()
const
177 return TQFontInfo(TQFont());
180const TQFont& KisOpenGLCanvasPainter::font()
const
182 return m_defaultFont;
185void KisOpenGLCanvasPainter::setFont(
const TQFont& )
189const TQPen& KisOpenGLCanvasPainter::pen()
const
194void KisOpenGLCanvasPainter::setPen(
const TQPen& pen)
196 setPenStyle(pen.style());
199void KisOpenGLCanvasPainter::setPen(TQt::PenStyle penStyle)
201 setPenStyle(penStyle);
204void KisOpenGLCanvasPainter::setPen(
const TQColor& )
208const TQBrush& KisOpenGLCanvasPainter::brush()
const
210 return m_defaultBrush;
213void KisOpenGLCanvasPainter::setBrush(
const TQBrush& )
217void KisOpenGLCanvasPainter::setBrush(TQt::BrushStyle )
221void KisOpenGLCanvasPainter::setBrush(
const TQColor& )
225TQPoint KisOpenGLCanvasPainter::pos()
const
230const TQColor& KisOpenGLCanvasPainter::backgroundColor()
const
232 return m_defaultColor;
235void KisOpenGLCanvasPainter::setBackgroundColor(
const TQColor& )
239TQt::BGMode KisOpenGLCanvasPainter::backgroundMode()
const
241 return TQt::TransparentMode;
244void KisOpenGLCanvasPainter::setBackgroundMode(TQt::BGMode )
248TQt::TQt::RasterOp KisOpenGLCanvasPainter::rasterOp()
const
253void KisOpenGLCanvasPainter::setRasterOp(TQt::RasterOp )
257const TQPoint& KisOpenGLCanvasPainter::brushOrigin()
const
259 return m_defaultBrushOrigin;
262void KisOpenGLCanvasPainter::setBrushOrigin(
int ,
int )
266void KisOpenGLCanvasPainter::setBrushOrigin(
const TQPoint& )
270bool KisOpenGLCanvasPainter::hasViewXForm()
const
275bool KisOpenGLCanvasPainter::hasWorldXForm()
const
280void KisOpenGLCanvasPainter::setViewXForm(
bool )
284TQRect KisOpenGLCanvasPainter::window()
const
289void KisOpenGLCanvasPainter::setWindow(
const TQRect& r)
292 updateViewTransformation();
295void KisOpenGLCanvasPainter::setWindow(
int x,
int y,
int w,
int h)
297 setWindow(TQRect(x, y, w, h));
300TQRect KisOpenGLCanvasPainter::viewport()
const
305void KisOpenGLCanvasPainter::setViewport(
const TQRect& r)
308 updateViewTransformation();
311void KisOpenGLCanvasPainter::setViewport(
int x,
int y,
int w,
int h)
313 setViewport(TQRect(x, y, w, h));
316void KisOpenGLCanvasPainter::setWorldXForm(
bool )
320const TQWMatrix& KisOpenGLCanvasPainter::worldMatrix()
const
322 return m_defaultWorldMatrix;
325void KisOpenGLCanvasPainter::setWorldMatrix(
const TQWMatrix& ,
bool )
329void KisOpenGLCanvasPainter::saveWorldMatrix()
333void KisOpenGLCanvasPainter::restoreWorldMatrix()
337void KisOpenGLCanvasPainter::scale(
double ,
double )
341void KisOpenGLCanvasPainter::shear(
double ,
double )
345void KisOpenGLCanvasPainter::rotate(
double )
349void KisOpenGLCanvasPainter::translate(
double dx,
double dy)
351 glMatrixMode(GL_MODELVIEW);
352 glTranslated(dx, dy, 0.0);
355void KisOpenGLCanvasPainter::resetXForm()
359double KisOpenGLCanvasPainter::translationX()
const
364double KisOpenGLCanvasPainter::translationY()
const
369TQPoint KisOpenGLCanvasPainter::xForm(
const TQPoint& point)
const
374TQRect KisOpenGLCanvasPainter::xForm(
const TQRect& r)
const
379TQPointArray KisOpenGLCanvasPainter::xForm(
const TQPointArray& pointArray)
const
384TQPointArray KisOpenGLCanvasPainter::xForm(
const TQPointArray& pointArray,
int ,
int )
const
389TQPoint KisOpenGLCanvasPainter::xFormDev(
const TQPoint& point)
const
394TQRect KisOpenGLCanvasPainter::xFormDev(
const TQRect& r)
const
399TQPointArray KisOpenGLCanvasPainter::xFormDev(
const TQPointArray& pointArray)
const
404TQPointArray KisOpenGLCanvasPainter::xFormDev(
const TQPointArray& pointArray,
int ,
int )
const
409void KisOpenGLCanvasPainter::setClipping(
bool )
413bool KisOpenGLCanvasPainter::hasClipping()
const
418TQRegion KisOpenGLCanvasPainter::clipRegion(TQPainter::CoordinateMode )
const
423void KisOpenGLCanvasPainter::setClipRect(
const TQRect& , TQPainter::CoordinateMode )
427void KisOpenGLCanvasPainter::setClipRect(
int ,
int ,
int ,
int , TQPainter::CoordinateMode )
431void KisOpenGLCanvasPainter::setClipRegion(
const TQRegion& , TQPainter::CoordinateMode )
435void KisOpenGLCanvasPainter::drawPoint(
int x,
int y)
442void KisOpenGLCanvasPainter::drawPoint(
const TQPoint& point)
444 drawPoint(point.x(), point.y());
447void KisOpenGLCanvasPainter::drawPoints(
const TQPointArray& pointArray,
int index,
int npoints)
449 int firstPointIndex = index;
451 if (firstPointIndex < 0) {
454 if (firstPointIndex > (
int)pointArray.count() - 1) {
461 lastPointIndex = pointArray.count() - 1;
463 lastPointIndex = firstPointIndex + npoints;
464 if (lastPointIndex > (
int)pointArray.count() - 1) {
465 lastPointIndex = pointArray.count() - 1;
471 for (
int pointIndex = firstPointIndex; pointIndex <= lastPointIndex; pointIndex++) {
472 TQPoint point = pointArray.point(pointIndex);
473 glVertex2i(point.x(), point.y());
479void KisOpenGLCanvasPainter::moveTo(
int ,
int )
483void KisOpenGLCanvasPainter::moveTo(
const TQPoint& )
487void KisOpenGLCanvasPainter::lineTo(
int ,
int )
491void KisOpenGLCanvasPainter::lineTo(
const TQPoint& )
495void KisOpenGLCanvasPainter::drawLine(
int x1,
int y1,
int x2,
int y2)
503void KisOpenGLCanvasPainter::drawLine(
const TQPoint& start,
const TQPoint& end)
505 drawLine(start.x(), start.y(), end.x(), end.y());
508void KisOpenGLCanvasPainter::drawRect(
int x,
int y,
int w,
int h)
513 glVertex2i(x + w - 1, y);
515 glVertex2i(x + w - 1, y);
516 glVertex2i(x + w - 1, y + h - 1);
518 glVertex2i(x + w - 1, y + h - 1);
519 glVertex2i(x, y + h - 1);
521 glVertex2i(x, y + h - 1);
527void KisOpenGLCanvasPainter::drawRect(
const TQRect& r)
529 drawRect(r.x(), r.y(), r.width(), r.height());
532void KisOpenGLCanvasPainter::drawWinFocusRect(
int ,
int ,
int ,
int )
536void KisOpenGLCanvasPainter::drawWinFocusRect(
int ,
int ,
int ,
int ,
const TQColor& )
540void KisOpenGLCanvasPainter::drawWinFocusRect(
const TQRect& )
544void KisOpenGLCanvasPainter::drawWinFocusRect(
const TQRect& ,
const TQColor& )
548void KisOpenGLCanvasPainter::drawRoundRect(
int x,
int y,
int w,
int h,
int ,
int )
553 glVertex2i(x + w - 1, y);
555 glVertex2i(x + w - 1, y);
556 glVertex2i(x + w - 1, y + h - 1);
558 glVertex2i(x + w - 1, y + h - 1);
559 glVertex2i(x, y + h - 1);
561 glVertex2i(x, y + h - 1);
567void KisOpenGLCanvasPainter::drawRoundRect(
const TQRect& r,
int ,
int )
569 drawRoundRect(r.x(), r.y(), r.width(), r.height());
580void KisOpenGLCanvasPainter::drawEllipse(
int x,
int y,
int w,
int h)
582 TQRect r(x, y, w, h);
587 points.makeEllipse(r.x(), r.y(), r.width(), r.height());
591void KisOpenGLCanvasPainter::drawEllipse(
const TQRect& r)
593 drawEllipse(r.x(), r.y(), r.width(), r.height());
596void KisOpenGLCanvasPainter::drawArc(
int ,
int ,
int ,
int ,
int ,
int )
600void KisOpenGLCanvasPainter::drawArc(
const TQRect& ,
int ,
int )
604void KisOpenGLCanvasPainter::drawPie(
int ,
int ,
int ,
int ,
int ,
int )
608void KisOpenGLCanvasPainter::drawPie(
const TQRect& ,
int ,
int )
612void KisOpenGLCanvasPainter::drawChord(
int ,
int ,
int ,
int ,
int ,
int )
616void KisOpenGLCanvasPainter::drawChord(
const TQRect& ,
int ,
int )
620void KisOpenGLCanvasPainter::drawLineSegments(
const TQPointArray& ,
int ,
int )
624void KisOpenGLCanvasPainter::drawPolyline(
const TQPointArray& pointArray,
int index,
int npoints)
626 int firstPointIndex = index;
628 if (firstPointIndex < 0) {
631 if (firstPointIndex > (
int)pointArray.count() - 2) {
638 lastPointIndex = pointArray.count() - 1;
640 lastPointIndex = firstPointIndex + npoints - 1;
641 if (lastPointIndex > (
int)pointArray.count() - 1) {
642 lastPointIndex = pointArray.count() - 1;
646 if (firstPointIndex >= lastPointIndex) {
652 for (
int pointIndex = firstPointIndex; pointIndex <= lastPointIndex; pointIndex++) {
653 TQPoint point = pointArray.point(pointIndex);
654 glVertex2i(point.x(), point.y());
660void KisOpenGLCanvasPainter::drawPolygon(
const TQPointArray& ,
bool ,
int ,
int )
664void KisOpenGLCanvasPainter::drawConvexPolygon(
const TQPointArray& ,
int ,
int )
668TQPoint midpoint (
const TQPoint& P1,
const TQPoint& P2)
671 temp.setX((P1.x()+P2.x())/2);
672 temp.setY((P1.y()+P2.y())/2);
678void recursiveCurve (
const TQPoint& P1,
const TQPoint& P2,
const TQPoint& P3,
679 const TQPoint& P4,
int level, TQValueList<TQPoint>& dest)
681 if (level > MAX_LEVEL) {
682 dest.append(midpoint(P1,P4));
686 TQPoint L1, L2, L3, L4;
687 TQPoint H, R1, R2, R3, R4;
690 L2 = midpoint(P1, P2);
691 H = midpoint(P2, P3);
692 R3 = midpoint(P3, P4);
694 L3 = midpoint(L2, H);
695 R2 = midpoint(R3, H);
696 L4 = midpoint(L3, R2);
698 recursiveCurve(L1, L2, L3, L4, level + 1, dest);
699 recursiveCurve(R1, R2, R3, R4, level + 1, dest);
702void KisOpenGLCanvasPainter::drawCubicBezier(
const TQPointArray& pointArray,
int index)
704 TQPoint P1, P2, P3, P4;
705 TQValueList<TQPoint> dest;
706 P1 = pointArray[index++];
707 P2 = pointArray[index++];
708 P3 = pointArray[index++];
709 P4 = pointArray[index];
711 recursiveCurve(P1, P2, P3, P4, 1, dest);
713 glBegin(GL_LINE_STRIP);
715 glVertex2i(P1.x(), P1.y());
716 for (TQValueList<TQPoint>::iterator it = dest.begin(); it != dest.end(); it++) {
717 TQPoint point = (*it);
718 glVertex2i(point.x(), point.y());
720 glVertex2i(P4.x(), P4.y());
725void KisOpenGLCanvasPainter::drawPixmap(
int ,
int ,
const TQPixmap& ,
int ,
int ,
int ,
int )
729void KisOpenGLCanvasPainter::drawPixmap(
const TQPoint& ,
const TQPixmap& ,
const TQRect& )
733void KisOpenGLCanvasPainter::drawPixmap(
const TQPoint& ,
const TQPixmap& )
737void KisOpenGLCanvasPainter::drawPixmap(
const TQRect& ,
const TQPixmap& )
741void KisOpenGLCanvasPainter::drawImage(
int ,
int ,
const TQImage& ,
int ,
int ,
int ,
int ,
int )
745void KisOpenGLCanvasPainter::drawImage(
const TQPoint& ,
const TQImage& ,
const TQRect& ,
int )
749void KisOpenGLCanvasPainter::drawImage(
const TQPoint& ,
const TQImage& ,
int )
753void KisOpenGLCanvasPainter::drawImage(
const TQRect& ,
const TQImage& )
757void KisOpenGLCanvasPainter::drawTiledPixmap(
int ,
int ,
int ,
int ,
const TQPixmap& ,
int ,
int )
761void KisOpenGLCanvasPainter::drawTiledPixmap(
const TQRect& ,
const TQPixmap& ,
const TQPoint& )
765void KisOpenGLCanvasPainter::drawTiledPixmap(
const TQRect& ,
const TQPixmap& )
769void KisOpenGLCanvasPainter::fillRect(
int x,
int y,
int w,
int h,
const TQBrush& )
772 glRecti(x, y, x + w, y + h);
775void KisOpenGLCanvasPainter::fillRect(
const TQRect& r,
const TQBrush& brush)
777 fillRect(r.x(), r.y(), r.width(), r.height(), brush);
780void KisOpenGLCanvasPainter::eraseRect(
int ,
int ,
int ,
int )
784void KisOpenGLCanvasPainter::eraseRect(
const TQRect& )
788void KisOpenGLCanvasPainter::drawText(
int ,
int ,
const TQString& ,
int , TQPainter::TextDirection )
792void KisOpenGLCanvasPainter::drawText(
const TQPoint& ,
const TQString& ,
int , TQPainter::TextDirection )
796void KisOpenGLCanvasPainter::drawText(
int ,
int ,
const TQString& ,
int ,
int , TQPainter::TextDirection )
800void KisOpenGLCanvasPainter::drawText(
const TQPoint& ,
const TQString& ,
int ,
int , TQPainter::TextDirection )
804void KisOpenGLCanvasPainter::drawText(
int ,
int ,
int ,
int ,
int ,
const TQString& ,
int , TQRect *, TQTextParag **)
808void KisOpenGLCanvasPainter::drawText(
const TQRect& ,
int ,
const TQString& ,
int , TQRect *, TQTextParag **)
812void KisOpenGLCanvasPainter::drawTextItem(
int ,
int ,
const TQTextItem& ,
int )
816void KisOpenGLCanvasPainter::drawTextItem(
const TQPoint& ,
const TQTextItem& ,
int )
820TQRect KisOpenGLCanvasPainter::boundingRect(
int ,
int ,
int ,
int ,
int ,
const TQString& ,
int , TQTextParag **)
825TQRect KisOpenGLCanvasPainter::boundingRect(
const TQRect& ,
int ,
const TQString& ,
int , TQTextParag **)
830int KisOpenGLCanvasPainter::tabStops()
const
835void KisOpenGLCanvasPainter::setTabStops(
int )
839int *KisOpenGLCanvasPainter::tabArray()
const
844void KisOpenGLCanvasPainter::setTabArray(
int *)