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

0001 /*
0002  *  SPDX-FileCopyrightText: 2007 Cyrille Berger <cberger@cberger.net>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-or-later
0005  */
0006 
0007 #include "KoFallBackColorTransformation.h"
0008 
0009 #include "KoColorConversionTransformation.h"
0010 #include "KoColorSpace.h"
0011 #include "KoColorTransformation.h"
0012 #include "KoColorConversionCache.h"
0013 #include "KoColorSpaceRegistry.h"
0014 
0015 #include "DebugPigment.h"
0016 
0017 struct Q_DECL_HIDDEN KoFallBackColorTransformation::Private {
0018     const KoColorSpace* fallBackColorSpace;
0019     KoCachedColorConversionTransformation* csToFallBackCache;
0020     KoCachedColorConversionTransformation* fallBackToCsCache;
0021     const KoColorConversionTransformation* csToFallBack;
0022     const KoColorConversionTransformation* fallBackToCs;
0023     KoColorTransformation* colorTransformation;
0024     mutable quint8* buff;
0025     mutable qint32 buffSize;
0026 };
0027 
0028 KoFallBackColorTransformation::KoFallBackColorTransformation(const KoColorSpace* _cs, const KoColorSpace* _fallBackCS, KoColorTransformation* _transfo) : d(new Private)
0029 {
0030     d->fallBackColorSpace = _fallBackCS;
0031     d->csToFallBackCache = new KoCachedColorConversionTransformation(KoColorSpaceRegistry::instance()->colorConversionCache()->cachedConverter(_cs, _fallBackCS, KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::internalConversionFlags()));
0032     d->csToFallBack = d->csToFallBackCache->transformation();
0033     d->fallBackToCsCache = new KoCachedColorConversionTransformation(KoColorSpaceRegistry::instance()->colorConversionCache()->cachedConverter(_fallBackCS, _cs, KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::internalConversionFlags()));
0034     d->fallBackToCs = d->fallBackToCsCache->transformation();
0035     d->colorTransformation = _transfo;
0036     d->buff = 0;
0037     d->buffSize = 0;
0038 }
0039 
0040 KoFallBackColorTransformation::KoFallBackColorTransformation(KoColorConversionTransformation* _csToFallBack, KoColorConversionTransformation* _fallBackToCs, KoColorTransformation* _transfo) : d(new Private)
0041 {
0042     Q_ASSERT(*_csToFallBack->srcColorSpace() == *_fallBackToCs->dstColorSpace());
0043     Q_ASSERT(*_fallBackToCs->srcColorSpace() == *_csToFallBack->dstColorSpace());
0044     d->fallBackColorSpace = _fallBackToCs->srcColorSpace();
0045     d->csToFallBack = _csToFallBack;
0046     d->fallBackToCs = _fallBackToCs;
0047     d->csToFallBackCache = 0;
0048     d->fallBackToCsCache = 0;
0049     d->colorTransformation = _transfo;
0050     d->buff = 0;
0051     d->buffSize = 0;
0052 }
0053 
0054 KoFallBackColorTransformation::~KoFallBackColorTransformation()
0055 {
0056     if (d->csToFallBackCache) {
0057         delete d->csToFallBackCache;
0058     } else {
0059         delete d->csToFallBack;
0060     }
0061     if (d->csToFallBackCache) {
0062         delete d->fallBackToCsCache;
0063     } else {
0064         delete d->fallBackToCs;
0065     }
0066     delete d->colorTransformation;
0067     delete[] d->buff;
0068     delete d;
0069 }
0070 
0071 void KoFallBackColorTransformation::transform(const quint8 *src, quint8 *dst, qint32 nPixels) const
0072 {
0073     if (d->buffSize < nPixels) { // Expand the buffer if needed
0074         d->buffSize = nPixels;
0075         delete[] d->buff;
0076         d->buff = new quint8[ d->buffSize * d->fallBackColorSpace->pixelSize()];
0077     }
0078     d->csToFallBack->transform(src, d->buff, nPixels);
0079     d->colorTransformation->transform(d->buff, d->buff, nPixels);
0080     d->fallBackToCs->transform(d->buff, dst, nPixels);
0081 }
0082 
0083 QList<QString> KoFallBackColorTransformation::parameters() const
0084 {
0085   return d->colorTransformation->parameters();
0086 }
0087 
0088 int KoFallBackColorTransformation::parameterId(const QString& name) const
0089 {
0090   return d->colorTransformation->parameterId(name);
0091 }
0092 
0093 void KoFallBackColorTransformation::setParameter(int id, const QVariant& parameter)
0094 {
0095   d->colorTransformation->setParameter(id, parameter);
0096 }