Krita Source Code Documentation
Loading...
Searching...
No Matches
KisMaskingBrushRenderer.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <KoColorSpace.h>
12#include <KoChannelInfo.h>
14
15#include "kis_painter.h"
16#include "kis_paint_device.h"
18
21
22
24 : m_dstDevice(dstDevice)
25{
26 m_strokeDevice = new KisPaintDevice(dstDevice->colorSpace());
30
33
34 const KoColorSpace *dstCs = m_dstDevice->colorSpace();
35 const int pixelSize = dstCs->pixelSize();
36
38 int alphaChannelOffset = -1;
39 int alphaPos = dstCs->alphaPos();
40
41 KIS_SAFE_ASSERT_RECOVER (alphaPos >= 0) {
42 alphaPos = 0;
43 }
44
45 const QList<KoChannelInfo *> channels = dstCs->channels();
46 alphaChannelOffset = channels[alphaPos]->pos()/* * channels[i]->size()*/;
47 alphaChannelType = channels[alphaPos]->channelValueType();
48
49 KIS_SAFE_ASSERT_RECOVER (alphaChannelOffset >= 0) {
50 alphaChannelOffset = 0;
51 }
52
53 m_compositeOp.reset(
55 compositeOpId, alphaChannelType, pixelSize, alphaChannelOffset));
56}
57
61
66
71
73{
74 if (rc.isEmpty()) return;
75
77
80
81 qint32 dstY = rc.y();
82 qint32 rowsRemaining = rc.height();
83
84 while (rowsRemaining > 0) {
85 qint32 dstX = rc.x();
86
87 const qint32 numContiguousDstRows = dstIt->numContiguousRows(dstY);
88 const qint32 numContiguousMaskRows = maskIt->numContiguousRows(dstY);
89
90 const qint32 rows = std::min({rowsRemaining, numContiguousDstRows, numContiguousMaskRows});
91
92 qint32 columnsRemaining = rc.width();
93
94 while (columnsRemaining > 0) {
95
96 const qint32 numContiguousDstColumns = dstIt->numContiguousColumns(dstX);
97 const qint32 numContiguousMaskColumns = maskIt->numContiguousColumns(dstX);
98 const qint32 columns = std::min({columnsRemaining, numContiguousDstColumns, numContiguousMaskColumns});
99
100 const qint32 dstRowStride = dstIt->rowStride(dstX, dstY);
101 const qint32 maskRowStride = maskIt->rowStride(dstX, dstY);
102
103 dstIt->moveTo(dstX, dstY);
104 maskIt->moveTo(dstX, dstY);
105
106 m_compositeOp->composite(maskIt->rawDataConst(), maskRowStride,
107 dstIt->rawData(), dstRowStride,
108 columns, rows);
109
110 dstX += columns;
111 columnsRemaining -= columns;
112 }
113
114 dstY += rows;
115 rowsRemaining -= rows;
116 }
117}
118
const KoID GrayAColorModelID("GRAYA", ki18n("Grayscale/Alpha"))
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
virtual quint8 * rawData()=0
virtual const quint8 * rawDataConst() const =0
static KisMaskingBrushCompositeOpBase * create(const QString &id, KoChannelInfo::enumChannelValueType channelType, int pixelSize, int alphaOffset)
QScopedPointer< KisMaskingBrushCompositeOpBase > m_compositeOp
KisPaintDeviceSP maskDevice() const
KisPaintDeviceSP strokeDevice() const
KisMaskingBrushRenderer(KisPaintDeviceSP dstDevice, const QString &compositeOpId)
void updateProjection(const QRect &rc)
void setDefaultBounds(KisDefaultBoundsBaseSP bounds)
KisRandomConstAccessorSP createRandomConstAccessorNG() const
const KoColorSpace * colorSpace() const
KisDefaultBoundsBaseSP defaultBounds() const
KisRandomAccessorSP createRandomAccessorNG()
static void copyAreaOptimized(const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)
virtual qint32 rowStride(qint32 x, qint32 y) const =0
virtual qint32 numContiguousRows(qint32 y) const =0
virtual void moveTo(qint32 x, qint32 y)=0
virtual qint32 numContiguousColumns(qint32 x) const =0
enumChannelValueType
enum to define the value of the channel
@ UINT8
use this for an unsigned integer 8bits channel
virtual quint32 alphaPos() const =0
virtual quint32 pixelSize() const =0
QList< KoChannelInfo * > channels
QString id() const
Definition KoID.cpp:63
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
static KoColorSpaceRegistry * instance()