Krita Source Code Documentation
Loading...
Searching...
No Matches
KoCompositeOpErase.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#ifndef KOCOMPOSITEOPERASE_H_
8#define KOCOMPOSITEOPERASE_H_
9
10#include "KoColorSpaceMaths.h"
11#include "KoCompositeOp.h"
12
13#define NATIVE_OPACITY_OPAQUE KoColorSpaceMathsTraits<channels_type>::unitValue
14#define NATIVE_OPACITY_TRANSPARENT KoColorSpaceMathsTraits<channels_type>::zeroValue
15
19template<class _CSTraits>
21{
22 typedef typename _CSTraits::channels_type channels_type;
23
24public:
25
29
30public:
32
33 void composite(const KoCompositeOp::ParameterInfo& params) const override {
34 // XXX: How to use channelflags here? It would be cool to
35 // erase all green from an image, for example.
36 qint32 srcInc = (params.srcRowStride == 0) ? 0 : _CSTraits::channels_nb;
38
39 const quint8 *srcRowStart = params.srcRowStart;
40 quint8 *dstRowStart = params.dstRowStart;
41 const quint8 *maskRowStart = params.maskRowStart;
42
43 qint32 rows = params.rows;
44
45 while (rows-- > 0) {
46 const channels_type *s = reinterpret_cast<const channels_type *>(srcRowStart);
47 channels_type *d = reinterpret_cast<channels_type *>(dstRowStart);
48 const quint8 *mask = maskRowStart;
49
50 for (qint32 i = params.cols; i > 0; i--, s += srcInc, d += _CSTraits::channels_nb) {
51 channels_type srcAlpha = s[_CSTraits::alpha_pos];
52
53 // apply the alphamask
54 if (mask != 0) {
55 quint8 U8_mask = *mask;
56
57 if (U8_mask != OPACITY_TRANSPARENT_U8) {
60 } else {
61 srcAlpha = 0;
62 }
63 ++mask;
64 }
65 srcAlpha = KoColorSpaceMaths<channels_type>::multiply(srcAlpha, opacity);
66 srcAlpha = NATIVE_OPACITY_OPAQUE - srcAlpha;
67 d[_CSTraits::alpha_pos] = KoColorSpaceMaths<channels_type>::multiply(srcAlpha, d[_CSTraits::alpha_pos]);
68 }
69
70 dstRowStart += params.dstRowStride;
71 srcRowStart += params.srcRowStride;
72 if (maskRowStart) {
73 maskRowStart += params.maskRowStride;
74 }
75 }
76 }
77};
78
79#endif
const quint8 OPACITY_TRANSPARENT_U8
#define NATIVE_OPACITY_OPAQUE
const QString COMPOSITE_ERASE
static _Tdst multiply(_T a, _Tdst b)
static _Tdst scaleToA(_T a)
void composite(const KoCompositeOp::ParameterInfo &params) const override
KoCompositeOpErase(const KoColorSpace *cs)
_CSTraits::channels_type channels_type
void composite(quint8 *dstRowStart, qint32 dstRowStride, const quint8 *srcRowStart, qint32 srcRowStride, const quint8 *maskRowStart, qint32 maskRowStride, qint32 rows, qint32 numColumns, float opacity, const QBitArray &channelFlags=QBitArray()) const
static QString categoryMix()
Private *const d