Krita Source Code Documentation
Loading...
Searching...
No Matches
KoCompositeOpOver.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.1-or-later
5*/
6
7#ifndef _KOCOMPOSITEOPOVER_H_
8#define _KOCOMPOSITEOPOVER_H_
9
12#include <klocalizedstring.h>
13
14template<class _CSTraits, int channel>
16 typedef typename _CSTraits::channels_type channels_type;
17 inline static void composeColorChannels(channels_type srcBlend,
18 const channels_type* srcN,
19 channels_type* dstN,
20 bool allChannelFlags,
21 const QBitArray & channelFlags) {
22 if (channel != _CSTraits::alpha_pos && (allChannelFlags || channelFlags.testBit(channel)))
23 dstN[channel] = KoColorSpaceMaths<channels_type>::blend(srcN[channel], dstN[channel], srcBlend);
24 KoCompositeOpOverCompositor<_CSTraits, channel - 1>::composeColorChannels(srcBlend, srcN, dstN, allChannelFlags, channelFlags);
25 }
26};
27
28template<class _CSTraits>
29struct KoCompositeOpOverCompositor<_CSTraits, -1> {
30 typedef typename _CSTraits::channels_type channels_type;
31 inline static void composeColorChannels(channels_type /*srcBlend*/,
32 const channels_type* /*srcN*/,
33 channels_type* /*dstN*/,
34 bool /*allChannelFlags*/,
35 const QBitArray & /*channelFlags*/) {
36 }
37};
38
42template<class _CSTraits>
43class KoCompositeOpOver : public KoCompositeOpAlphaBase<_CSTraits, KoCompositeOpOver<_CSTraits>, false >
44{
45 typedef typename _CSTraits::channels_type channels_type;
46public:
47
51
52public:
53 inline static channels_type selectAlpha(channels_type srcAlpha, channels_type dstAlpha) {
54 Q_UNUSED(dstAlpha);
55 return srcAlpha;
56 }
57
58public:
59 inline static void composeColorChannels(channels_type srcBlend,
60 const channels_type* srcN,
61 channels_type* dstN,
62 bool allChannelFlags,
63 const QBitArray & channelFlags) {
64 if (srcBlend == NATIVE_OPACITY_OPAQUE) {
65 for (int i = 0; (uint)i < _CSTraits::channels_nb; i++) {
66 if (i != _CSTraits::alpha_pos && (allChannelFlags || channelFlags.testBit(i)))
67 dstN[i] = srcN[i];
68 }
69 } else {
70 KoCompositeOpOverCompositor<_CSTraits, _CSTraits::channels_nb-1>::composeColorChannels(srcBlend, srcN, dstN, allChannelFlags, channelFlags);
71 }
72 }
73
74};
75
76#endif
#define NATIVE_OPACITY_OPAQUE
const QString COMPOSITE_OVER
unsigned int uint
static _T blend(_T a, _T b, _T alpha)
static void composeColorChannels(channels_type srcBlend, const channels_type *srcN, channels_type *dstN, bool allChannelFlags, const QBitArray &channelFlags)
_CSTraits::channels_type channels_type
static channels_type selectAlpha(channels_type srcAlpha, channels_type dstAlpha)
KoCompositeOpOver(const KoColorSpace *cs)
static void composeColorChannels(channels_type, const channels_type *, channels_type *, bool, const QBitArray &)
_CSTraits::channels_type channels_type
static void composeColorChannels(channels_type srcBlend, const channels_type *srcN, channels_type *dstN, bool allChannelFlags, const QBitArray &channelFlags)
static QString categoryMix()