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 }