painter = new QPainter(image);
-#ifdef USE_PIXMAP_CACHE
- pixmap = new QPixmap(image->size());
- QPainter pixmapPainter(pixmap);
- pixmapPainter.drawImage(0, 0, *image);
-#endif
-
dirtyFlag = false;
setFocusPolicy(Qt::StrongFocus);
DrawingWindow::~DrawingWindow()
{
delete thread;
-#ifdef USE_PIXMAP_CACHE
- delete pixmap;
-#endif
delete painter;
delete image;
}
{
QPainter widgetPainter(this);
QRect rect = ev->rect();
-#ifdef USE_PIXMAP_CACHE
- widgetPainter.drawPixmap(rect, *pixmap, rect);
-#else
lock();
- widgetPainter.drawImage(rect, *image, rect);
+ QImage imageCopy(*image);
unlock();
-#endif
+ widgetPainter.drawImage(rect, imageCopy, rect);
}
void DrawingWindow::showEvent(QShowEvent *ev)
if (ev->timerId() == timer.timerId()) {
lock();
if (dirtyFlag) {
-#ifdef USE_PIXMAP_CACHE
- QPainter pixmapPainter(pixmap);
- pixmapPainter.drawImage(dirtyRect, *image, dirtyRect);
-#endif
- dirtyFlag = false;
update(dirtyRect);
- timer.start(paintInterval, this);
+ dirtyFlag = false;
}
unlock();
+ timer.start(paintInterval, this);
} else {
QWidget::timerEvent(ev);
}
}
-void DrawingWindow::setDirtyRect()
-{
- setDirtyRect(QRect(0, 0, width(), height()));
-}
-
-void DrawingWindow::setDirtyRect(int x, int y)
-{
- setDirtyRect(QRect(x, y, 1, 1));
-}
-
-void DrawingWindow::setDirtyRect(int x1, int y1, int x2, int y2)
-{
- QRect r;
- r.setCoords(x1, y1, x2, y2);
- setDirtyRect(r.normalized());
-}
-
void DrawingWindow::setDirtyRect(const QRect &rect)
{
if (dirtyFlag) {
#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>
QImage *image;
QPainter *painter;
-#ifdef USE_PIXMAP_CACHE
- QPixmap *pixmap;
-#endif
DrawingThread *thread;
bool thread_started;
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());
+}
+
#endif // !DRAWING_WINDOW_H
return 0;
}
+int lines(DrawingWindow &w)
+{
+ int n = 100000;
+ int xmax = w.width();
+ int ymax = w.height();
+ while (n-- > 0) {
+ double r = rand() / (float )RAND_MAX;
+ double g = rand() / (float )RAND_MAX;
+ double b = rand() / (float )RAND_MAX;
+ int x1 = rand() % xmax;
+ int y1 = rand() % ymax;
+ int x2 = rand() % xmax;
+ int y2 = rand() % ymax;
+ w.setColor(r, g, b);
+ w.drawLine(x1, y1, x2, y2);
+ }
+ return 0;
+}
+
int main(int argc, char *argv[])
{
- const int nf = 1;
- const int nm = 1;
const int w = 1000;
const int h = 700;
QApplication application(argc, argv);
+
+ DrawingWindow dd(lines, w, h);
+ dd.show();
+ return application.exec();
+
+ const int nf = 1;
+ const int nm = 1;
DrawingWindow *dw[nf + nm];
for (int i = 0; i < nf; ++i)