Krita Source Code Documentation
Loading...
Searching...
No Matches
KisAutoBrush Class Reference

#include <kis_auto_brush.h>

+ Inheritance diagram for KisAutoBrush:

Classes

struct  Private
 

Public Member Functions

QSizeF characteristicSize (KisDabShape const &) const override
 
KoResourceSP clone () const override
 
void coldInitBrush () override
 
qreal density () const
 
void generateMaskAndApplyMaskOrCreateDab (KisFixedPaintDeviceSP dst, KisBrush::ColoringInformation *src, KisDabShape const &, const KisPaintInformation &info, double subPixelX=0, double subPixelY=0, qreal softnessFactor=DEFAULT_SOFTNESS_FACTOR, qreal lightnessStrength=DEFAULT_LIGHTNESS_STRENGTH) const override
 
bool isEphemeral () const override
 
bool isPiercedApprox () const override
 
 KisAutoBrush (const KisAutoBrush &rhs)
 
 KisAutoBrush (KisMaskGenerator *as, qreal angle, qreal randomness, qreal density=1.0)
 
bool loadFromDevice (QIODevice *dev, KisResourcesInterfaceSP resourcesInterface) override
 
void lodLimitations (KisPaintopLodLimitations *l) const override
 
const KisMaskGeneratormaskGenerator () const
 
qint32 maskHeight (KisDabShape const &shape, qreal subPixelX, qreal subPixelY, const KisPaintInformation &info) const override
 
qint32 maskWidth (KisDabShape const &shape, qreal subPixelX, qreal subPixelY, const KisPaintInformation &info) const override
 
void notifyBrushIsGoingToBeClonedForStroke () override
 
KisAutoBrushoperator= (const KisAutoBrush &rhs)=delete
 
KisOptimizedBrushOutline outline (bool forcePreciseOutline=false) const override
 
KisFixedPaintDeviceSP outlineSourceImage () const override
 
KisFixedPaintDeviceSP paintDevice (const KoColorSpace *, KisDabShape const &, const KisPaintInformation &, double=0, double=0) const override
 
qreal randomness () const
 
bool saveToDevice (QIODevice *dev) const override
 
void setUserEffectiveSize (qreal value) override
 
bool supportsCaching () const override
 
void toXML (QDomDocument &, QDomElement &) const override
 
qreal userEffectiveSize () const override
 
 ~KisAutoBrush () override
 
- Public Member Functions inherited from KisBrush
qreal angle () const
 
virtual bool applyingGradient () const
 
bool autoSpacingActive () const
 
qreal autoSpacingCoeff () const
 
virtual enumBrushApplication brushApplication () const
 
virtual quint32 brushIndex () const
 
virtual QImage brushTipImage () const
 brushImage the image the brush tip can paint with. Not all brush types have a single image.
 
virtual enumBrushType brushType () const
 
virtual bool canPaintFor (const KisPaintInformation &)
 
void clearBrushPyramid ()
 
void generateMaskAndApplyMaskOrCreateDab (KisFixedPaintDeviceSP dst, ColoringInformation *coloringInfo, KisDabShape const &, const KisPaintInformation &info, double subPixelX=0, double subPixelY=0, qreal softnessFactor=DEFAULT_SOFTNESS_FACTOR) const
 
qint32 height () const
 
QPointF hotSpot (KisDabShape const &, const KisPaintInformation &info) const
 
 KisBrush ()
 
 KisBrush (const KisBrush &rhs)
 
 KisBrush (const QString &filename)
 
void mask (KisFixedPaintDeviceSP dst, const KisPaintDeviceSP src, KisDabShape const &shape, const KisPaintInformation &info, double subPixelX=0, double subPixelY=0, qreal softnessFactor=DEFAULT_SOFTNESS_FACTOR, qreal lightnessStrength=DEFAULT_LIGHTNESS_STRENGTH) const
 
