Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_convert_color_space_processing_visitor.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2019 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
10
12#include "kis_paint_device.h"
13#include "kis_transaction.h"
14#include "kis_undo_adapter.h"
15#include "kis_transform_mask.h"
17
18#include "kis_filter_mask.h"
19#include "kis_generator_layer.h"
21#include "kis_group_layer.h"
22#include "kis_paint_layer.h"
23#include "kis_projection_leaf.h"
24#include "kis_time_span.h"
26#include <KoUpdater.h>
31
33 const KoColorSpace *dstColorSpace,
35 KoColorConversionTransformation::ConversionFlags conversionFlags)
36 : m_srcColorSpace(srcColorSpace)
37 , m_dstColorSpace(dstColorSpace)
38 , m_renderingIntent(renderingIntent)
39 , m_conversionFlags(conversionFlags)
40{
41}
42
50
58
66
74
76{
77 if (!node->projectionLeaf()->isLayer()) return;
78 if (*m_dstColorSpace == *node->colorSpace()) return;
79
80 bool alphaLock = false;
81 bool alphaDisabled = false;
82
83 KisLayer *layer = dynamic_cast<KisLayer*>(node);
85
87
88 KisPaintLayer *paintLayer = 0;
89
90 KUndo2Command *parentConversionCommand = new KUndo2Command();
91
93 alphaDisabled = layer->alphaChannelDisabled();
94 new KisChangeChannelFlagsCommand(QBitArray(), layer, parentConversionCommand);
95 if ((paintLayer = dynamic_cast<KisPaintLayer*>(layer))) {
96 alphaLock = paintLayer->alphaLocked();
97 new KisChangeChannelLockFlagsCommand(QBitArray(), paintLayer, parentConversionCommand);
98 }
99 }
100
101 if (layer->original()) {
102 layer->original()->convertTo(m_dstColorSpace, m_renderingIntent, m_conversionFlags, parentConversionCommand, helper.updater());
103 }
104
105 if (layer->paintDevice() && layer->paintDevice()->colorSpace()->colorModelId() != AlphaColorModelID) {
106 layer->paintDevice()->convertTo(m_dstColorSpace, m_renderingIntent, m_conversionFlags, parentConversionCommand, helper.updater());
107 }
108
109 if (layer->projection()) {
110 layer->projection()->convertTo(m_dstColorSpace, m_renderingIntent, m_conversionFlags, parentConversionCommand, helper.updater());
111 }
112
113 if (alphaDisabled) {
115 layer, parentConversionCommand);
116 }
117
118 if (paintLayer && alphaLock) {
120 paintLayer, parentConversionCommand);
121 }
122
123 undoAdapter->addCommand(parentConversionCommand);
124 layer->invalidateFrames(KisTimeSpan::infinite(0), layer->extent());
125}
126
128{
129 // Group Layers determine their color space from their paint device, thus before setting
130 // channel flags, it must be reset to the new CS first.
131
132 bool alphaDisabled = layer->alphaChannelDisabled();
133
134 const KoColorSpace *srcColorSpace = layer->colorSpace();
135 const KoColorSpace *dstColorSpace = m_dstColorSpace;
136
137 // the swap of FINALIZING/INITIALIZING is intentional here, see the comment above
139
140 if (srcColorSpace->colorModelId() != dstColorSpace->colorModelId()) {
141 QBitArray channelFlags;
142
143 if (alphaDisabled) {
144 channelFlags = dstColorSpace->channelFlags(true, false);
145 }
146
147 undoAdapter->addCommand(new KisChangeChannelFlagsCommand(channelFlags, layer));
148 }
149
151}
152
158
const KoID AlphaColorModelID("A", ki18n("Alpha mask"))
QRect extent() const override
KUndo2Command * setColorSpace(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KoUpdater *progressUpdater=nullptr)
void visitExternalLayer(KisExternalLayer *layer, KisUndoAdapter *undoAdapter) override
void visitNodeWithPaintDevice(KisNode *node, KisUndoAdapter *undoAdapter) override
void visit(KisGeneratorLayer *layer, KisUndoAdapter *undoAdapter) override
KisConvertColorSpaceProcessingVisitor(const KoColorSpace *srcColorSpace, const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
void visitColorizeMask(KisColorizeMask *mask, KisUndoAdapter *undoAdapter) override
KoColorConversionTransformation::ConversionFlags m_conversionFlags
virtual KUndo2Command * convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags())
const KoColorSpace * colorSpace() const
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)
void visit(KisNode *node, KisUndoAdapter *undoAdapter) override
static KisTimeSpan infinite(int start)
virtual void addCommand(KUndo2Command *cmd)=0
QBitArray channelFlags(bool color=true, bool alpha=false) const
virtual KoID colorModelId() const =0
void setProgress(int percent)
Definition KoUpdater.cpp:38
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
virtual const KoColorSpace * colorSpace() const =0
virtual KisPaintDeviceSP paintDevice() const =0
const KoColorSpace * colorSpace() const override
KisPaintDeviceSP projection() const override
Definition kis_layer.cc:820
bool alphaChannelDisabled() const
Definition kis_layer.cc:334
QRect extent() const override
KisPaintDeviceSP original() const override=0
KisProjectionLeafSP projectionLeaf
Definition kis_node.cpp:93
void invalidateFrames(const KisTimeSpan &range, const QRect &rect)
Definition kis_node.cpp:616
bool alphaLocked() const
void threadSafeForceStaticImageUpdate(const QRect &extraUpdateRect)