File indexing completed on 2024-05-12 15:59:35
0001 /* 0002 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "KoCompositeColorTransformation.h" 0008 0009 #include <QVector> 0010 0011 0012 struct Q_DECL_HIDDEN KoCompositeColorTransformation::Private 0013 { 0014 ~Private() { 0015 qDeleteAll(transformations); 0016 } 0017 0018 QVector<KoColorTransformation*> transformations; 0019 }; 0020 0021 0022 KoCompositeColorTransformation::KoCompositeColorTransformation(Mode mode) 0023 : m_d(new Private) 0024 { 0025 Q_ASSERT_X(mode == INPLACE, "KoCompositeColorTransformation", "BUFFERED mode is not implemented yet!"); 0026 Q_UNUSED(mode); 0027 } 0028 0029 KoCompositeColorTransformation::~KoCompositeColorTransformation() 0030 { 0031 } 0032 0033 void KoCompositeColorTransformation::appendTransform(KoColorTransformation *transform) 0034 { 0035 if (transform) { 0036 m_d->transformations.append(transform); 0037 } 0038 } 0039 0040 void KoCompositeColorTransformation::transform(const quint8 *src, quint8 *dst, qint32 nPixels) const 0041 { 0042 QVector<KoColorTransformation*>::const_iterator begin = m_d->transformations.constBegin(); 0043 QVector<KoColorTransformation*>::const_iterator it = begin; 0044 QVector<KoColorTransformation*>::const_iterator end = m_d->transformations.constEnd(); 0045 0046 for (; it != end; ++it) { 0047 if (it == begin) { 0048 (*it)->transform(src, dst, nPixels); 0049 } else { 0050 (*it)->transform(dst, dst, nPixels); 0051 } 0052 } 0053 } 0054 0055 KoColorTransformation* KoCompositeColorTransformation::createOptimizedCompositeTransform(const QVector<KoColorTransformation*> transforms) 0056 { 0057 KoColorTransformation *finalTransform = 0; 0058 0059 int numValidTransforms = 0; 0060 foreach (KoColorTransformation *t, transforms) { 0061 numValidTransforms += bool(t); 0062 } 0063 0064 if (numValidTransforms > 1) { 0065 KoCompositeColorTransformation *compositeTransform = 0066 new KoCompositeColorTransformation( 0067 KoCompositeColorTransformation::INPLACE); 0068 0069 foreach (KoColorTransformation *t, transforms) { 0070 if (t) { 0071 compositeTransform->appendTransform(t); 0072 } 0073 } 0074 0075 finalTransform = compositeTransform; 0076 0077 } else if (numValidTransforms == 1) { 0078 foreach (KoColorTransformation *t, transforms) { 0079 if (t) { 0080 finalTransform = t; 0081 break; 0082 } 0083 } 0084 } 0085 0086 return finalTransform; 0087 }