void mask (KisFixedPaintDeviceSP dst, const KoColor &color, KisDabShape const &shape, const KisPaintInformation &info, double subPixelX=0, double subPixelY=0, qreal softnessFactor=DEFAULT_SOFTNESS_FACTOR, qreal lightnessStrength=DEFAULT_LIGHTNESS_STRENGTH) const
 
double maskAngle (double angle=0) const
 
virtual void notifyStrokeStarted ()
 
KisBrushoperator= (const KisBrush &rhs)=delete
 
virtual void prepareForSeqNo (const KisPaintInformation &info, int seqNo)
 
virtual bool preserveLightness () const
 
QPair< QString, QString > resourceType () const override
 
qreal scale () const
 
virtual void setAngle (qreal _angle)
 
void setAutoSpacing (bool active, qreal coeff)
 
virtual void setBrushApplication (enumBrushApplication brushApplication)
 
virtual void setBrushTipImage (const QImage &image)
 
virtual void setGradient (KoAbstractGradientSP gradient)
 
virtual void setScale (qreal _scale)
 
virtual void setSpacing (double spacing)
 
double spacing () const
 
qint32 width () const
 
 ~KisBrush () override
 
- Public Member Functions inherited from KoResource
bool active () const
 
void addMetaData (QString key, QVariant value)
 store the given key, value pair in the resource
 
virtual void clearSideLoadedResources ()
 
virtual QString defaultFileExtension () const
 
virtual QList< KoResourceLoadResultembeddedResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
QString filename () const
 
QImage image () const
 
bool isDirty () const
 
virtual bool isSerializable () const
 
 KoResource ()
 
 KoResource (const KoResource &rhs)
 
 KoResource (const QString &filename)
 
virtual QList< KoResourceLoadResultlinkedResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
bool load (KisResourcesInterfaceSP resourcesInterface)
 
QString md5Sum (bool generateIfEmpty=true) const
 
QMap< QString, QVariant > metadata () const
 get a map with all the metadata
 
virtual QString name () const
 
KoResourceoperator= (const KoResource &rhs)=delete
 
bool permanent () const
 
virtual QList< int > requiredCanvasResources () const
 
QList< KoResourceLoadResultrequiredResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
int resourceId () const
 
bool save ()
 
void setActive (bool active)
 
void setDirty (bool value)
 Mark the preset as modified but not saved.
 
void setFilename (const QString &filename)
 
void setImage (const QImage &image)
 
void setMD5Sum (const QString &md5sum)
 Set the md5sum of this resource. It must be in hex-encoded string format.
 
void setName (const QString &name)
 
void setPermanent (bool permanent)
 
void setResourceId (int id)
 
void setStorageLocation (const QString &location)
 
void setValid (bool valid)
 
void setVersion (int version)
 
virtual QList< KoResourceLoadResultsideLoadedResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
KoResourceSignature signature () const
 
QString storageLocation () const
 
QList< KoResourceLoadResulttakeSideLoadedResources (KisResourcesInterfaceSP globalResourcesInterface)
 
virtual QImage thumbnail () const
 thumbnail the thumbnail image to use in resource selectors
 
virtual QString thumbnailPath () const
 thumbnailPath returns the path to a separate thumbnail image, outside the actual resource file itself. If the path is relative, it is supposed start in the same location as the resource itself. If it's absolute, that is, it starts with "/", it is from the root of the storage.
 
virtual void updateThumbnail ()
 updateThumbnail updates the thumbnail for this resource. Reimplement if your thumbnail is something else than the image set with setImage.
 
bool valid () const
 
int version () const
 Get the version of the resource.
 
virtual ~KoResource ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Private Member Functions

QImage createBrushPreview (int maxSize=-1)
 

Private Attributes

const QScopedPointer< Privated
 

Additional Inherited Members

- Static Public Member Functions inherited from KisBrush
static KisBrushSP fromXML (const QDomElement &element, KisResourcesInterfaceSP resourcesInterface)
 
static KoResourceLoadResult fromXMLLoadResult (const QDomElement &element, KisResourcesInterfaceSP resourcesInterface)
 
