qscreen_qws.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:12k
源码类别:

系统编程

开发平台:

Unix_Linux

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