#ifndef DRAWING_WINDOW_H
#define DRAWING_WINDOW_H
-#define USE_PIXMAP_CACHE
-
#include <QBasicTimer>
#include <QColor>
#include <QImage>
#include <QMutex>
#include <QPainter>
-#ifdef USE_PIXMAP_CACHE
-# include <QPixmap>
-#endif
#include <QRect>
#include <QWidget>
#include <Qt>
+#include <QThread>
+
class DrawingWindow: public QWidget {
/* Q_OBJECT */
public:
- typedef int (*ThreadFunction)(DrawingWindow &);
+ typedef void (*ThreadFunction)(DrawingWindow &);
static const int DEFAULT_WIDTH = 640;
static const int DEFAULT_HEIGHT = 480;
void drawLine(int x1, int y1, int x2, int y2);
protected:
+ void closeEvent(QCloseEvent *ev);
void paintEvent(QPaintEvent *ev);
void showEvent(QShowEvent *ev);
void timerEvent(QTimerEvent *ev);
private:
- class DrawingThread;
+ class DrawingThread: public QThread {
+ public:
+ DrawingThread(DrawingWindow &w, ThreadFunction f);
+ void run();
+
+ void enableTerminate();
+ void disableTerminate();
+
+ private:
+ DrawingWindow &drawingWindow;
+ ThreadFunction threadFunction;
+
+ };
static const int paintInterval = 33;
QImage *image;
QPainter *painter;
-#ifdef USE_PIXMAP_CACHE
- QPixmap *pixmap;
-#endif
DrawingThread *thread;
bool thread_started;
inline
void DrawingWindow::lock()
{
+ thread->disableTerminate();
mutex.lock();
}
void DrawingWindow::unlock()
{
mutex.unlock();
+ thread->enableTerminate();
+}
+
+inline
+void DrawingWindow::setDirtyRect()
+{
+ dirtyFlag = true;
+ dirtyRect.setRect(0, 0, width(), height());
+}
+
+inline
+void DrawingWindow::setDirtyRect(int x, int y)
+{
+ setDirtyRect(QRect(x, y, 1, 1));
+}
+
+inline
+void DrawingWindow::setDirtyRect(int x1, int y1, int x2, int y2)
+{
+ QRect r;
+ r.setCoords(x1, y1, x2, y2);
+ setDirtyRect(r.normalized());
+}
+
+inline
+void DrawingWindow::DrawingThread::enableTerminate()
+{
+ setTerminationEnabled(true);
+}
+
+inline
+void DrawingWindow::DrawingThread::disableTerminate()
+{
+ setTerminationEnabled(false);
}
#endif // !DRAWING_WINDOW_H