1/****************************************************************************
2**
3** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4** Contact: http://www.qt-project.org/legal
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 Digia. For licensing terms and
14** conditions see http://qt.digia.com/licensing. For further information
15** use the contact form at http://qt.digia.com/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 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 2.1 requirements
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24**
25** In addition, as a special exception, Digia gives you certain additional
26** rights. These rights are described in the Digia Qt LGPL Exception
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28**
29** GNU General Public License Usage
30** Alternatively, this file may be used under the terms of the GNU
31** General Public License version 3.0 as published by the Free Software
32** Foundation and appearing in the file LICENSE.GPL included in the
33** packaging of this file. Please review the following information to
34** ensure the GNU General Public License version 3.0 requirements will be
35** met: http://www.gnu.org/copyleft/gpl.html.
36**
37**
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#ifndef QPAINTENGINE_X11_P_H
43#define QPAINTENGINE_X11_P_H
44
45//
46// W A R N I N G
47// -------------
48//
49// This file is not part of the Qt API. It exists purely as an
50// implementation detail. This header file may change from version to
51// version without notice, or even be removed.
52//
53// We mean it.
54//
55
56#include "QtGui/qpaintengine.h"
57#include "QtGui/qregion.h"
58#include "QtGui/qpen.h"
59#include "QtCore/qpoint.h"
60#include "private/qpaintengine_p.h"
61#include "private/qpainter_p.h"
62#include "private/qpolygonclipper_p.h"
63
64typedef unsigned long Picture;
65
66QT_BEGIN_NAMESPACE
67
68class QX11PaintEnginePrivate;
69class QFontEngineFT;
70class QXRenderTessellator;
71
72struct qt_float_point
73{
74 qreal x, y;
75};
76
77class QX11PaintEngine : public QPaintEngine
78{
79 Q_DECLARE_PRIVATE(QX11PaintEngine)
80public:
81 QX11PaintEngine();
82 ~QX11PaintEngine();
83
84 bool begin(QPaintDevice *pdev);
85 bool end();
86
87 void updateState(const QPaintEngineState &state);
88
89 void updatePen(const QPen &pen);
90 void updateBrush(const QBrush &brush, const QPointF &pt);
91 void updateRenderHints(QPainter::RenderHints hints);
92 void updateFont(const QFont &font);
93 void updateMatrix(const QTransform &matrix);
94 void updateClipRegion_dev(const QRegion &region, Qt::ClipOperation op);
95
96 void drawLines(const QLine *lines, int lineCount);
97 void drawLines(const QLineF *lines, int lineCount);
98
99 void drawRects(const QRect *rects, int rectCount);
100 void drawRects(const QRectF *rects, int rectCount);
101
102 void drawPoints(const QPoint *points, int pointCount);
103 void drawPoints(const QPointF *points, int pointCount);
104
105 void drawEllipse(const QRect &r);
106 void drawEllipse(const QRectF &r);
107
108 virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
109 inline void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode)
110 { QPaintEngine::drawPolygon(points, pointCount, mode); }
111
112 void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr);
113 void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s);
114 void drawPath(const QPainterPath &path);
115 void drawTextItem(const QPointF &p, const QTextItem &textItem);
116 void drawImage(const QRectF &r, const QImage &img, const QRectF &sr,
117 Qt::ImageConversionFlags flags = Qt::AutoColor);
118
119 virtual Qt::HANDLE handle() const;
120 inline Type type() const { return QPaintEngine::X11; }
121
122 QPainter::RenderHints supportedRenderHints() const;
123
124protected:
125 QX11PaintEngine(QX11PaintEnginePrivate &dptr);
126
127 void drawXLFD(const QPointF &p, const QTextItemInt &si);
128#ifndef QT_NO_FONTCONFIG
129 void drawFreetype(const QPointF &p, const QTextItemInt &si);
130#endif
131
132 friend class QPixmap;
133 friend class QFontEngineBox;
134 friend Q_GUI_EXPORT GC qt_x11_get_pen_gc(QPainter *);
135 friend Q_GUI_EXPORT GC qt_x11_get_brush_gc(QPainter *);
136
137private:
138 Q_DISABLE_COPY(QX11PaintEngine)
139};
140
141class QX11PaintEnginePrivate : public QPaintEnginePrivate
142{
143 Q_DECLARE_PUBLIC(QX11PaintEngine)
144public:
145 QX11PaintEnginePrivate()
146 {
147 scrn = -1;
148 hd = 0;
149 picture = 0;
150 gc = gc_brush = 0;
151 dpy = 0;
152 xinfo = 0;
153 txop = QTransform::TxNone;
154 has_clipping = false;
155 render_hints = 0;
156 xform_scale = 1;
157#ifndef QT_NO_XRENDER
158 tessellator = 0;
159#endif
160 }
161 enum GCMode {
162 PenGC,
163 BrushGC
164 };
165
166 void init();
167 void fillPolygon_translated(const QPointF *points, int pointCount, GCMode gcMode,
168 QPaintEngine::PolygonDrawMode mode);
169 void fillPolygon_dev(const QPointF *points, int pointCount, GCMode gcMode,
170 QPaintEngine::PolygonDrawMode mode);
171 void fillPath(const QPainterPath &path, GCMode gcmode, bool transform);
172 void strokePolygon_dev(const QPointF *points, int pointCount, bool close);
173 void strokePolygon_translated(const QPointF *points, int pointCount, bool close);
174 void setupAdaptedOrigin(const QPoint &p);
175 void resetAdaptedOrigin();
176 void decidePathFallback() {
177 use_path_fallback = has_alpha_brush
178 || has_alpha_pen
179 || has_custom_pen
180 || has_complex_xform
181 || (render_hints & QPainter::Antialiasing);
182 }
183 void decideCoordAdjust() {
184 adjust_coords = !(render_hints & QPainter::Antialiasing)
185 && (has_alpha_pen
186 || (has_alpha_brush && has_pen && !has_alpha_pen)
187 || (cpen.style() > Qt::SolidLine));
188 }
189 void clipPolygon_dev(const QPolygonF &poly, QPolygonF *clipped_poly);
190 void systemStateChanged();
191
192 Display *dpy;
193 int scrn;
194 int pdev_depth;
195 Qt::HANDLE hd;
196 QPixmap brush_pm;
197#if !defined (QT_NO_XRENDER)
198 Qt::HANDLE picture;
199 Qt::HANDLE current_brush;
200 QPixmap bitmap_texture;
201 int composition_mode;
202#else
203 Qt::HANDLE picture;
204#endif
205 GC gc;
206 GC gc_brush;
207
208 QPen cpen;
209 QBrush cbrush;
210 QRegion crgn;
211 QTransform matrix;
212 qreal opacity;
213
214 uint has_complex_xform : 1;
215 uint has_scaling_xform : 1;
216 uint has_non_scaling_xform : 1;
217 uint has_custom_pen : 1;
218 uint use_path_fallback : 1;
219 uint adjust_coords : 1;
220 uint has_clipping : 1;
221 uint adapted_brush_origin : 1;
222 uint adapted_pen_origin : 1;
223 uint has_pen : 1;
224 uint has_brush : 1;
225 uint has_texture : 1;
226 uint has_alpha_texture : 1;
227 uint has_pattern : 1;
228 uint has_alpha_pen : 1;
229 uint has_alpha_brush : 1;
230 uint render_hints;
231
232 const QX11Info *xinfo;
233 QPointF bg_origin;
234 QTransform::TransformationType txop;
235 qreal xform_scale;
236 QPolygonClipper<qt_float_point, qt_float_point, float> polygonClipper;
237
238 int xlibMaxLinePoints;
239#ifndef QT_NO_XRENDER
240 QXRenderTessellator *tessellator;
241#endif
242};
243
244QT_END_NAMESPACE
245
246#endif // QPAINTENGINE_X11_P_H
247