Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_ls_utils.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
3 * SPDX-FileCopyrightText: 2021 L. E. Segovia <amy@amyspark.me>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#include "kis_ls_utils.h"
9
11#include <KoColorSpace.h>
12#include <resources/KoPattern.h>
13
14
15#include "psd.h"
16
17#include "kis_default_bounds.h"
18#include "kis_pixel_selection.h"
20#include "kis_iterator_ng.h"
21
24#include "kis_gaussian_kernel.h"
25
26#include "kis_fill_painter.h"
33
34namespace KisLsUtils
35{
36
37 QRect growSelectionUniform(KisPixelSelectionSP selection, int growSize, const QRect &applyRect)
38 {
39 QRect changeRect = applyRect;
40
41 if (growSize > 0) {
42 KisGrowSelectionFilter filter(growSize, growSize);
43 changeRect = filter.changeRect(applyRect, selection->defaultBounds());
44 filter.process(selection, applyRect);
45 } else if (growSize < 0) {
46 KisShrinkSelectionFilter filter(qAbs(growSize), qAbs(growSize), false);
47 changeRect = filter.changeRect(applyRect, selection->defaultBounds());
48 filter.process(selection, applyRect);
49 }
50
51 return changeRect;
52 }
53
55 KisSelectionSP dstSelection,
56 const QRect &srcRect)
57 {
58 const KoColorSpace *cs = srcDevice->colorSpace();
59
60
61 KisPixelSelectionSP selection = dstSelection->pixelSelection();
62
63 KisSequentialConstIterator srcIt(srcDevice, srcRect);
64 KisSequentialIterator dstIt(selection, srcRect);
65
66 while (srcIt.nextPixel() && dstIt.nextPixel()) {
67 quint8 *dstPtr = dstIt.rawData();
68 const quint8* srcPtr = srcIt.rawDataConst();
69 *dstPtr = cs->opacityU8(srcPtr);
70 }
71
72 }
73
74 void findEdge(KisPixelSelectionSP selection, const QRect &applyRect, const bool edgeHidden)
75 {
76 KisSequentialIterator dstIt(selection, applyRect);
77
78 if (edgeHidden) {
79 while(dstIt.nextPixel()) {
80 quint8 *pixelPtr = dstIt.rawData();
81
82 *pixelPtr =
83 (*pixelPtr < 24) ?
84 *pixelPtr * 10 : 0xFF;
85
86 }
87 } else {
88 while(dstIt.nextPixel()) {
89 quint8 *pixelPtr = dstIt.rawData();
90 *pixelPtr = 0xFF;
91
92 }
93 }
94 }
95
96 QRect growRectFromRadius(const QRect &rc, int radius)
97 {
98 int halfSize = KisGaussianKernel::kernelSizeFromRadius(radius) / 2;
99 return rc.adjusted(-halfSize, -halfSize, halfSize, halfSize);
100 }
101
103 const QRect &applyRect,
104 qreal radius)
105 {
106 KisGaussianKernel::applyGaussian(selection, applyRect,
107 radius, radius,
108 QBitArray(), 0, true,
110 }
111
112 namespace Private {
114 QVector<KoColor> *table,
115 const KoColorSpace *colorSpace)
116 {
117 KIS_ASSERT_RECOVER_RETURN(table->size() == 256);
118
119 for (int i = 0; i < 256; i++) {
120 gradient->colorAt(((*table)[i]), qreal(i) / 255.0);
121 (*table)[i].convertTo(colorSpace);
122 }
123 }
124
126 {
127 int popOneIndex(int selectionAlpha) {
128 return 255 - selectionAlpha;
129 }
130
131 bool nextPixel() {
132 return true;
133 }
134 };
135
137 {
138 JitterGradientIndex(const QRect &applyRect,
139 int jitter,
141 : randomSelection(env->cachedRandomSelection(applyRect)),
142 noiseIt(randomSelection, applyRect),
143 m_jitterCoeff(jitter * 255 / 100)
144 {
145 }
146
147 int popOneIndex(int selectionAlpha) {
148 int gradientIndex = 255 - selectionAlpha;
149 gradientIndex += m_jitterCoeff * *noiseIt.rawDataConst() >> 8;
150 gradientIndex &= 0xFF;
151
152 return gradientIndex;
153 }
154
155 bool nextPixel() {
156 return noiseIt.nextPixel();
157 }
158
159 private:
163 };
164
165 template <class IndexFetcher>
167 KisPixelSelectionSP selection,
168 const QRect &applyRect,
169 const QVector<KoColor> &table,
170 bool edgeHidden,
171 IndexFetcher &indexFetcher)
172 {
174 *table.first().colorSpace() == *device->colorSpace());
175
176 const KoColorSpace *cs = device->colorSpace();
177 const int pixelSize = cs->pixelSize();
178
179 KisSequentialConstIterator selIt(selection, applyRect);
180 KisSequentialIterator dstIt(device, applyRect);
181
182 if (edgeHidden) {
183
184 while (selIt.nextPixel() &&
185 dstIt.nextPixel() &&
186 indexFetcher.nextPixel()) {
187
188 quint8 selAlpha = *selIt.rawDataConst();
189 int gradientIndex = indexFetcher.popOneIndex(selAlpha);
190 const KoColor &color = table[gradientIndex];
191 quint8 tableAlpha = color.opacityU8();
192
193 memcpy(dstIt.rawData(), color.data(), pixelSize);
194
195 if (selAlpha < 24 && tableAlpha == 255) {
196 tableAlpha = int(selAlpha) * 10 * tableAlpha >> 8;
197 cs->setOpacity(dstIt.rawData(), tableAlpha, 1);
198 }
199
200 }
201
202 } else {
203
204 while (selIt.nextPixel() &&
205 dstIt.nextPixel() &&
206 indexFetcher.nextPixel()) {
207
208 int gradientIndex = indexFetcher.popOneIndex(*selIt.rawDataConst());
209 const KoColor &color = table[gradientIndex];
210 memcpy(dstIt.rawData(), color.data(), pixelSize);
211 }
212 }
213 }
214
216 KisPixelSelectionSP selection,
217 const QRect &applyRect,
218 const QVector<KoColor> &table,
219 bool edgeHidden,
220 int jitter,
222 {
223 if (!jitter) {
224 LinearGradientIndex fetcher;
225 applyGradientImpl(device, selection, applyRect, table, edgeHidden, fetcher);
226 } else {
227 JitterGradientIndex fetcher(applyRect, jitter, env);
228 applyGradientImpl(device, selection, applyRect, table, edgeHidden, fetcher);
229 }
230 }
231 }
232
233 const int noiseNeedBorder = 8;
234
236 const QRect &applyRect,
237 int noise,
238 const psd_layer_effects_context *context,
240 {
241 Q_UNUSED(context);
242
243 const QRect overlayRect = kisGrowRect(applyRect, noiseNeedBorder);
244
245 KisPixelSelectionSP randomSelection = env->cachedRandomSelection(overlayRect);
246
247
249 KisPixelSelectionSP randomOverlay = s1.selection()->pixelSelection();
250
251 KisSequentialConstIterator noiseIt(randomSelection, overlayRect);
252 KisSequentialConstIterator srcIt(selection, overlayRect);
253 KisRandomAccessorSP dstIt = randomOverlay->createRandomAccessorNG();
254
255 while (noiseIt.nextPixel() && srcIt.nextPixel()) {
256 int itX = noiseIt.x();
257 int itY = noiseIt.y();
258
259 int x = itX + (*noiseIt.rawDataConst() >> 4) - 8;
260 int y = itY + (*noiseIt.rawDataConst() & 0x0F) - 8;
261 x = (x + itX) >> 1;
262 y = (y + itY) >> 1;
263
264 dstIt->moveTo(x, y);
265
266 quint8 dstAlpha = *dstIt->rawData();
267 quint8 srcAlpha = *srcIt.rawDataConst();
268
269 int value = qMin(255, dstAlpha + srcAlpha);
270
271 *dstIt->rawData() = value;
272 }
273
274 KisPainter gc(selection);
275 gc.setOpacityF(qreal(noise) / 100.0);
277 gc.bitBlt(applyRect.topLeft(), randomOverlay, applyRect);
278 }
279
280 //const int FULL_PERCENT_RANGE = 100;
281
282 void adjustRange(KisPixelSelectionSP selection, const QRect &applyRect, const int range)
283 {
284 KIS_ASSERT_RECOVER_RETURN(range >= 1 && range <= 100);
285
286 quint8 rangeTable[256];
287 for(int i = 0; i < 256; i ++) {
288 quint8 value = i * 100 / range;
289 rangeTable[i] = qMin(value, quint8(255));
290 }
291
292 KisSequentialIterator dstIt(selection, applyRect);
293
294 while (dstIt.nextPixel()) {
295 quint8 *pixelPtr = dstIt.rawData();
296 *pixelPtr = rangeTable[*pixelPtr];
297 }
298 }
299
301 const QRect &applyRect,
302 const quint8 *lookup_table,
303 bool antiAliased,
304 bool edgeHidden)
305 {
306 quint8 contour[PSD_LOOKUP_TABLE_SIZE] = {
307 0x00, 0x0b, 0x16, 0x21, 0x2c, 0x37, 0x42, 0x4d, 0x58, 0x63, 0x6e, 0x79, 0x84, 0x8f, 0x9a, 0xa5,
308 0xb0, 0xbb, 0xc6, 0xd1, 0xdc, 0xf2, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
309 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
310 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
311 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
312 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
313 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
314 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
315 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
316 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
317 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
318 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
319 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
320 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
321 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
322 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
323
324 if (edgeHidden) {
325 if (antiAliased) {
326 for (int i = 0; i < PSD_LOOKUP_TABLE_SIZE; i++) {
327 contour[i] = contour[i] * lookup_table[i] >> 8;
328 }
329 } else {
330 for (int i = 0; i < PSD_LOOKUP_TABLE_SIZE; i++) {
331 contour[i] = contour[i] * lookup_table[(int)((int)(i / 2.55) * 2.55 + 0.5)] >> 8;
332 }
333 }
334 } else {
335 if (antiAliased) {
336 for (int i = 0; i < PSD_LOOKUP_TABLE_SIZE; i++) {
337 contour[i] = lookup_table[i];
338 }
339 } else {
340 for (int i = 0; i < PSD_LOOKUP_TABLE_SIZE; i++) {
341 contour[i] = lookup_table[(int)((int)(i / 2.55) * 2.55 + 0.5)];
342 }
343 }
344 }
345
346 KisSequentialIterator dstIt(selection, applyRect);
347 while (dstIt.nextPixel()) {
348 quint8 *pixelPtr = dstIt.rawData();
349 *pixelPtr = contour[*pixelPtr];
350 }
351 }
352
355 const QRect &srcRect,
356 const QRect &dstRect,
357 const QRect &totalNeedRect,
358 const bool knockOutInverted)
359 {
361
362 QRect knockOutRect = !knockOutInverted ? srcRect : totalNeedRect;
363 knockOutRect &= dstRect;
364
365 KisPainter gc(selection);
367 gc.bitBlt(knockOutRect.topLeft(), knockOutSelection, knockOutRect);
368 }
369
371 const QRect &applyRect,
373 int scale,
374 KoPatternSP pattern,
375 int horizontalPhase,
376 int verticalPhase,
377 bool alignWithLayer)
378 {
380
381 QSize psize(pattern->width(), pattern->height());
382
383 QPoint patternOffset(qreal(psize.width()) * horizontalPhase / 100,
384 qreal(psize.height()) * verticalPhase / 100);
385
386 const QRect boundsRect = alignWithLayer ?
387 env->layerBounds() : env->defaultBounds();
388
389 patternOffset -= boundsRect.topLeft();
390
391 patternOffset.rx() %= psize.width();
392 patternOffset.ry() %= psize.height();
393
394 QRect fillRect = applyRect | applyRect.translated(patternOffset);
395
396 KisFillPainter gc(fillDevice);
397 QTransform transform;
398 transform.translate(-patternOffset.x(), -patternOffset.y());
399 qreal scaleNorm = qreal(scale*0.01);
400 transform.scale(scaleNorm, scaleNorm);
401 gc.fillRectNoCompose(fillRect, pattern, transform);
402 gc.end();
403 }
404
406 const QRect &applyRect,
407 const psd_layer_effects_overlay_base *config,
408 KisResourcesInterfaceSP resourcesInterface,
410 {
411 if (config->fillType() == psd_fill_solid_color) {
412 KoColor color(config->color(), fillDevice->colorSpace());
413 fillDevice->setDefaultPixel(color);
414
415 } else if (config->fillType() == psd_fill_pattern) {
416 KoPatternSP pattern = config->pattern(resourcesInterface);
417
419
420 if (pattern->hasAlpha()) {
421 pattern = env->cachedFlattenedPattern(pattern);
422 }
423
424 fillPattern(fillDevice, applyRect, env,
425 config->scale(), pattern,
426 config->horizontalPhase(),
427 config->verticalPhase(),
428 config->alignWithLayer());
429 } else if (config->fillType() == psd_fill_gradient) {
430 const QRect boundsRect = config->alignWithLayer() ?
431 env->layerBounds() : env->defaultBounds();
432
433 QPoint center = boundsRect.center();
434 center += QPoint(boundsRect.width() * config->gradientXOffset() / 100,
435 boundsRect.height() * config->gradientYOffset() / 100);
436
437 int width = (boundsRect.width() * config->scale() + 100) / 200;
438 int height = (boundsRect.height() * config->scale() + 100) / 200;
439
440 /* copy paste from libpsd */
441
442 int angle = config->angle();
443 int corner_angle = (int)(atan((qreal)boundsRect.height() / boundsRect.width()) * 180 / M_PI + 0.5);
444 int sign_x = 1;
445 int sign_y = 1;
446
447
448 if(angle < 0) {
449 angle += 360;
450 }
451
452 if (angle >= 90 && angle < 180) {
453 angle = 180 - angle;
454 sign_x = -1;
455 } else if (angle >= 180 && angle < 270) {
456 angle = angle - 180;
457 sign_x = -1;
458 sign_y = -1;
459 } else if (angle >= 270 && angle <= 360) {
460 angle = 360 - angle;
461 sign_y = -1;
462 }
463
464 int radius_x = 0;
465 int radius_y = 0;
466
467 if (angle <= corner_angle) {
468 radius_x = width;
469 radius_y = (int)(radius_x * tan(kisDegreesToRadians(qreal(angle))) + 0.5);
470 } else {
471 radius_y = height;
472 radius_x = (int)(radius_y / tan(kisDegreesToRadians(qreal(angle))) + 0.5);
473 }
474
475 int radius_corner = (int)(std::sqrt((qreal)(radius_x * radius_x + radius_y * radius_y)) + 0.5);
476
477 /* end of copy paste from libpsd */
478
479 KisGradientPainter gc(fillDevice);
480 gc.setGradient(config->gradient(resourcesInterface));
481 QPointF gradStart;
482 QPointF gradEnd;
485
486 QPoint rectangularOffset(sign_x * radius_x, -sign_y * radius_y);
487
488
489 switch(config->style())
490 {
494 gradStart = center - rectangularOffset;
495 gradEnd = center + rectangularOffset;
496 break;
497
501 gradStart = center;
502 gradEnd = center + QPointF(radius_corner, 0);
503 break;
504
508 gradStart = center;
509 gradEnd = center + rectangularOffset;
510 break;
511
515 gradStart = center - rectangularOffset;
516 gradEnd = center;
517 break;
518
522 gradStart = center - rectangularOffset;
523 gradEnd = center + rectangularOffset;
524 break;
525 default:
526 qFatal("Gradient Overlay: unknown switch case!");
527 break;
528 }
529
530 gc.paintGradient(gradStart, gradEnd,
531 repeat, 0.0,
532 config->reverse(),
533 applyRect,
534 config->dither());
535 }
536 }
537
538 void applyFinalSelection(const QString &projectionId,
539 KisSelectionSP baseSelection,
540 KisPaintDeviceSP srcDevice,
542 const QRect &/*srcRect*/,
543 const QRect &dstRect,
544 const psd_layer_effects_context */*context*/,
545 const psd_layer_effects_shadow_base *config,
546 KisResourcesInterfaceSP resourcesInterface,
548 {
549 const KoColor effectColor(config->color(), srcDevice->colorSpace());
550
551 const QRect effectRect(dstRect);
552 const QString compositeOp = config->blendMode();
553 const quint8 opacityU8 = quint8(qRound(255.0 / 100.0 * config->opacity()));
554 KisPaintDeviceSP dstDevice = dst->getProjection(projectionId, compositeOp, opacityU8, QBitArray(), srcDevice);
555
556 if (config->fillType() == psd_fill_solid_color) {
557 KisFillPainter gc(dstDevice);
559 gc.setSelection(baseSelection);
560 gc.fillSelection(effectRect, effectColor);
561 gc.end();
562
563 } else if (config->fillType() == psd_fill_gradient) {
564 if (!config->gradient(resourcesInterface)) {
565 warnKrita << "KisLsUtils::applyFinalSelection: Gradient object is null! Skipping...";
566 return;
567 }
568
569 QVector<KoColor> table(256);
570 Private::getGradientTable(config->gradient(resourcesInterface).data(), &table, dstDevice->colorSpace());
571
572 Private::applyGradient(dstDevice, baseSelection->pixelSelection(),
573 effectRect, table,
574 true, config->jitter(), env);
575 }
576
577 //dstDevice->convertToQImage(0, QRect(0,0,300,300)).save("6_device_shadow.png");
578 }
579
581 {
582 bool result = config->effectEnabled();
583
584 if (!result) {
585 dst->freeAllProjections();
586 }
587
588 return result;
589 }
590}
float value(const T *src, size_t ch)
QPointF s1
const QString COMPOSITE_COPY
const QString COMPOSITE_ERASE
virtual quint8 * rawData()=0
void fillSelection(const QRect &rc, const KoColor &color)
void fillRectNoCompose(const QRect &rc, const KoPatternSP pattern, const QTransform transform)
fillRect Fill a rectangle with a certain pattern. The pattern is repeated if it does not fit the enti...
static void applyGaussian(KisPaintDeviceSP device, const QRect &rect, qreal xRadius, qreal yRadius, const QBitArray &channelFlags, KoUpdater *updater, bool createTransaction=false, KisConvolutionBorderOp borderOp=BORDER_REPEAT)
static int kernelSizeFromRadius(qreal radius)
void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override
QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override
KisPaintDeviceSP getProjection(const QString &id, const QString &compositeOpId, quint8 opacity, const QBitArray &channelFlags, KisPaintDeviceSP prototype)
void setDefaultPixel(const KoColor &defPixel)
const KoColorSpace * colorSpace() const
KisDefaultBoundsBaseSP defaultBounds() const
KisRandomAccessorSP createRandomAccessorNG()
void setSelection(KisSelectionSP selection)
void setOpacityF(qreal opacity)
void setGradient(const KoAbstractGradientSP gradient)
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
void setCompositeOpId(const KoCompositeOp *op)
virtual void moveTo(qint32 x, qint32 y)=0
ALWAYS_INLINE quint8 * rawData()
ALWAYS_INLINE int x() const
ALWAYS_INLINE int y() const
ALWAYS_INLINE const quint8 * rawDataConst() const
QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override
void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override
virtual quint32 pixelSize() const =0
virtual void setOpacity(quint8 *pixels, quint8 alpha, qint32 nPixels) const =0
virtual quint8 opacityU8(const quint8 *pixel) const =0
quint8 * data()
Definition KoColor.h:144
quint8 opacityU8() const
Definition KoColor.cpp:341
qint32 opacity() const
Definition psd.h:281
QString blendMode() const
Definition psd.h:266
bool effectEnabled() const
Definition psd.h:261
KoColor color() const
Definition psd.h:271
qint32 jitter() const
Definition psd.h:356
qint32 angle() const
Definition psd.h:286
KoAbstractGradientSP gradient(KisResourcesInterfaceSP resourcesInterface) const
Definition psd.h:365
psd_fill_type fillType() const
Definition psd.h:341
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
#define warnKrita
Definition kis_debug.h:87
T kisGrowRect(const T &rect, U offset)
Definition kis_global.h:186
T kisDegreesToRadians(T degrees)
Definition kis_global.h:176
#define M_PI
Definition kis_global.h:111
void getGradientTable(const KoAbstractGradient *gradient, QVector< KoColor > *table, const KoColorSpace *colorSpace)
void applyGradient(KisPaintDeviceSP device, KisPixelSelectionSP selection, const QRect &applyRect, const QVector< KoColor > &table, bool edgeHidden, int jitter, const KisLayerStyleFilterEnvironment *env)
void applyGradientImpl(KisPaintDeviceSP device, KisPixelSelectionSP selection, const QRect &applyRect, const QVector< KoColor > &table, bool edgeHidden, IndexFetcher &indexFetcher)
void applyContourCorrection(KisPixelSelectionSP selection, const QRect &applyRect, const quint8 *lookup_table, bool antiAliased, bool edgeHidden)
const int noiseNeedBorder
QRect growSelectionUniform(KisPixelSelectionSP selection, int growSize, const QRect &applyRect)
QRect growRectFromRadius(const QRect &rc, int radius)
void adjustRange(KisPixelSelectionSP selection, const QRect &applyRect, const int range)
void findEdge(KisPixelSelectionSP selection, const QRect &applyRect, const bool edgeHidden)
void fillPattern(KisPaintDeviceSP fillDevice, const QRect &applyRect, KisLayerStyleFilterEnvironment *env, int scale, KoPatternSP pattern, int horizontalPhase, int verticalPhase, bool alignWithLayer)
void fillOverlayDevice(KisPaintDeviceSP fillDevice, const QRect &applyRect, const psd_layer_effects_overlay_base *config, KisResourcesInterfaceSP resourcesInterface, KisLayerStyleFilterEnvironment *env)
void applyNoise(KisPixelSelectionSP selection, const QRect &applyRect, int noise, const psd_layer_effects_context *context, KisLayerStyleFilterEnvironment *env)
bool checkEffectEnabled(const psd_layer_effects_shadow_base *config, KisMultipleProjection *dst)
void knockOutSelection(KisPixelSelectionSP selection, KisPixelSelectionSP knockOutSelection, const QRect &srcRect, const QRect &dstRect, const QRect &totalNeedRect, const bool knockOutInverted)
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)
@ psd_gradient_style_linear
Definition psd.h:102
@ psd_gradient_style_reflected
Definition psd.h:105
@ psd_gradient_style_angle
Definition psd.h:104
@ psd_gradient_style_radial
Definition psd.h:103
@ psd_gradient_style_diamond
Definition psd.h:106
@ psd_fill_solid_color
Definition psd.h:124
@ psd_fill_gradient
Definition psd.h:125
@ psd_fill_pattern
Definition psd.h:126
#define PSD_LOOKUP_TABLE_SIZE
Definition psd.h:220
bool paintGradient(const QPointF &gradientVectorStart, const QPointF &gradientVectorEnd, enumGradientRepeat repeat, double antiAliasThreshold, bool reverseGradient, qint32 startx, qint32 starty, qint32 width, qint32 height, bool useDithering=false)
void setGradientShape(enumGradientShape shape)
JitterGradientIndex(const QRect &applyRect, int jitter, const KisLayerStyleFilterEnvironment *env)
KisPixelSelectionSP pixelSelection
virtual void colorAt(KoColor &, qreal t) const
gets the color at position 0 <= t <= 1
KoPatternSP pattern(KisResourcesInterfaceSP resourcesInterface) const
Definition psd.h:1061
int gradientXOffset() const
Definition psd.h:1047
int gradientYOffset() const
Definition psd.h:1052
int horizontalPhase() const
Definition psd.h:1067
bool alignWithLayer() const
Definition psd.h:1027
psd_gradient_style style() const
Definition psd.h:1042