#include <QImage>
#include <QMutex>
#include <QPainter>
+#include <QPen>
#include <QRect>
+#include <QWaitCondition>
#include <QWidget>
#include <Qt>
-class DrawingWindow: public QWidget {
-/* Q_OBJECT */
+class DrawingThread;
+class DrawingWindow: public QWidget {
public:
- typedef int (*ThreadFunction)(DrawingWindow &);
+ typedef void (*ThreadFunction)(DrawingWindow &);
static const int DEFAULT_WIDTH = 640;
static const int DEFAULT_HEIGHT = 480;
DrawingWindow(ThreadFunction fun,
- int width = DEFAULT_WIDTH, int height = DEFAULT_HEIGHT);
+ int width_ = DEFAULT_WIDTH, int height_ = DEFAULT_HEIGHT);
DrawingWindow(QWidget *parent,
ThreadFunction fun,
- int width = DEFAULT_WIDTH, int height = DEFAULT_HEIGHT);
+ int width_ = DEFAULT_WIDTH, int height_ = DEFAULT_HEIGHT);
DrawingWindow(QWidget *parent, Qt::WindowFlags flags,
ThreadFunction fun,
- int width = DEFAULT_WIDTH, int height = DEFAULT_HEIGHT);
+ int width_ = DEFAULT_WIDTH, int height_ = DEFAULT_HEIGHT);
~DrawingWindow();
- int width() const;
- int height() const;
+ const int width;
+ const int height;
+ void setColor(unsigned int color);
+ void setColor(const char *name);
void setColor(float red, float green, float blue);
- void setColor(const QColor &color);
+
+ void setBgColor(unsigned int color);
+ void setBgColor(const char *name);
+ void setBgColor(float red, float green, float blue);
+
+ void clearGraph();
void drawPoint(int x, int y);
void drawLine(int x1, int y1, int x2, int y2);
+ void drawRect(int x1, int y1, int x2, int y2);
+ void fillRect(int x1, int y1, int x2, int y2);
+ void drawCircle(int x, int y, int r);
+ void fillCircle(int x, int y, int r);
+
+ void drawText(int x, int y, const char *text, int flags = 0);
+ void drawTextBg(int x, int y, const char *text, int flags = 0);
+
+ unsigned int getPointColor(int x, int y);
+
+ bool waitMousePress(int &x, int &y, int &button,
+ unsigned long time = ULONG_MAX);
+ bool sync(unsigned long time = ULONG_MAX);
+
+ void closeGraph();
+
+ void sleep(unsigned long secs);
+ void msleep(unsigned long msecs);
+ void usleep(unsigned long usecs);
protected:
+ void closeEvent(QCloseEvent *ev);
+ void customEvent(QEvent *ev);
+ void mousePressEvent(QMouseEvent *ev);
+ void keyPressEvent(QKeyEvent *ev);
void paintEvent(QPaintEvent *ev);
void showEvent(QShowEvent *ev);
void timerEvent(QTimerEvent *ev);
private:
- class DrawingThread;
-
+ //! Intervalle de temps entre deux rendus (ms)
static const int paintInterval = 33;
QBasicTimer timer;
+ QMutex imageMutex;
+ QMutex mouseMutex;
+ QWaitCondition mouseCondition;
+ QMutex syncMutex;
+ QWaitCondition syncCondition;
+ bool terminateThread;
+ int lockCount;
QImage *image;
QPainter *painter;
- DrawingThread *thread;
- bool thread_started;
+ QPoint mousePos;
+ Qt::MouseButton mouseButton;
bool dirtyFlag;
QRect dirtyRect;
- QMutex mutex;
+ DrawingThread *thread;
+
+ void initialize(ThreadFunction fun);
- void initialize(ThreadFunction fun, int width, int height);
+ void setColor(const QColor& color);
+ void setBgColor(const QColor& color);
+ QColor getColor();
+ QColor getBgColor();
- void lock();
- void unlock();
+ void safeLock(QMutex &mutex);
+ void safeUnlock(QMutex &mutex);
- void setDirtyRect();
- void setDirtyRect(int x, int y);
- void setDirtyRect(int x1, int y1, int x2, int y2);
- void setDirtyRect(const QRect &rect);
-};
+ void dirty();
+ void dirty(int x, int y);
+ void dirty(int x1, int y1, int x2, int y2);
+ void dirty(const QRect &rect);
-inline
-int DrawingWindow::width() const
-{
- return image->width();
-}
-
-inline
-int DrawingWindow::height() const
-{
- return image->height();
-}
-
-inline
-void DrawingWindow::lock()
-{
- mutex.lock();
-}
-
-inline
-void DrawingWindow::unlock()
-{
- mutex.unlock();
-}
-
-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());
-}
+ void mayUpdate();
+ void realSync();
+ void realDrawText(int x, int y, const char *text, int flags);
+};
#endif // !DRAWING_WINDOW_H
+
+// Local variables:
+// mode: c++
+// End: