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 }