summaryrefslogtreecommitdiffstats
path: root/src/gui/painting/qpainter_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/painting/qpainter_p.h')
-rw-r--r--src/gui/painting/qpainter_p.h260
1 files changed, 260 insertions, 0 deletions
diff --git a/src/gui/painting/qpainter_p.h b/src/gui/painting/qpainter_p.h
new file mode 100644
index 0000000..258b25a
--- /dev/null
+++ b/src/gui/painting/qpainter_p.h
@@ -0,0 +1,260 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPAINTER_P_H
+#define QPAINTER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "QtGui/qbrush.h"
+#include "QtGui/qfont.h"
+#include "QtGui/qpen.h"
+#include "QtGui/qregion.h"
+#include "QtGui/qmatrix.h"
+#include "QtGui/qpainter.h"
+#include "QtGui/qpainterpath.h"
+#include "QtGui/qpaintengine.h"
+#include <QtCore/qhash.h>
+
+#include "qpen_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QPaintEngine;
+class QEmulationPaintEngine;
+class QPaintEngineEx;
+
+struct QTLWExtra;
+
+struct DataPtrContainer {
+ void *ptr;
+};
+
+inline void *data_ptr(const QTransform &t) { return (DataPtrContainer *) &t; }
+inline bool qtransform_fast_equals(const QTransform &a, const QTransform &b) { return data_ptr(a) == data_ptr(b); }
+
+// QPen inline functions...
+inline QPen::DataPtr &data_ptr(const QPen &p) { return const_cast<QPen &>(p).data_ptr(); }
+inline bool qpen_fast_equals(const QPen &a, const QPen &b) { return data_ptr(a) == data_ptr(b); }
+inline QBrush qpen_brush(const QPen &p) { return data_ptr(p)->brush; }
+inline qreal qpen_widthf(const QPen &p) { return data_ptr(p)->width; }
+inline Qt::PenStyle qpen_style(const QPen &p) { return data_ptr(p)->style; }
+inline Qt::PenCapStyle qpen_capStyle(const QPen &p) { return data_ptr(p)->capStyle; }
+inline Qt::PenJoinStyle qpen_joinStyle(const QPen &p) { return data_ptr(p)->joinStyle; }
+
+// QBrush inline functions...
+inline QBrush::DataPtr &data_ptr(const QBrush &p) { return const_cast<QBrush &>(p).data_ptr(); }
+inline bool qbrush_fast_equals(const QBrush &a, const QBrush &b) { return data_ptr(a) == data_ptr(b); }
+inline Qt::BrushStyle qbrush_style(const QBrush &b) { return data_ptr(b)->style; };
+inline const QColor &qbrush_color(const QBrush &b) { return data_ptr(b)->color; };
+inline bool qbrush_has_transform(const QBrush &b) { return data_ptr(b)->transform.type() > QTransform::TxNone; }
+
+class QPainterClipInfo
+{
+public:
+ enum ClipType { RegionClip, PathClip, RectClip, RectFClip };
+
+ QPainterClipInfo(const QPainterPath &p, Qt::ClipOperation op, const QTransform &m) :
+ clipType(PathClip), matrix(m), operation(op), path(p) { }
+
+ QPainterClipInfo(const QRegion &r, Qt::ClipOperation op, const QTransform &m) :
+ clipType(RegionClip), matrix(m), operation(op), region(r) { }
+
+ QPainterClipInfo(const QRect &r, Qt::ClipOperation op, const QTransform &m) :
+ clipType(RectClip), matrix(m), operation(op), rect(r) { }
+
+ QPainterClipInfo(const QRectF &r, Qt::ClipOperation op, const QTransform &m) :
+ clipType(RectFClip), matrix(m), operation(op), rectf(r) { }
+
+ ClipType clipType;
+ QTransform matrix;
+ Qt::ClipOperation operation;
+ QPainterPath path;
+ QRegion region;
+ QRect rect;
+ QRectF rectf;
+
+ // ###
+// union {
+// QRegionData *d;
+// QPainterPathPrivate *pathData;
+
+// struct {
+// int x, y, w, h;
+// } rectData;
+// struct {
+// qreal x, y, w, h;
+// } rectFData;
+// };
+
+};
+
+
+class Q_GUI_EXPORT QPainterState : public QPaintEngineState
+{
+public:
+ QPainterState();
+ QPainterState(const QPainterState *s);
+ virtual ~QPainterState();
+ void init(QPainter *p);
+
+ QPointF brushOrigin;
+ QFont font;
+ QFont deviceFont;
+ QPen pen;
+ QBrush brush;
+ QBrush bgBrush; // background brush
+ QRegion clipRegion;
+ QPainterPath clipPath;
+ Qt::ClipOperation clipOperation;
+ QPainter::RenderHints renderHints;
+ QList<QPainterClipInfo> clipInfo; // ### Make me smaller and faster to copy around...
+ QTransform worldMatrix; // World transformation matrix, not window and viewport
+ QTransform matrix; // Complete transformation matrix,
+ QPoint redirection_offset;
+ int wx, wy, ww, wh; // window rectangle
+ int vx, vy, vw, vh; // viewport rectangle
+ qreal opacity;
+
+ uint WxF:1; // World transformation
+ uint VxF:1; // View transformation
+ uint clipEnabled:1;
+
+ Qt::BGMode bgMode;
+ QPainter *painter;
+ Qt::LayoutDirection layoutDirection;
+ QPainter::CompositionMode composition_mode;
+ uint emulationSpecifier;
+ uint changeFlags;
+};
+
+struct QPainterDummyState
+{
+ QFont font;
+ QPen pen;
+ QBrush brush;
+ QTransform transform;
+};
+
+class QPainterPrivate
+{
+ Q_DECLARE_PUBLIC(QPainter)
+public:
+ QPainterPrivate(QPainter *painter)
+ : q_ptr(painter), d_ptrs(0), state(0), dummyState(0), txinv(0), inDestructor(false), d_ptrs_size(0),
+ refcount(1), device(0), original_device(0), helper_device(0), engine(0), emulationEngine(0),
+ extended(0)
+ {
+ }
+
+ ~QPainterPrivate();
+
+ QPainter *q_ptr;
+ QPainterPrivate **d_ptrs;
+
+ QPainterState *state;
+ QVector<QPainterState*> states;
+
+ mutable QPainterDummyState *dummyState;
+
+ QTransform invMatrix;
+ uint txinv:1;
+ uint inDestructor : 1;
+ uint d_ptrs_size;
+ uint refcount;
+
+ enum DrawOperation { StrokeDraw = 0x1,
+ FillDraw = 0x2,
+ StrokeAndFillDraw = 0x3
+ };
+
+ QPainterDummyState *fakeState() const {
+ if (!dummyState)
+ dummyState = new QPainterDummyState();
+ return dummyState;
+ }
+
+ void updateEmulationSpecifier(QPainterState *s);
+ void updateStateImpl(QPainterState *state);
+ void updateState(QPainterState *state);
+
+ void draw_helper(const QPainterPath &path, DrawOperation operation = StrokeAndFillDraw);
+ void drawStretchedGradient(const QPainterPath &path, DrawOperation operation);
+ void drawOpaqueBackground(const QPainterPath &path, DrawOperation operation);
+
+ void updateMatrix();
+ void updateInvMatrix();
+
+ int rectSubtraction() const {
+ return state->pen.style() != Qt::NoPen && state->pen.width() == 0 ? 1 : 0;
+ }
+
+ void checkEmulation();
+
+ QTransform viewTransform() const;
+ static bool attachPainterPrivate(QPainter *q, QPaintDevice *pdev);
+ void detachPainterPrivate(QPainter *q);
+
+ QPaintDevice *device;
+ QPaintDevice *original_device;
+ QPaintDevice *helper_device;
+ QPaintEngine *engine;
+ QEmulationPaintEngine *emulationEngine;
+ QPaintEngineEx *extended;
+ QBrush colorBrush; // for fill with solid color
+};
+
+Q_GUI_EXPORT void qt_draw_helper(QPainterPrivate *p, const QPainterPath &path, QPainterPrivate::DrawOperation operation);
+
+QString qt_generate_brush_key(const QBrush &brush);
+
+QT_END_NAMESPACE
+
+#endif // QPAINTER_P_H