1
1
#include " screencanvas.h"
2
2
3
3
#include < cmath>
4
+
4
5
#include < QPainter>
5
6
#include < QClipboard>
6
7
#include < QGuiApplication>
7
8
8
- #include " debug.h"
9
-
10
9
ScreenCanvas::ScreenCanvas (QQuickItem *parent):
11
10
QQuickPaintedItem(parent),
12
11
m_foreground(QColor(0x00 , 0x00 , 0x00 )),
13
12
m_background(QColor(0xFF , 0xFF , 0xFF )),
14
- m_canvas(QImage(1 , 1 , QImage::Format_RGB32))
15
- {}
13
+ m_canvas(QImage(1 , 1 , QImage::Format_RGB32)),
14
+ m_zoomFactor(1.0 )
15
+ {
16
+ connect (this , &ScreenCanvas::zoomFactorChanged, this , &ScreenCanvas::updateImplicitSize);
17
+ connect (this , &ScreenCanvas::canvasSizeChanged, this , &ScreenCanvas::updateImplicitSize);
18
+ }
16
19
17
- const QByteArray &ScreenCanvas::data () const
20
+ const ScreenFrame &ScreenCanvas::frame () const
18
21
{
19
- static QByteArray dummy;
22
+ static const ScreenFrame dummy {} ;
20
23
return dummy;
21
24
}
22
25
23
- void ScreenCanvas::setData (const QByteArray &data )
26
+ void ScreenCanvas::setFrame (const ScreenFrame &frame )
24
27
{
25
- if (data .isEmpty ()) {
28
+ if (frame. pixelData . isEmpty () || frame. size .isEmpty ()) {
26
29
return ;
27
30
}
28
31
29
- for (auto x = 0 ; x < canvasWidth (); x++) {
30
- for (auto y = 0 ; y < canvasHeight (); y++) {
31
- const auto i = y / 8 * canvasWidth () + x;
32
+ setCanvasSize (frame.size );
33
+
34
+ for (auto x = 0 ; x < m_canvas.width (); x++) {
35
+ for (auto y = 0 ; y < m_canvas.height (); y++) {
36
+ const auto i = y / 8 * m_canvas.width () + x;
32
37
const auto z = y % 8 ;
33
- const auto color = ((data.at (i) & (1 << z))) ? m_foreground : m_background;
34
- m_canvas.setPixelColor (x, y, color);
38
+ const auto color = ((frame.pixelData .at (i) & (1 << z))) ? m_foreground : m_background;
39
+
40
+ m_canvas.setPixelColor (frame.isFlipped ? m_canvas.width () - x - 1 : x,
41
+ frame.isFlipped ? m_canvas.height () - y - 1 : y,
42
+ color);
35
43
}
36
44
}
37
45
@@ -43,7 +51,7 @@ void ScreenCanvas::paint(QPainter *painter)
43
51
const auto bw = boundingRect ().width ();
44
52
const auto bh = boundingRect ().height ();
45
53
46
- const auto aspectRatio = (double )canvasWidth () / canvasHeight ();
54
+ const auto aspectRatio = (double )m_canvas. width () / m_canvas. height ();
47
55
48
56
auto w = bw;
49
57
auto h = floor (w / aspectRatio);
@@ -53,11 +61,8 @@ void ScreenCanvas::paint(QPainter *painter)
53
61
w = bh * aspectRatio;
54
62
}
55
63
56
- w -= ((int )w % (int )canvasWidth ());
57
- h -= ((int )h % (int )canvasHeight ());
58
-
59
- setRenderWidth (w);
60
- setRenderHeight (h);
64
+ w -= ((int )w % m_canvas.width ());
65
+ h -= ((int )h % m_canvas.height ());
61
66
62
67
const auto dw = (bw - w) / 2 ;
63
68
const auto dh = (bh - h) / 2 ;
@@ -66,50 +71,20 @@ void ScreenCanvas::paint(QPainter *painter)
66
71
painter->drawImage (canvasRect, m_canvas);
67
72
}
68
73
69
- qreal ScreenCanvas::canvasWidth () const
70
- {
71
- return m_canvas.width ();
72
- }
73
-
74
- void ScreenCanvas::setCanvasWidth (qreal w)
75
- {
76
- if (qFuzzyCompare (canvasWidth (), w)) {
77
- return ;
78
- }
79
-
80
- m_canvas = QImage (w, canvasHeight (), QImage::Format_RGB32);
81
- m_canvas.fill (m_background);
82
- emit canvasWidthChanged ();
83
-
84
- update ();
85
- }
86
-
87
- qreal ScreenCanvas::canvasHeight () const
74
+ qreal ScreenCanvas::zoomFactor () const
88
75
{
89
- return m_canvas. height () ;
76
+ return m_zoomFactor ;
90
77
}
91
78
92
- void ScreenCanvas::setCanvasHeight (qreal h )
79
+ void ScreenCanvas::setZoomFactor (qreal zoom )
93
80
{
94
- if (qFuzzyCompare (canvasHeight (), h )) {
81
+ if (qFuzzyCompare (m_zoomFactor, zoom )) {
95
82
return ;
96
83
}
97
84
98
- m_canvas = QImage (canvasWidth (), h, QImage::Format_RGB32);
99
- m_canvas.fill (m_background);
100
- emit canvasHeightChanged ();
101
-
102
- update ();
103
- }
104
-
105
- qreal ScreenCanvas::renderWidth () const
106
- {
107
- return m_renderWidth;
108
- }
85
+ m_zoomFactor = zoom;
86
+ emit zoomFactorChanged ();
109
87
110
- qreal ScreenCanvas::renderHeight () const
111
- {
112
- return m_renderHeight;
113
88
}
114
89
115
90
const QColor &ScreenCanvas::foregroundColor () const
@@ -142,41 +117,38 @@ void ScreenCanvas::setBackgroundColor(const QColor &color)
142
117
emit backgroundColorChanged ();
143
118
}
144
119
145
- void ScreenCanvas::saveImage (const QUrl &url, int scale)
120
+ bool ScreenCanvas::saveImage (const QUrl &url, int scale)
146
121
{
147
- check_return_void ( canvas (scale).save (url.toLocalFile ()), " Failed to save image " );
122
+ return canvas (scale).save (url.toLocalFile ());
148
123
}
149
124
150
125
void ScreenCanvas::copyToClipboard (int scale)
151
126
{
152
127
qGuiApp->clipboard ()->setImage (canvas (scale));
153
128
}
154
129
155
- void ScreenCanvas::setRenderWidth (qreal w )
130
+ void ScreenCanvas::updateImplicitSize ( )
156
131
{
157
- if (qFuzzyCompare (m_renderWidth, w)) {
132
+ setImplicitSize (m_zoomFactor * m_canvas.width (), m_zoomFactor * m_canvas.height ());
133
+ }
134
+
135
+ void ScreenCanvas::setCanvasSize (const QSize &size)
136
+ {
137
+ if (size == m_canvas.size ()) {
158
138
return ;
159
139
}
160
140
161
- m_renderWidth = w;
162
- emit renderWidthChanged ();
141
+ m_canvas = QImage (size, QImage::Format_RGB32);
142
+ m_canvas.fill (m_background);
143
+
144
+ emit canvasSizeChanged ();
163
145
}
164
146
165
147
const QImage ScreenCanvas::canvas (int scale) const
166
148
{
167
149
if (scale == 0 ) {
168
- return m_canvas.scaled (m_renderWidth, m_renderHeight );
150
+ return m_canvas.scaled (m_canvas. width () * m_zoomFactor, m_canvas. height () * m_zoomFactor );
169
151
} else {
170
- return m_canvas.scaled (canvasWidth () * scale, canvasHeight () * scale);
152
+ return m_canvas.scaled (m_canvas. width () * scale, m_canvas. height () * scale);
171
153
}
172
154
}
173
-
174
- void ScreenCanvas::setRenderHeight (qreal h)
175
- {
176
- if (qFuzzyCompare (m_renderHeight, h)) {
177
- return ;
178
- }
179
-
180
- m_renderHeight = h;
181
- emit renderHeightChanged ();
182
- }
0 commit comments