X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/graphlib.git/blobdiff_plain/abb9adcc79ad7c8bff8741c19df15e6fad1603c6..d9d083393abda0a28eb718de3000466513aa6b91:/DrawingWindow.h diff --git a/DrawingWindow.h b/DrawingWindow.h index d2ee6de..17253ba 100644 --- a/DrawingWindow.h +++ b/DrawingWindow.h @@ -1,25 +1,20 @@ #ifndef DRAWING_WINDOW_H #define DRAWING_WINDOW_H -#define USE_PIXMAP_CACHE - #include #include #include #include -#include -#ifdef USE_PIXMAP_CACHE -# include -#endif #include +#include #include #include -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; @@ -35,74 +30,76 @@ public: ~DrawingWindow(); - int width() const; - int height() const; + const int width; + const int height; + // http://www.w3.org/TR/SVG/types.html#ColorKeywords void setColor(float red, float green, float blue); - void setColor(const QColor &color); + void setColor(const char *name); + void setBgColor(float red, float green, float blue); + void setBgColor(const char *name); + + 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); + + 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 keyPressEvent(QKeyEvent *ev); void paintEvent(QPaintEvent *ev); void showEvent(QShowEvent *ev); void timerEvent(QTimerEvent *ev); private: - class DrawingThread; - static const int paintInterval = 33; QBasicTimer timer; + QMutex imageMutex; + QMutex syncMutex; + QWaitCondition syncCondition; + bool terminateThread; + int lockCount; QImage *image; QPainter *painter; -#ifdef USE_PIXMAP_CACHE - QPixmap *pixmap; -#endif - DrawingThread *thread; - bool thread_started; + QColor fgColor; + QColor bgColor; bool dirtyFlag; QRect dirtyRect; - QMutex mutex; + DrawingThread *thread; - void initialize(ThreadFunction fun, int width, int height); + void initialize(ThreadFunction f); - void lock(); - void unlock(); + void applyColor(); - void setDirtyRect(); - void setDirtyRect(int x, int y); - void setDirtyRect(int x1, int y1, int x2, int y2); - void setDirtyRect(const QRect &rect); -}; + void safeLock(QMutex &mutex); + void safeUnlock(QMutex &mutex); + + 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(); -} + void mayUpdate(); +}; #endif // !DRAWING_WINDOW_H