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 }