File indexing completed on 2024-05-26 04:33:06

0001 /*
0002  * This file is part of the KDE project
0003  *
0004  * SPDX-FileCopyrightText: 2016 Spencer Brown <sbrown655@gmail.com>
0005  * SPDX-FileCopyrightText: 2020 Deif Lou <ginoba@gmail.com>
0006  * 
0007  * SPDX-License-Identifier: GPL-2.0-or-later
0008  */
0009 
0010 #include <KoAbstractGradient.h>
0011 #include <KoStopGradient.h>
0012 #include <KoSegmentGradient.h>
0013 #include <KoColorSpace.h>
0014 
0015 #include "KisGradientMapFilterDitherCachedGradient.h"
0016 
0017 KisGradientMapFilterDitherCachedGradient::KisGradientMapFilterDitherCachedGradient(const KoAbstractGradientSP gradient, qint32 steps, const KoColorSpace *cs)
0018     : m_max(steps - 1)
0019     , m_nullEntry(CachedEntry{KoColor(cs), KoColor(cs), 0.0})
0020 {
0021     if (gradient.dynamicCast<KoStopGradient>()) {
0022         KoStopGradient *stopGradient = static_cast<KoStopGradient*>(gradient.data());
0023         for (qint32 i = 0; i < steps; i++) {
0024             qreal t = static_cast<qreal>(i) / m_max;
0025             KoGradientStop leftStop, rightStop;
0026             if (!stopGradient->stopsAt(leftStop, rightStop, t)) {
0027                 m_cachedEntries << m_nullEntry;
0028             } else {
0029                 const qreal localT = (t - leftStop.position) / (rightStop.position - leftStop.position);
0030                 m_cachedEntries << CachedEntry{leftStop.color.convertedTo(cs), rightStop.color.convertedTo(cs), localT};
0031             }
0032         }
0033     } else if (gradient.dynamicCast<KoSegmentGradient>()) {
0034         KoSegmentGradient *segmentGradient = static_cast<KoSegmentGradient*>(gradient.data());
0035         for (qint32 i = 0; i < steps; i++) {
0036             qreal t = static_cast<qreal>(i) / m_max;
0037             KoGradientSegment *segment = segmentGradient->segmentAt(t);
0038             if (!segment) {
0039                 m_cachedEntries << m_nullEntry;
0040             } else {
0041                 const qreal localT = (t - segment->startOffset()) / (segment->endOffset() - segment->startOffset());
0042                 m_cachedEntries << CachedEntry{segment->startColor().convertedTo(cs), segment->endColor().convertedTo(cs), localT};
0043             }
0044         }
0045     }
0046 }
0047 
0048 const KisGradientMapFilterDitherCachedGradient::CachedEntry& KisGradientMapFilterDitherCachedGradient::cachedAt(qreal t) const
0049 {
0050     qint32 tInt = t * m_max + 0.5;
0051     if (m_cachedEntries.size() > tInt) {
0052         return m_cachedEntries[tInt];
0053     } else {
0054         return m_nullEntry;
0055     }
0056 }