- Public Attributes inherited from KoResource
bool active {true}
 
QString filename
 
QImage image
 
QString md5sum
 
QMap< QString, QVariant > metadata
 
bool modified {false}
 
QString name
 
bool permanent {false}
 
int resourceId {-1}
 
QString storageLocation
 
bool valid {false}
 
int version {-1}
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Static Public Attributes inherited from KisBrush
static const QString brushTypeMetaDataKey = "image-based-brush"
 
- Protected Member Functions inherited from KisBrush
void generateOutlineCache ()
 
bool outlineCacheIsValid () const
 
void predefinedBrushToXML (const QString &type, QDomElement &e) const
 
void resetOutlineCache ()
 
virtual void setBrushType (enumBrushType type)
 
void setHeight (qint32 height)
 
void setHotSpot (QPointF)
 
void setWidth (qint32 width)
 

Detailed Description

XXX: docs!

Definition at line 23 of file kis_auto_brush.h.

Constructor & Destructor Documentation

◆ KisAutoBrush() [1/2]

KisAutoBrush::KisAutoBrush ( KisMaskGenerator * as,
qreal angle,
qreal randomness,
qreal density = 1.0 )

Here is a two-stage process of initialization of the brush size. It is done so for the backward compatibility reasons when the size was set to the size of brushTipImage(), which initialization is now skipped for efficiency reasons.

Definition at line 66 of file kis_auto_brush.cpp.

67 : KisBrush(),
68 d(new Private)
69{
70 d->shape.reset(as);
71 d->randomness = randomness;
72 d->density = density;
73 d->idealThreadCountCached = QThread::idealThreadCount();
75
76 {
84 setWidth(qMax(qreal(1.0), d->shape->width()));
85 setHeight(qMax(qreal(1.0), d->shape->height()));
86
87 const int width = maskWidth(KisDabShape(), 0.0, 0.0, KisPaintInformation());
88 const int height = maskHeight(KisDabShape(), 0.0, 0.0, KisPaintInformation());
89
90 setWidth(qMax(1, width));
91 setHeight(qMax(1, height));
92 }
93
94 // We don't initialize setBrushTipImage(), because
95 // auto brush doesn't use image pyramid. And generation
96 // of a full-scaled QImage may cause a significant delay
97 // in the beginning of the stroke
98
101}
qint32 maskWidth(KisDabShape const &shape, qreal subPixelX, qreal subPixelY, const KisPaintInformation &info) const override
const QScopedPointer< Private > d
qreal density() const
qint32 maskHeight(KisDabShape const &shape, qreal subPixelX, qreal subPixelY, const KisPaintInformation &info) const override
qreal randomness() const
QImage createBrushPreview(int maxSize=-1)
qint32 width() const
virtual void setAngle(qreal _angle)
virtual void setBrushType(enumBrushType type)
void setWidth(qint32 width)
qint32 height() const
void setHeight(qint32 height)
qreal angle() const
@ MASK
Definition kis_brush.h:32
void setImage(const QImage &image)

References KisBrush::angle(), createBrushPreview(), d, density(), KisBrush::height(), MASK, maskHeight(), maskWidth(), randomness(), KisBrush::setAngle(), KisBrush::setBrushType(), KisBrush::setHeight(), KoResource::setImage(), KisBrush::setWidth(), and KisBrush::width().

◆ KisAutoBrush() [2/2]

KisAutoBrush::KisAutoBrush ( const KisAutoBrush & rhs)

Definition at line 158 of file kis_auto_brush.cpp.

159 : KisBrush(rhs)
160 , d(new Private(*rhs.d))
161{
162}

◆ ~KisAutoBrush()

KisAutoBrush::~KisAutoBrush ( )
override

Definition at line 103 of file kis_auto_brush.cpp.

104{
105}

Member Function Documentation

◆ characteristicSize()

QSizeF KisAutoBrush::characteristicSize ( KisDabShape const & shape) const
overridevirtual
Returns
the logical size of the brush, that is the size measured in floating point value.

