File indexing completed on 2024-05-12 15:59:37

0001 /*
0002  *  SPDX-FileCopyrightText: 2007 Cyrille Berger <cberger@cberger.net>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "KoMultipleColorConversionTransformation.h"
0008 
0009 #include <QList>
0010 
0011 #include <KoColorSpace.h>
0012 
0013 struct Q_DECL_HIDDEN KoMultipleColorConversionTransformation::Private {
0014     QList<KoColorConversionTransformation*> transfos;
0015     quint32 maxPixelSize;
0016 };
0017 
0018 
0019 KoMultipleColorConversionTransformation::KoMultipleColorConversionTransformation(const KoColorSpace* srcCs, const KoColorSpace* dstCs, Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
0020     : KoColorConversionTransformation(srcCs, dstCs, renderingIntent, conversionFlags)
0021     , d(new Private)
0022 {
0023     d->maxPixelSize = qMax(srcCs->pixelSize(), dstCs->pixelSize());
0024 }
0025 KoMultipleColorConversionTransformation::~KoMultipleColorConversionTransformation()
0026 {
0027     Q_FOREACH (KoColorConversionTransformation* transfo, d->transfos) {
0028         delete transfo;
0029     }
0030     delete d;
0031 }
0032 void KoMultipleColorConversionTransformation::appendTransfo(KoColorConversionTransformation* transfo)
0033 {
0034     d->transfos.append(transfo);
0035     d->maxPixelSize = qMax(d->maxPixelSize, transfo->srcColorSpace()->pixelSize());
0036     d->maxPixelSize = qMax(d->maxPixelSize, transfo->dstColorSpace()->pixelSize());
0037 }
0038 void KoMultipleColorConversionTransformation::transform(const quint8 *src, quint8 *dst, qint32 nPixels) const
0039 {
0040     Q_ASSERT(d->transfos.size() > 1); // Be sure to have a more than one transformation
0041     quint8 *buff1 = new quint8[d->maxPixelSize*nPixels];
0042     quint8 *buff2 = 0;
0043     if (d->transfos.size() > 2) {
0044         buff2 = new quint8[d->maxPixelSize*nPixels]; // a second buffer is needed
0045     }
0046     d->transfos.first()->transform(src, buff1, nPixels);
0047     int lastIndex = d->transfos.size() - 2;
0048     for (int i = 1; i <= lastIndex; i++) {
0049         d->transfos[i]->transform(buff1, buff2, nPixels);
0050         quint8* tmp = buff1;
0051         buff1 = buff2;
0052         buff2 = tmp;
0053     }
0054     d->transfos.last()->transform(buff1, dst, nPixels);
0055     delete [] buff2;
0056     delete [] buff1;
0057 }