1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file.  Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #include "qcursor.h"
43 #include "qbitmap.h"
44 #include "qscreen_qws.h"
45 #include "qapplication.h"
46 #include "qwindowsystem_qws.h"
47 #include "qwindowsystem_p.h"
48 #include "qwscursor_qws.h"
49 
50 QT_BEGIN_NAMESPACE
51 
52 #ifndef QT_NO_QWS_CURSOR
53 static QWSCursor *systemCursorTable[Qt::LastCursor+1];
54 static bool systemCursorTableInit = false;
55 
56 // 16 x 16
57 static const uchar cur_arrow_bits[] = {
58    0x07, 0x00, 0x39, 0x00, 0xc1, 0x01, 0x02, 0x0e, 0x02, 0x10, 0x02, 0x08,
59    0x04, 0x04, 0x04, 0x02, 0x04, 0x04, 0x88, 0x08, 0x48, 0x11, 0x28, 0x22,
60    0x10, 0x44, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00 };
61 static const uchar mcur_arrow_bits[] = {
62    0x07, 0x00, 0x3f, 0x00, 0xff, 0x01, 0xfe, 0x0f, 0xfe, 0x1f, 0xfe, 0x0f,
63    0xfc, 0x07, 0xfc, 0x03, 0xfc, 0x07, 0xf8, 0x0f, 0x78, 0x1f, 0x38, 0x3e,
64    0x10, 0x7c, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00 };
65 
66 static const unsigned char cur_up_arrow_bits[] = {
67    0x80, 0x00, 0x40, 0x01, 0x40, 0x01, 0x20, 0x02, 0x20, 0x02, 0x10, 0x04,
68    0x10, 0x04, 0x08, 0x08, 0x78, 0x0f, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01,
69    0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0xc0, 0x01};
70 static const unsigned char mcur_up_arrow_bits[] = {
71    0x80, 0x00, 0xc0, 0x01, 0xc0, 0x01, 0xe0, 0x03, 0xe0, 0x03, 0xf0, 0x07,
72    0xf0, 0x07, 0xf8, 0x0f, 0xf8, 0x0f, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
73    0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01};
74 
75 static const unsigned char cur_cross_bits[] = {
76    0xc0, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01,
77    0x7f, 0x7f, 0x01, 0x40, 0x7f, 0x7f, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01,
78    0x40, 0x01, 0x40, 0x01, 0xc0, 0x01, 0x00, 0x00};
79 static const unsigned char mcur_cross_bits[] = {
80    0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
81    0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
82    0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0x00, 0x00};
83 
84 static const uchar cur_ibeam_bits[] = {
85    0x00, 0x00, 0xe0, 0x03, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,
86    0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,
87    0x80, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00 };
88 static const uchar mcur_ibeam_bits[] = {
89    0xf0, 0x07, 0xf0, 0x07, 0xf0, 0x07, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
90    0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01,
91    0xf0, 0x07, 0xf0, 0x07, 0xf0, 0x07, 0x00, 0x00 };
92 
93 static const uchar cur_ver_bits[] = {
94     0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f,
95     0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xf0, 0x0f,
96     0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00 };
97 static const uchar mcur_ver_bits[] = {
98     0x00, 0x00, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x0f, 0xf0, 0x1f, 0xf8, 0x3f,
99     0xfc, 0x7f, 0xc0, 0x07, 0xc0, 0x07, 0xc0, 0x07, 0xfc, 0x7f, 0xf8, 0x3f,
100     0xf0, 0x1f, 0xe0, 0x0f, 0xc0, 0x07, 0x80, 0x03 };
101 
102 static const uchar cur_hor_bits[] = {
103     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x30, 0x18,
104     0x38, 0x38, 0xfc, 0x7f, 0xfc, 0x7f, 0x38, 0x38, 0x30, 0x18, 0x20, 0x08,
105     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
106 static const uchar mcur_hor_bits[] = {
107     0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x60, 0x0c, 0x70, 0x1c, 0x78, 0x3c,
108     0xfc, 0x7f, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfc, 0x7f, 0x78, 0x3c,
109     0x70, 0x1c, 0x60, 0x0c, 0x40, 0x04, 0x00, 0x00 };
110 static const uchar cur_bdiag_bits[] = {
111     0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3c, 0x00, 0x3e,
112     0x00, 0x37, 0x88, 0x23, 0xd8, 0x01, 0xf8, 0x00, 0x78, 0x00, 0xf8, 0x00,
113     0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
114 static const uchar mcur_bdiag_bits[] = {
115     0x00, 0x00, 0xc0, 0x7f, 0x80, 0x7f, 0x00, 0x7f, 0x00, 0x7e, 0x04, 0x7f,
116     0x8c, 0x7f, 0xdc, 0x77, 0xfc, 0x63, 0xfc, 0x41, 0xfc, 0x00, 0xfc, 0x01,
117     0xfc, 0x03, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00 };
118 static const uchar cur_fdiag_bits[] = {
119     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0x78, 0x00,
120     0xf8, 0x00, 0xd8, 0x01, 0x88, 0x23, 0x00, 0x37, 0x00, 0x3e, 0x00, 0x3c,
121     0x00, 0x3e, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00 };
122 static const uchar mcur_fdiag_bits[] = {
123     0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0xfc, 0x03, 0xfc, 0x01, 0xfc, 0x00,
124     0xfc, 0x41, 0xfc, 0x63, 0xdc, 0x77, 0x8c, 0x7f, 0x04, 0x7f, 0x00, 0x7e,
125     0x00, 0x7f, 0x80, 0x7f, 0xc0, 0x7f, 0x00, 0x00 };
126 static const uchar cur_blank_bits[] = {
127     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
130 
131 // 20 x 20
132 static const uchar forbidden_bits[] = {
133     0x00,0x00,0x00,0x80,0x1f,0x00,0xe0,0x7f,0x00,0xf0,0xf0,0x00,0x38,0xc0,0x01,
134     0x7c,0x80,0x03,0xec,0x00,0x03,0xce,0x01,0x07,0x86,0x03,0x06,0x06,0x07,0x06,
135     0x06,0x0e,0x06,0x06,0x1c,0x06,0x0e,0x38,0x07,0x0c,0x70,0x03,0x1c,0xe0,0x03,
136     0x38,0xc0,0x01,0xf0,0xe0,0x00,0xe0,0x7f,0x00,0x80,0x1f,0x00,0x00,0x00,0x00 };
137 
138 static const uchar forbiddenm_bits[] = {
139     0x80,0x1f,0x00,0xe0,0x7f,0x00,0xf0,0xff,0x00,0xf8,0xff,0x01,0xfc,0xf0,0x03,
140     0xfe,0xc0,0x07,0xfe,0x81,0x07,0xff,0x83,0x0f,0xcf,0x07,0x0f,0x8f,0x0f,0x0f,
141     0x0f,0x1f,0x0f,0x0f,0x3e,0x0f,0x1f,0xfc,0x0f,0x1e,0xf8,0x07,0x3e,0xf0,0x07,
142     0xfc,0xe0,0x03,0xf8,0xff,0x01,0xf0,0xff,0x00,0xe0,0x7f,0x00,0x80,0x1f,0x00};
143 
144 // 32 x 32
145 static const uchar wait_data_bits[] = {
146    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0x00,
148    0x00, 0x04, 0x40, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x08, 0x20, 0x00,
149    0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00,
150    0x00, 0x50, 0x15, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0x40, 0x05, 0x00,
151    0x00, 0x80, 0x02, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x20, 0x08, 0x00,
152    0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x21, 0x00, 0x00, 0x88, 0x22, 0x00,
153    0x00, 0x48, 0x25, 0x00, 0x00, 0xa8, 0x2a, 0x00, 0x00, 0xfc, 0x7f, 0x00,
154    0x00, 0x04, 0x40, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
155    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
157 static const uchar wait_mask_bits[] = {
158    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0x00,
160    0x00, 0xfc, 0x7f, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0xf8, 0x3f, 0x00,
161    0x00, 0xf8, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00,
162    0x00, 0xf0, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0xc0, 0x07, 0x00,
163    0x00, 0x80, 0x03, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xe0, 0x0f, 0x00,
164    0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00,
165    0x00, 0xf8, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xfc, 0x7f, 0x00,
166    0x00, 0xfc, 0x7f, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
167    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
169 
170 static const uchar hsplit_bits[] = {
171     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173     0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
174     0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
175     0x00, 0x41, 0x82, 0x00, 0x80, 0x41, 0x82, 0x01, 0xc0, 0x7f, 0xfe, 0x03,
176     0x80, 0x41, 0x82, 0x01, 0x00, 0x41, 0x82, 0x00, 0x00, 0x40, 0x02, 0x00,
177     0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
178     0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
179     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
182 static const uchar hsplitm_bits[] = {
183     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
185     0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
186     0x00, 0xe0, 0x07, 0x00, 0x00, 0xe2, 0x47, 0x00, 0x00, 0xe3, 0xc7, 0x00,
187     0x80, 0xe3, 0xc7, 0x01, 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07,
188     0xc0, 0xff, 0xff, 0x03, 0x80, 0xe3, 0xc7, 0x01, 0x00, 0xe3, 0xc7, 0x00,
189     0x00, 0xe2, 0x47, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
190     0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
191     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
194 static const uchar vsplit_bits[] = {
195     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197     0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00,
198     0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
199     0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00,
200     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00,
201     0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
202     0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00,
203     0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
206 static const uchar vsplitm_bits[] = {
207     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
209     0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x07, 0x00,
210     0x00, 0xf8, 0x0f, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
211     0x00, 0xc0, 0x01, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00,
212     0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00,
213     0x80, 0xff, 0xff, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
214     0x00, 0xc0, 0x01, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x00,
215     0x00, 0xe0, 0x03, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00,
216     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
218 static const uchar phand_bits[] = {
219     0x00, 0x00, 0x00, 0x00,        0xfe, 0x01, 0x00, 0x00,        0x01, 0x02, 0x00, 0x00,
220     0x7e, 0x04, 0x00, 0x00,        0x08, 0x08, 0x00, 0x00,        0x70, 0x08, 0x00, 0x00,
221     0x08, 0x08, 0x00, 0x00,        0x70, 0x14, 0x00, 0x00,        0x08, 0x22, 0x00, 0x00,
222     0x30, 0x41, 0x00, 0x00,        0xc0, 0x20, 0x00, 0x00,        0x40, 0x12, 0x00, 0x00,
223     0x80, 0x08, 0x00, 0x00,        0x00, 0x05, 0x00, 0x00,        0x00, 0x02, 0x00, 0x00,
224     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,
225     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,
226     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,
227     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,
228     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,
229     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00 };
230 static const uchar phandm_bits[] = {
231     0xfe, 0x01, 0x00, 0x00,        0xff, 0x03, 0x00, 0x00,        0xff, 0x07, 0x00, 0x00,
232     0xff, 0x0f, 0x00, 0x00,        0xfe, 0x1f, 0x00, 0x00,        0xf8, 0x1f, 0x00, 0x00,
233     0xfc, 0x1f, 0x00, 0x00,        0xf8, 0x3f, 0x00, 0x00,        0xfc, 0x7f, 0x00, 0x00,
234     0xf8, 0xff, 0x00, 0x00,        0xf0, 0x7f, 0x00, 0x00,        0xe0, 0x3f, 0x00, 0x00,
235     0xc0, 0x1f, 0x00, 0x00,        0x80, 0x0f, 0x00, 0x00,        0x00, 0x07, 0x00, 0x00,
236     0x00, 0x02, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,
237     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,
238     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,
239     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,
240     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,
241     0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00 };
242 
243 static const uchar size_all_data_bits[] = {
244    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246    0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00,
247    0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
248    0x00, 0x80, 0x00, 0x00, 0x00, 0x81, 0x40, 0x00, 0x80, 0x81, 0xc0, 0x00,
249    0xc0, 0xff, 0xff, 0x01, 0x80, 0x81, 0xc0, 0x00, 0x00, 0x81, 0x40, 0x00,
250    0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
251    0x00, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xc0, 0x01, 0x00,
252    0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
255 static const uchar size_all_mask_bits[] = {
256    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
258    0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x07, 0x00,
259    0x00, 0xf8, 0x0f, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc2, 0x21, 0x00,
260    0x00, 0xc3, 0x61, 0x00, 0x80, 0xc3, 0xe1, 0x00, 0xc0, 0xff, 0xff, 0x01,
261    0xe0, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0x01, 0x80, 0xc3, 0xe1, 0x00,
262    0x00, 0xc3, 0x61, 0x00, 0x00, 0xc2, 0x21, 0x00, 0x00, 0xc0, 0x01, 0x00,
263    0x00, 0xf8, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xe0, 0x03, 0x00,
264    0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
266    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
267 
268 static const uchar whatsthis_bits[] = {
269    0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0xf0, 0x07, 0x00,
270    0x09, 0x18, 0x0e, 0x00, 0x11, 0x1c, 0x0e, 0x00, 0x21, 0x1c, 0x0e, 0x00,
271    0x41, 0x1c, 0x0e, 0x00, 0x81, 0x1c, 0x0e, 0x00, 0x01, 0x01, 0x07, 0x00,
272    0x01, 0x82, 0x03, 0x00, 0xc1, 0xc7, 0x01, 0x00, 0x49, 0xc0, 0x01, 0x00,
273    0x95, 0xc0, 0x01, 0x00, 0x93, 0xc0, 0x01, 0x00, 0x21, 0x01, 0x00, 0x00,
274    0x20, 0xc1, 0x01, 0x00, 0x40, 0xc2, 0x01, 0x00, 0x40, 0x02, 0x00, 0x00,
275    0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
277    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
280 static const uchar whatsthism_bits[] = {
281    0x01, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x07, 0x00, 0x07, 0xf8, 0x0f, 0x00,
282    0x0f, 0xfc, 0x1f, 0x00, 0x1f, 0x3e, 0x1f, 0x00, 0x3f, 0x3e, 0x1f, 0x00,
283    0x7f, 0x3e, 0x1f, 0x00, 0xff, 0x3e, 0x1f, 0x00, 0xff, 0x9d, 0x0f, 0x00,
284    0xff, 0xc3, 0x07, 0x00, 0xff, 0xe7, 0x03, 0x00, 0x7f, 0xe0, 0x03, 0x00,
285    0xf7, 0xe0, 0x03, 0x00, 0xf3, 0xe0, 0x03, 0x00, 0xe1, 0xe1, 0x03, 0x00,
286    0xe0, 0xe1, 0x03, 0x00, 0xc0, 0xe3, 0x03, 0x00, 0xc0, 0xe3, 0x03, 0x00,
287    0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
288    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
292 
293 static const uchar busy_bits[] = {
294     0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
295     0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
296     0x41, 0xe0, 0xff, 0x00, 0x81, 0x20, 0x80, 0x00, 0x01, 0xe1, 0xff, 0x00,
297     0x01, 0x42, 0x40, 0x00, 0xc1, 0x47, 0x40, 0x00, 0x49, 0x40, 0x55, 0x00,
298     0x95, 0x80, 0x2a, 0x00, 0x93, 0x00, 0x15, 0x00, 0x21, 0x01, 0x0a, 0x00,
299     0x20, 0x01, 0x11, 0x00, 0x40, 0x82, 0x20, 0x00, 0x40, 0x42, 0x44, 0x00,
300     0x80, 0x41, 0x4a, 0x00, 0x00, 0x40, 0x55, 0x00, 0x00, 0xe0, 0xff, 0x00,
301     0x00, 0x20, 0x80, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
302     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
305 static const uchar busym_bits[] = {
306     0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
307     0x0f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
308     0x7f, 0xe0, 0xff, 0x00, 0xff, 0xe0, 0xff, 0x00, 0xff, 0xe1, 0xff, 0x00,
309     0xff, 0xc3, 0x7f, 0x00, 0xff, 0xc7, 0x7f, 0x00, 0x7f, 0xc0, 0x7f, 0x00,
310     0xf7, 0x80, 0x3f, 0x00, 0xf3, 0x00, 0x1f, 0x00, 0xe1, 0x01, 0x0e, 0x00,
311     0xe0, 0x01, 0x1f, 0x00, 0xc0, 0x83, 0x3f, 0x00, 0xc0, 0xc3, 0x7f, 0x00,
312     0x80, 0xc1, 0x7f, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0x00,
313     0x00, 0xe0, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
314     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
317 
318 // 16 x 16
319 static const uchar openhand_bits[] = {
320     0x80,0x01,0x58,0x0e,0x64,0x12,0x64,0x52,0x48,0xb2,0x48,0x92,
321     0x16,0x90,0x19,0x80,0x11,0x40,0x02,0x40,0x04,0x40,0x04,0x20,
322     0x08,0x20,0x10,0x10,0x20,0x10,0x00,0x00};
323 static const uchar openhandm_bits[] = {
324     0x80,0x01,0xd8,0x0f,0xfc,0x1f,0xfc,0x5f,0xf8,0xff,0xf8,0xff,
325     0xfe,0xff,0xff,0xff,0xff,0x7f,0xfe,0x7f,0xfc,0x7f,0xfc,0x3f,
326     0xf8,0x3f,0xf0,0x1f,0xe0,0x1f,0x00,0x00};
327 static const uchar closedhand_bits[] = {
328     0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0d,0x48,0x32,0x08,0x50,
329     0x10,0x40,0x18,0x40,0x04,0x40,0x04,0x20,0x08,0x20,0x10,0x10,
330     0x20,0x10,0x20,0x10,0x00,0x00,0x00,0x00};
331 static const uchar closedhandm_bits[] = {
332     0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0d,0xf8,0x3f,0xf8,0x7f,
333     0xf0,0x7f,0xf8,0x7f,0xfc,0x7f,0xfc,0x3f,0xf8,0x3f,0xf0,0x1f,
334     0xe0,0x1f,0xe0,0x1f,0x00,0x00,0x00,0x00};
335 
336 #endif
337 
initializeCursor()338 void QWSServerPrivate::initializeCursor()
339 {
340     Q_Q(QWSServer);
341     // setup system cursors
342 #ifndef QT_NO_QWS_CURSOR
343 //    qt_screen->initCursor(sharedram + ramlen,true);
344 
345     // default cursor
346     cursor = 0;
347     setCursor(QWSCursor::systemCursor(Qt::ArrowCursor));
348 #endif
349     q->sendMouseEvent(QPoint(swidth/2, sheight/2), 0);
350 }
351 
setCursor(QWSCursor * curs)352 void QWSServerPrivate::setCursor(QWSCursor *curs)
353 {
354 #ifdef QT_NO_QWS_CURSOR
355     Q_UNUSED(curs);
356 #else
357     if (cursor == curs)
358         return;
359 
360     cursor = curs;
361 
362     if (!haveviscurs || !curs)
363         curs = QWSCursor::systemCursor(Qt::BlankCursor);
364 
365     if (qt_screencursor) {
366         qt_screencursor->set(curs->image(),
367                              curs->hotSpot().x(),
368                              curs->hotSpot().y());
369     }
370 #endif
371 }
372 
373 #ifndef QT_NO_QWS_CURSOR
cleanupSystemCursorTable()374 static void cleanupSystemCursorTable()
375 {
376     for (int i = 0; i <= Qt::LastCursor; i++)
377         if (systemCursorTable[i]) {
378             delete systemCursorTable[i];
379             systemCursorTable[i] = 0;
380         }
381 }
382 #endif
383 
createSystemCursor(int id)384 void QWSCursor::createSystemCursor(int id)
385 {
386 #ifdef QT_NO_QWS_CURSOR
387     Q_UNUSED(id);
388 #else
389     if (!systemCursorTableInit) {
390         for (int i = 0; i <= Qt::LastCursor; i++)
391             systemCursorTable[i] = 0;
392         qAddPostRoutine(cleanupSystemCursorTable);
393         systemCursorTableInit = true;
394     }
395     switch (id) {
396         // 16x16 cursors
397         case Qt::ArrowCursor:
398             systemCursorTable[Qt::ArrowCursor] =
399                 new QWSCursor(cur_arrow_bits, mcur_arrow_bits, 16, 16, 0, 0);
400             break;
401 
402         case Qt::UpArrowCursor:
403             systemCursorTable[Qt::UpArrowCursor] =
404                 new QWSCursor(cur_up_arrow_bits, mcur_up_arrow_bits, 16, 16, 7, 0);
405             break;
406 
407         case Qt::CrossCursor:
408             systemCursorTable[Qt::CrossCursor] =
409                 new QWSCursor(cur_cross_bits, mcur_cross_bits, 16, 16, 7, 7);
410             break;
411 
412         case Qt::IBeamCursor:
413             systemCursorTable[Qt::IBeamCursor] =
414                 new QWSCursor(cur_ibeam_bits, mcur_ibeam_bits, 16, 16, 7, 7);
415             break;
416 
417         case Qt::SizeVerCursor:
418             systemCursorTable[Qt::SizeVerCursor] =
419                 new QWSCursor(cur_ver_bits, mcur_ver_bits, 16, 16, 7, 7);
420             break;
421 
422         case Qt::SizeHorCursor:
423             systemCursorTable[Qt::SizeHorCursor] =
424                 new QWSCursor(cur_hor_bits, mcur_hor_bits, 16, 16, 7, 7);
425             break;
426 
427         case Qt::SizeBDiagCursor:
428             systemCursorTable[Qt::SizeBDiagCursor] =
429                 new QWSCursor(cur_bdiag_bits, mcur_bdiag_bits, 16, 16, 7, 7);
430             break;
431 
432         case Qt::SizeFDiagCursor:
433             systemCursorTable[Qt::SizeFDiagCursor] =
434                 new QWSCursor(cur_fdiag_bits, mcur_fdiag_bits, 16, 16, 7, 7);
435             break;
436 
437         case Qt::BlankCursor:
438             systemCursorTable[Qt::BlankCursor] =
439                 new QWSCursor(0, 0, 0, 0, 0, 0);
440             break;
441 
442         // 20x20 cursors
443         case Qt::ForbiddenCursor:
444             systemCursorTable[Qt::ForbiddenCursor] =
445                 new QWSCursor(forbidden_bits, forbiddenm_bits, 20, 20, 10, 10);
446             break;
447 
448         // 32x32 cursors
449         case Qt::WaitCursor:
450             systemCursorTable[Qt::WaitCursor] =
451                 new QWSCursor(wait_data_bits, wait_mask_bits, 32, 32, 15, 15);
452             break;
453 
454         case Qt::SplitVCursor:
455             systemCursorTable[Qt::SplitVCursor] =
456                 new QWSCursor(vsplit_bits, vsplitm_bits, 32, 32, 15, 15);
457             break;
458 
459         case Qt::SplitHCursor:
460             systemCursorTable[Qt::SplitHCursor] =
461                 new QWSCursor(hsplit_bits, hsplitm_bits, 32, 32, 15, 15);
462             break;
463 
464         case Qt::SizeAllCursor:
465             systemCursorTable[Qt::SizeAllCursor] =
466                 new QWSCursor(size_all_data_bits, size_all_mask_bits, 32, 32, 15, 15);
467             break;
468 
469         case Qt::PointingHandCursor:
470             systemCursorTable[Qt::PointingHandCursor] =
471                 new QWSCursor(phand_bits, phandm_bits, 32, 32, 0, 0);
472             break;
473 
474         case Qt::WhatsThisCursor:
475             systemCursorTable[Qt::WhatsThisCursor] =
476                 new QWSCursor(whatsthis_bits, whatsthism_bits, 32, 32, 0, 0);
477             break;
478         case Qt::BusyCursor:
479             systemCursorTable[Qt::BusyCursor] =
480                 new QWSCursor(busy_bits, busym_bits, 32, 32, 0, 0);
481             break;
482 
483         case Qt::OpenHandCursor:
484             systemCursorTable[Qt::OpenHandCursor] =
485                 new QWSCursor(openhand_bits, openhandm_bits, 16, 16, 8, 8);
486             break;
487         case Qt::ClosedHandCursor:
488             systemCursorTable[Qt::ClosedHandCursor] =
489                 new QWSCursor(closedhand_bits, closedhandm_bits, 16, 16, 8, 8);
490             break;
491         default:
492             qWarning("Unknown system cursor %d", id);
493     }
494 #endif
495 }
496 
systemCursor(int id)497 QWSCursor *QWSCursor::systemCursor(int id)
498 {
499     QWSCursor *cursor = 0;
500 #ifdef QT_NO_QWS_CURSOR
501     Q_UNUSED(id);
502 #else
503     if (id >= 0 && id <= Qt::LastCursor) {
504         if (!systemCursorTable[id])
505             createSystemCursor(id);
506         cursor = systemCursorTable[id];
507     }
508 
509     if (cursor == 0) {
510         if (!systemCursorTable[Qt::ArrowCursor])
511             createSystemCursor(Qt::ArrowCursor);
512         cursor = systemCursorTable[Qt::ArrowCursor];
513     }
514 #endif
515     return cursor;
516 }
517 
set(const uchar * data,const uchar * mask,int width,int height,int hx,int hy)518 void QWSCursor::set(const uchar *data, const uchar *mask,
519                     int width, int height, int hx, int hy)
520 {
521 #ifdef QT_NO_QWS_CURSOR
522     Q_UNUSED(data);
523     Q_UNUSED(mask);
524     Q_UNUSED(width);
525     Q_UNUSED(height);
526     Q_UNUSED(hx);
527     Q_UNUSED(hy);
528 #else
529     hot.setX(hx);
530     hot.setY(hy);
531 
532     cursor = QImage(width,height, QImage::Format_Indexed8);
533 
534     if (!width || !height || !data || !mask || cursor.isNull())
535         return;
536 
537     cursor.setColorCount(3);
538     cursor.setColor(0, 0xff000000);
539     cursor.setColor(1, 0xffffffff);
540     cursor.setColor(2, 0x00000000);
541 
542     int bytesPerLine = (width + 7) / 8;
543     int p = 0;
544     int d, m;
545 
546     int x = -1, w = 0;
547 
548     uchar *cursor_data = cursor.bits();
549     int bpl = cursor.bytesPerLine();
550     for (int i = 0; i < height; i++)
551     {
552         for (int j = 0; j < bytesPerLine; j++, data++, mask++)
553         {
554             for (int b = 0; b < 8 && j*8+b < width; b++)
555             {
556                 d = *data & (1 << b);
557                 m = *mask & (1 << b);
558                 if (d && m) p = 0;
559                 else if (!d && m) p = 1;
560                 else p = 2;
561                 cursor_data[j*8+b] = p;
562 
563                 // calc region
564                 if (x < 0 && m)
565                     x = j*8+b;
566                 else if (x >= 0 && !m) {
567                     x = -1;
568                     w = 0;
569                 }
570                 if (m)
571                     w++;
572             }
573         }
574         if (x >= 0) {
575             x = -1;
576             w = 0;
577         }
578         cursor_data += bpl;
579     }
580 
581     if (qt_screencursor && qt_screencursor->supportsAlphaCursor())
582         createDropShadow(5, 2);
583 #endif
584 }
585 
586 // now we're really silly
createDropShadow(int dropx,int dropy)587 void QWSCursor::createDropShadow(int dropx, int dropy)
588 {
589     //####
590 #if 1 || defined(QT_NO_QWS_CURSOR) || defined(QT_NO_QWS_ALHPA_CURSOR)
591     Q_UNUSED(dropx);
592     Q_UNUSED(dropy);
593 #else
594     if (cursor.width() + dropx > 64 || cursor.height() + dropy > 64)
595         return;
596 
597     if (!cursor.hasAlphaBuffer()) {
598         cursor.setAlphaBuffer(true);
599 
600         const int nblur=4;
601         const int darkness=140;
602 
603         QImage drop(cursor.width()+dropx+nblur, cursor.height()+dropy+nblur, 8, 18);
604         drop.setColor(0, 0xff000000); // bg (black)
605         drop.setColor(1, 0xffffffff); // fg (white)
606         for (int i=0; i<16; i++) {
607             drop.setColor(2+i, (darkness*i/16)<<24);
608         }
609         drop.fill(2); // all trans
610         QImage drop2 = drop.copy();
611 
612         int cp;
613 
614         // made solid shadow
615         for (int row = 0; row < cursor.height(); row++) {
616             for (int col = 0; col < cursor.width(); col++) {
617                 cp = cursor.pixelIndex(col, row);
618                 if (cp != 2)
619                     drop.setPixel(col+dropx, row+dropy, 17);
620             }
621         }
622 
623         // blur shadow
624         for (int blur=0; blur<nblur; blur++) {
625             QImage& to((blur&1)?drop:drop2);
626             QImage& from((blur&1)?drop2:drop);
627             for (int row = 1; row < drop.height()-1; row++) {
628                 for (int col = 1; col < drop.width()-1; col++) {
629                     int t=0;
630                     for (int dx=-1; dx<=1; dx++) {
631                         for (int dy=-1; dy<=1; dy++) {
632                             t += from.pixelIndex(col+dx,row+dy)-2;
633                         }
634                     }
635                     to.setPixel(col,row,2+t/9);
636                 }
637             }
638         }
639 
640         // copy cursor
641         for (int row = 0; row < cursor.height(); row++) {
642             for (int col = 0; col < cursor.width(); col++) {
643                 cp = cursor.pixelIndex(col, row);
644                 if (cp != 2)
645                     drop.setPixel(col, row, cp);
646             }
647         }
648 
649         cursor = drop;
650     }
651 #endif
652 }
653 
654 QT_END_NAMESPACE
655