This value should not be used for calculating future dab sizes because it doesn't take any rounding into account. The only use of this metric is calculation of brush-size derivatives like hotspots and spacing.

Reimplemented from KisBrush.

Definition at line 190 of file kis_auto_brush.cpp.

191{
193}
const KisMaskGenerator * maskGenerator() const
virtual QSizeF characteristicSize(KisDabShape const &) const
static KisDabShape lieAboutDabShape(KisDabShape const &shape, int spikes)

References KisBrush::characteristicSize(), lieAboutDabShape(), and maskGenerator().

◆ clone()

KoResourceSP KisAutoBrush::clone ( ) const
overridevirtual

Implements KoResource.

Definition at line 164 of file kis_auto_brush.cpp.

165{
166 return KoResourceSP(new KisAutoBrush(*this));
167}
KisAutoBrush(KisMaskGenerator *as, qreal angle, qreal randomness, qreal density=1.0)
QSharedPointer< KoResource > KoResourceSP

References KisAutoBrush().

◆ coldInitBrush()

void KisAutoBrush::coldInitBrush ( )
overridevirtual

Reimplemented from KisBrush.

Definition at line 356 of file kis_auto_brush.cpp.

357{
359}
void generateOutlineCache()

References KisBrush::generateOutlineCache().

◆ createBrushPreview()

QImage KisAutoBrush::createBrushPreview ( int maxSize = -1)
private

Definition at line 376 of file kis_auto_brush.cpp.

