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 }