17#include <klocalizedstring.h>
48 KisBrushTextureFlags flags)
50 , m_levelOfDetail(levelOfDetail)
51 , m_strengthOption(setting)
54 fillProperties(setting, resourcesInterface, canvasResourcesInterface);
81 bool additionalInvert =
false;
92 if (!
m_maskInfo->fillProperties(setting, resourcesInterface, additionalInvert)) {
93 warnKrita <<
"WARNING: Couldn't load the pattern for a stroke (KisTextureProperties)";
198 const QRect maskBounds =
m_maskInfo->maskBounds();
206 const QRect maskPatchRect = QRect(x, y,
rect.width(),
rect.height());
211 fillMaskPainter.
end();
214 quint8* dabData = dab->
data();
231 const QRect maskBounds =
m_maskInfo->maskBounds();
240 const QRect maskPatchRect = QRect(x, y,
rect.width(),
rect.height());
248 quint8* dabData = dab->
data();
252 qint16 colorWeights[2];
253 colorWeights[0] = qRound(pressure * 255);
254 colorWeights[1] = 255 - colorWeights[0];
259 for (
int row = 0; row <
rect.height(); ++row) {
260 for (
int col = 0; col <
rect.width(); ++col) {
262 const QRgb* maskQRgb =
reinterpret_cast<const QRgb*
>(iter->oldRawData());
263 qreal gradientvalue = qreal(qGray(*maskQRgb))/255.0;
266 qreal paintOpacity = paintcolor.
opacityF() * (qreal(qAlpha(*maskQRgb)) / 255.0);
268 colors[0] = paintcolor.
data();
270 colors[1] = dabColor.
data();
271 colorMix->
mixColors(colors, colorWeights, 2, dabData);
296 const QRect maskBounds =
m_maskInfo->maskBounds();
304 const QRect maskPatchRect = QRect(x, y,
rect.width(),
rect.height());
316 int alphaChannelOffset = -1;
319 for (quint32 i = 0; i < dab->
pixelSize(); i++) {
322 alphaChannelOffset = channels[i]->pos();
323 alphaChannelType = channels[i]->channelValueType();
329 alphaChannelOffset = 0;
332 QScopedPointer<KisMaskingBrushCompositeOpBase> compositeOp;
333 QString compositeOpId;
353 compositeOpId, alphaChannelType, dab->
pixelSize(),
358 quint8 *dabIt =
nullptr;
361 qint32 dabY = dab->
bounds().y();
362 qint32 maskPatchY = maskPatchRect.y();
363 qint32 rowsRemaining = dab->
bounds().height();
366 while (rowsRemaining > 0) {
367 qint32 dabX = dab->
bounds().x();
368 qint32 maskPatchX = maskPatchRect.x();
369 const qint32 numContiguousMaskPatchRows = maskPatchIt->
numContiguousRows(maskPatchY);
370 const qint32 rows = std::min(rowsRemaining, numContiguousMaskPatchRows);
371 qint32 columnsRemaining = dab->
bounds().width();
373 while (columnsRemaining > 0) {
375 const qint32 columns = std::min(columnsRemaining, numContiguousMaskPatchColumns);
377 const qint32 maskPatchRowStride = maskPatchIt->
rowStride(maskPatchX, maskPatchY);
380 maskPatchIt->
moveTo(maskPatchX, maskPatchY);
382 compositeOp->composite(maskPatchIt->
rawDataConst(), maskPatchRowStride,
387 maskPatchX += columns;
388 columnsRemaining -= columns;
394 rowsRemaining -= rows;
const QString COMPOSITE_OVER
const QString COMPOSITE_COPY
const QString COMPOSITE_DARKEN
const QString COMPOSITE_OVERLAY
const QString COMPOSITE_DODGE
const QString COMPOSITE_LINEAR_BURN
const QString COMPOSITE_MULT
const QString COMPOSITE_ERASE
const QString COMPOSITE_SUBTRACT
const QString COMPOSITE_BURN
const QString COMPOSITE_LINEAR_DODGE
const QString COMPOSITE_HARD_MIX_SOFTER_PHOTOSHOP
const QString COMPOSITE_HARD_MIX_PHOTOSHOP
virtual const quint8 * rawDataConst() const =0
KoResourceLoadResult loadLinkedPattern(KisResourcesInterfaceSP resourcesInterface) const
void fillRect(qint32 x, qint32 y, qint32 w, qint32 h, const KoColor &c, quint8 opacity)
quint32 pixelSize() const
const KoColorSpace * colorSpace() const
static KisMaskingBrushCompositeOpBase * createForAlphaSrc(const QString &id, KoChannelInfo::enumChannelValueType channelType, int pixelSize, int alphaOffset)
KisRandomConstAccessorSP createRandomConstAccessorNG() const
KisHLineIteratorSP createHLineIteratorNG(qint32 x, qint32 y, qint32 w)
void setCompositeOpId(const KoCompositeOp *op)
int generate(const QString &key, int min, int max) const
virtual qint32 rowStride(qint32 x, qint32 y) const =0
virtual qint32 numContiguousRows(qint32 y) const =0
virtual void moveTo(qint32 x, qint32 y)=0
virtual qint32 numContiguousColumns(qint32 x) const =0
ALWAYS_INLINE const quint8 * oldRawData() const
qreal apply(const KisPaintInformation &info) const
static bool requiresEffectiveCompositeOp(const KisPropertiesConfiguration *settings)
void fillProperties(const KisPropertiesConfiguration *setting, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface)
KisTextureMaskInfoSP m_maskInfo
static QList< KoResourceLoadResult > prepareEmbeddedResources(const KisPropertiesConfigurationSP setting, KisResourcesInterfaceSP resourcesInterface)
KisBrushTextureFlags m_flags
KisCachedPaintDevice m_cachedPaintDevice
KisStrengthOption m_strengthOption
KoAbstractGradientSP m_gradient
void applyGradient(KisFixedPaintDeviceSP dab, const QPoint &offset, const KisPaintInformation &info)
int effectiveOffsetY(const KisPaintInformation &info) const
bool applyingGradient() const
KoCachedGradient m_cachedGradient
void apply(KisFixedPaintDeviceSP dab, const QPoint &offset, const KisPaintInformation &info)
apply combine the texture map with the dab
KisTextureOption(const KisPropertiesConfiguration *setting, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface, int levelOfDetail, KisBrushTextureFlags flags=None)
void applyLightness(KisFixedPaintDeviceSP dab, const QPoint &offset, const KisPaintInformation &info)
int effectiveOffsetX(const KisPaintInformation &info) const
KisTextureOptionData::TexturingMode m_texturingMode
static QList< KoResourceLoadResult > prepareLinkedResources(const KisPropertiesConfigurationSP setting, KisResourcesInterfaceSP resourcesInterface)
void setGradient(const KoAbstractGradientSP gradient, qint32 steps, const KoColorSpace *cs)
void setColorSpace(const KoColorSpace *colorSpace)
const quint8 * cachedAt(qreal t) const
gets the color data at position 0 <= t <= 1
@ ALPHA
The channel represents the opacity of a pixel.
enumChannelValueType
enum to define the value of the channel
@ UINT8
use this for an unsigned integer 8bits channel
virtual qreal opacityF(const quint8 *pixel) const =0
QList< KoChannelInfo * > channels
virtual void fillGrayBrushWithColorAndLightnessWithStrength(quint8 *dst, const QRgb *brush, quint8 *brushColor, qreal strength, qint32 nPixels) const
KoMixColorsOp * mixColorsOp
void setColor(const quint8 *data, const KoColorSpace *colorSpace=0)
void setOpacity(quint8 alpha)
virtual void mixColors(const quint8 *const *colors, const qint16 *weights, int nColors, quint8 *dst, int weightSum=255) const =0
#define KIS_SAFE_ASSERT_RECOVER(cond)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
T kisGrowRect(const T &rect, U offset)
QSharedPointer< T > toQShared(T *ptr)
@ CurrentEffectiveCompositeOp
KisPaintDeviceSP device() const
KisTextureMaskInfoSP fetchCachedTextureInfo(KisTextureMaskInfoSP info)
static KisTextureMaskInfoCache * instance()
bool read(const KisPropertiesConfiguration *setting)
TexturingMode texturingMode
@ HARD_MIX_SOFTER_PHOTOSHOP
@ LINEAR_HEIGHT_PHOTOSHOP
KisEmbeddedTextureData textureData
static KoColorSpaceRegistry * instance()