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