377{
378 KisDabShape shape;
379
380 int width = maskWidth(KisDabShape(), 0.0, 0.0, KisPaintInformation());
381 int height = maskHeight(KisDabShape(), 0.0, 0.0, KisPaintInformation());
382
383 QSize size(width, height);
384
385 if (maxSize > 0 && KisAlgebra2D::maxDimension(size) > maxSize) {
386 size.scale(128, 128, Qt::KeepAspectRatio);
387
388 qreal scale = 1.0;
389
390 if (width > height) {
391 scale = qreal(size.width()) / width;
392 } else {
393 scale = qreal(size.height()) / height;
394 }
395
396 shape = KisDabShape(scale, 1.0, 0.0);
397 width = maskWidth(shape, 0.0, 0.0, KisPaintInformation());
398 height = maskHeight(shape, 0.0, 0.0, KisPaintInformation());
399 }
400
401 KisPaintInformation info(QPointF(width * 0.5, height * 0.5), 0.5, 0, 0, angle(), 0, 0, 0, 0);
402
404 fdev->setRect(QRect(0, 0, width, height));
405 fdev->initialize();
406
407 mask(fdev, KoColor(Qt::black, fdev->colorSpace()), shape, info);
408 return fdev->convertToQImage(0);
409}
void mask(KisFixedPaintDeviceSP dst, const KoColor &color, KisDabShape const &shape, const KisPaintInformation &info, double subPixelX=0, double subPixelY=0, qreal softnessFactor=DEFAULT_SOFTNESS_FACTOR, qreal lightnessStrength=DEFAULT_LIGHTNESS_STRENGTH) const
qreal scale() const
void setRect(const QRect &rc)
bool initialize(quint8 defaultValue=0)
virtual QImage convertToQImage(const KoColorProfile *dstProfile, qint32 x, qint32 y, qint32 w, qint32 h, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
const KoColorSpace * colorSpace() const
auto maxDimension(Size size) -> decltype(size.width())
int size(const Forest< T > &forest)
Definition KisForest.h:1232
static KoColorSpaceRegistry * instance()

References KisBrush::angle(), KisFixedPaintDevice::colorSpace(), KisFixedPaintDevice::convertToQImage(), KisBrush::height(), KisFixedPaintDevice::initialize(), KoColorSpaceRegistry::instance(), KisBrush::mask(), maskHeight(), maskWidth(), KisAlgebra2D::maxDimension(), KisBrush::scale(), KisFixedPaintDevice::setRect(), and KisBrush::width().

◆ density()

qreal KisAutoBrush::density ( ) const

Definition at line 417 of file kis_auto_brush.cpp.

418{
419 return d->density;
420}

References d.

◆ generateMaskAndApplyMaskOrCreateDab()

void KisAutoBrush::generateMaskAndApplyMaskOrCreateDab ( KisFixedPaintDeviceSP dst,
KisBrush::ColoringInformation * coloringInfo,
KisDabShape const & shape,
const KisPaintInformation & info,
double subPixelX = 0,
double subPixelY = 0,
qreal softnessFactor = DEFAULT_SOFTNESS_FACTOR,
qreal lightnessStrength = DEFAULT_LIGHTNESS_STRENGTH ) const
overridevirtual

Create a mask and either mask dst (that is, change all alpha values of the existing pixels to those of the mask) or, if coloringInfo is present, clear dst and fill dst with pixels according to coloringInfo, masked according to the generated mask.

Parameters
dstthe destination that will be draw on the image, and this function will edit its alpha channel
coloringInfocoloring information that will be copied on the dab, it can be null
shapea shape applied on the alpha mask
infothe painting information (this is only and should only be used by KisImagePipeBrush and only to be backward compatible with the Gimp, KisImagePipeBrush is ignoring scale and angle information)
subPixelXsub position of the brush (contained between 0.0 and 1.0)
subPixelYsub position of the brush (contained between 0.0 and 1.0)
softnessFactorsoftness factor of the brush
Returns
a mask computed from the grey-level values of the pixels in the brush.

Reimplemented from KisBrush.

Definition at line 281 of file kis_auto_brush.cpp.

286{
287 Q_UNUSED(info);
288 Q_UNUSED(lightnessStrength);
289
290 // Generate the paint device from the mask
291 const KoColorSpace* cs = dst->colorSpace();
292 quint32 pixelSize = cs->pixelSize();
293
294 // mask dimension methods already includes KisBrush::angle()
295 int dstWidth = maskWidth(shape, subPixelX, subPixelY, info);
296 int dstHeight = maskHeight(shape, subPixelX, subPixelY, info);
297 QPointF hotSpot = this->hotSpot(shape, info);
298
299 // mask size and hotSpot function take the KisBrush rotation into account
300 qreal angle = shape.rotation() + KisBrush::angle();
301
302 // if there's coloring information, we merely change the alpha: in that case,
303 // the dab should be big enough!
304 if (coloringInformation) {
305 // new bounds. we don't care if there is some extra memory occupied.
306 dst->setRect(QRect(0, 0, dstWidth, dstHeight));
308 }
309 else {
310 KIS_SAFE_ASSERT_RECOVER_RETURN(dst->bounds().width() >= dstWidth &&
311 dst->bounds().height() >= dstHeight);
312 }
313
314 KIS_SAFE_ASSERT_RECOVER_RETURN(coloringInformation);
315
316 quint8* dabPointer = dst->data();
317
318 quint8* color = 0;
319 if (dynamic_cast<PlainColoringInformation*>(coloringInformation)) {
320 color = const_cast<quint8*>(coloringInformation->color());
321 }
322
323 double centerX = hotSpot.x() - 0.5 + subPixelX;
324 double centerY = hotSpot.y() - 0.5 + subPixelY;
325
326 d->shape->setSoftness(softnessFactor); // softness must be set first
327 d->shape->setScale(shape.scaleX(), shape.scaleY());
328
329 if (!color) {
330 for (int y = 0; y < dstHeight; y++) {
331 for (int x = 0; x < dstWidth; x++) {
332 memcpy(dabPointer, coloringInformation->color(), pixelSize);
333 coloringInformation->nextColumn();
334 dabPointer += pixelSize;
335 }
336 coloringInformation->nextRow();
337 }
338 }
339
340 MaskProcessingData data(dst, cs, color,
341 d->randomness, d->density,
342 centerX, centerY,
343 angle);
344
345 const QRect rect(0, 0, dstWidth, dstHeight);
346 KisBrushMaskApplicatorBase *applicator = d->shape->applicator();
347 applicator->initializeData(&data);
348 applicator->process(rect);
349}
virtual void process(const QRect &rect)=0
void initializeData(const MaskProcessingData *data)
QPointF hotSpot(KisDabShape const &, const KisPaintInformation &info) const
virtual quint32 pixelSize() const =0
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References KisBrush::angle(), KisFixedPaintDevice::bounds(), KisBrush::ColoringInformation::color(), KisFixedPaintDevice::colorSpace(), d, KisFixedPaintDevice::data(), KisBrush::hotSpot(), KisBrushMaskApplicatorBase::initializeData(), KIS_SAFE_ASSERT_RECOVER_RETURN, KisFixedPaintDevice::lazyGrowBufferWithoutInitialization(), maskHeight(), maskWidth(), KisBrush::ColoringInformation::nextColumn(), KisBrush::ColoringInformation::nextRow(), KoColorSpace::pixelSize(), KisBrushMaskApplicatorBase::process(), KisDabShape::rotation(), KisDabShape::scaleX(), KisDabShape::scaleY(), and KisFixedPaintDevice::setRect().

◆ isEphemeral()

bool KisAutoBrush::isEphemeral ( ) const
overridevirtual

Ephemeral resource is a type of resource that has no physical representation on disk. Therefore, its load()/save() calls do nothing. Such resources will always have empty md5Sum() and, therefore, will never be stored in the resources database.

This type of resources is created directly by the corresponding factory or other object (e.g. KisAutoBrushFactory).

Ephemeral resource cannot be serializable.

Reimplemented from KoResource.

Definition at line 107 of file kis_auto_brush.cpp.

108{
109 return true;
110}

◆ isPiercedApprox()

bool KisAutoBrush::isPiercedApprox ( ) const
overridevirtual

Returns true if the brush has a bunch of pixels almost fully transparent in the very center. If the brush is pierced, then dulling mode may not work correctly due to empty samples.

WARNING: this method is relatively expensive since it iterates up to 100 pixels of the brush.

Reimplemented from KisBrush.

Definition at line 125 of file kis_auto_brush.cpp.

126{
127 bool result = false;
128
129 if (d->shape->id() == SoftId.id()) {
130 result = d->shape->valueAt(0,0) > 0.05 * 255;
131 }
132
133 return result;
134}
QString id() const
Definition KoID.cpp:63
const KoID SoftId("soft", ki18n("Soft"))
generate brush mask from former softbrush paintop, where softness is based on curve

References d, KoID::id(), and SoftId().

◆ loadFromDevice()

bool KisAutoBrush::loadFromDevice ( QIODevice * dev,
KisResourcesInterfaceSP resourcesInterface )
overridevirtual

Implements KoResource.

Definition at line 112 of file kis_auto_brush.cpp.

113{
114 Q_UNUSED(dev);
115 Q_UNUSED(resourcesInterface);
116 return false;
117}

◆ lodLimitations()

void KisAutoBrush::lodLimitations ( KisPaintopLodLimitations * l) const
overridevirtual

Reimplemented from KisBrush.

Definition at line 446 of file kis_auto_brush.cpp.

447{
449
450 if (!qFuzzyCompare(density(), 1.0)) {
451 l->limitations << KoID("auto-brush-density", i18nc("PaintOp instant preview limitation", "Brush Density recommended value 100.0"));
452 }
453
454 if (!qFuzzyCompare(randomness(), 0.0)) {
455 l->limitations << KoID("auto-brush-randomness", i18nc("PaintOp instant preview limitation", "Brush Randomness recommended value 0.0"));
456 }
457}
virtual void lodLimitations(KisPaintopLodLimitations *l) const
Definition KoID.h:30
static bool qFuzzyCompare(half p1, half p2)

References density(), KisPaintopLodLimitations::limitations, KisBrush::lodLimitations(), qFuzzyCompare(), and randomness().

◆ maskGenerator()

const KisMaskGenerator * KisAutoBrush::maskGenerator ( ) const

Definition at line 412 of file kis_auto_brush.cpp.

413{
414 return d->shape.data();
415}

References d.

◆ maskHeight()

qint32 KisAutoBrush::maskHeight ( KisDabShape const & shape,
qreal subPixelX,
qreal subPixelY,
const KisPaintInformation & info ) const
overridevirtual
Returns
the height of the mask for the given scale and angle

Reimplemented from KisBrush.

Definition at line 176 of file kis_auto_brush.cpp.

178{
180 lieAboutDabShape(shape, maskGenerator()->spikes()), subPixelX, subPixelY, info);
181}
virtual qint32 maskHeight(KisDabShape const &, qreal subPixelX, qreal subPixelY, const KisPaintInformation &info) const

