Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_ls_satin_filter.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <cstdlib>
10
11
13
14#include "psd.h"
15
18#include "kis_gaussian_kernel.h"
19
20#include "kis_pixel_selection.h"
21#include "kis_fill_painter.h"
22#include "kis_iterator_ng.h"
24
25#include "kis_psd_layer_style.h"
26
28#include "kis_ls_utils.h"
31
32
34 : KisLayerStyleFilter(KoID("lssatin", i18n("Satin (style)")))
35{
36}
37
42
44{
45 return new KisLsSatinFilter(*this);
46}
47
49{
54
55 SatinRectsData(const QRect &applyRect,
56 const psd_layer_effects_context *context,
57 const psd_layer_effects_satin *shadow,
58 Direction direction)
59 {
60 Q_UNUSED(direction);
61
62 blur_size = shadow->size();
63 offset = shadow->calculateOffset(context);
64
65 // need rect calculation in reverse order
66 dstRect = applyRect;
67
69
70 int xGrow = qAbs(offset.x());
71 int yGrow = qAbs(offset.y());
72 satinNeedRect = srcRect.adjusted(-xGrow, -yGrow, xGrow, yGrow);
73
76 }
77
78 inline QRect finalNeedRect() const {
79 return blurNeedRect;
80 }
81
82 inline QRect finalChangeRect() const {
83 // TODO: is it correct?
84 return blurNeedRect;
85 }
86
87 qint32 blur_size;
88 QPoint offset;
89
90 QRect srcRect;
91 QRect dstRect;
94};
95
97 KisPixelSelectionSP srcSelection,
98 const bool invert,
99 const QPoint &offset,
100 const QRect &applyRect)
101{
102 KisSequentialIterator srcIt1(srcSelection, applyRect.translated(offset));
103 KisSequentialIterator srcIt2(srcSelection, applyRect.translated(-offset));
104 KisSequentialIterator dstIt(dstSelection, applyRect);
105
106 while(dstIt.nextPixel() && srcIt1.nextPixel() && srcIt2.nextPixel()) {
107
108 quint8 *dstPixelPtr = dstIt.rawData();
109 quint8 *src1PixelPtr = srcIt1.rawData();
110 quint8 *src2PixelPtr = srcIt2.rawData();
111
112 if (!invert) {
113 *dstPixelPtr = qAbs(*src1PixelPtr - *src2PixelPtr);
114 } else {
115 *dstPixelPtr = (255 - qAbs(*src1PixelPtr - *src2PixelPtr));
116 }
117 }
118}
119
120//#include "kis_paint_device_debug_utils.h"
121
124 const QRect &applyRect,
125 const psd_layer_effects_context *context,
126 const psd_layer_effects_satin *config,
127 KisResourcesInterfaceSP resourcesInterface,
129{
130 if (applyRect.isEmpty()) return;
131
132 SatinRectsData d(applyRect, context, config, SatinRectsData::NEED_RECT);
133
135 KisSelectionSP baseSelection = s1.selection();
136 KisLsUtils::selectionFromAlphaChannel(srcDevice, baseSelection, d.blurNeedRect);
137
138 KisPixelSelectionSP selection = baseSelection->pixelSelection();
139
141 KisPixelSelectionSP tempSelection = s2.selection()->pixelSelection();
142 tempSelection->makeCloneFromRough(selection, selection->selectedRect());
143
144 //KIS_DUMP_DEVICE_2(tempSelection, QRect(0,0,64,64), "00_selection", "dd");
145
146 KisLsUtils::applyGaussianWithTransaction(tempSelection, d.satinNeedRect, d.blur_size);
147
148 //KIS_DUMP_DEVICE_2(tempSelection, QRect(0,0,64,64), "01_gauss", "dd");
149
154 d.satinNeedRect,
155 config->contourLookupTable(),
156 config->antiAliased(),
157 config->edgeHidden());
158
159 //KIS_DUMP_DEVICE_2(tempSelection, QRect(0,0,64,64), "02_contour", "dd");
160
162 tempSelection,
163 config->invert(),
164 d.offset,
165 d.dstRect);
166
167 //KIS_DUMP_DEVICE_2(selection, QRect(0,0,64,64), "03_blended", "dd");
168
170 baseSelection,
171 srcDevice,
172 dst,
173 d.srcRect,
174 d.dstRect,
175 context,
176 config,
177 resourcesInterface,
178 env);
179}
180
184 const QRect &applyRect,
185 KisPSDLayerStyleSP style,
187{
188 Q_UNUSED(blower);
190
191 const psd_layer_effects_satin *config = style->satin();
192 if (!KisLsUtils::checkEffectEnabled(config, dst)) return;
193
195 applySatin(src, dst, applyRect, style->context(), w.config, style->resourcesInterface(), env);
196}
197
199{
200 const psd_layer_effects_satin *config = style->satin();
201 if (!config->effectEnabled()) return rect;
202
204 SatinRectsData d(rect, style->context(), w.config, SatinRectsData::NEED_RECT);
205 return rect | d.finalNeedRect();
206}
207
209{
210 const psd_layer_effects_satin *config = style->satin();
211 if (!config->effectEnabled()) return rect;
212
214 SatinRectsData d(rect, style->context(), w.config, SatinRectsData::CHANGE_RECT);
215 return style->context()->keep_original ?
216 d.finalChangeRect() : rect | d.finalChangeRect();
217}
QPointF s1
QPointF s2
void applySatin(KisPaintDeviceSP srcDevice, KisMultipleProjection *dst, const QRect &applyRect, const psd_layer_effects_context *context, const psd_layer_effects_satin *config, KisResourcesInterfaceSP resourcesInterface, KisLayerStyleFilterEnvironment *env) const
void processDirectly(KisPaintDeviceSP src, KisMultipleProjection *dst, KisLayerStyleKnockoutBlower *blower, const QRect &applyRect, KisPSDLayerStyleSP style, KisLayerStyleFilterEnvironment *env) const override
QRect changedRect(const QRect &rect, KisPSDLayerStyleSP style, KisLayerStyleFilterEnvironment *env) const override
QRect neededRect(const QRect &rect, KisPSDLayerStyleSP style, KisLayerStyleFilterEnvironment *env) const override
KisLayerStyleFilter * clone() const override
void makeCloneFromRough(KisPaintDeviceSP src, const QRect &minimalRect)
ALWAYS_INLINE quint8 * rawData()
Definition KoID.h:30
bool effectEnabled() const
Definition psd.h:261
QPoint calculateOffset(const psd_layer_effects_context *context) const
Definition psd.cpp:243
qint32 size() const
Definition psd.h:306
bool edgeHidden() const
Definition psd.h:336
const quint8 * contourLookupTable() const
Definition psd.h:311
bool antiAliased() const
Definition psd.h:316
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
void blendAndOffsetSatinSelection(KisPixelSelectionSP dstSelection, KisPixelSelectionSP srcSelection, const bool invert, const QPoint &offset, const QRect &applyRect)
void applyContourCorrection(KisPixelSelectionSP selection, const QRect &applyRect, const quint8 *lookup_table, bool antiAliased, bool edgeHidden)
QRect growRectFromRadius(const QRect &rc, int radius)
bool checkEffectEnabled(const psd_layer_effects_shadow_base *config, KisMultipleProjection *dst)
void selectionFromAlphaChannel(KisPaintDeviceSP srcDevice, KisSelectionSP dstSelection, const QRect &srcRect)
void applyGaussianWithTransaction(KisPixelSelectionSP selection, const QRect &applyRect, qreal radius)
void applyFinalSelection(const QString &projectionId, KisSelectionSP baseSelection, KisPaintDeviceSP srcDevice, KisMultipleProjection *dst, const QRect &, const QRect &dstRect, const psd_layer_effects_context *, const psd_layer_effects_shadow_base *config, KisResourcesInterfaceSP resourcesInterface, const KisLayerStyleFilterEnvironment *env)
KisPixelSelectionSP pixelSelection
QRect finalChangeRect() const
QRect finalNeedRect() const
SatinRectsData(const QRect &applyRect, const psd_layer_effects_context *context, const psd_layer_effects_satin *shadow, Direction direction)
bool invert() const
Definition psd.h:650