2
* Copyright (c) 2009 Cyrille Berger <cberger@cberger.net>
4
* This library is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2 of the License, or (at your option) any later version.
9
* This library is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
14
* You should have received a copy of the GNU Lesser General Public License
15
* along with this library; see the file COPYING.LIB. If not, write to
16
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17
* Boston, MA 02110-1301, USA.
20
#include "KoCtlMixColorsOp.h"
21
#include "KoCtlColorSpace.h"
22
#include "KoCtlAccumulator.h"
23
#include "KoCtlColorSpaceInfo.h"
25
KoCtlMixColorsOp::KoCtlMixColorsOp(const KoCtlColorSpace* _colorSpace, const KoCtlColorSpaceInfo* _info) : m_colorSpace(_colorSpace)
27
m_accumulators = _info->accumulators();
30
KoCtlMixColorsOp::~KoCtlMixColorsOp()
34
void KoCtlMixColorsOp::mixColors(const quint8 * const* colors, const qint16 *weights, quint32 nColors, quint8 *dst) const
36
foreach(KoCtlAccumulator* accumulator, m_accumulators) {
39
int alphaPos = m_colorSpace->alphaPos();
40
// Compute the total for each channel by summing each colors multiplied by the weightlabcache
41
qreal totalAlpha = 0.0;
43
const quint8* color = *colors;
44
double alphaTimesWeight;
47
alphaTimesWeight = m_colorSpace->opacityF(color);
49
alphaTimesWeight = 1.0;
51
alphaTimesWeight *= *weights;
53
for (uint i = 0; i < m_colorSpace->channelCount(); i++) {
54
if ((int)i != alphaPos) {
55
m_accumulators[i]->mix(color, alphaTimesWeight);
58
totalAlpha += alphaTimesWeight;
62
totalAlpha /= 255; // 255 is the sum of weights
63
if (totalAlpha > 1.0) totalAlpha = 1.0;
66
double inv = 1.0 / (totalAlpha * 255);
67
for (uint i = 0; i < m_colorSpace->channelCount(); i++) {
68
if ((int)i != alphaPos) {
69
m_accumulators[i]->affect(dst, inv);
72
m_colorSpace->setOpacity(dst, totalAlpha, 1);
74
memset(dst, 0, m_colorSpace->pixelSize());