References lieAboutDabShape(), maskGenerator(), and KisBrush::maskHeight().

◆ maskWidth()

qint32 KisAutoBrush::maskWidth ( KisDabShape const & shape,
qreal subPixelX,
qreal subPixelY,
const KisPaintInformation & info ) const
overridevirtual
Returns
the width of the mask for the given scale and angle

Reimplemented from KisBrush.

Definition at line 183 of file kis_auto_brush.cpp.

185{
186 return KisBrush::maskWidth(
187 lieAboutDabShape(shape, maskGenerator()->spikes()), subPixelX, subPixelY, info);
188}
virtual qint32 maskWidth(KisDabShape const &, qreal subPixelX, qreal subPixelY, const KisPaintInformation &info) const

References lieAboutDabShape(), maskGenerator(), and KisBrush::maskWidth().

◆ notifyBrushIsGoingToBeClonedForStroke()

void KisAutoBrush::notifyBrushIsGoingToBeClonedForStroke ( )
overridevirtual

Is called by the paint op before it is going to clone the brush into multiple instances to pass to different threads. During this call the brush is free to prepare some structures that may be shared by all the clones without excessive recalculation.

Default implementation for all image-based brushes: just recreate the shared pyramid

Reimplemented from KisBrush.

Definition at line 351 of file kis_auto_brush.cpp.

