1 /****************************************************************************
2 ** $Id: qt/qpaintdevice.h 3.3.8 edited Jan 11 14:38 $
3 **
4 ** Definition of QPaintDevice class
5 **
6 ** Created : 940721
7 **
8 ** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.
9 **
10 ** This file is part of the kernel module of the Qt GUI Toolkit.
11 **
12 ** This file may be distributed under the terms of the Q Public License
13 ** as defined by Trolltech ASA of Norway and appearing in the file
14 ** LICENSE.QPL included in the packaging of this file.
15 **
16 ** This file may be distributed and/or modified under the terms of the
17 ** GNU General Public License version 2 as published by the Free Software
18 ** Foundation and appearing in the file LICENSE.GPL included in the
19 ** packaging of this file.
20 **
21 ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
22 ** licenses may use this file in accordance with the Qt Commercial License
23 ** Agreement provided with the Software.
24 **
25 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
26 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27 **
28 ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
29 ** information about Qt Commercial License Agreements.
30 ** See http://www.trolltech.com/qpl/ for QPL licensing information.
31 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
32 **
33 ** Contact info@trolltech.com if any conditions of this licensing are
34 ** not clear to you.
35 **
36 **********************************************************************/
37
38 #ifndef QPAINTDEVICE_H
39 #define QPAINTDEVICE_H
40
41 #ifndef QT_H
42 #include "qwindowdefs.h"
43 #include "qrect.h"
44 #endif // QT_H
45
46 #if defined(Q_WS_QWS)
47 class QWSDisplay;
48 class QGfx;
49 #endif
50
51 class QIODevice;
52 class QString;
53 class QTextItem;
54
55
56 #if defined(Q_WS_X11)
57 struct QPaintDeviceX11Data;
58 #endif
59
60 union QPDevCmdParam {
61 int ival;
62 int *ivec;
63 QString *str;
64 const QPoint *point;
65 const QRect *rect;
66 const QPointArray *ptarr;
67 const QPixmap *pixmap;
68 const QImage *image;
69 const QColor *color;
70 const QFont *font;
71 const QPen *pen;
72 const QBrush *brush;
73 const QRegion *rgn;
74 const QWMatrix *matrix;
75 const QTextItem *textItem;
76 QIODevice *device;
77 };
78
79
80
81 class Q_EXPORT QPaintDevice // device for QPainter
82 {
83 public:
84 virtual ~QPaintDevice();
85
86 int devType() const;
87 bool isExtDev() const;
88 bool paintingActive() const;
89
90 virtual void setResolution( int );
91 virtual int resolution() const;
92
93 // Windows: get device context
94 // X-Windows: get drawable
95 #if defined(Q_WS_WIN)
96 virtual HDC handle() const;
97 #elif defined(Q_WS_X11)
98 virtual Qt::HANDLE handle() const;
99 virtual Qt::HANDLE x11RenderHandle() const;
100 #elif defined(Q_WS_MAC)
101 virtual Qt::HANDLE handle() const;
102 #elif defined(Q_WS_QWS)
103 virtual Qt::HANDLE handle() const;
104 #endif
105
106 #if defined(Q_WS_X11)
107 Display *x11Display() const;
108 int x11Screen() const;
109 int x11Depth() const;
110 int x11Cells() const;
111 Qt::HANDLE x11Colormap() const;
112 bool x11DefaultColormap() const;
113 void *x11Visual() const;
114 bool x11DefaultVisual() const;
115
116 static Display *x11AppDisplay();
117 static int x11AppScreen();
118
119 static int x11AppDpiX();
120 static int x11AppDpiY();
121 static void x11SetAppDpiX(int);
122 static void x11SetAppDpiY(int);
123 static int x11AppDepth();
124 static int x11AppCells();
125 static Qt::HANDLE x11AppRootWindow();
126 static Qt::HANDLE x11AppColormap();
127 static bool x11AppDefaultColormap();
128 static void *x11AppVisual();
129 static bool x11AppDefaultVisual();
130
131 // ### in 4.0, the above need to go away, the below needs to take a -1 default
132 // argument, signifying the default screen...
133 static int x11AppDepth( int screen );
134 static int x11AppCells( int screen );
135 static Qt::HANDLE x11AppRootWindow( int screen );
136 static Qt::HANDLE x11AppColormap( int screen );
137 static void *x11AppVisual( int screen );
138 static bool x11AppDefaultColormap( int screen );
139 static bool x11AppDefaultVisual( int screen );
140 static int x11AppDpiX( int );
141 static int x11AppDpiY( int );
142 static void x11SetAppDpiX( int, int );
143 static void x11SetAppDpiY( int, int );
144 #endif
145
146 #if defined(Q_WS_QWS)
147 static QWSDisplay *qwsDisplay();
148 virtual unsigned char * scanLine(int) const;
149 virtual int bytesPerLine() const;
150 virtual QGfx * graphicsContext(bool clip_children=TRUE) const;
151 #endif
152
153 enum PDevCmd {
154 PdcNOP = 0, // <void>
155 PdcDrawPoint = 1, // point
156 PdcDrawFirst = PdcDrawPoint,
157 PdcMoveTo = 2, // point
158 PdcLineTo = 3, // point
159 PdcDrawLine = 4, // point,point
160 PdcDrawRect = 5, // rect
161 PdcDrawRoundRect = 6, // rect,ival,ival
162 PdcDrawEllipse = 7, // rect
163 PdcDrawArc = 8, // rect,ival,ival
164 PdcDrawPie = 9, // rect,ival,ival
165 PdcDrawChord = 10, // rect,ival,ival
166 PdcDrawLineSegments = 11, // ptarr
167 PdcDrawPolyline = 12, // ptarr
168 PdcDrawPolygon = 13, // ptarr,ival
169 PdcDrawCubicBezier = 14, // ptarr
170 PdcDrawText = 15, // point,str
171 PdcDrawTextFormatted = 16, // rect,ival,str
172 PdcDrawPixmap = 17, // rect,pixmap
173 PdcDrawImage = 18, // rect,image
174 PdcDrawText2 = 19, // point,str
175 PdcDrawText2Formatted = 20, // rect,ival,str
176 PdcDrawTextItem = 21,
177 PdcDrawLast = PdcDrawTextItem,
178
179 // no painting commands below PdcDrawLast.
180
181 PdcBegin = 30, // <void>
182 PdcEnd = 31, // <void>
183 PdcSave = 32, // <void>
184 PdcRestore = 33, // <void>
185 PdcSetdev = 34, // device - PRIVATE
186 PdcSetBkColor = 40, // color
187 PdcSetBkMode = 41, // ival
188 PdcSetROP = 42, // ival
189 PdcSetBrushOrigin = 43, // point
190 PdcSetFont = 45, // font
191 PdcSetPen = 46, // pen
192 PdcSetBrush = 47, // brush
193 PdcSetTabStops = 48, // ival
194 PdcSetTabArray = 49, // ival,ivec
195 PdcSetUnit = 50, // ival
196 PdcSetVXform = 51, // ival
197 PdcSetWindow = 52, // rect
198 PdcSetViewport = 53, // rect
199 PdcSetWXform = 54, // ival
200 PdcSetWMatrix = 55, // matrix,ival
201 PdcSaveWMatrix = 56,
202 PdcRestoreWMatrix = 57,
203 PdcSetClip = 60, // ival
204 PdcSetClipRegion = 61, // rgn
205
206 PdcReservedStart = 0, // codes 0-199 are reserved
207 PdcReservedStop = 199 // for Qt
208 };
209
210 protected:
211 QPaintDevice( uint devflags );
212
213 #if defined(Q_WS_WIN)
214 HDC hdc; // device context
215 #elif defined(Q_WS_X11)
216 Qt::HANDLE hd; // handle to drawable
217 Qt::HANDLE rendhd; // handle to RENDER pict
218
219 void copyX11Data( const QPaintDevice * );
220 void cloneX11Data( const QPaintDevice * );
221 virtual void setX11Data( const QPaintDeviceX11Data* );
222 QPaintDeviceX11Data* getX11Data( bool def=FALSE ) const;
223 #elif defined(Q_WS_MAC)
224 #if !defined( QMAC_NO_QUARTZ )
225 CGContextRef ctx;
226 #endif
227 void * hd;
228 #elif defined(Q_WS_QWS)
229 Qt::HANDLE hd;
230 #endif
231
232 virtual bool cmd( int, QPainter *, QPDevCmdParam * );
233 virtual int metric( int ) const;
234 virtual int fontMet( QFont *, int, const char * = 0, int = 0 ) const;
235 virtual int fontInf( QFont *, int ) const;
236
237 ushort devFlags; // device flags
238 ushort painters; // refcount
239
240 friend class QPainter;
241 friend class QPaintDeviceMetrics;
242 #if defined(Q_WS_MAC)
243 #ifndef QMAC_NO_QUARTZ
244 virtual CGContextRef macCGContext(bool clipped=TRUE) const;
245 #endif
246 friend Q_EXPORT void unclippedScaledBitBlt( QPaintDevice *, int, int, int, int,
247 const QPaintDevice *, int, int, int, int, Qt::RasterOp, bool, bool );
248 #else
249 friend Q_EXPORT void bitBlt( QPaintDevice *, int, int,
250 const QPaintDevice *,
251 int, int, int, int, Qt::RasterOp, bool );
252 #endif
253 #if defined(Q_WS_X11)
254 friend void qt_init_internal( int *, char **, Display *, Qt::HANDLE, Qt::HANDLE );
255 friend void qt_cleanup();
256 #endif
257
258 private:
259 #if defined(Q_WS_X11)
260 static Display *x_appdisplay;
261 static int x_appscreen;
262
263 static int x_appdepth;
264 static int x_appcells;
265 static Qt::HANDLE x_approotwindow;
266 static Qt::HANDLE x_appcolormap;
267 static bool x_appdefcolormap;
268 static void *x_appvisual;
269 static bool x_appdefvisual;
270
271 // ### in 4.0, remove the above, and replace with the below
272 static int *x_appdepth_arr;
273 static int *x_appcells_arr;
274 static Qt::HANDLE *x_approotwindow_arr;
275 static Qt::HANDLE *x_appcolormap_arr;
276 static bool *x_appdefcolormap_arr;
277 static void **x_appvisual_arr;
278 static bool *x_appdefvisual_arr;
279
280 QPaintDeviceX11Data* x11Data;
281 #endif
282
283 private: // Disabled copy constructor and operator=
284 #if defined(Q_DISABLE_COPY)
285 QPaintDevice( const QPaintDevice & );
286 QPaintDevice &operator=( const QPaintDevice & );
287 #endif
288 };
289
290
291 Q_EXPORT
292 void bitBlt( QPaintDevice *dst, int dx, int dy,
293 const QPaintDevice *src, int sx=0, int sy=0, int sw=-1, int sh=-1,
294 Qt::RasterOp = Qt::CopyROP, bool ignoreMask=FALSE );
295
296 Q_EXPORT
297 void bitBlt( QPaintDevice *dst, int dx, int dy,
298 const QImage *src, int sx=0, int sy=0, int sw=-1, int sh=-1,
299 int conversion_flags=0 );
300
301
302 #if defined(Q_WS_X11)
303
304 struct Q_EXPORT QPaintDeviceX11Data : public QShared {
305 Display* x_display;
306 int x_screen;
307 int x_depth;
308 int x_cells;
309 Qt::HANDLE x_colormap;
310 bool x_defcolormap;
311 void* x_visual;
312 bool x_defvisual;
313 };
314
315 #endif
316
317 /*****************************************************************************
318 Inline functions
319 *****************************************************************************/
320
devType()321 inline int QPaintDevice::devType() const
322 { return devFlags & QInternal::DeviceTypeMask; }
323
isExtDev()324 inline bool QPaintDevice::isExtDev() const
325 { return (devFlags & QInternal::ExternalDevice) != 0; }
326
paintingActive()327 inline bool QPaintDevice::paintingActive() const
328 { return painters != 0; }
329
330 #if defined(Q_WS_X11)
x11Display()331 inline Display *QPaintDevice::x11Display() const
332 { return x11Data ? x11Data->x_display : x_appdisplay; }
333
x11Screen()334 inline int QPaintDevice::x11Screen() const
335 { return x11Data ? x11Data->x_screen : x_appscreen; }
336
x11Depth()337 inline int QPaintDevice::x11Depth() const
338 { return x11Data ? x11Data->x_depth : x_appdepth; }
339
x11Cells()340 inline int QPaintDevice::x11Cells() const
341 { return x11Data ? x11Data->x_cells : x_appcells; }
342
x11Colormap()343 inline Qt::HANDLE QPaintDevice::x11Colormap() const
344 { return x11Data ? x11Data->x_colormap : x_appcolormap; }
345
x11DefaultColormap()346 inline bool QPaintDevice::x11DefaultColormap() const
347 { return x11Data ? x11Data->x_defcolormap : x_appdefcolormap; }
348
x11Visual()349 inline void *QPaintDevice::x11Visual() const
350 { return x11Data ? x11Data->x_visual : x_appvisual; }
351
x11DefaultVisual()352 inline bool QPaintDevice::x11DefaultVisual() const
353 { return x11Data ? x11Data->x_defvisual : x_appdefvisual; }
354
x11AppDisplay()355 inline Display *QPaintDevice::x11AppDisplay()
356 { return x_appdisplay; }
357
x11AppScreen()358 inline int QPaintDevice::x11AppScreen()
359 { return x_appscreen; }
360
x11AppDepth(int screen)361 inline int QPaintDevice::x11AppDepth( int screen )
362 { return x_appdepth_arr[ screen == -1 ? x_appscreen : screen ]; }
363
x11AppCells(int screen)364 inline int QPaintDevice::x11AppCells( int screen )
365 { return x_appcells_arr[ screen == -1 ? x_appscreen : screen ]; }
366
x11AppRootWindow(int screen)367 inline Qt::HANDLE QPaintDevice::x11AppRootWindow( int screen )
368 { return x_approotwindow_arr[ screen == -1 ? x_appscreen : screen ]; }
369
x11AppColormap(int screen)370 inline Qt::HANDLE QPaintDevice::x11AppColormap( int screen )
371 { return x_appcolormap_arr[ screen == -1 ? x_appscreen : screen ]; }
372
x11AppDefaultColormap(int screen)373 inline bool QPaintDevice::x11AppDefaultColormap( int screen )
374 { return x_appdefcolormap_arr[ screen == -1 ? x_appscreen : screen ]; }
375
x11AppVisual(int screen)376 inline void *QPaintDevice::x11AppVisual( int screen )
377 { return x_appvisual_arr[ screen == -1 ? x_appscreen : screen ]; }
378
x11AppDefaultVisual(int screen)379 inline bool QPaintDevice::x11AppDefaultVisual( int screen )
380 { return x_appdefvisual_arr[ screen == -1 ? x_appscreen : screen ]; }
381
x11AppDepth()382 inline int QPaintDevice::x11AppDepth()
383 { return x_appdepth; }
384
x11AppCells()385 inline int QPaintDevice::x11AppCells()
386 { return x_appcells; }
387
x11AppRootWindow()388 inline Qt::HANDLE QPaintDevice::x11AppRootWindow()
389 { return x_approotwindow; }
390
x11AppColormap()391 inline Qt::HANDLE QPaintDevice::x11AppColormap()
392 { return x_appcolormap; }
393
x11AppDefaultColormap()394 inline bool QPaintDevice::x11AppDefaultColormap()
395 { return x_appdefcolormap; }
396
x11AppVisual()397 inline void *QPaintDevice::x11AppVisual()
398 { return x_appvisual; }
399
x11AppDefaultVisual()400 inline bool QPaintDevice::x11AppDefaultVisual()
401 { return x_appdefvisual; }
402
403 #endif // Q_WS_X11
404
405
406 Q_EXPORT
407 inline void bitBlt( QPaintDevice *dst, const QPoint &dp,
408 const QPaintDevice *src, const QRect &sr =QRect(0,0,-1,-1),
409 Qt::RasterOp rop=Qt::CopyROP, bool ignoreMask=FALSE )
410 {
411 bitBlt( dst, dp.x(), dp.y(), src, sr.x(), sr.y(), sr.width(), sr.height(),
412 rop, ignoreMask );
413 }
414
415
416
417
418 #endif // QPAINTDEVICE_H
419