Fixed crash in GL 2 paint engine on Intel Atom.
[profile/ivi/qtbase.git] / src / widgets / platforms / mac / qpaintengine_mac_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the QtGui module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 **
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 **
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
29 **
30 ** Other Usage
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QPAINTENGINE_MAC_P_H
43 #define QPAINTENGINE_MAC_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 "private/qt_mac_p.h"
58 #include "private/qpaintengine_p.h"
59 #include "private/qpolygonclipper_p.h"
60 #include "private/qfont_p.h"
61 #include "QtCore/qhash.h"
62
63 typedef struct CGColorSpace *CGColorSpaceRef;
64 QT_BEGIN_NAMESPACE
65
66 class QCoreGraphicsPaintEnginePrivate;
67 class QCoreGraphicsPaintEngine : public QPaintEngine
68 {
69     Q_DECLARE_PRIVATE(QCoreGraphicsPaintEngine)
70
71 public:
72     QCoreGraphicsPaintEngine();
73     ~QCoreGraphicsPaintEngine();
74
75     bool begin(QPaintDevice *pdev);
76     bool end();
77     static CGColorSpaceRef macGenericColorSpace();
78     static CGColorSpaceRef macDisplayColorSpace(const QWidget *widget = 0);
79
80     void updateState(const QPaintEngineState &state);
81
82     void updatePen(const QPen &pen);
83     void updateBrush(const QBrush &brush, const QPointF &pt);
84     void updateFont(const QFont &font);
85     void updateOpacity(qreal opacity);
86     void updateMatrix(const QTransform &matrix);
87     void updateTransform(const QTransform &matrix);
88     void updateClipRegion(const QRegion &region, Qt::ClipOperation op);
89     void updateClipPath(const QPainterPath &path, Qt::ClipOperation op);
90     void updateCompositionMode(QPainter::CompositionMode mode);
91     void updateRenderHints(QPainter::RenderHints hints);
92
93     void drawLines(const QLineF *lines, int lineCount);
94     void drawRects(const QRectF *rects, int rectCount);
95     void drawPoints(const QPointF *p, int pointCount);
96     void drawEllipse(const QRectF &r);
97     void drawPath(const QPainterPath &path);
98
99     void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
100     void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr);
101     void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s);
102
103     void drawTextItem(const QPointF &pos, const QTextItem &item);
104     void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
105                    Qt::ImageConversionFlags flags = Qt::AutoColor);
106
107     Type type() const { return QPaintEngine::CoreGraphics; }
108
109     CGContextRef handle() const;
110
111     static void initialize();
112     static void cleanup();
113
114     QPainter::RenderHints supportedRenderHints() const;
115
116     //avoid partial shadowed overload warnings...
117     void drawLines(const QLine *lines, int lineCount) { QPaintEngine::drawLines(lines, lineCount); }
118     void drawRects(const QRect *rects, int rectCount) { QPaintEngine::drawRects(rects, rectCount); }
119     void drawPoints(const QPoint *p, int pointCount) { QPaintEngine::drawPoints(p, pointCount); }
120     void drawEllipse(const QRect &r) { QPaintEngine::drawEllipse(r); }
121     void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode)
122     { QPaintEngine::drawPolygon(points, pointCount, mode); }
123
124     bool supportsTransformations(qreal, const QTransform &) const { return true; };
125
126 protected:
127     friend class QMacPrintEngine;
128     friend class QMacPrintEnginePrivate;
129     friend void qt_mac_display_change_callbk(CGDirectDisplayID, CGDisplayChangeSummaryFlags, void *);
130     friend void qt_color_profile_changed(CFNotificationCenterRef center, void *,
131                                          CFStringRef , const void *, CFDictionaryRef);
132     QCoreGraphicsPaintEngine(QPaintEnginePrivate &dptr);
133
134 private:
135     static bool m_postRoutineRegistered;
136     static CGColorSpaceRef m_genericColorSpace;
137     static QHash<CGDirectDisplayID, CGColorSpaceRef> m_displayColorSpaceHash;
138     static void cleanUpMacColorSpaces();
139     Q_DISABLE_COPY(QCoreGraphicsPaintEngine)
140 };
141
142 /*****************************************************************************
143   Private data
144  *****************************************************************************/
145 class QCoreGraphicsPaintEnginePrivate : public QPaintEnginePrivate
146 {
147     Q_DECLARE_PUBLIC(QCoreGraphicsPaintEngine)
148 public:
149     QCoreGraphicsPaintEnginePrivate()
150         : hd(0), shading(0), stackCount(0), complexXForm(false), disabledSmoothFonts(false)
151     {
152     }
153
154     struct {
155         QPen pen;
156         QBrush brush;
157         uint clipEnabled : 1;
158         QRegion clip;
159         QTransform transform;
160    } current;
161
162     //state info (shared with QD)
163     CGAffineTransform orig_xform;
164
165     //cg structures
166     CGContextRef hd;
167     CGShadingRef shading;
168     int stackCount;
169     bool complexXForm;
170     bool disabledSmoothFonts;
171     enum { CosmeticNone, CosmeticTransformPath, CosmeticSetPenWidth } cosmeticPen;
172
173     // pixel and cosmetic pen size in user coordinates.
174     QPointF pixelSize;
175     float cosmeticPenSize;
176
177     //internal functions
178     enum { CGStroke=0x01, CGEOFill=0x02, CGFill=0x04 };
179     void drawPath(uchar ops, CGMutablePathRef path = 0);
180     void setClip(const QRegion *rgn=0);
181     void resetClip();
182     void setFillBrush(const QPointF &origin=QPoint());
183     void setStrokePen(const QPen &pen);
184     inline void saveGraphicsState();
185     inline void restoreGraphicsState();
186     float penOffset();
187     QPointF devicePixelSize(CGContextRef context);
188     float adjustPenWidth(float penWidth);
189     inline void setTransform(const QTransform *matrix=0)
190     {
191         CGContextConcatCTM(hd, CGAffineTransformInvert(CGContextGetCTM(hd)));
192         CGAffineTransform xform = orig_xform;
193         if(matrix) {
194             extern CGAffineTransform qt_mac_convert_transform_to_cg(const QTransform &);
195             xform = CGAffineTransformConcat(qt_mac_convert_transform_to_cg(*matrix), xform);
196         }
197         CGContextConcatCTM(hd, xform);
198         CGContextSetTextMatrix(hd, xform);
199     }
200 };
201
202 inline void QCoreGraphicsPaintEnginePrivate::saveGraphicsState()
203 {
204     ++stackCount;
205     CGContextSaveGState(hd);
206 }
207
208 inline void QCoreGraphicsPaintEnginePrivate::restoreGraphicsState()
209 {
210     --stackCount;
211     Q_ASSERT(stackCount >= 0);
212     CGContextRestoreGState(hd);
213 }
214
215 class QMacQuartzPaintDevice : public QPaintDevice
216 {
217 public:
218     QMacQuartzPaintDevice(CGContextRef cg, int width, int height, int bytesPerLine)
219         : mCG(cg), mWidth(width), mHeight(height), mBytesPerLine(bytesPerLine)
220     { }
221     int devType() const { return QInternal::MacQuartz; }
222     CGContextRef cgContext() const { return mCG; }
223     int metric(PaintDeviceMetric metric) const {
224         switch (metric) {
225         case PdmWidth:
226             return mWidth;
227         case PdmHeight:
228             return mHeight;
229         case PdmWidthMM:
230             return (qt_defaultDpiX() * mWidth) / 2.54;
231         case PdmHeightMM:
232             return (qt_defaultDpiY() * mHeight) / 2.54;
233         case PdmNumColors:
234             return 0;
235         case PdmDepth:
236             return 32;
237         case PdmDpiX:
238         case PdmPhysicalDpiX:
239             return qt_defaultDpiX();
240         case PdmDpiY:
241         case PdmPhysicalDpiY:
242             return qt_defaultDpiY();
243         }
244         return 0;
245     }
246     QPaintEngine *paintEngine() const { qWarning("This function should never be called."); return 0; }
247 private:
248     CGContextRef mCG;
249     int mWidth;
250     int mHeight;
251     int mBytesPerLine;
252 };
253
254 QT_END_NAMESPACE
255
256 #endif // QPAINTENGINE_MAC_P_H