352{
353 // do nothing, since we don't use the pyramid!
354}

◆ operator=()

KisAutoBrush & KisAutoBrush::operator= ( const KisAutoBrush & rhs)
delete

◆ outline()

KisOptimizedBrushOutline KisAutoBrush::outline ( bool forcePreciseOutline = false) const
overridevirtual

Reimplemented from KisBrush.

Definition at line 427 of file kis_auto_brush.cpp.

428{
429 const bool requiresComplexOutline = d->shape->spikes() > 2;
430 if (!requiresComplexOutline && !forcePreciseOutline) {
431 QPainterPath path;
432 QRectF brushBoundingbox(0, 0, width(), height());
433 if (maskGenerator()->type() == KisMaskGenerator::CIRCLE) {
434 path.addEllipse(brushBoundingbox);
435 }
436 else { // if (maskGenerator()->type() == KisMaskGenerator::RECTANGLE)
437 path.addRect(brushBoundingbox);
438 }
439
440 return path;
441 }
442
443 return KisBrush::outline();
444}
virtual KisOptimizedBrushOutline outline(bool forcePreciseOutline=false) const

References KisMaskGenerator::CIRCLE, d, KisBrush::height(), maskGenerator(), KisBrush::outline(), and KisBrush::width().

◆ outlineSourceImage()

KisFixedPaintDeviceSP KisAutoBrush::outlineSourceImage ( ) const
overridevirtual

Is a paint device of the brush that should be used for generation of the brush outline. Usually, it is the same device returned by brushTipImage(), but might be different in some types of brushes, like in KisAutoBrush.

We need to generate the mask manually, skipping the construction of the image pyramid

Reimplemented from KisBrush.

Definition at line 136 of file kis_auto_brush.cpp.

