Warning, file /office/calligra/libs/pigment/KoColorConversionAlphaTransformation.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 * Copyright (c) 2007 Cyrille Berger <cberger@cberger.net> 0003 * 0004 * This library is free software; you can redistribute it and/or 0005 * modify it under the terms of the GNU Lesser General Public 0006 * License as published by the Free Software Foundation; either 0007 * version 2.1 of the License, or (at your option) any later version. 0008 * 0009 * This library is distributed in the hope that it will be useful, 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0012 * Lesser General Public License for more details. 0013 * 0014 * You should have received a copy of the GNU Lesser General Public License 0015 * along with this library; see the file COPYING.LIB. If not, write to 0016 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0017 * Boston, MA 02110-1301, USA. 0018 */ 0019 0020 #include "KoColorConversionAlphaTransformation.h" 0021 0022 #include "KoColorSpace.h" 0023 #include "KoIntegerMaths.h" 0024 #include "KoColorSpaceTraits.h" 0025 #include "KoColorModelStandardIds.h" 0026 0027 /** 0028 * Converter from the alpha color space to any color space 0029 */ 0030 class KoColorConversionFromAlphaTransformation : public KoColorConversionTransformation 0031 { 0032 public: 0033 KoColorConversionFromAlphaTransformation(const KoColorSpace* srcCs, const KoColorSpace* dstCs, 0034 Intent renderingIntent, 0035 KoColorConversionTransformation::ConversionFlags conversionFlags); 0036 void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override; 0037 }; 0038 0039 //------ KoColorConversionFromAlphaTransformation ------// 0040 0041 KoColorConversionFromAlphaTransformation::KoColorConversionFromAlphaTransformation(const KoColorSpace* srcCs, 0042 const KoColorSpace* dstCs, 0043 Intent renderingIntent, 0044 ConversionFlags conversionFlags) 0045 : KoColorConversionTransformation(srcCs, dstCs, renderingIntent, conversionFlags) 0046 { 0047 0048 } 0049 0050 void KoColorConversionFromAlphaTransformation::transform(const quint8 *src, quint8 *dst, qint32 nPixels) const 0051 { 0052 quint16 data[4]; 0053 qint32 size = dstColorSpace()->pixelSize(); 0054 0055 data[1] = UINT16_MAX / 2; // a 0056 data[2] = UINT16_MAX / 2; // b 0057 data[3] = UINT16_MAX; // A 0058 0059 while (nPixels > 0) { 0060 0061 data[0] = UINT8_TO_UINT16(*src); // L 0062 dstColorSpace()->fromLabA16((quint8*)data, dst, 1); 0063 0064 src ++; 0065 dst += size; 0066 nPixels--; 0067 0068 } 0069 } 0070 0071 class KoColorConversionGrayAU8FromAlphaTransformation : public KoColorConversionTransformation 0072 { 0073 public: 0074 KoColorConversionGrayAU8FromAlphaTransformation(const KoColorSpace* srcCs, 0075 const KoColorSpace* dstCs, 0076 Intent renderingIntent, 0077 KoColorConversionTransformation::ConversionFlags conversionFlags) 0078 : KoColorConversionTransformation(srcCs, dstCs, renderingIntent, conversionFlags) 0079 { 0080 } 0081 void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override { 0082 while (nPixels > 0) { 0083 0084 dst[0] = *src; 0085 dst[1] = 255; 0086 0087 src ++; 0088 dst += 2; 0089 nPixels--; 0090 } 0091 } 0092 }; 0093 0094 //------ KoColorConversionFromAlphaTransformationFactory ------// 0095 0096 KoColorConversionFromAlphaTransformationFactory::KoColorConversionFromAlphaTransformationFactory(const QString& _dstModelId, const QString& _dstDepthId, const QString& _dstProfileName) 0097 : KoColorConversionTransformationFactory(AlphaColorModelID.id(), Integer8BitsColorDepthID.id(), "", _dstModelId, _dstDepthId, _dstProfileName) 0098 { 0099 } 0100 0101 KoColorConversionTransformation* KoColorConversionFromAlphaTransformationFactory::createColorTransformation(const KoColorSpace* srcColorSpace, 0102 const KoColorSpace* dstColorSpace, 0103 KoColorConversionTransformation::Intent renderingIntent, 0104 KoColorConversionTransformation::ConversionFlags conversionFlags) const 0105 { 0106 Q_ASSERT(canBeSource(srcColorSpace)); 0107 Q_ASSERT(canBeDestination(dstColorSpace)); 0108 0109 if (dstColorSpace->id() == "GRAYA") { 0110 return new KoColorConversionGrayAU8FromAlphaTransformation(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags); 0111 } else { 0112 return new KoColorConversionFromAlphaTransformation(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags); 0113 } 0114 } 0115 0116 bool KoColorConversionFromAlphaTransformationFactory::conserveColorInformation() const 0117 { 0118 return false; 0119 } 0120 0121 bool KoColorConversionFromAlphaTransformationFactory::conserveDynamicRange() const 0122 { 0123 return false; 0124 } 0125 0126 //------ KoColorConversionToAlphaTransformation ------// 0127 0128 /** 0129 * Converter to the alpha color space to any color space 0130 */ 0131 class KoColorConversionToAlphaTransformation : public KoColorConversionTransformation 0132 { 0133 public: 0134 KoColorConversionToAlphaTransformation(const KoColorSpace* srcCs, const KoColorSpace* dstCs, Intent renderingIntent, ConversionFlags conversionFlags); 0135 void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override; 0136 }; 0137 0138 0139 KoColorConversionToAlphaTransformation::KoColorConversionToAlphaTransformation(const KoColorSpace* srcCs, 0140 const KoColorSpace* dstCs, 0141 Intent renderingIntent, 0142 ConversionFlags conversionFlags) 0143 : KoColorConversionTransformation(srcCs, dstCs, renderingIntent, conversionFlags) 0144 { 0145 0146 } 0147 0148 void KoColorConversionToAlphaTransformation::transform(const quint8 *src, quint8 *dst, qint32 nPixels) const 0149 { 0150 quint16 data[4]; 0151 qint32 size = srcColorSpace()->pixelSize(); 0152 0153 while (nPixels > 0) { 0154 0155 srcColorSpace()->toLabA16(src, (quint8*)data, 1); 0156 *dst = UINT16_TO_UINT8(UINT16_MULT(data[0], data[3])); // L * A 0157 0158 src += size; 0159 dst ++; 0160 nPixels --; 0161 0162 } 0163 } 0164 0165 //------ KoColorConversionGrayAU8ToAlphaTransformation ------// 0166 0167 class KoColorConversionGrayAU8ToAlphaTransformation : public KoColorConversionTransformation 0168 { 0169 public: 0170 KoColorConversionGrayAU8ToAlphaTransformation(const KoColorSpace* srcCs, 0171 const KoColorSpace* dstCs, 0172 Intent renderingIntent, 0173 ConversionFlags conversionFlags) 0174 : KoColorConversionTransformation(srcCs, dstCs, renderingIntent, conversionFlags) 0175 { 0176 } 0177 0178 void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override 0179 { 0180 while (nPixels > 0) { 0181 0182 *dst = UINT8_MULT(src[0], src[1]); 0183 0184 src += 2; 0185 dst ++; 0186 nPixels --; 0187 } 0188 } 0189 }; 0190 0191 //------ KoColorConversionToAlphaTransformationFactory ------// 0192 0193 KoColorConversionToAlphaTransformationFactory::KoColorConversionToAlphaTransformationFactory(const QString& _srcModelId, const QString& _srcDepthId, const QString& _srcProfileName) 0194 : KoColorConversionTransformationFactory(_srcModelId, _srcDepthId, _srcProfileName, AlphaColorModelID.id(), Integer8BitsColorDepthID.id(), "") 0195 { 0196 } 0197 0198 KoColorConversionTransformation* KoColorConversionToAlphaTransformationFactory::createColorTransformation(const KoColorSpace* srcColorSpace, 0199 const KoColorSpace* dstColorSpace, 0200 KoColorConversionTransformation::Intent renderingIntent, 0201 KoColorConversionTransformation::ConversionFlags conversionFlags) const 0202 { 0203 Q_ASSERT(canBeSource(srcColorSpace)); 0204 Q_ASSERT(canBeDestination(dstColorSpace)); 0205 0206 if (srcColorSpace->id() == "GRAYA") { 0207 return new KoColorConversionGrayAU8ToAlphaTransformation(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags); 0208 } else { 0209 return new KoColorConversionToAlphaTransformation(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags); 0210 } 0211 } 0212 0213 bool KoColorConversionToAlphaTransformationFactory::conserveColorInformation() const 0214 { 0215 return false; 0216 } 0217 0218 bool KoColorConversionToAlphaTransformationFactory::conserveDynamicRange() const 0219 { 0220 return false; 0221 } 0222