Krita Source Code Documentation
Loading...
Searching...
No Matches
KoClipMask.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "KoClipMask.h"
8
9#include <QRectF>
10#include <QTransform>
11#include <QPainter>
12#include <QSharedData>
13#include <QPainterPath>
14#include <KoShape.h>
15#include "kis_algebra_2d.h"
16
17#include <KoShapePainter.h>
18
19struct Q_DECL_HIDDEN KoClipMask::Private : public QSharedData
20{
22 : QSharedData()
23 {}
24
25 Private(const Private &rhs)
26 : QSharedData()
27 , coordinates(rhs.coordinates)
28 , contentCoordinates(rhs.contentCoordinates)
29 , maskRect(rhs.maskRect)
30 , extraShapeTransform(rhs.extraShapeTransform)
31 {
32 Q_FOREACH (KoShape *shape, rhs.shapes) {
33 KoShape *clonedShape = shape->cloneShape();
34 KIS_ASSERT_RECOVER(clonedShape) { continue; }
35
36 shapes << clonedShape;
37 }
38 }
39
41 qDeleteAll(shapes);
42 shapes.clear();
43 }
44
45
48
49 QRectF maskRect = QRectF(-0.1, -0.1, 1.2, 1.2);
50
52 QTransform extraShapeTransform; // TODO: not used anymore, use direct shape transform instead
53
54};
55
57 : m_d(new Private)
58{
59}
60
64
66 : m_d(new Private(*rhs.m_d))
67{
68}
69
71{
72 m_d = rhs.m_d;
73 return *this;
74}
75
77{
78 return new KoClipMask(*this);
79}
80
82{
83 return m_d->coordinates;
84}
85
90
92{
93 return m_d->contentCoordinates;
94}
95
100
101QRectF KoClipMask::maskRect() const
102{
103 return m_d->maskRect;
104}
105
107{
108 m_d->maskRect = value;
109}
110
112{
113 return m_d->shapes;
114}
115
117{
118 m_d->shapes = value;
119}
120
122{
123 return m_d->shapes.isEmpty();
124}
125
127{
133 if (m_d->contentCoordinates == KoFlake::UserSpaceOnUse) {
134 const QTransform t = QTransform::fromTranslate(value.x(), value.y());
135
136 Q_FOREACH (KoShape *shape, m_d->shapes) {
138 }
139 }
140
141 if (m_d->coordinates == KoFlake::UserSpaceOnUse) {
142 m_d->maskRect.translate(value);
143 }
144}
145
146void KoClipMask::drawMask(QPainter *painter, KoShape *shape)
147{
148 painter->save();
149
150 QPainterPath clipPathInShapeSpace;
151
152 if (m_d->coordinates == KoFlake::ObjectBoundingBox) {
153 QTransform relativeToShape = KisAlgebra2D::mapToRect(shape->outlineRect());
154 clipPathInShapeSpace.addPolygon(relativeToShape.map(m_d->maskRect));
155 } else {
156 clipPathInShapeSpace.addRect(m_d->maskRect);
157 clipPathInShapeSpace = m_d->extraShapeTransform.map(clipPathInShapeSpace);
158 }
159
160 painter->setClipPath(clipPathInShapeSpace, Qt::IntersectClip);
161
162 if (m_d->contentCoordinates == KoFlake::ObjectBoundingBox) {
163 QTransform relativeToShape = KisAlgebra2D::mapToRect(shape->outlineRect());
164
165 painter->setTransform(relativeToShape, true);
166 } else {
167 painter->setTransform(m_d->extraShapeTransform, true);
168 }
169
171 p.setShapes(m_d->shapes);
172 p.paint(*painter);
173
174 painter->restore();
175}
float value(const T *src, size_t ch)
const Params2D p
void setShapes(const QList< KoShape * > &shapes)
virtual QRectF outlineRect() const
Definition KoShape.cpp:637
void applyAbsoluteTransformation(const QTransform &matrix)
Definition KoShape.cpp:400
virtual KoShape * cloneShape() const
creates a deep copy of the shape or shape's subtree
Definition KoShape.cpp:200
#define KIS_ASSERT_RECOVER(cond)
Definition kis_assert.h:55
QTransform mapToRect(const QRectF &rect)
QList< KoShape * > shapes
QTransform extraShapeTransform
KoFlake::CoordinateSystem coordinates
void drawMask(QPainter *painter, KoShape *shape)
KoFlake::CoordinateSystem contentCoordinates
QSharedDataPointer< Private > m_d
Definition KoClipMask.h:55
QRectF maskRect
void setContentCoordinates(KoFlake::CoordinateSystem value)
KoClipMask * clone() const
void setShapes(const QList< KoShape * > &value)
void setExtraShapeOffset(const QPointF &value)
Private(const Private &rhs)
bool isEmpty() const
void setCoordinates(KoFlake::CoordinateSystem value)
void setMaskRect(const QRectF &value)
KoClipMask & operator=(const KoClipMask &)