| 1 | /****************************************************************************
|
|---|
| 2 | **
|
|---|
| 3 | ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|---|
| 4 | ** All rights reserved.
|
|---|
| 5 | ** Contact: Nokia Corporation ([email protected])
|
|---|
| 6 | **
|
|---|
| 7 | ** This file is part of the QtGui module of the Qt Toolkit.
|
|---|
| 8 | **
|
|---|
| 9 | ** $QT_BEGIN_LICENSE:LGPL$
|
|---|
| 10 | ** Commercial Usage
|
|---|
| 11 | ** Licensees holding valid Qt Commercial licenses may use this file in
|
|---|
| 12 | ** accordance with the Qt Commercial License Agreement provided with the
|
|---|
| 13 | ** Software or, alternatively, in accordance with the terms contained in
|
|---|
| 14 | ** a written agreement between you and Nokia.
|
|---|
| 15 | **
|
|---|
| 16 | ** GNU Lesser General Public License Usage
|
|---|
| 17 | ** Alternatively, this file may be used under the terms of the GNU Lesser
|
|---|
| 18 | ** General Public License version 2.1 as published by the Free Software
|
|---|
| 19 | ** Foundation and appearing in the file LICENSE.LGPL included in the
|
|---|
| 20 | ** packaging of this file. Please review the following information to
|
|---|
| 21 | ** ensure the GNU Lesser General Public License version 2.1 requirements
|
|---|
| 22 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|---|
| 23 | **
|
|---|
| 24 | ** In addition, as a special exception, Nokia gives you certain additional
|
|---|
| 25 | ** rights. These rights are described in the Nokia Qt LGPL Exception
|
|---|
| 26 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|---|
| 27 | **
|
|---|
| 28 | ** GNU General Public License Usage
|
|---|
| 29 | ** Alternatively, this file may be used under the terms of the GNU
|
|---|
| 30 | ** General Public License version 3.0 as published by the Free Software
|
|---|
| 31 | ** Foundation and appearing in the file LICENSE.GPL included in the
|
|---|
| 32 | ** packaging of this file. Please review the following information to
|
|---|
| 33 | ** ensure the GNU General Public License version 3.0 requirements will be
|
|---|
| 34 | ** met: http://www.gnu.org/copyleft/gpl.html.
|
|---|
| 35 | **
|
|---|
| 36 | ** If you have questions regarding the use of this file, please contact
|
|---|
| 37 | ** Nokia at [email protected].
|
|---|
| 38 | ** $QT_END_LICENSE$
|
|---|
| 39 | **
|
|---|
| 40 | ****************************************************************************/
|
|---|
| 41 |
|
|---|
| 42 | #ifndef QSCREEN_QWS_H
|
|---|
| 43 | #define QSCREEN_QWS_H
|
|---|
| 44 |
|
|---|
| 45 | #include <QtCore/qnamespace.h>
|
|---|
| 46 | #include <QtCore/qpoint.h>
|
|---|
| 47 | #include <QtCore/qlist.h>
|
|---|
| 48 | #include <QtGui/qrgb.h>
|
|---|
| 49 | #include <QtCore/qrect.h>
|
|---|
| 50 | #include <QtGui/qimage.h>
|
|---|
| 51 | #include <QtGui/qregion.h>
|
|---|
| 52 |
|
|---|
| 53 | struct fb_cmap;
|
|---|
| 54 |
|
|---|
| 55 | QT_BEGIN_HEADER
|
|---|
| 56 |
|
|---|
| 57 | QT_BEGIN_NAMESPACE
|
|---|
| 58 |
|
|---|
| 59 | QT_MODULE(Gui)
|
|---|
| 60 |
|
|---|
| 61 | class QScreenCursor;
|
|---|
| 62 | class QBrush;
|
|---|
| 63 | class QWSWindow;
|
|---|
| 64 | class QWSWindowSurface;
|
|---|
| 65 | class QGraphicsSystem;
|
|---|
| 66 | class QPixmapData;
|
|---|
| 67 |
|
|---|
| 68 | #ifndef QT_QWS_DEPTH16_RGB
|
|---|
| 69 | #define QT_QWS_DEPTH16_RGB 565
|
|---|
| 70 | #endif
|
|---|
| 71 | static const int qt_rbits = (QT_QWS_DEPTH16_RGB/100);
|
|---|
| 72 | static const int qt_gbits = (QT_QWS_DEPTH16_RGB/10%10);
|
|---|
| 73 | static const int qt_bbits = (QT_QWS_DEPTH16_RGB%10);
|
|---|
| 74 | static const int qt_red_shift = qt_bbits+qt_gbits-(8-qt_rbits);
|
|---|
| 75 | static const int qt_green_shift = qt_bbits-(8-qt_gbits);
|
|---|
| 76 | static const int qt_neg_blue_shift = 8-qt_bbits;
|
|---|
| 77 | static const int qt_blue_mask = (1<<qt_bbits)-1;
|
|---|
| 78 | static const int qt_green_mask = (1<<(qt_gbits+qt_bbits))-(1<<qt_bbits);
|
|---|
| 79 | static const int qt_red_mask = (1<<(qt_rbits+qt_gbits+qt_bbits))-(1<<(qt_gbits+qt_bbits));
|
|---|
| 80 |
|
|---|
| 81 | static const int qt_red_rounding_shift = qt_red_shift + qt_rbits;
|
|---|
| 82 | static const int qt_green_rounding_shift = qt_green_shift + qt_gbits;
|
|---|
| 83 | static const int qt_blue_rounding_shift = qt_bbits - qt_neg_blue_shift;
|
|---|
| 84 |
|
|---|
| 85 |
|
|---|
| 86 | inline ushort qt_convRgbTo16(const int r, const int g, const int b)
|
|---|
| 87 | {
|
|---|
| 88 | const int tr = r << qt_red_shift;
|
|---|
| 89 | const int tg = g << qt_green_shift;
|
|---|
| 90 | const int tb = b >> qt_neg_blue_shift;
|
|---|
| 91 |
|
|---|
| 92 | return (tb & qt_blue_mask) | (tg & qt_green_mask) | (tr & qt_red_mask);
|
|---|
| 93 | }
|
|---|
| 94 |
|
|---|
| 95 | inline ushort qt_convRgbTo16(QRgb c)
|
|---|
| 96 | {
|
|---|
| 97 | const int tr = qRed(c) << qt_red_shift;
|
|---|
| 98 | const int tg = qGreen(c) << qt_green_shift;
|
|---|
| 99 | const int tb = qBlue(c) >> qt_neg_blue_shift;
|
|---|
| 100 |
|
|---|
| 101 | return (tb & qt_blue_mask) | (tg & qt_green_mask) | (tr & qt_red_mask);
|
|---|
| 102 | }
|
|---|
| 103 |
|
|---|
| 104 | inline QRgb qt_conv16ToRgb(ushort c)
|
|---|
| 105 | {
|
|---|
| 106 | const int r=(c & qt_red_mask);
|
|---|
| 107 | const int g=(c & qt_green_mask);
|
|---|
| 108 | const int b=(c & qt_blue_mask);
|
|---|
| 109 | const int tr = r >> qt_red_shift | r >> qt_red_rounding_shift;
|
|---|
| 110 | const int tg = g >> qt_green_shift | g >> qt_green_rounding_shift;
|
|---|
| 111 | const int tb = b << qt_neg_blue_shift | b >> qt_blue_rounding_shift;
|
|---|
| 112 |
|
|---|
| 113 | return qRgb(tr,tg,tb);
|
|---|
| 114 | }
|
|---|
| 115 |
|
|---|
| 116 | inline void qt_conv16ToRgb(ushort c, int& r, int& g, int& b)
|
|---|
| 117 | {
|
|---|
| 118 | const int tr=(c & qt_red_mask);
|
|---|
| 119 | const int tg=(c & qt_green_mask);
|
|---|
| 120 | const int tb=(c & qt_blue_mask);
|
|---|
| 121 | r = tr >> qt_red_shift | tr >> qt_red_rounding_shift;
|
|---|
| 122 | g = tg >> qt_green_shift | tg >> qt_green_rounding_shift;
|
|---|
| 123 | b = tb << qt_neg_blue_shift | tb >> qt_blue_rounding_shift;
|
|---|
| 124 | }
|
|---|
| 125 |
|
|---|
| 126 | const int SourceSolid=0;
|
|---|
| 127 | const int SourcePixmap=1;
|
|---|
| 128 |
|
|---|
| 129 | #ifndef QT_NO_QWS_CURSOR
|
|---|
| 130 |
|
|---|
| 131 | class QScreenCursor;
|
|---|
| 132 | extern QScreenCursor *qt_screencursor;
|
|---|
| 133 | extern bool qt_sw_cursor;
|
|---|
| 134 |
|
|---|
| 135 | class Q_GUI_EXPORT QScreenCursor
|
|---|
| 136 | {
|
|---|
| 137 | public:
|
|---|
| 138 | QScreenCursor();
|
|---|
| 139 | virtual ~QScreenCursor();
|
|---|
| 140 |
|
|---|
| 141 | virtual void set(const QImage &image, int hotx, int hoty);
|
|---|
| 142 | virtual void move(int x, int y);
|
|---|
| 143 | virtual void show();
|
|---|
| 144 | virtual void hide();
|
|---|
| 145 |
|
|---|
| 146 | bool supportsAlphaCursor() const { return supportsAlpha; }
|
|---|
| 147 |
|
|---|
| 148 | static bool enabled() { return qt_sw_cursor; }
|
|---|
| 149 |
|
|---|
| 150 | QRect boundingRect() const { return QRect(pos - hotspot, size); }
|
|---|
| 151 | QImage image() const { return cursor; }
|
|---|
| 152 | bool isVisible() const { return enable; }
|
|---|
| 153 | bool isAccelerated() const { return hwaccel; }
|
|---|
| 154 |
|
|---|
| 155 | static void initSoftwareCursor();
|
|---|
| 156 | static QScreenCursor* instance() { return qt_screencursor; }
|
|---|
| 157 |
|
|---|
| 158 | protected:
|
|---|
| 159 | QImage cursor;
|
|---|
| 160 |
|
|---|
| 161 | QSize size;
|
|---|
| 162 | QPoint pos;
|
|---|
| 163 | QPoint hotspot;
|
|---|
| 164 | uint enable : 1;
|
|---|
| 165 | uint hwaccel : 1;
|
|---|
| 166 | uint supportsAlpha : 1;
|
|---|
| 167 |
|
|---|
| 168 | private:
|
|---|
| 169 | friend class QProxyScreenCursor;
|
|---|
| 170 | };
|
|---|
| 171 |
|
|---|
| 172 | #endif // QT_NO_QWS_CURSOR
|
|---|
| 173 |
|
|---|
| 174 | // A (used) chunk of offscreen memory
|
|---|
| 175 |
|
|---|
| 176 | class QPoolEntry
|
|---|
| 177 | {
|
|---|
| 178 | public:
|
|---|
| 179 | unsigned int start;
|
|---|
| 180 | unsigned int end;
|
|---|
| 181 | int clientId;
|
|---|
| 182 | };
|
|---|
| 183 |
|
|---|
| 184 | class QScreen;
|
|---|
| 185 | class QScreenPrivate;
|
|---|
| 186 | class QPixmapDataFactory;
|
|---|
| 187 |
|
|---|
| 188 | extern Q_GUI_EXPORT QScreen *qt_screen;
|
|---|
| 189 | typedef void(*ClearCacheFunc)(QScreen *obj, int);
|
|---|
| 190 |
|
|---|
| 191 | class Q_GUI_EXPORT QScreen {
|
|---|
| 192 |
|
|---|
| 193 | public:
|
|---|
| 194 | enum ClassId { LinuxFBClass, TransformedClass, VNCClass, MultiClass,
|
|---|
| 195 | VFbClass, DirectFBClass, SvgalibClass, ProxyClass,
|
|---|
| 196 | GLClass, CustomClass = 1024 };
|
|---|
| 197 |
|
|---|
| 198 | QScreen(int display_id, ClassId classId);
|
|---|
| 199 | explicit QScreen(int display_id);
|
|---|
| 200 | virtual ~QScreen();
|
|---|
| 201 | static QScreen* instance() { return qt_screen; }
|
|---|
| 202 | virtual bool initDevice() = 0;
|
|---|
| 203 | virtual bool connect(const QString &displaySpec) = 0;
|
|---|
| 204 | virtual void disconnect() = 0;
|
|---|
| 205 | virtual void shutdownDevice();
|
|---|
| 206 | virtual void setMode(int,int,int) = 0;
|
|---|
| 207 | virtual bool supportsDepth(int) const;
|
|---|
| 208 |
|
|---|
| 209 | virtual void save();
|
|---|
| 210 | virtual void restore();
|
|---|
| 211 | virtual void blank(bool on);
|
|---|
| 212 |
|
|---|
| 213 | virtual int pixmapOffsetAlignment() { return 64; }
|
|---|
| 214 | virtual int pixmapLinestepAlignment() { return 64; }
|
|---|
| 215 | virtual int sharedRamSize(void *) { return 0; }
|
|---|
| 216 |
|
|---|
| 217 | virtual bool onCard(const unsigned char *) const;
|
|---|
| 218 | virtual bool onCard(const unsigned char *, ulong& out_offset) const;
|
|---|
| 219 |
|
|---|
| 220 | enum PixelType { NormalPixel, BGRPixel };
|
|---|
| 221 |
|
|---|
| 222 | // sets a single color in the colormap
|
|---|
| 223 | virtual void set(unsigned int,unsigned int,unsigned int,unsigned int);
|
|---|
| 224 | // allocates a color
|
|---|
| 225 | virtual int alloc(unsigned int,unsigned int,unsigned int);
|
|---|
| 226 |
|
|---|
| 227 | int width() const { return w; }
|
|---|
| 228 | int height() const { return h; }
|
|---|
| 229 | int depth() const { return d; }
|
|---|
| 230 | virtual int pixmapDepth() const;
|
|---|
| 231 | PixelType pixelType() const { return pixeltype; }
|
|---|
| 232 | int linestep() const { return lstep; }
|
|---|
| 233 | int deviceWidth() const { return dw; }
|
|---|
| 234 | int deviceHeight() const { return dh; }
|
|---|
| 235 | uchar * base() const { return data; }
|
|---|
| 236 | // Ask for memory from card cache with alignment
|
|---|
| 237 | virtual uchar * cache(int) { return 0; }
|
|---|
| 238 | virtual void uncache(uchar *) {}
|
|---|
| 239 |
|
|---|
| 240 | QImage::Format pixelFormat() const;
|
|---|
| 241 |
|
|---|
| 242 | int screenSize() const { return size; }
|
|---|
| 243 | int totalSize() const { return mapsize; }
|
|---|
| 244 |
|
|---|
| 245 | QRgb * clut() { return screenclut; }
|
|---|
| 246 | #ifdef QT_DEPRECATED
|
|---|
| 247 | QT_DEPRECATED int numCols() { return screencols; }
|
|---|
| 248 | #endif
|
|---|
| 249 | int colorCount() { return screencols; }
|
|---|
| 250 |
|
|---|
| 251 | virtual QSize mapToDevice(const QSize &) const;
|
|---|
| 252 | virtual QSize mapFromDevice(const QSize &) const;
|
|---|
| 253 | virtual QPoint mapToDevice(const QPoint &, const QSize &) const;
|
|---|
| 254 | virtual QPoint mapFromDevice(const QPoint &, const QSize &) const;
|
|---|
| 255 | virtual QRect mapToDevice(const QRect &, const QSize &) const;
|
|---|
| 256 | virtual QRect mapFromDevice(const QRect &, const QSize &) const;
|
|---|
| 257 | virtual QImage mapToDevice(const QImage &) const;
|
|---|
| 258 | virtual QImage mapFromDevice(const QImage &) const;
|
|---|
| 259 | virtual QRegion mapToDevice(const QRegion &, const QSize &) const;
|
|---|
| 260 | virtual QRegion mapFromDevice(const QRegion &, const QSize &) const;
|
|---|
| 261 | virtual int transformOrientation() const;
|
|---|
| 262 | virtual bool isTransformed() const;
|
|---|
| 263 | virtual bool isInterlaced() const;
|
|---|
| 264 |
|
|---|
| 265 | virtual void setDirty(const QRect&);
|
|---|
| 266 |
|
|---|
| 267 | virtual int memoryNeeded(const QString&);
|
|---|
| 268 |
|
|---|
| 269 | virtual void haltUpdates();
|
|---|
| 270 | virtual void resumeUpdates();
|
|---|
| 271 |
|
|---|
| 272 | // composition manager methods
|
|---|
| 273 | virtual void exposeRegion(QRegion r, int changing);
|
|---|
| 274 |
|
|---|
| 275 | // these work directly on the screen
|
|---|
| 276 | virtual void blit(const QImage &img, const QPoint &topLeft, const QRegion ®ion);
|
|---|
| 277 | virtual void solidFill(const QColor &color, const QRegion ®ion);
|
|---|
| 278 | void blit(QWSWindow *bs, const QRegion &clip);
|
|---|
| 279 |
|
|---|
| 280 | virtual QWSWindowSurface* createSurface(QWidget *widget) const;
|
|---|
| 281 | virtual QWSWindowSurface* createSurface(const QString &key) const;
|
|---|
| 282 |
|
|---|
| 283 | virtual QList<QScreen*> subScreens() const { return QList<QScreen*>(); }
|
|---|
| 284 | virtual QRegion region() const { return QRect(offset(), QSize(w, h)); }
|
|---|
| 285 | int subScreenIndexAt(const QPoint &p) const;
|
|---|
| 286 |
|
|---|
| 287 | void setOffset(const QPoint &p);
|
|---|
| 288 | QPoint offset() const;
|
|---|
| 289 |
|
|---|
| 290 | int physicalWidth() const { return physWidth; } // physical display size in mm
|
|---|
| 291 | int physicalHeight() const { return physHeight; } // physical display size in mm
|
|---|
| 292 |
|
|---|
| 293 | QPixmapDataFactory* pixmapDataFactory() const; // Deprecated, will be removed in 4.6
|
|---|
| 294 | QGraphicsSystem* graphicsSystem() const;
|
|---|
| 295 |
|
|---|
| 296 | #ifdef QT_QWS_CLIENTBLIT
|
|---|
| 297 | bool supportsBlitInClients() const;
|
|---|
| 298 | void setSupportsBlitInClients(bool);
|
|---|
| 299 | #endif
|
|---|
| 300 |
|
|---|
| 301 | ClassId classId() const;
|
|---|
| 302 |
|
|---|
| 303 | protected:
|
|---|
| 304 | void setPixelFormat(QImage::Format format);
|
|---|
| 305 | void setPixmapDataFactory(QPixmapDataFactory *factory); // Deprecated, will be removed in 4.6
|
|---|
| 306 | void setGraphicsSystem(QGraphicsSystem* system);
|
|---|
| 307 |
|
|---|
| 308 | QRgb screenclut[256];
|
|---|
| 309 | int screencols;
|
|---|
| 310 |
|
|---|
| 311 | uchar * data;
|
|---|
| 312 |
|
|---|
| 313 | // Table of allocated lumps, kept in sorted highest-to-lowest order
|
|---|
| 314 | // The table itself is allocated at the bottom of offscreen memory
|
|---|
| 315 | // i.e. it's similar to having a stack (the table) and a heap
|
|---|
| 316 | // (the allocated blocks). Freed space is implicitly described
|
|---|
| 317 | // by the gaps between the allocated lumps (this saves entries and
|
|---|
| 318 | // means we don't need to worry about coalescing freed lumps)
|
|---|
| 319 |
|
|---|
| 320 | QPoolEntry * entries;
|
|---|
| 321 | int * entryp;
|
|---|
| 322 | unsigned int * lowest;
|
|---|
| 323 |
|
|---|
| 324 | int w;
|
|---|
| 325 | int lstep;
|
|---|
| 326 | int h;
|
|---|
| 327 | int d;
|
|---|
| 328 | PixelType pixeltype;
|
|---|
| 329 | bool grayscale;
|
|---|
| 330 |
|
|---|
| 331 | int dw;
|
|---|
| 332 | int dh;
|
|---|
| 333 |
|
|---|
| 334 | int size; // Screen size
|
|---|
| 335 | int mapsize; // Total mapped memory
|
|---|
| 336 |
|
|---|
| 337 | int displayId;
|
|---|
| 338 |
|
|---|
| 339 | int physWidth;
|
|---|
| 340 | int physHeight;
|
|---|
| 341 |
|
|---|
| 342 | friend class QWSServer;
|
|---|
| 343 | friend class QWSServerPrivate;
|
|---|
| 344 | static ClearCacheFunc clearCacheFunc;
|
|---|
| 345 |
|
|---|
| 346 | private:
|
|---|
| 347 | void compose(int level, const QRegion &exposed, QRegion &blend,
|
|---|
| 348 | QImage **blendbuffer, int changing_level);
|
|---|
| 349 | void paintBackground(const QRegion &);
|
|---|
| 350 |
|
|---|
| 351 | friend class QWSOnScreenSurface;
|
|---|
| 352 | static bool isWidgetPaintOnScreen(const QWidget *w);
|
|---|
| 353 |
|
|---|
| 354 | #if Q_BYTE_ORDER == Q_BIG_ENDIAN
|
|---|
| 355 | void setFrameBufferLittleEndian(bool littleEndian);
|
|---|
| 356 | bool frameBufferLittleEndian() const;
|
|---|
| 357 | friend class QVNCScreen;
|
|---|
| 358 | friend class QLinuxFbScreen;
|
|---|
| 359 | friend class QVFbScreen;
|
|---|
| 360 | friend class QProxyScreen;
|
|---|
| 361 | #endif
|
|---|
| 362 | friend void qt_solidFill_setup(QScreen*, const QColor&, const QRegion&);
|
|---|
| 363 | friend void qt_blit_setup(QScreen *screen, const QImage &image,
|
|---|
| 364 | const QPoint &topLeft, const QRegion ®ion);
|
|---|
| 365 | #ifdef QT_QWS_DEPTH_GENERIC
|
|---|
| 366 | friend void qt_set_generic_blit(QScreen *screen, int bpp,
|
|---|
| 367 | int len_red, int len_green, int len_blue,
|
|---|
| 368 | int len_alpha, int off_red, int off_green,
|
|---|
| 369 | int off_blue, int off_alpha);
|
|---|
| 370 | #endif
|
|---|
| 371 |
|
|---|
| 372 | QScreenPrivate *d_ptr;
|
|---|
| 373 | };
|
|---|
| 374 |
|
|---|
| 375 | // This lives in loadable modules
|
|---|
| 376 |
|
|---|
| 377 | #ifndef QT_LOADABLE_MODULES
|
|---|
| 378 | extern "C" QScreen * qt_get_screen(int display_id, const char* spec);
|
|---|
| 379 | #endif
|
|---|
| 380 |
|
|---|
| 381 | // This is in main lib, loads the right module, calls qt_get_screen
|
|---|
| 382 | // In non-loadable cases just aliases to qt_get_screen
|
|---|
| 383 |
|
|---|
| 384 | const unsigned char * qt_probe_bus();
|
|---|
| 385 |
|
|---|
| 386 | QT_END_NAMESPACE
|
|---|
| 387 |
|
|---|
| 388 | QT_END_HEADER
|
|---|
| 389 |
|
|---|
| 390 | #endif // QSCREEN_QWS_H
|
|---|