Changeset View
Changeset View
Standalone View
Standalone View
libs/pigment/KoColor.cpp
Show First 20 Lines • Show All 129 Lines • ▼ Show 20 Line(s) | |||||
130 | 130 | | |||
131 | void KoColor::convertTo(const KoColorSpace * cs) | 131 | void KoColor::convertTo(const KoColorSpace * cs) | ||
132 | { | 132 | { | ||
133 | convertTo(cs, | 133 | convertTo(cs, | ||
134 | KoColorConversionTransformation::internalRenderingIntent(), | 134 | KoColorConversionTransformation::internalRenderingIntent(), | ||
135 | KoColorConversionTransformation::internalConversionFlags()); | 135 | KoColorConversionTransformation::internalConversionFlags()); | ||
136 | } | 136 | } | ||
137 | 137 | | |||
138 | KoColor KoColor::convertedTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const | ||||
139 | { | ||||
140 | KoColor result(*this); | ||||
141 | result.convertTo(cs, renderingIntent, conversionFlags); | ||||
142 | return result; | ||||
143 | } | ||||
144 | | ||||
145 | KoColor KoColor::convertedTo(const KoColorSpace *cs) const | ||||
146 | { | ||||
147 | return convertedTo(cs, | ||||
148 | KoColorConversionTransformation::internalRenderingIntent(), | ||||
149 | KoColorConversionTransformation::internalConversionFlags()); | ||||
150 | } | ||||
151 | | ||||
138 | void KoColor::setProfile(const KoColorProfile *profile) | 152 | void KoColor::setProfile(const KoColorProfile *profile) | ||
139 | { | 153 | { | ||
140 | const KoColorSpace *dstColorSpace = | 154 | const KoColorSpace *dstColorSpace = | ||
141 | KoColorSpaceRegistry::instance()->colorSpace(colorSpace()->colorModelId().id(), colorSpace()->colorDepthId().id(), profile); | 155 | KoColorSpaceRegistry::instance()->colorSpace(colorSpace()->colorModelId().id(), colorSpace()->colorDepthId().id(), profile); | ||
142 | if (!dstColorSpace) return; | 156 | if (!dstColorSpace) return; | ||
143 | 157 | | |||
144 | m_colorSpace = KoColorSpaceRegistry::instance()->permanentColorspace(dstColorSpace); | 158 | m_colorSpace = KoColorSpaceRegistry::instance()->permanentColorspace(dstColorSpace); | ||
145 | } | 159 | } | ||
Show All 27 Lines | |||||
173 | 187 | | |||
174 | void KoColor::fromQColor(const QColor& c) | 188 | void KoColor::fromQColor(const QColor& c) | ||
175 | { | 189 | { | ||
176 | if (m_colorSpace) { | 190 | if (m_colorSpace) { | ||
177 | m_colorSpace->fromQColor(c, m_data); | 191 | m_colorSpace->fromQColor(c, m_data); | ||
178 | } | 192 | } | ||
179 | } | 193 | } | ||
180 | 194 | | |||
195 | void KoColor::subtract(const KoColor &value) | ||||
196 | { | ||||
197 | KIS_SAFE_ASSERT_RECOVER_RETURN(*m_colorSpace == *value.colorSpace()); | ||||
198 | | ||||
199 | QVector<float> channels1(m_colorSpace->channelCount()); | ||||
200 | QVector<float> channels2(m_colorSpace->channelCount()); | ||||
201 | | ||||
202 | m_colorSpace->normalisedChannelsValue(m_data, channels1); | ||||
203 | m_colorSpace->normalisedChannelsValue(value.data(), channels2); | ||||
204 | | ||||
205 | for (int i = 0; i < channels1.size(); i++) { | ||||
206 | channels1[i] -= channels2[i]; | ||||
207 | } | ||||
208 | | ||||
209 | m_colorSpace->fromNormalisedChannelsValue(m_data, channels1); | ||||
210 | } | ||||
211 | | ||||
212 | KoColor KoColor::subtracted(const KoColor &value) const | ||||
213 | { | ||||
214 | KoColor result(*this); | ||||
215 | result.subtract(value); | ||||
216 | return result; | ||||
217 | } | ||||
218 | | ||||
219 | void KoColor::add(const KoColor &value) | ||||
220 | { | ||||
221 | KIS_SAFE_ASSERT_RECOVER_RETURN(*m_colorSpace == *value.colorSpace()); | ||||
222 | | ||||
223 | QVector<float> channels1(m_colorSpace->channelCount()); | ||||
224 | QVector<float> channels2(m_colorSpace->channelCount()); | ||||
225 | | ||||
226 | m_colorSpace->normalisedChannelsValue(m_data, channels1); | ||||
227 | m_colorSpace->normalisedChannelsValue(value.data(), channels2); | ||||
228 | | ||||
229 | for (int i = 0; i < channels1.size(); i++) { | ||||
230 | channels1[i] += channels2[i]; | ||||
231 | } | ||||
232 | | ||||
233 | m_colorSpace->fromNormalisedChannelsValue(m_data, channels1); | ||||
234 | } | ||||
235 | | ||||
236 | KoColor KoColor::added(const KoColor &value) const | ||||
237 | { | ||||
238 | KoColor result(*this); | ||||
239 | result.add(value); | ||||
240 | return result; | ||||
241 | } | ||||
242 | | ||||
181 | #ifndef NDEBUG | 243 | #ifndef NDEBUG | ||
182 | void KoColor::dump() const | 244 | void KoColor::dump() const | ||
183 | { | 245 | { | ||
184 | dbgPigment <<"KoColor (" << this <<")," << m_colorSpace->id() <<""; | 246 | dbgPigment <<"KoColor (" << this <<")," << m_colorSpace->id() <<""; | ||
185 | QList<KoChannelInfo *> channels = m_colorSpace->channels(); | 247 | QList<KoChannelInfo *> channels = m_colorSpace->channels(); | ||
186 | 248 | | |||
187 | QList<KoChannelInfo *>::const_iterator begin = channels.constBegin(); | 249 | QList<KoChannelInfo *>::const_iterator begin = channels.constBegin(); | ||
188 | QList<KoChannelInfo *>::const_iterator end = channels.constEnd(); | 250 | QList<KoChannelInfo *>::const_iterator end = channels.constEnd(); | ||
▲ Show 20 Lines • Show All 102 Lines • ▼ Show 20 Line(s) | 352 | { | |||
291 | QStringList ls; | 353 | QStringList ls; | ||
292 | Q_FOREACH (KoChannelInfo *channel, KoChannelInfo::displayOrderSorted(color.colorSpace()->channels())) { | 354 | Q_FOREACH (KoChannelInfo *channel, KoChannelInfo::displayOrderSorted(color.colorSpace()->channels())) { | ||
293 | int realIndex = KoChannelInfo::displayPositionToChannelIndex(channel->displayPosition(), color.colorSpace()->channels()); | 355 | int realIndex = KoChannelInfo::displayPositionToChannelIndex(channel->displayPosition(), color.colorSpace()->channels()); | ||
294 | ls << channel->name(); | 356 | ls << channel->name(); | ||
295 | ls << color.colorSpace()->channelValueText(color.data(), realIndex); | 357 | ls << color.colorSpace()->channelValueText(color.data(), realIndex); | ||
296 | } | 358 | } | ||
297 | return ls.join(" "); | 359 | return ls.join(" "); | ||
298 | } | 360 | } | ||
361 | | ||||
362 | QDebug operator<<(QDebug dbg, const KoColor &color) | ||||
363 | { | ||||
364 | dbg.nospace() << "KoColor (" << color.colorSpace()->id(); | ||||
365 | | ||||
366 | QList<KoChannelInfo*> channels = color.colorSpace()->channels(); | ||||
367 | for (auto it = channels.constBegin(); it != channels.constEnd(); ++it) { | ||||
368 | | ||||
369 | KoChannelInfo *ch = (*it); | ||||
370 | | ||||
371 | dbg.nospace() << ", " << ch->name() << ":"; | ||||
372 | | ||||
373 | switch (ch->channelValueType()) { | ||||
374 | case KoChannelInfo::UINT8: { | ||||
375 | const quint8 *ptr = reinterpret_cast<const quint8*>(color.data() + ch->pos()); | ||||
376 | dbg.nospace() << *ptr; | ||||
377 | break; | ||||
378 | } case KoChannelInfo::UINT16: { | ||||
379 | const quint16 *ptr = reinterpret_cast<const quint16*>(color.data() + ch->pos()); | ||||
380 | dbg.nospace() << *ptr; | ||||
381 | break; | ||||
382 | } case KoChannelInfo::UINT32: { | ||||
383 | const quint32 *ptr = reinterpret_cast<const quint32*>(color.data() + ch->pos()); | ||||
384 | dbg.nospace() << *ptr; | ||||
385 | break; | ||||
386 | } case KoChannelInfo::FLOAT16: { | ||||
387 | const half *ptr = reinterpret_cast<const half*>(color.data() + ch->pos()); | ||||
388 | dbg.nospace() << *ptr; | ||||
389 | break; | ||||
390 | } case KoChannelInfo::FLOAT32: { | ||||
391 | const float *ptr = reinterpret_cast<const float*>(color.data() + ch->pos()); | ||||
392 | dbg.nospace() << *ptr; | ||||
393 | break; | ||||
394 | } case KoChannelInfo::FLOAT64: { | ||||
395 | const double *ptr = reinterpret_cast<const double*>(color.data() + ch->pos()); | ||||
396 | dbg.nospace() << *ptr; | ||||
397 | break; | ||||
398 | } case KoChannelInfo::INT8: { | ||||
399 | const qint8 *ptr = reinterpret_cast<const qint8*>(color.data() + ch->pos()); | ||||
400 | dbg.nospace() << *ptr; | ||||
401 | break; | ||||
402 | } case KoChannelInfo::INT16: { | ||||
403 | const qint16 *ptr = reinterpret_cast<const qint16*>(color.data() + ch->pos()); | ||||
404 | dbg.nospace() << *ptr; | ||||
405 | break; | ||||
406 | } case KoChannelInfo::OTHER: { | ||||
407 | const quint8 *ptr = reinterpret_cast<const quint8*>(color.data() + ch->pos()); | ||||
408 | dbg.nospace() << "undef(" << *ptr << ")"; | ||||
409 | break; | ||||
410 | } | ||||
411 | } | ||||
412 | } | ||||
413 | dbg.nospace() << ")"; | ||||
414 | return dbg.space(); | ||||
415 | } |