-
Notifications
You must be signed in to change notification settings - Fork 5
/
mainwindow.cpp
88 lines (74 loc) · 1.9 KB
/
mainwindow.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#define NUM_TOUCHES 10
static const QImage::Format ImageFormat = QImage::Format_RGB32;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
_image(new QImage(size(), ImageFormat)),
_mutex(new QMutex()),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete _image;
delete _mutex;
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *)
{
QMutexLocker lock(_mutex);
QPainter painter(this);
int dx = -(this->pos().x());
int dy = -(this->pos().y());
int w = _image->width();
int h = _image->height();
uchar* bits = _image->bits();
size_t bpl = _image->bytesPerLine();
foreach(TouchEvent ev, _events) {
int x = (ev.x + dx) % w;
int y = ((ev.y + dy) % h);
int color = 0xff * !!(ev.idx & 1)
+ 0xff00 * !!(ev.idx & 2)
+ 0xff0000 * !!(ev.idx & 4);
uchar *line = bits + bpl * y;
((unsigned*)line)[x] = color;
}
painter.drawImage(0, 0, *_image);
}
void MainWindow::resizeEvent(QResizeEvent *event) {
QWidget::resizeEvent(event);
QMutexLocker lock(_mutex);
delete _image;
_image = new QImage(event->size(), ImageFormat);
_image->fill(Qt::gray);
}
void MainWindow::submitEvent(struct TouchEvent ev) {
static int last_x[NUM_TOUCHES] = {
};
static int last_y[NUM_TOUCHES] = {
};
if (ev.x > 0) {
if (last_y[ev.idx] > 0) {
ev.y = last_y[ev.idx];
_events.append(ev);
last_y[ev.idx] = 0;
}
else {
last_x[ev.idx] = ev.x;
}
}
if (ev.y > 0) {
if (last_x[ev.idx] > 0) {
ev.x = last_x[ev.idx];
_events.append(ev);
last_y[ev.idx] = 0;
}
else {
last_y[ev.idx] = ev.y;
}
}
repaint();
}