Krita Source Code Documentation
Loading...
Searching...
No Matches
KoBakedShapeRenderer.h
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#ifndef KOBAKEDSHAPERENDERER_H
8#define KOBAKEDSHAPERENDERER_H
9
10#include <QImage>
11#include <QPainter>
12#include <QPainterPath>
13#include <QTransform>
14
15#include <kis_debug.h>
16#include <kis_algebra_2d.h>
17
18
20 KoBakedShapeRenderer(const QPainterPath &dstShapeOutline, const QTransform &dstShapeTransform,
21 const QTransform &bakedTransform,
22 const QRectF &referenceRect,
23 bool contentIsObb, const QRectF &bakedShapeBoundingRect,
24 bool referenceIsObb,
25 const QTransform &patternTransform)
26 : m_dstShapeOutline(dstShapeOutline),
27 m_dstShapeTransform(dstShapeTransform),
28 m_contentIsObb(contentIsObb),
29 m_patternTransform(patternTransform)
30 {
31 KIS_SAFE_ASSERT_RECOVER_NOOP(!contentIsObb || !bakedShapeBoundingRect.isEmpty());
32
33 const QRectF dstShapeBoundingRect = dstShapeOutline.boundingRect();
34
35 QTransform relativeToBakedShape;
36
37 if (referenceIsObb || contentIsObb) {
38 m_relativeToShape = KisAlgebra2D::mapToRect(dstShapeBoundingRect);
39 relativeToBakedShape = KisAlgebra2D::mapToRect(bakedShapeBoundingRect);
40 }
41
42
44 referenceIsObb ?
45 m_relativeToShape.mapRect(referenceRect).toAlignedRect() :
46 referenceRect.toAlignedRect();
47
48 m_patch = QImage(m_referenceRectUser.size(), QImage::Format_ARGB32);
49 m_patch.fill(0);
50 m_patchPainter.begin(&m_patch);
51
52 m_patchPainter.translate(-m_referenceRectUser.topLeft());
54
55 if (contentIsObb) {
56 m_patchPainter.setTransform(m_relativeToShape, true);
57 m_patchPainter.setTransform(relativeToBakedShape.inverted(), true);
58 }
59
60 m_patchPainter.setTransform(bakedTransform.inverted(), true);
61 }
62
63 QPainter* bakeShapePainter() {
64 return &m_patchPainter;
65 }
66
67 void renderShape(QPainter &painter) {
68 painter.save();
69
70 painter.setTransform(m_dstShapeTransform, true);
71 painter.setClipPath(m_dstShapeOutline);
72
73 QTransform brushTransform;
74
75 QPointF patternOffset = m_referenceRectUser.topLeft();
76
77 brushTransform =
78 brushTransform *
79 QTransform::fromTranslate(patternOffset.x(), patternOffset.y());
80
81 if (m_contentIsObb) {
82 brushTransform = brushTransform * m_relativeToShape.inverted();
83 }
84
85 brushTransform = brushTransform * m_patternTransform;
86
87 if (m_contentIsObb) {
88 brushTransform = brushTransform * m_relativeToShape;
89 }
90
91 QBrush brush(m_patch);
92 brush.setTransform(brushTransform);
93
94 painter.setBrush(brush);
95 painter.drawPath(m_dstShapeOutline);
96
97 painter.restore();
98 }
99
100 QImage patchImage() const {
101 return m_patch;
102 }
103
104
105private:
106 QPainterPath m_dstShapeOutline;
108
110 const QTransform &m_patternTransform;
111
112 QImage m_patch;
114
117};
118
119#endif // KOBAKEDSHAPERENDERER_H
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
QTransform mapToRect(const QRectF &rect)
const QTransform & m_patternTransform
void renderShape(QPainter &painter)
KoBakedShapeRenderer(const QPainterPath &dstShapeOutline, const QTransform &dstShapeTransform, const QTransform &bakedTransform, const QRectF &referenceRect, bool contentIsObb, const QRectF &bakedShapeBoundingRect, bool referenceIsObb, const QTransform &patternTransform)