00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef QSCREEN_QWS_H
00043 #define QSCREEN_QWS_H
00044
00045 #include <QtCore/qnamespace.h>
00046 #include <QtCore/qpoint.h>
00047 #include <QtCore/qlist.h>
00048 #include <QtGui/qrgb.h>
00049 #include <QtCore/qrect.h>
00050 #include <QtGui/qimage.h>
00051 #include <QtGui/qregion.h>
00052
00053 struct fb_cmap;
00054
00055 QT_BEGIN_HEADER
00056
00057 QT_BEGIN_NAMESPACE
00058
00059 QT_MODULE(Gui)
00060
00061 class QScreenCursor;
00062 class QBrush;
00063 class QWSWindow;
00064 class QWSWindowSurface;
00065 class QGraphicsSystem;
00066 class QPixmapData;
00067
00068 #ifndef QT_QWS_DEPTH16_RGB
00069 #define QT_QWS_DEPTH16_RGB 565
00070 #endif
00071 static const int qt_rbits = (QT_QWS_DEPTH16_RGB/100);
00072 static const int qt_gbits = (QT_QWS_DEPTH16_RGB/10%10);
00073 static const int qt_bbits = (QT_QWS_DEPTH16_RGB%10);
00074 static const int qt_red_shift = qt_bbits+qt_gbits-(8-qt_rbits);
00075 static const int qt_green_shift = qt_bbits-(8-qt_gbits);
00076 static const int qt_neg_blue_shift = 8-qt_bbits;
00077 static const int qt_blue_mask = (1<<qt_bbits)-1;
00078 static const int qt_green_mask = (1<<(qt_gbits+qt_bbits))-(1<<qt_bbits);
00079 static const int qt_red_mask = (1<<(qt_rbits+qt_gbits+qt_bbits))-(1<<(qt_gbits+qt_bbits));
00080
00081 static const int qt_red_rounding_shift = qt_red_shift + qt_rbits;
00082 static const int qt_green_rounding_shift = qt_green_shift + qt_gbits;
00083 static const int qt_blue_rounding_shift = qt_bbits - qt_neg_blue_shift;
00084
00085
00086 inline ushort qt_convRgbTo16(const int r, const int g, const int b)
00087 {
00088 const int tr = r << qt_red_shift;
00089 const int tg = g << qt_green_shift;
00090 const int tb = b >> qt_neg_blue_shift;
00091
00092 return (tb & qt_blue_mask) | (tg & qt_green_mask) | (tr & qt_red_mask);
00093 }
00094
00095 inline ushort qt_convRgbTo16(QRgb c)
00096 {
00097 const int tr = qRed(c) << qt_red_shift;
00098 const int tg = qGreen(c) << qt_green_shift;
00099 const int tb = qBlue(c) >> qt_neg_blue_shift;
00100
00101 return (tb & qt_blue_mask) | (tg & qt_green_mask) | (tr & qt_red_mask);
00102 }
00103
00104 inline QRgb qt_conv16ToRgb(ushort c)
00105 {
00106 const int r=(c & qt_red_mask);
00107 const int g=(c & qt_green_mask);
00108 const int b=(c & qt_blue_mask);
00109 const int tr = r >> qt_red_shift | r >> qt_red_rounding_shift;
00110 const int tg = g >> qt_green_shift | g >> qt_green_rounding_shift;
00111 const int tb = b << qt_neg_blue_shift | b >> qt_blue_rounding_shift;
00112
00113 return qRgb(tr,tg,tb);
00114 }
00115
00116 inline void qt_conv16ToRgb(ushort c, int& r, int& g, int& b)
00117 {
00118 const int tr=(c & qt_red_mask);
00119 const int tg=(c & qt_green_mask);
00120 const int tb=(c & qt_blue_mask);
00121 r = tr >> qt_red_shift | tr >> qt_red_rounding_shift;
00122 g = tg >> qt_green_shift | tg >> qt_green_rounding_shift;
00123 b = tb << qt_neg_blue_shift | tb >> qt_blue_rounding_shift;
00124 }
00125
00126 const int SourceSolid=0;
00127 const int SourcePixmap=1;
00128
00129 #ifndef QT_NO_QWS_CURSOR
00130
00131 class QScreenCursor;
00132 extern QScreenCursor *qt_screencursor;
00133 extern bool qt_sw_cursor;
00134
00135 class Q_GUI_EXPORT QScreenCursor
00136 {
00137 public:
00138 QScreenCursor();
00139 virtual ~QScreenCursor();
00140
00141 virtual void set(const QImage &image, int hotx, int hoty);
00142 virtual void move(int x, int y);
00143 virtual void show();
00144 virtual void hide();
00145
00146 bool supportsAlphaCursor() const { return supportsAlpha; }
00147
00148 static bool enabled() { return qt_sw_cursor; }
00149
00150 QRect boundingRect() const { return QRect(pos - hotspot, size); }
00151 QImage image() const { return cursor; }
00152 bool isVisible() const { return enable; }
00153 bool isAccelerated() const { return hwaccel; }
00154
00155 static void initSoftwareCursor();
00156 static QScreenCursor* instance() { return qt_screencursor; }
00157
00158 protected:
00159 QImage cursor;
00160
00161 QSize size;
00162 QPoint pos;
00163 QPoint hotspot;
00164 uint enable : 1;
00165 uint hwaccel : 1;
00166 uint supportsAlpha : 1;
00167
00168 private:
00169 friend class QProxyScreenCursor;
00170 };
00171
00172 #endif // QT_NO_QWS_CURSOR
00173
00174
00175
00176 class QPoolEntry
00177 {
00178 public:
00179 unsigned int start;
00180 unsigned int end;
00181 int clientId;
00182 };
00183
00184 class QScreen;
00185 class QScreenPrivate;
00186 class QPixmapDataFactory;
00187
00188 extern Q_GUI_EXPORT QScreen *qt_screen;
00189 typedef void(*ClearCacheFunc)(QScreen *obj, int);
00190
00191 class Q_GUI_EXPORT QScreen {
00192
00193 public:
00194 enum ClassId { LinuxFBClass, TransformedClass, VNCClass, MultiClass,
00195 VFbClass, DirectFBClass, SvgalibClass, ProxyClass,
00196 GLClass, CustomClass = 1024 };
00197
00198 QScreen(int display_id, ClassId classId);
00199 explicit QScreen(int display_id);
00200 virtual ~QScreen();
00201 static QScreen* instance() { return qt_screen; }
00202 virtual bool initDevice() = 0;
00203 virtual bool connect(const QString &displaySpec) = 0;
00204 virtual void disconnect() = 0;
00205 virtual void shutdownDevice();
00206 virtual void setMode(int,int,int) = 0;
00207 virtual bool supportsDepth(int) const;
00208
00209 virtual void save();
00210 virtual void restore();
00211 virtual void blank(bool on);
00212
00213 virtual int pixmapOffsetAlignment() { return 64; }
00214 virtual int pixmapLinestepAlignment() { return 64; }
00215 virtual int sharedRamSize(void *) { return 0; }
00216
00217 virtual bool onCard(const unsigned char *) const;
00218 virtual bool onCard(const unsigned char *, ulong& out_offset) const;
00219
00220 enum PixelType { NormalPixel, BGRPixel };
00221
00222
00223 virtual void set(unsigned int,unsigned int,unsigned int,unsigned int);
00224
00225 virtual int alloc(unsigned int,unsigned int,unsigned int);
00226
00227 int width() const { return w; }
00228 int height() const { return h; }
00229 int depth() const { return d; }
00230 virtual int pixmapDepth() const;
00231 PixelType pixelType() const { return pixeltype; }
00232 int linestep() const { return lstep; }
00233 int deviceWidth() const { return dw; }
00234 int deviceHeight() const { return dh; }
00235 uchar * base() const { return data; }
00236
00237 virtual uchar * cache(int) { return 0; }
00238 virtual void uncache(uchar *) {}
00239
00240 QImage::Format pixelFormat() const;
00241
00242 int screenSize() const { return size; }
00243 int totalSize() const { return mapsize; }
00244
00245 QRgb * clut() { return screenclut; }
00246 #ifdef QT_DEPRECATED
00247 QT_DEPRECATED int numCols() { return screencols; }
00248 #endif
00249 int colorCount() { return screencols; }
00250
00251 virtual QSize mapToDevice(const QSize &) const;
00252 virtual QSize mapFromDevice(const QSize &) const;
00253 virtual QPoint mapToDevice(const QPoint &, const QSize &) const;
00254 virtual QPoint mapFromDevice(const QPoint &, const QSize &) const;
00255 virtual QRect mapToDevice(const QRect &, const QSize &) const;
00256 virtual QRect mapFromDevice(const QRect &, const QSize &) const;
00257 virtual QImage mapToDevice(const QImage &) const;
00258 virtual QImage mapFromDevice(const QImage &) const;
00259 virtual QRegion mapToDevice(const QRegion &, const QSize &) const;
00260 virtual QRegion mapFromDevice(const QRegion &, const QSize &) const;
00261 virtual int transformOrientation() const;
00262 virtual bool isTransformed() const;
00263 virtual bool isInterlaced() const;
00264
00265 virtual void setDirty(const QRect&);
00266
00267 virtual int memoryNeeded(const QString&);
00268
00269 virtual void haltUpdates();
00270 virtual void resumeUpdates();
00271
00272
00273 virtual void exposeRegion(QRegion r, int changing);
00274
00275
00276 virtual void blit(const QImage &img, const QPoint &topLeft, const QRegion ®ion);
00277 virtual void solidFill(const QColor &color, const QRegion ®ion);
00278 void blit(QWSWindow *bs, const QRegion &clip);
00279
00280 virtual QWSWindowSurface* createSurface(QWidget *widget) const;
00281 virtual QWSWindowSurface* createSurface(const QString &key) const;
00282
00283 virtual QList<QScreen*> subScreens() const { return QList<QScreen*>(); }
00284 virtual QRegion region() const { return QRect(offset(), QSize(w, h)); }
00285 int subScreenIndexAt(const QPoint &p) const;
00286
00287 void setOffset(const QPoint &p);
00288 QPoint offset() const;
00289
00290 int physicalWidth() const { return physWidth; }
00291 int physicalHeight() const { return physHeight; }
00292
00293 QPixmapDataFactory* pixmapDataFactory() const;
00294 QGraphicsSystem* graphicsSystem() const;
00295
00296 #ifdef QT_QWS_CLIENTBLIT
00297 bool supportsBlitInClients() const;
00298 void setSupportsBlitInClients(bool);
00299 #endif
00300
00301 ClassId classId() const;
00302
00303 protected:
00304 void setPixelFormat(QImage::Format format);
00305 void setPixmapDataFactory(QPixmapDataFactory *factory);
00306 void setGraphicsSystem(QGraphicsSystem* system);
00307
00308 QRgb screenclut[256];
00309 int screencols;
00310
00311 uchar * data;
00312
00313
00314
00315
00316
00317
00318
00319
00320 QPoolEntry * entries;
00321 int * entryp;
00322 unsigned int * lowest;
00323
00324 int w;
00325 int lstep;
00326 int h;
00327 int d;
00328 PixelType pixeltype;
00329 bool grayscale;
00330
00331 int dw;
00332 int dh;
00333
00334 int size;
00335 int mapsize;
00336
00337 int displayId;
00338
00339 int physWidth;
00340 int physHeight;
00341
00342 friend class QWSServer;
00343 friend class QWSServerPrivate;
00344 static ClearCacheFunc clearCacheFunc;
00345
00346 private:
00347 void compose(int level, const QRegion &exposed, QRegion &blend,
00348 QImage **blendbuffer, int changing_level);
00349 void paintBackground(const QRegion &);
00350
00351 friend class QWSOnScreenSurface;
00352 static bool isWidgetPaintOnScreen(const QWidget *w);
00353
00354 #if Q_BYTE_ORDER == Q_BIG_ENDIAN
00355 void setFrameBufferLittleEndian(bool littleEndian);
00356 bool frameBufferLittleEndian() const;
00357 friend class QVNCScreen;
00358 friend class QLinuxFbScreen;
00359 friend class QVFbScreen;
00360 friend class QProxyScreen;
00361 #endif
00362 friend void qt_solidFill_setup(QScreen*, const QColor&, const QRegion&);
00363 friend void qt_blit_setup(QScreen *screen, const QImage &image,
00364 const QPoint &topLeft, const QRegion ®ion);
00365 #ifdef QT_QWS_DEPTH_GENERIC
00366 friend void qt_set_generic_blit(QScreen *screen, int bpp,
00367 int len_red, int len_green, int len_blue,
00368 int len_alpha, int off_red, int off_green,
00369 int off_blue, int off_alpha);
00370 #endif
00371
00372 QScreenPrivate *d_ptr;
00373 };
00374
00375
00376
00377 #ifndef QT_LOADABLE_MODULES
00378 extern "C" QScreen * qt_get_screen(int display_id, const char* spec);
00379 #endif
00380
00381
00382
00383
00384 const unsigned char * qt_probe_bus();
00385
00386 QT_END_NAMESPACE
00387
00388 QT_END_HEADER
00389
00390 #endif // QSCREEN_QWS_H