~smartboyhw/ubuntu/raring/calligra/2.6.0-0ubuntu1

« back to all changes in this revision

Viewing changes to krita/plugins/colorspaces/ctlcs/KoCtlMixColorsOp.cpp

  • Committer: Package Import Robot
  • Author(s): Philip Muškovac
  • Date: 2012-10-23 21:09:16 UTC
  • mfrom: (1.1.13)
  • Revision ID: package-import@ubuntu.com-20121023210916-m82w6zxnxhaxz7va
Tags: 1:2.5.90-0ubuntu1
* New upstream alpha release (LP: #1070436)
  - Add libkactivities-dev and libopenimageio-dev to build-depends
  - Add kubuntu_build_calligraactive.diff to build calligraactive by default
  - Add package for calligraauthor and move files that are shared between
    calligrawords and calligraauthor to calligrawords-common
* Document the patches
* Remove numbers from patches so they follow the same naming scheme as
  the rest of our patches.
* calligra-data breaks replaces krita-data (<< 1:2.5.3) (LP: #1071686)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 *  Copyright (c) 2009 Cyrille Berger <cberger@cberger.net>
3
 
 *
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.
8
 
 *
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.
13
 
 *
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.
18
 
 */
19
 
 
20
 
#include "KoCtlMixColorsOp.h"
21
 
#include "KoCtlColorSpace.h"
22
 
#include "KoCtlAccumulator.h"
23
 
#include "KoCtlColorSpaceInfo.h"
24
 
 
25
 
KoCtlMixColorsOp::KoCtlMixColorsOp(const KoCtlColorSpace* _colorSpace, const KoCtlColorSpaceInfo* _info) : m_colorSpace(_colorSpace)
26
 
{
27
 
    m_accumulators = _info->accumulators();
28
 
}
29
 
 
30
 
KoCtlMixColorsOp::~KoCtlMixColorsOp()
31
 
{
32
 
}
33
 
 
34
 
void KoCtlMixColorsOp::mixColors(const quint8 * const* colors, const qint16 *weights, quint32 nColors, quint8 *dst) const
35
 
{
36
 
    foreach(KoCtlAccumulator* accumulator, m_accumulators) {
37
 
        accumulator->reset();
38
 
    }
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;
42
 
    while (nColors--) {
43
 
        const quint8* color = *colors;
44
 
        double alphaTimesWeight;
45
 
 
46
 
        if (alphaPos != -1) {
47
 
            alphaTimesWeight = m_colorSpace->opacityF(color);
48
 
        } else {
49
 
            alphaTimesWeight = 1.0;
50
 
        }
51
 
        alphaTimesWeight *= *weights;
52
 
 
53
 
        for (uint i = 0; i < m_colorSpace->channelCount(); i++) {
54
 
            if ((int)i != alphaPos) {
55
 
                m_accumulators[i]->mix(color, alphaTimesWeight);
56
 
            }
57
 
        }
58
 
        totalAlpha += alphaTimesWeight;
59
 
        ++colors;
60
 
        ++weights;
61
 
    }
62
 
    totalAlpha /= 255; // 255 is the sum of weights
63
 
    if (totalAlpha > 1.0) totalAlpha = 1.0;
64
 
 
65
 
    if (totalAlpha > 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);
70
 
            }
71
 
        }
72
 
        m_colorSpace->setOpacity(dst, totalAlpha, 1);
73
 
    } else {
74
 
        memset(dst, 0, m_colorSpace->pixelSize());
75
 
    }
76
 
}