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