21 bool useDullingMode, KisPaintThicknessOptionData::ThicknessMode thicknessMode)
25 , m_smearAlpha(smearAlpha)
26 , m_initializationPainter(painter)
27 , m_thicknessMode(thicknessMode)
30 thicknessMode == KisPaintThicknessOptionData::OVERWRITE) {
32 thicknessMode = KisPaintThicknessOptionData::OVERLAY;
41 if (colorSmudgeData) {
91 const KisDabShape &shape,
const QPointF &cursorPoint,
92 QRect *dstDabRect, qreal paintThickness)
105 if (paintThickness < 1.0) {
111 const int denormedPaintThickness = qRound(paintThickness * 255.0);
112 KoBgrU8Traits::Pixel *pixelPtr =
reinterpret_cast<KoBgrU8Traits::Pixel *
>(
m_origDab->
data());
113 for (
int i = 0; i < numPixels; i++) {
114 int gray = pixelPtr->red - 127;
122 gray = qBound(0, gray + 127, 255);
124 pixelPtr->red = gray;
125 pixelPtr->green = gray;
126 pixelPtr->blue = gray;
139 qreal opacity, qreal colorRateValue, qreal smudgeRateValue,
140 qreal maxPossibleSmudgeRateValue, qreal paintThicknessValue,
141 qreal smudgeRadiusValue)
143 const int numPixels = dstRect.width() * dstRect.height();
148 readRects << mirroredRects;
149 readRects << srcRect;
160 maxPossibleSmudgeRateValue,
165 const qreal overlaySmearRate = smudgeRateValue - 0.01;
166 const qreal overlayAdjustment =
167 (
m_thicknessMode == KisPaintThicknessOptionData::ThicknessMode::OVERWRITE) ?
169 const qreal brushHeightmapOpacity = opacity * overlayAdjustment;
181 Q_FOREACH(
const QRect& rc, mirroredRects) {
185 tempHeightmapDevice->
setRect(rc);
191 modulateLightnessByGrayBrush(tempColorDevice->
data(),
192 reinterpret_cast<const QRgb*
>(tempHeightmapDevice->
data()),
200 return mirroredRects;
const KoID Integer16BitsColorDepthID("U16", ki18n("16-bit integer/channel"))
const QString COMPOSITE_OVER
const QString COMPOSITE_COPY
PythonPluginManager * instance
void blendBrush(const QVector< KisPainter * > dstPainters, KisColorSmudgeSourceSP srcSampleDevice, KisFixedPaintDeviceSP maskDab, bool preserveMaskDab, const QRect &srcRect, const QRect &dstRect, const KoColor ¤tPaintColor, qreal opacity, qreal smudgeRateValue, qreal maxPossibleSmudgeRateValue, qreal colorRateValue, qreal smudgeRadiusValue)
void initializePaintingImpl(const KoColorSpace *dstColorSpace, bool smearAlpha, const QString &colorRateCompositeOpId)
KisPaintDeviceSP m_projectionDevice
DabColoringStrategy & coloringStrategy() override
KisPainter m_heightmapPainter
KisPaintDeviceSP m_colorOnlyDevice
KisPainter m_finalPainter
void initializePainting() override
KisFixedPaintDeviceSP m_maskDab
void updateMask(KisDabCache *dabCache, const KisPaintInformation &info, const KisDabShape &shape, const QPointF &cursorPoint, QRect *dstDabRect, qreal lightnessStrength) override
KisColorSmudgeSourceSP m_sourceWrapperDevice
KisPainter * m_initializationPainter
DabColoringStrategyMask m_coloringStrategy
KisFixedPaintDeviceSP m_origDab
QVector< QRect > paintDab(const QRect &srcRect, const QRect &dstRect, const KoColor ¤tPaintColor, qreal opacity, qreal colorRateValue, qreal smudgeRateValue, qreal maxPossibleSmudgeRateValue, qreal lightnessStrengthValue, qreal smudgeRadiusValue) override
KisColorSmudgeStrategyLightness(KisPainter *painter, bool smearAlpha, bool useDullingMode, KisPaintThicknessOptionData::ThicknessMode thicknessMode)
KisOverlayPaintDeviceWrapper * m_layerOverlayDevice
KisPaintThicknessOptionData::ThicknessMode m_thicknessMode
KisPaintDeviceSP m_heightmapDevice
bool m_shouldPreserveOriginalDab
KisOptimizedByteArray::MemoryAllocatorSP m_memoryAllocator
The KisDabCache class provides caching for dabs into the brush paintop.
bool needSeparateOriginal() const
KisFixedPaintDeviceSP fetchNormalizedImageDab(const KoColorSpace *cs, const QPointF &cursorPoint, KisDabShape const &shape, const KisPaintInformation &info, qreal softnessFactor, QRect *dstDabRect)
void setRect(const QRect &rc)
void lazyGrowBufferWithoutInitialization()
const KoColorSpace * colorSpace() const
void writeRects(const QVector< QRect > &rects, int index=0)
bool supportsWraproundMode() const
void setDefaultBounds(KisDefaultBoundsBaseSP bounds)
KisInterstrokeDataSP interstrokeData() const
const KoColorSpace * colorSpace() const
void setSupportsWraparoundMode(bool value)
KisDefaultBoundsBaseSP defaultBounds() const
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)
void readBytes(quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h) const
void writeBytes(const quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h)
const QVector< QRect > calculateAllMirroredRects(const QRect &rc)
void copyMirrorInformationFrom(const KisPainter *other)
void setSelection(KisSelectionSP selection)
void setOpacityF(qreal opacity)
void begin(KisPaintDeviceSP device)
void renderMirrorMaskSafe(QRect rc, KisFixedPaintDeviceSP dab, bool preserveDab)
void bltFixed(qint32 dstX, qint32 dstY, const KisFixedPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
void setChannelFlags(QBitArray channelFlags)
void setCompositeOpId(const KoCompositeOp *op)
static _Tdst multiply(_T a, _Tdst b)
virtual void copyOpacityU8(quint8 *src, quint8 *dst, qint32 nPixels) const =0
virtual KoID colorModelId() const =0
virtual const KoColorProfile * profile() const =0
#define KIS_SAFE_ASSERT_RECOVER(cond)
QSharedPointer< T > toQShared(T *ptr)
Point lerp(const Point &pt1, const Point &pt2, qreal t)
KisPaintDeviceSP heightmapDevice
KisOverlayPaintDeviceWrapper overlayDeviceWrapper
KisPaintDeviceSP projectionDevice
KisPaintDeviceSP colorBlendDevice
static KoColorSpaceRegistry * instance()