Krita Source Code Documentation
Loading...
Searching...
No Matches
KisGradientMapFilterDitherCachedGradient.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the KDE project
3 *
4 * SPDX-FileCopyrightText: 2016 Spencer Brown <sbrown655@gmail.com>
5 * SPDX-FileCopyrightText: 2020 Deif Lou <ginoba@gmail.com>
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10#include <KoAbstractGradient.h>
11#include <KoStopGradient.h>
12#include <KoSegmentGradient.h>
13#include <KoColorSpace.h>
14
16
18 : m_max(steps - 1)
19 , m_nullEntry(CachedEntry{KoColor(cs), KoColor(cs), 0.0})
20{
21 if (gradient.dynamicCast<KoStopGradient>()) {
22 KoStopGradient *stopGradient = static_cast<KoStopGradient*>(gradient.data());
23 for (qint32 i = 0; i < steps; i++) {
24 qreal t = static_cast<qreal>(i) / m_max;
25 KoGradientStop leftStop, rightStop;
26 if (!stopGradient->stopsAt(leftStop, rightStop, t)) {
28 } else {
29 const qreal localT = (t - leftStop.position) / (rightStop.position - leftStop.position);
30 m_cachedEntries << CachedEntry{leftStop.color.convertedTo(cs), rightStop.color.convertedTo(cs), localT};
31 }
32 }
33 } else if (gradient.dynamicCast<KoSegmentGradient>()) {
34 KoSegmentGradient *segmentGradient = static_cast<KoSegmentGradient*>(gradient.data());
35 for (qint32 i = 0; i < steps; i++) {
36 qreal t = static_cast<qreal>(i) / m_max;
37 KoGradientSegment *segment = segmentGradient->segmentAt(t);
38 if (!segment) {
40 } else {
41 const qreal localT = (t - segment->startOffset()) / (segment->endOffset() - segment->startOffset());
42 m_cachedEntries << CachedEntry{segment->startColor().convertedTo(cs), segment->endColor().convertedTo(cs), localT};
43 }
44 }
45 }
46}
47
49{
50 qint32 tInt = t * m_max + 0.5;
51 if (m_cachedEntries.size() > tInt) {
52 return m_cachedEntries[tInt];
53 } else {
54 return m_nullEntry;
55 }
56}
const CachedEntry & cachedAt(qreal t) const
gets the color data at position 0 <= t <= 1
KisGradientMapFilterDitherCachedGradient(const KoAbstractGradientSP gradient, qint32 steps, const KoColorSpace *cs)
KoColor convertedTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
Definition KoColor.cpp:163
Write API docs here.
const KoColor & startColor() const
const KoColor & endColor() const
KoGradientSegment * segmentAt(qreal t) const
bool stopsAt(KoGradientStop &leftStop, KoGradientStop &rightStop, qreal t) const
Find stops surrounding position, returns false if position outside gradient.