Krita Source Code Documentation
Loading...
Searching...
No Matches
KoClipMaskPainter.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 "KoClipMaskPainter.h"
8
9#include <QPainter>
10#include <QPainterPath>
11#include <QRectF>
12#include <KoStreamedMath.h>
15
16#include "kis_assert.h"
17
20#ifndef DISABLE_CLIP_MASK_PAINTER_ON_MACOS
21 return createOptimizedClass<KoClipMaskApplicatorFactoryImpl>();
22#else
23 return KoClipMaskApplicatorFactoryImpl::create<xsimd::generic>();
24#endif
25 }
26};
27
28struct Q_DECL_HIDDEN KoClipMaskPainter::Private
29{
30 QPainter *globalPainter;
31
32 QImage shapeImage;
33 QImage maskImage;
34
35 QPainter shapePainter;
36 QPainter maskPainter;
37
39};
40
41KoClipMaskPainter::KoClipMaskPainter(QPainter *painter, const QRectF &globalClipRect)
42 : m_d(new Private)
43{
44 m_d->globalPainter = painter;
45 m_d->alignedGlobalClipRect = globalClipRect.toAlignedRect();
46
47 if (!m_d->alignedGlobalClipRect.isValid()) {
48 m_d->alignedGlobalClipRect = QRect();
49 }
50 m_d->shapeImage = QImage(m_d->alignedGlobalClipRect.size(), QImage::Format_ARGB32);
51 m_d->maskImage = QImage(m_d->alignedGlobalClipRect.size(), QImage::Format_ARGB32);
52
53 QTransform moveToBufferTransform =
54 QTransform::fromTranslate(-m_d->alignedGlobalClipRect.x(),
55 -m_d->alignedGlobalClipRect.y());
56
57 m_d->shapePainter.begin(&m_d->shapeImage);
58
59 m_d->shapePainter.save();
60 m_d->shapePainter.setCompositionMode(QPainter::CompositionMode_Source);
61 m_d->shapePainter.fillRect(QRect(QPoint(), m_d->alignedGlobalClipRect.size()), Qt::transparent);
62 m_d->shapePainter.restore();
63
64 m_d->shapePainter.setTransform(moveToBufferTransform);
65 m_d->shapePainter.setTransform(painter->transform(), true);
66 if (painter->hasClipping()) {
67 m_d->shapePainter.setClipPath(painter->clipPath());
68 }
69 m_d->shapePainter.setOpacity(painter->opacity());
70 m_d->shapePainter.setBrush(painter->brush());
71 m_d->shapePainter.setPen(painter->pen());
72
73 m_d->maskPainter.begin(&m_d->maskImage);
74
75 m_d->maskPainter.save();
76 m_d->maskPainter.setCompositionMode(QPainter::CompositionMode_Source);
77 m_d->maskPainter.fillRect(QRect(QPoint(), m_d->alignedGlobalClipRect.size()), Qt::transparent);
78 m_d->maskPainter.restore();
79
80 m_d->maskPainter.setTransform(moveToBufferTransform);
81 m_d->maskPainter.setTransform(painter->transform(), true);
82 if (painter->hasClipping()) {
83 m_d->maskPainter.setClipPath(painter->clipPath());
84 }
85 m_d->maskPainter.setOpacity(painter->opacity());
86 m_d->maskPainter.setBrush(painter->brush());
87 m_d->maskPainter.setPen(painter->pen());
88
89
90
91}
92
96
98{
99 return &m_d->shapePainter;
100}
101
103{
104 return &m_d->maskPainter;
105}
106
108{
109 KIS_ASSERT_RECOVER_RETURN(m_d->maskImage.size() == m_d->shapeImage.size());
110
111 const int nPixels = m_d->maskImage.height() * m_d->maskImage.width();
112
114 applicator->applyLuminanceMask(m_d->shapeImage.bits(),
115 m_d->maskImage.bits(),
116 nPixels);
117
118 KIS_ASSERT_RECOVER_RETURN(m_d->shapeImage.size() == m_d->alignedGlobalClipRect.size());
119 QPainterPath globalClipPath;
120
121 if (m_d->globalPainter->hasClipping()) {
122 globalClipPath = m_d->globalPainter->transform().map(m_d->globalPainter->clipPath());
123 }
124
125 m_d->globalPainter->save();
126
127 m_d->globalPainter->setTransform(QTransform());
128
129 if (!globalClipPath.isEmpty()) {
130 m_d->globalPainter->setClipPath(globalClipPath);
131 }
132
133 m_d->globalPainter->drawImage(m_d->alignedGlobalClipRect.topLeft(), m_d->shapeImage);
134 m_d->globalPainter->restore();
135}
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
virtual void applyLuminanceMask(quint8 *pixels, quint8 *maskPixels, const int nPixels) const =0
applyLuminanceMask This applies an ARGB32 mask to an ARGB32 image as per w3c specs....
static KoClipMaskApplicatorBase * createApplicator()
KoClipMaskPainter(QPainter *painter, const QRectF &globalClipRect)
const QScopedPointer< Private > m_d