137{
139 KisDabShape inverseTransform(1.0 / scale(), 1.0, -angle());
140
142 dev = new KisFixedPaintDevice(cs);
143 mask(dev, KoColor(Qt::black, cs), inverseTransform, KisPaintInformation());
144
145 return dev;
146}
const KoColorSpace * rgb8(const QString &profileName=QString())

References KisBrush::angle(), KoColorSpaceRegistry::instance(), KisBrush::mask(), KoColorSpaceRegistry::rgb8(), and KisBrush::scale().

◆ paintDevice()

KisFixedPaintDeviceSP KisAutoBrush::paintDevice ( const KoColorSpace * colorSpace,
KisDabShape const & shape,
const KisPaintInformation & info,
double subPixelX = 0,
double subPixelY = 0 ) const
overridevirtual

Return a fixed paint device that contains a correctly scaled image dab.

Reimplemented from KisBrush.

Definition at line 195 of file kis_auto_brush.cpp.

195 {
196 return 0; // The autobrush does NOT support images!
197}

◆ randomness()

qreal KisAutoBrush::randomness ( ) const

Definition at line 422 of file kis_auto_brush.cpp.

423{
424 return d->randomness;
425}

References d.

◆ saveToDevice()

bool KisAutoBrush::saveToDevice ( QIODevice * dev) const
overridevirtual

Reimplemented from KoResource.

Definition at line 119 of file kis_auto_brush.cpp.

120{
121 Q_UNUSED(dev);
122 return false;
123}

◆ setUserEffectiveSize()

void KisAutoBrush::setUserEffectiveSize ( qreal value)
overridevirtual

Implements KisBrush.

Definition at line 153 of file kis_auto_brush.cpp.

154{
155 d->shape->setDiameter(value);
156}
float value(const T *src, size_t ch)

References d, and value().

◆ supportsCaching()

bool KisAutoBrush::supportsCaching ( ) const
overridevirtual

Reimplemented from KisBrush.

Definition at line 459 of file kis_auto_brush.cpp.

460{
461 return qFuzzyCompare(density(), 1.0) && qFuzzyCompare(randomness(), 0.0);
462}

References density(), qFuzzyCompare(), and randomness().

◆ toXML()

void KisAutoBrush::toXML ( QDomDocument & ,
QDomElement & element ) const
overridevirtual

Serialize this brush to XML.

Reimplemented from KisBrush.

Definition at line 361 of file kis_auto_brush.cpp.

362{
363 QDomElement shapeElt = doc.createElement("MaskGenerator");
364 d->shape->toXML(doc, shapeElt);
365 e.appendChild(shapeElt);
366 e.setAttribute("type", "auto_brush");
367 e.setAttribute("spacing", QString::number(spacing()));
368 e.setAttribute("useAutoSpacing", QString::number(autoSpacingActive()));
369 e.setAttribute("autoSpacingCoeff", QString::number(autoSpacingCoeff()));
370 e.setAttribute("angle", QString::number(KisBrush::angle()));
371 e.setAttribute("randomness", QString::number(d->randomness));
372 e.setAttribute("density", QString::number(d->density));
373 KisBrush::toXML(doc, e);
374}
bool autoSpacingActive() const
double spacing() const
virtual void toXML(QDomDocument &, QDomElement &) const
qreal autoSpacingCoeff() const

References KisBrush::angle(), KisBrush::autoSpacingActive(), KisBrush::autoSpacingCoeff(), d, KisBrush::spacing(), and KisBrush::toXML().

◆ userEffectiveSize()

qreal KisAutoBrush::userEffectiveSize ( ) const
overridevirtual

Implements KisBrush.

Definition at line 148 of file kis_auto_brush.cpp.

149{
150 return d->shape->diameter();
151}

References d.

Member Data Documentation

◆ d

const QScopedPointer<Private> KisAutoBrush::d
private

Definition at line 88 of file kis_auto_brush.h.


The documentation for this class was generated from the following files: