Krita Source Code Documentation
Loading...
Searching...
No Matches
CmykU8ColorSpace.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2007 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2021 L. E. Segovia <amy@amyspark.me>
4 *
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7
8#include "CmykU8ColorSpace.h"
9
10#include <QDomElement>
11
12#include <QDebug>
13#include <klocalizedstring.h>
14
17#include <KoColorConversions.h>
18#include <kis_dom_utils.h>
19
21 : LcmsColorSpace<KoCmykU8Traits>(colorSpaceId(), name, TYPE_CMYKA_8, cmsSigCmykData, p)
22{
23 addChannel(new KoChannelInfo(i18n("Cyan"), 0 * sizeof(quint8), 0, KoChannelInfo::COLOR, KoChannelInfo::UINT8, sizeof(quint8), Qt::cyan));
24 addChannel(new KoChannelInfo(i18n("Magenta"), 1 * sizeof(quint8), 1, KoChannelInfo::COLOR, KoChannelInfo::UINT8, sizeof(quint8), Qt::magenta));
25 addChannel(new KoChannelInfo(i18n("Yellow"), 2 * sizeof(quint8), 2, KoChannelInfo::COLOR, KoChannelInfo::UINT8, sizeof(quint8), Qt::yellow));
26 addChannel(new KoChannelInfo(i18n("Black"), 3 * sizeof(quint8), 3, KoChannelInfo::COLOR, KoChannelInfo::UINT8, sizeof(quint8), Qt::black));
27 addChannel(new KoChannelInfo(i18n("Alpha"), 4 * sizeof(quint8), 4, KoChannelInfo::ALPHA, KoChannelInfo::UINT8, sizeof(quint8)));
28
29 init();
30
31 addStandardCompositeOps<KoCmykU8Traits>(this);
32 addStandardDitherOps<KoCmykU8Traits>(this);
33}
34
36{
37 if (independence == TO_RGBA8) {
38 return true;
39 } else {
40 return false;
41 }
42}
43
45{
46 return new CmykU8ColorSpace(name(), profile()->clone());
47}
48
49void CmykU8ColorSpace::colorToXML(const quint8 *pixel, QDomDocument &doc, QDomElement &colorElt) const
50{
51 const KoCmykU8Traits::Pixel *p = reinterpret_cast<const KoCmykU8Traits::Pixel *>(pixel);
52 QDomElement labElt = doc.createElement("CMYK");
57 labElt.setAttribute("space", profile()->name());
58 colorElt.appendChild(labElt);
59}
60
61void CmykU8ColorSpace::colorFromXML(quint8 *pixel, const QDomElement &elt) const
62{
63 KoCmykU8Traits::Pixel *p = reinterpret_cast<KoCmykU8Traits::Pixel *>(pixel);
69}
70
71void CmykU8ColorSpace::toHSY(const QVector<double> &channelValues, qreal *hue, qreal *sat, qreal *luma) const
72{
73 qreal c0 = channelValues[0];
74 qreal c1 = channelValues[1];
75 qreal c2 = channelValues[2];
76 qreal c3 = channelValues[3];
77 //we use HSI here because we can't linearise CMYK, and HSY doesn't work right with...
78 CMYKToCMY(&c0, &c1, &c2, &c3);
79 c0 = 1.0 - c0;
80 c1 = 1.0 - c1;
81 c2 = 1.0 - c2;
82 RGBToHSI(c0, c1, c2, hue, sat, luma);
83}
84
85QVector <double> CmykU8ColorSpace::fromHSY(qreal *hue, qreal *sat, qreal *luma) const
86{
87 QVector <double> channelValues(5);
88 channelValues.fill(1.0);
89 HSIToRGB(*hue, *sat, *luma, &channelValues[0],&channelValues[1],&channelValues[2]);
90 channelValues[0] = qBound(0.0,1.0-channelValues[0],1.0);
91 channelValues[1] = qBound(0.0,1.0-channelValues[1],1.0);
92 channelValues[2] = qBound(0.0,1.0-channelValues[2],1.0);
93 CMYToCMYK(&channelValues[0],&channelValues[1],&channelValues[2],&channelValues[3]);
94 return channelValues;
95}
96
97void CmykU8ColorSpace::toYUV(const QVector<double> &channelValues, qreal *y, qreal *u, qreal *v) const
98{
99 qreal c0 = channelValues[0];
100 qreal c1 = channelValues[1];
101 qreal c2 = channelValues[2];
102 qreal c3 = channelValues[3];
103 CMYKToCMY(&c0, &c1, &c2, &c3);
104 c0 = 1.0 - c0;
105 c1 = 1.0 - c1;
106 c2 = 1.0 - c2;
107 RGBToYUV(c0, c1, c2, y, u, v, 0.33, 0.33, 0.33);
108}
109
110QVector <double> CmykU8ColorSpace::fromYUV(qreal *y, qreal *u, qreal *v) const
111{
112 QVector <double> channelValues(5);
113 channelValues.fill(1.0);
114 YUVToRGB(*y, *u, *v, &channelValues[0],&channelValues[1],&channelValues[2], 0.33, 0.33, 0.33);
115 channelValues[0] = qBound(0.0,1.0-channelValues[0],1.0);
116 channelValues[1] = qBound(0.0,1.0-channelValues[1],1.0);
117 channelValues[2] = qBound(0.0,1.0-channelValues[2],1.0);
118 CMYToCMYK(&channelValues[0],&channelValues[1],&channelValues[2],&channelValues[3]);
119 return channelValues;
120}
const Params2D p
qreal v
qreal u
void RGBToHSI(qreal r, qreal g, qreal b, qreal *h, qreal *s, qreal *i)
void RGBToYUV(const qreal r, const qreal g, const qreal b, qreal *y, qreal *u, qreal *v, qreal R, qreal G, qreal B)
void HSIToRGB(const qreal h, const qreal s, const qreal i, qreal *red, qreal *green, qreal *blue)
void YUVToRGB(const qreal y, const qreal u, const qreal v, qreal *r, qreal *g, qreal *b, qreal R, qreal G, qreal B)
void CMYToCMYK(qreal *c, qreal *m, qreal *y, qreal *k)
void CMYKToCMY(qreal *c, qreal *m, qreal *y, qreal *k)
ColorSpaceIndependence
@ TO_RGBA8
void toHSY(const QVector< double > &channelValues, qreal *hue, qreal *sat, qreal *luma) const override
void colorToXML(const quint8 *pixel, QDomDocument &doc, QDomElement &colorElt) const override
QVector< double > fromHSY(qreal *hue, qreal *sat, qreal *luma) const override
bool willDegrade(ColorSpaceIndependence independence) const override
CmykU8ColorSpace(const QString &name, KoColorProfile *p)
void toYUV(const QVector< double > &channelValues, qreal *y, qreal *u, qreal *v) const override
QVector< double > fromYUV(qreal *y, qreal *u, qreal *v) const override
void colorFromXML(quint8 *pixel, const QDomElement &elt) const override
virtual KoColorSpace * clone() const
@ ALPHA
The channel represents the opacity of a pixel.
@ COLOR
The channel represents a color.
@ UINT8
use this for an unsigned integer 8bits channel
static _Tdst scaleToA(_T a)
virtual void addChannel(KoChannelInfo *ci)
const KoColorProfile * profile() const override
double toDouble(const QString &str, bool *ok=nullptr)
QString toString(const QString &value)