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 #ifndef _KO_SCALE_COLOR_CONVERSION_TRANSFORMATION_H_
0008 #define _KO_SCALE_COLOR_CONVERSION_TRANSFORMATION_H_
0009 
0010 #include <KoColorConversionTransformation.h>
0011 #include <KoColorConversionTransformationFactory.h>
0012 /**
0013  * This transformation allows to convert between two color spaces with the same
0014  * color model but different channel type.
0015  */
0016 template<typename _src_CSTraits_, typename _dst_CSTraits_>
0017 class KoScaleColorConversionTransformation : public KoColorConversionTransformation
0018 {
0019 public:
0020     KoScaleColorConversionTransformation(const KoColorSpace* srcCs, const KoColorSpace* dstCs) : KoColorConversionTransformation(srcCs, dstCs) {
0021         Q_ASSERT(srcCs->colorModelId() == dstCs->colorModelId());
0022     }
0023     virtual void transform(const quint8 *srcU8, quint8 *dstU8, qint32 nPixels) const {
0024         const typename _src_CSTraits_::channels_type* src = _src_CSTraits_::nativeArray(srcU8);
0025         typename _dst_CSTraits_::channels_type* dst = _dst_CSTraits_::nativeArray(dstU8);
0026         for (quint32 i = 0; i < _src_CSTraits_::channels_nb * nPixels; i++) {
0027             dst[i] = KoColorSpaceMaths<typename _src_CSTraits_::channels_type, typename _dst_CSTraits_::channels_type>::scaleToA(src[i]);
0028         }
0029     }
0030 };
0031 
0032 /**
0033  * Factory to create KoScaleColorConversionTransformation.
0034  */
0035 template<typename _src_CSTraits_, typename _dst_CSTraits_>
0036 class KoScaleColorConversionTransformationFactory : public KoColorConversionTransformationFactory
0037 {
0038 public:
0039     KoScaleColorConversionTransformationFactory(const QString& _colorModelId, const QString& _profileName, const QString& _srcDepthId, const QString& _dstDepthId)
0040             : KoColorConversionTransformationFactory(_colorModelId,  _srcDepthId, _profileName, _colorModelId, _dstDepthId, _profileName),
0041             hdr(((srcColorDepthId() == Float16BitsColorDepthID.id()) &&
0042                  (dstColorDepthId() == Float32BitsColorDepthID.id())) ||
0043                 ((srcColorDepthId() == Float32BitsColorDepthID.id()) &&
0044                  (dstColorDepthId() == Float16BitsColorDepthID.id()))) {
0045     }
0046     virtual KoColorConversionTransformation* createColorTransformation(const KoColorSpace* srcColorSpace, const KoColorSpace* dstColorSpace, KoColorConversionTransformation::Intent renderingIntent = KoColorConversionTransformation::internalRenderingIntent()) const {
0047         Q_UNUSED(renderingIntent);
0048         Q_ASSERT(canBeSource(srcColorSpace));
0049         Q_ASSERT(canBeDestination(dstColorSpace));
0050         return new KoScaleColorConversionTransformation<_src_CSTraits_, _dst_CSTraits_>(srcColorSpace, dstColorSpace);
0051     }
0052     virtual bool conserveColorInformation() const {
0053         return true;
0054     }
0055     virtual bool conserveDynamicRange() const {
0056         return hdr;
0057     }
0058 private:
0059     bool hdr;
0060 };
0061 
0062 #endif