mirror of
https://bitbucket.org/smil3y/katie.git
synced 2025-02-26 20:03:13 +00:00
220 lines
6.4 KiB
C++
220 lines
6.4 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2015 The Qt Company Ltd.
|
|
** Copyright (C) 2016-2019 Ivailo Monev
|
|
**
|
|
** This file is part of the QtGui module of the Katie Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** 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 or version 3 as published by the Free
|
|
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
|
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
|
** following information to ensure the GNU Lesser General Public License
|
|
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
**
|
|
** As a special exception, The Qt Company gives you certain additional
|
|
** rights. These rights are described in The Qt Company LGPL Exception
|
|
** version 1.1, 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.
|
|
**
|
|
** $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 Katie 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>
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
class QPaintEngine;
|
|
class QPaintEngineEx;
|
|
struct QFixedPoint;
|
|
|
|
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,
|
|
QTransform redirectionMatrix;
|
|
int wx, wy, ww, wh; // window rectangle
|
|
int vx, vy, vw, vh; // viewport rectangle
|
|
qreal opacity;
|
|
|
|
bool WxF; // World transformation
|
|
bool VxF; // View transformation
|
|
bool clipEnabled;
|
|
|
|
QPaintEngine::DirtyFlags changeFlags;
|
|
Qt::BGMode bgMode;
|
|
QPainter *painter;
|
|
Qt::LayoutDirection layoutDirection;
|
|
QPainter::CompositionMode composition_mode;
|
|
};
|
|
|
|
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(Q_NULLPTR), state(Q_NULLPTR), dummyState(Q_NULLPTR), txinv(false),
|
|
inDestructor(false), d_ptrs_size(0), refcount(1), device(Q_NULLPTR),
|
|
original_device(Q_NULLPTR), helper_device(Q_NULLPTR), engine(Q_NULLPTR),
|
|
extended(Q_NULLPTR)
|
|
{
|
|
}
|
|
|
|
~QPainterPrivate();
|
|
|
|
QPainter *q_ptr;
|
|
QPainterPrivate **d_ptrs;
|
|
|
|
QPainterState *state;
|
|
QVector<QPainterState*> states;
|
|
|
|
mutable QPainterDummyState *dummyState;
|
|
|
|
QTransform invMatrix;
|
|
bool txinv;
|
|
bool inDestructor;
|
|
int d_ptrs_size;
|
|
uint refcount;
|
|
|
|
enum DrawOperation {
|
|
StrokeDraw = 0x1,
|
|
FillDraw = 0x2,
|
|
StrokeAndFillDraw = 0x3
|
|
};
|
|
|
|
QPainterDummyState *fakeState() const {
|
|
if (!dummyState)
|
|
dummyState = new QPainterDummyState();
|
|
return dummyState;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
QTransform viewTransform() const;
|
|
static bool attachPainterPrivate(QPainter *q, QPaintDevice *pdev);
|
|
void detachPainterPrivate(QPainter *q);
|
|
|
|
QPaintDevice *device;
|
|
QPaintDevice *original_device;
|
|
QPaintDevice *helper_device;
|
|
QPaintEngine *engine;
|
|
QPaintEngineEx *extended;
|
|
QBrush colorBrush; // for fill with solid color
|
|
};
|
|
|
|
QString qt_generate_brush_key(const QBrush &brush);
|
|
|
|
QT_END_NAMESPACE
|
|
|
|
#endif // QPAINTER_P_H
|