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

#include <kis_brushop.h>

+ Inheritance diagram for KisBrushOp:

Classes

struct  UpdateSharedState
 

Public Member Functions

std::pair< int, bool > doAsynchronousUpdate (QVector< KisRunnableStrokeJobData * > &jobs) override
 
 KisBrushOp (const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image)
 
void paintLine (const KisPaintInformation &pi1, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance) override
 
 ~KisBrushOp () override
 
- Public Member Functions inherited from KisBrushBasedPaintOp
bool canPaint () const override
 Reimplemented, false if brush is 0.
 
bool checkSizeTooSmall (qreal scale)
 
KisSpacingInformation effectiveSpacing (qreal scale) const
 
KisSpacingInformation effectiveSpacing (qreal scale, qreal rotation, const KisAirbrushOptionData *airbrushOption, const KisSpacingOption *spacingOption, const KisPaintInformation &pi) const
 
KisSpacingInformation effectiveSpacing (qreal scale, qreal rotation, const KisPaintInformation &pi) const
 
KisSpacingInformation effectiveSpacing (qreal scale, qreal rotation, const KisSpacingOption &spacingOption, const KisPaintInformation &pi) const
 
 KisBrushBasedPaintOp (const KisPaintOpSettingsSP settings, KisPainter *painter, KisBrushTextureFlags textureFlags=None)
 
 ~KisBrushBasedPaintOp () override
 
- Public Member Functions inherited from KisPaintOp
 KisPaintOp (KisPainter *painter)
 
void paintAt (const KisPaintInformation &info, KisDistanceInformation *currentDistance)
 
virtual void paintBezierCurve (const KisPaintInformation &pi1, const QPointF &control1, const QPointF &control2, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)
 
 Private (KisPaintOp *_q)
 
void updateSpacing (const KisPaintInformation &info, KisDistanceInformation &currentDistance) const
 
void updateTiming (const KisPaintInformation &info, KisDistanceInformation &currentDistance) const
 
virtual ~KisPaintOp ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Protected Types

typedef QSharedPointer< UpdateSharedStateUpdateSharedStateSP
 

Protected Member Functions

void addMirroringJobs (Qt::Orientation direction, QVector< QRect > &rects, UpdateSharedStateSP state, QVector< KisRunnableStrokeJobData * > &jobs)
 
KisSpacingInformation paintAt (const KisPaintInformation &info) override
 
KisSpacingInformation updateSpacingImpl (const KisPaintInformation &info) const override
 
KisTimingInformation updateTimingImpl (const KisPaintInformation &info) const override
 
- Protected Member Functions inherited from KisPaintOp
KisFixedPaintDeviceSP cachedDab ()
 
KisFixedPaintDeviceSP cachedDab (const KoColorSpace *cs)
 
KisPainterpainter () const
 
KisPaintDeviceSP source () const
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Protected Attributes

UpdateSharedStateSP m_updateSharedState
 
- Protected Attributes inherited from KisBrushBasedPaintOp
KisBrushSP m_brush
 
KisDabCachem_dabCache
 
KisMirrorOption m_mirrorOption
 
KisPrecisionOption m_precisionOption
 

Private Attributes

KisAirbrushOptionData m_airbrushData
 
KisRollingMeanAccumulatorWrapper m_avgNumDabs
 
KisRollingMeanAccumulatorWrapper m_avgSpacing
 
KisRollingMeanAccumulatorWrapper m_avgUpdateTimePerDab
 
qreal m_currentUpdatePeriod = 20.0
 
QScopedPointer< KisDabRenderingExecutorm_dabExecutor
 
const int m_idealNumRects
 
KisLightnessStrengthOption m_lightnessStrengthOption
 
KisPaintDeviceSP m_lineCacheDevice
 
const int m_maxUpdatePeriod
 
const int m_minUpdatePeriod
 
KisFlowOpacityOption2 m_opacityOption
 
KisRateOption m_rateOption
 
KisRatioOption m_ratioOption
 
KisRotationOption m_rotationOption
 
KisScatterOption m_scatterOption
 
KisSharpnessOption m_sharpnessOption
 
KisSizeOption m_sizeOption
 
KisSoftnessOption m_softnessOption
 
KisSpacingOption m_spacingOption
 

Additional Inherited Members

- Static Public Member Functions inherited from KisBrushBasedPaintOp
static QList< KoResourceLoadResultprepareEmbeddedResources (const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
 
static QList< KoResourceLoadResultprepareLinkedResources (const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
 
- Static Public Member Functions inherited from KisPaintOp
static void splitCoordinate (qreal coordinate, qint32 *whole, qreal *fraction)
 
- Public Attributes inherited from KisPaintOp
KisFixedPaintDeviceSP dab
 
bool fanCornersEnabled {false}
 
qreal fanCornersStep {1.0}
 
KisPainterpainter {nullptr}
 
KisPaintOpq {nullptr}
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Detailed Description

Definition at line 33 of file kis_brushop.h.

Member Typedef Documentation

◆ UpdateSharedStateSP

Definition at line 53 of file kis_brushop.h.

Constructor & Destructor Documentation

◆ KisBrushOp()

KisBrushOp::KisBrushOp ( const KisPaintOpSettingsSP settings,
KisPainter * painter,
KisNodeSP node,
KisImageSP image )

Definition at line 47 of file kis_brushop.cpp.

49 , m_sizeOption(settings.data())
50 , m_ratioOption(settings.data())
51 , m_rateOption(settings.data())
52 , m_softnessOption(settings.data())
54 , m_spacingOption(settings.data())
55 , m_scatterOption(settings.data())
56 , m_sharpnessOption(settings.data())
57 , m_rotationOption(settings.data())
58 , m_opacityOption(settings.data(), node)
59 , m_avgSpacing(50)
60 , m_avgNumDabs(50)
62 , m_idealNumRects(KisImageConfig(true).maxNumberOfThreads())
65{
66 Q_UNUSED(image);
67 Q_ASSERT(settings);
68
69 m_airbrushData.read(settings.data());
71
76
77 m_brush->notifyBrushIsGoingToBeClonedForStroke();
78
79 KisBrushSP baseBrush = m_brush;
80 auto resourcesFactory =
81 [baseBrush, settings, painter] () {
83 new KisBrushOpResources(settings, painter);
84 resources->brush = baseBrush->clone().dynamicCast<KisBrush>();
85
86 return resources;
87 };
88
89
90 m_dabExecutor.reset(
93 resourcesFactory,
97}
@ SupportsGradientMode
@ SupportsLightnessMode
KisBrushBasedPaintOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisBrushTextureFlags textureFlags=None)
KisPrecisionOption m_precisionOption
KisScatterOption m_scatterOption
Definition kis_brushop.h:72
KisSoftnessOption m_softnessOption
Definition kis_brushop.h:69
KisRateOption m_rateOption
Definition kis_brushop.h:68
KisSpacingOption m_spacingOption
Definition kis_brushop.h:71
KisRotationOption m_rotationOption
Definition kis_brushop.h:74
KisRatioOption m_ratioOption
Definition kis_brushop.h:67
QScopedPointer< KisDabRenderingExecutor > m_dabExecutor
Definition kis_brushop.h:80
KisLightnessStrengthOption m_lightnessStrengthOption
Definition kis_brushop.h:70
const int m_idealNumRects
Definition kis_brushop.h:86
KisRollingMeanAccumulatorWrapper m_avgSpacing
Definition kis_brushop.h:82
KisSizeOption m_sizeOption
Definition kis_brushop.h:66
KisSharpnessOption m_sharpnessOption
Definition kis_brushop.h:73
KisRollingMeanAccumulatorWrapper m_avgNumDabs
Definition kis_brushop.h:83
KisFlowOpacityOption2 m_opacityOption
Definition kis_brushop.h:75
const int m_minUpdatePeriod
Definition kis_brushop.h:88
KisRollingMeanAccumulatorWrapper m_avgUpdateTimePerDab
Definition kis_brushop.h:84
const int m_maxUpdatePeriod
Definition kis_brushop.h:89
KisAirbrushOptionData m_airbrushData
Definition kis_brushop.h:64
bool isChecked() const
virtual const KoColorSpace * compositionSourceColorSpace() const
KisRunnableStrokeJobsInterface * runnableStrokeJobsInterface
KisPaintDeviceSP device
bool hasImprecisePositionOptions() const
void setHasImprecisePositionOptions(bool value)
void applyFanCornersInfo(KisPaintOp *op)
bool read(const KisPropertiesConfiguration *setting)
KisPainter * painter

References KisRotationOption::applyFanCornersInfo(), KisDabCacheUtils::DabRenderingResources::brush, KisPaintDevice::compositionSourceColorSpace(), KisSharedPtr< T >::data(), KisPainter::device, KisPrecisionOption::hasImprecisePositionOptions(), KisAirbrushOptionData::isChecked, KisCurveOption::isChecked(), m_airbrushData, KisBrushBasedPaintOp::m_brush, m_dabExecutor, KisBrushBasedPaintOp::m_mirrorOption, KisBrushBasedPaintOp::m_precisionOption, m_rotationOption, m_scatterOption, KisPaintOp::painter, KisAirbrushOptionData::read(), KisPainter::runnableStrokeJobsInterface, and KisPrecisionOption::setHasImprecisePositionOptions().

◆ ~KisBrushOp()

KisBrushOp::~KisBrushOp ( )
override

Definition at line 99 of file kis_brushop.cpp.

100{
101}

Member Function Documentation

◆ addMirroringJobs()

void KisBrushOp::addMirroringJobs ( Qt::Orientation direction,
QVector< QRect > & rects,
UpdateSharedStateSP state,
QVector< KisRunnableStrokeJobData * > & jobs )
protected

Some KisRenderedDab may share their devices, so we should mirror them carefully, avoiding doing that twice. KisDabRenderingQueue is implemented in a way that duplicated dabs can go only sequentially, one after another, so we don't have to use complex deduplication algorithms here.

Definition at line 166 of file kis_brushop.cpp.

170{
171 KritaUtils::addJobSequential(jobs, nullptr);
172
179 KisFixedPaintDeviceSP prevDabDevice = 0;
180 for (KisRenderedDab &dab : state->dabsQueue) {
181 const bool skipMirrorPixels = prevDabDevice && prevDabDevice == dab.device;
182
184 [state, &dab, direction, skipMirrorPixels] () {
185 state->painter->mirrorDab(direction, &dab, skipMirrorPixels);
186 }
187 );
188
189 prevDabDevice = dab.device;
190 }
191
192 KritaUtils::addJobSequential(jobs, nullptr);
193
194 for (QRect &rc : rects) {
195 state->painter->mirrorRect(direction, &rc);
196
198 [rc, state] () {
199 state->painter->bltFixed(rc, state->dabsQueue);
200 }
201 );
202 }
203
204 state->allDirtyRects.append(rects);
205}
void addJobConcurrent(QVector< Job * > &jobs, Func func)
void addJobSequential(QVector< Job * > &jobs, Func func)
KisFixedPaintDeviceSP dab

References KritaUtils::addJobConcurrent(), KritaUtils::addJobSequential(), and KisPaintOp::dab.

◆ doAsynchronousUpdate()

std::pair< int, bool > KisBrushOp::doAsynchronousUpdate ( QVector< KisRunnableStrokeJobData * > & jobs)
overridevirtual

If the preset supports asynchronous updates, then the stroke execution core will call this method with a desired frame rate. The jobs that should be run to prepare the update are returned via jobs

Returns
a pair of <the desired FPS rate (period of updates); are there any unprocessed update jobs left?>

In WA mode we do two things:

1) We ensure that the parallel threads do not access the same are on the image. For normal updates that is ensured by the code in KisImage and the scheduler. Here we should do that manually by adjusting 'rects' so that they would not intersect in the wrapped space.

2) We duplicate dabs, to ensure that all the pieces of dabs are painted inside the wrapped rect. No pieces are dabs are painted twice, because we paint only the parts intersecting the wrap rect.

After the dab has been rendered once, we should mirror it either one (h or v) or three (h and v) times. This sequence of 'if's achieves the goal without any extra copying. Please note that it has no 'else' branches, which is done intentionally!

NOTE: using currentUpdateTimePerDab in the calculation for the next update time instead of the average one makes rendering speed about 40% faster. It happens because the adaptation period is shorter than if it used

Reimplemented from KisPaintOp.

Definition at line 207 of file kis_brushop.cpp.

208{
209 bool someDabsAreStillInQueue = false;
210 const bool hasPreparedDabsAtStart = m_dabExecutor->hasPreparedDabs();
211
212 if (!m_updateSharedState && hasPreparedDabsAtStart) {
213
214 m_updateSharedState = toQShared(new UpdateSharedState());
216
217 state->painter = painter();
218
219 {
220 const qreal dabRenderingTime = m_dabExecutor->averageDabRenderingTime();
221 const qreal totalRenderingTimePerDab = dabRenderingTime + m_avgUpdateTimePerDab.rollingMeanSafe();
222
223 // we limit the number of fetched dabs to fit the maximum update period and not
224 // make visual hiccups
225 const int dabsLimit =
226 totalRenderingTimePerDab > 0 ?
227 qMax(10, int(m_maxUpdatePeriod / totalRenderingTimePerDab * m_idealNumRects)) :
228 -1;
229
230 state->dabsQueue = m_dabExecutor->takeReadyDabs(painter()->hasMirroring(), dabsLimit, &someDabsAreStillInQueue);
231 }
232
233 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(!state->dabsQueue.isEmpty(),
234 std::make_pair(m_currentUpdatePeriod, false));
235
236 const int diameter = m_dabExecutor->averageDabSize();
237 const qreal spacing = m_avgSpacing.rollingMean();
238
239 const int idealNumRects = m_idealNumRects;
240
241 QVector<QRect> rects;
242
243 // wrap the dabs if needed
244 if (painter()->device()->defaultBounds()->wrapAroundMode()) {
258 const QRect wrapRect = painter()->device()->defaultBounds()->imageBorderRect();
259 const WrapAroundAxis wrapAroundModeAxis = painter()->device()->defaultBounds()->wrapAroundModeAxis();
260
261 QList<KisRenderedDab> wrappedDabs;
262
263 Q_FOREACH (const KisRenderedDab &dab, state->dabsQueue) {
264 const QVector<QPoint> normalizationOrigins =
265 KisWrappedRect::normalizationOriginsForRect(dab.realBounds(), wrapRect, wrapAroundModeAxis);
266
267 Q_FOREACH(const QPoint &pt, normalizationOrigins) {
268 KisRenderedDab newDab = dab;
269
270 newDab.offset = pt;
271 rects.append(KisWrappedRect::clipToWrapRect(newDab.realBounds(), wrapRect, wrapAroundModeAxis));
272 wrappedDabs.append(newDab);
273 }
274 }
275
276 state->dabsQueue = wrappedDabs;
277
278 } else {
279 // just get all rects
280 Q_FOREACH (const KisRenderedDab &dab, state->dabsQueue) {
281 rects.append(dab.realBounds());
282 }
283 }
284
285 // split/merge rects into non-overlapping areas
287 idealNumRects, diameter, spacing);
288
289 state->allDirtyRects = rects;
290
291 Q_FOREACH (const KisRenderedDab &dab, state->dabsQueue) {
292 state->dabPoints.append(dab.realBounds().center());
293 }
294
295 state->dabRenderingTimer.start();
296
297 Q_FOREACH (const QRect &rc, rects) {
299 [rc, state] () {
300 state->painter->bltFixed(rc, state->dabsQueue);
301 }
302 );
303 }
304
311 if (state->painter->hasHorizontalMirroring()) {
312 addMirroringJobs(Qt::Horizontal, rects, state, jobs);
313 }
314
315 if (state->painter->hasVerticalMirroring()) {
316 addMirroringJobs(Qt::Vertical, rects, state, jobs);
317 }
318
319 if (state->painter->hasHorizontalMirroring() && state->painter->hasVerticalMirroring()) {
320 addMirroringJobs(Qt::Horizontal, rects, state, jobs);
321 }
322
324 [state, this, someDabsAreStillInQueue] () {
325 Q_FOREACH(const QRect &rc, state->allDirtyRects) {
326 state->painter->addDirtyRect(rc);
327 }
328
329 state->painter->setAverageOpacity(state->dabsQueue.last().averageOpacity);
330
331 const int updateRenderingTime = state->dabRenderingTimer.elapsed();
332 const qreal dabRenderingTime = m_dabExecutor->averageDabRenderingTime();
333
334 m_avgNumDabs(state->dabsQueue.size());
335
336 const qreal currentUpdateTimePerDab = qreal(updateRenderingTime) / state->dabsQueue.size();
337 m_avgUpdateTimePerDab(currentUpdateTimePerDab);
338
344 const qreal totalRenderingTimePerDab = dabRenderingTime + currentUpdateTimePerDab;
345
346 const int approxDabRenderingTime =
347 qreal(totalRenderingTimePerDab) * m_avgNumDabs.rollingMean() / m_idealNumRects;
348
350 someDabsAreStillInQueue ? m_minUpdatePeriod :
351 qBound(m_minUpdatePeriod, int(1.5 * approxDabRenderingTime), m_maxUpdatePeriod);
352
353
354 { // debug chunk
355// ENTER_FUNCTION() << ppVar(state->allDirtyRects.size()) << ppVar(state->dabsQueue.size()) << ppVar(dabRenderingTime) << ppVar(updateRenderingTime);
356// ENTER_FUNCTION() << ppVar(m_currentUpdatePeriod) << ppVar(someDabsAreStillInQueue);
357 }
358
359 // release all the dab devices
360 state->dabsQueue.clear();
361
362 m_updateSharedState.clear();
363 }
364 );
365 } else if (m_updateSharedState && hasPreparedDabsAtStart) {
366 someDabsAreStillInQueue = true;
367 }
368
369 return std::make_pair(m_currentUpdatePeriod, someDabsAreStillInQueue);
370}
WrapAroundAxis
UpdateSharedStateSP m_updateSharedState
Definition kis_brushop.h:60
qreal m_currentUpdatePeriod
Definition kis_brushop.h:81
void addMirroringJobs(Qt::Orientation direction, QVector< QRect > &rects, UpdateSharedStateSP state, QVector< KisRunnableStrokeJobData * > &jobs)
QSharedPointer< UpdateSharedState > UpdateSharedStateSP
Definition kis_brushop.h:53
virtual WrapAroundAxis wrapAroundModeAxis() const =0
virtual QRect imageBorderRect() const
KisDefaultBoundsBaseSP defaultBounds() const
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
QSharedPointer< T > toQShared(T *ptr)
QVector< QRect > splitDabsIntoRects(const QVector< QRect > &dabRects, int idealNumRects, int diameter, qreal spacing)
QRect realBounds() const
static QRect clipToWrapRect(QRect rc, const QRect &wrapRect, WrapAroundAxis wrapAxis)
static QVector< QPoint > normalizationOriginsForRect(const QRect &rc, const QRect &wrapRect, WrapAroundAxis wrapAxis)

References KritaUtils::addJobConcurrent(), KritaUtils::addJobSequential(), addMirroringJobs(), KisWrappedRect::clipToWrapRect(), KisPaintOp::dab, KisPaintDevice::defaultBounds(), KisPainter::device, KisDefaultBoundsBase::imageBorderRect(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, m_avgNumDabs, m_avgSpacing, m_avgUpdateTimePerDab, m_currentUpdatePeriod, m_dabExecutor, m_idealNumRects, m_maxUpdatePeriod, m_minUpdatePeriod, m_updateSharedState, KisWrappedRect::normalizationOriginsForRect(), KisRenderedDab::offset, KisPaintOp::painter, KisRenderedDab::realBounds(), KisRollingMeanAccumulatorWrapper::rollingMean(), KisRollingMeanAccumulatorWrapper::rollingMeanSafe(), KisPaintOpUtils::splitDabsIntoRects(), toQShared(), and KisDefaultBoundsBase::wrapAroundModeAxis().

◆ paintAt()

KisSpacingInformation KisBrushOp::paintAt ( const KisPaintInformation & info)
overrideprotectedvirtual

The implementation of painting of a dab and updating spacing. This does NOT need to update the timing information.

Implements KisPaintOp.

Definition at line 103 of file kis_brushop.cpp.

104{
105 if (!painter()->device()) return KisSpacingInformation(1.0);
106
107 KisBrushSP brush = m_brush;
108 Q_ASSERT(brush);
109 if (!brush)
110 return KisSpacingInformation(1.0);
111
112 if (!brush->canPaintFor(info))
113 return KisSpacingInformation(1.0);
114
115 qreal scale = m_sizeOption.apply(info);
117 if (checkSizeTooSmall(scale)) return KisSpacingInformation();
118
119 qreal rotation = m_rotationOption.apply(info);
120 qreal ratio = m_ratioOption.apply(info);
121
122 KisDabShape shape(scale, ratio, rotation);
123 QPointF cursorPos =
125 brush->maskWidth(shape, 0, 0, info),
126 brush->maskHeight(shape, 0, 0, info));
127
128 qreal dabOpacity = OPACITY_OPAQUE_F;
129 qreal dabFlow = OPACITY_OPAQUE_F;
130
131 m_opacityOption.apply(info, &dabOpacity, &dabFlow);
132
133 KisDabCacheUtils::DabRequestInfo request(painter()->paintColor(),
134 cursorPos,
135 shape,
136 info,
139
140 m_dabExecutor->addDab(request, dabOpacity, dabFlow);
141
142
143 KisSpacingInformation spacingInfo =
144 effectiveSpacing(scale, rotation, &m_airbrushData, &m_spacingOption, info);
145
146 // gather statistics about dabs
147 m_avgSpacing(spacingInfo.scalarApprox());
148
149 return spacingInfo;
150}
const qreal OPACITY_OPAQUE_F
KisSpacingInformation effectiveSpacing(qreal scale) const
void apply(KisPainter *painter, const KisPaintInformation &info)
static qreal lodToScale(int levelOfDetail)
qreal apply(const KisPaintInformation &info) const
QPointF apply(const KisPaintInformation &info, qreal width, qreal height) const
qreal apply(const KisPaintInformation &info) const

References KisRotationOption::apply(), KisStandardOption< Data >::apply(), KisScatterOption::apply(), KisFlowOpacityOption2::apply(), KisBrushBasedPaintOp::checkSizeTooSmall(), KisBrushBasedPaintOp::effectiveSpacing(), KisLodTransformBase::lodToScale(), m_airbrushData, m_avgSpacing, KisBrushBasedPaintOp::m_brush, m_dabExecutor, m_lightnessStrengthOption, m_opacityOption, m_ratioOption, m_rotationOption, m_scatterOption, m_sizeOption, m_softnessOption, m_spacingOption, OPACITY_OPAQUE_F, KisPaintOp::painter, and KisSpacingInformation::scalarApprox().

◆ paintLine()

void KisBrushOp::paintLine ( const KisPaintInformation & pi1,
const KisPaintInformation & pi2,
KisDistanceInformation * currentDistance )
overridevirtual

Draw a line between pos1 and pos2 using the currently set brush and color. If savedDist is less than zero, the brush is painted at pos1 before being painted along the line using the spacing setting.

Returns
the drag distance, that is the remains of the distance between p1 and p2 not covered because the currently set brush has a spacing greater than that distance.

Reimplemented from KisPaintOp.

Definition at line 384 of file kis_brushop.cpp.

385{
386 if (m_sharpnessOption.isChecked() && m_brush && (m_brush->width() == 1) && (m_brush->height() == 1)) {
387
388 if (!m_lineCacheDevice) {
390 }
391 else {
393 }
394
396 p.setPaintColor(painter()->paintColor());
397 p.drawDDALine(pi1.pos(), pi2.pos());
398
399 QRect rc = m_lineCacheDevice->extent();
400 painter()->bitBlt(rc.x(), rc.y(), m_lineCacheDevice, rc.x(), rc.y(), rc.width(), rc.height());
401 //fixes Bug 338011
403 }
404 else {
405 KisPaintOp::paintLine(pi1, pi2, currentDistance);
406 }
407}
const Params2D p
KisPaintDeviceSP m_lineCacheDevice
Definition kis_brushop.h:78
virtual void clear()
KisPaintDeviceSP createCompositionSourceDevice() const
QRect extent() const
const QPointF & pos() const
void renderMirrorMask(QRect rc, KisFixedPaintDeviceSP dab)
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
KisPaintDeviceSP source() const
virtual void paintLine(const KisPaintInformation &pi1, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)

References KisPainter::bitBlt(), KisPaintDevice::clear(), KisPaintDevice::createCompositionSourceDevice(), KisPaintDevice::extent(), KisCurveOption::isChecked(), KisBrushBasedPaintOp::m_brush, m_lineCacheDevice, m_sharpnessOption, p, KisPaintOp::painter, KisPaintOp::paintLine(), KisPaintInformation::pos(), KisPainter::renderMirrorMask(), and KisPaintOp::source().

◆ updateSpacingImpl()

KisSpacingInformation KisBrushOp::updateSpacingImpl ( const KisPaintInformation & info) const
overrideprotectedvirtual

◆ updateTimingImpl()

KisTimingInformation KisBrushOp::updateTimingImpl ( const KisPaintInformation & info) const
overrideprotectedvirtual

Implementation of a timing update. The default implementation always disables timing. This is suitable for paintops that do not support airbrushing.

Reimplemented from KisPaintOp.

Definition at line 379 of file kis_brushop.cpp.

380{
382}
KisTimingInformation effectiveTiming(const KisAirbrushOptionData *airbrushOption, const KisRateOption *rateOption, const KisPaintInformation &pi)

References KisPaintOpPluginUtils::effectiveTiming(), m_airbrushData, and m_rateOption.

Member Data Documentation

◆ m_airbrushData

KisAirbrushOptionData KisBrushOp::m_airbrushData
private

Definition at line 64 of file kis_brushop.h.

◆ m_avgNumDabs

KisRollingMeanAccumulatorWrapper KisBrushOp::m_avgNumDabs
private

Definition at line 83 of file kis_brushop.h.

◆ m_avgSpacing

KisRollingMeanAccumulatorWrapper KisBrushOp::m_avgSpacing
private

Definition at line 82 of file kis_brushop.h.

◆ m_avgUpdateTimePerDab

KisRollingMeanAccumulatorWrapper KisBrushOp::m_avgUpdateTimePerDab
private

Definition at line 84 of file kis_brushop.h.

◆ m_currentUpdatePeriod

qreal KisBrushOp::m_currentUpdatePeriod = 20.0
private

Definition at line 81 of file kis_brushop.h.

◆ m_dabExecutor

QScopedPointer<KisDabRenderingExecutor> KisBrushOp::m_dabExecutor
private

Definition at line 80 of file kis_brushop.h.

◆ m_idealNumRects

const int KisBrushOp::m_idealNumRects
private

Definition at line 86 of file kis_brushop.h.

◆ m_lightnessStrengthOption

KisLightnessStrengthOption KisBrushOp::m_lightnessStrengthOption
private

Definition at line 70 of file kis_brushop.h.

◆ m_lineCacheDevice

KisPaintDeviceSP KisBrushOp::m_lineCacheDevice
private

Definition at line 78 of file kis_brushop.h.

◆ m_maxUpdatePeriod

const int KisBrushOp::m_maxUpdatePeriod
private

Definition at line 89 of file kis_brushop.h.

◆ m_minUpdatePeriod

const int KisBrushOp::m_minUpdatePeriod
private

Definition at line 88 of file kis_brushop.h.

◆ m_opacityOption

KisFlowOpacityOption2 KisBrushOp::m_opacityOption
private

Definition at line 75 of file kis_brushop.h.

◆ m_rateOption

KisRateOption KisBrushOp::m_rateOption
private

Definition at line 68 of file kis_brushop.h.

◆ m_ratioOption

KisRatioOption KisBrushOp::m_ratioOption
private

Definition at line 67 of file kis_brushop.h.

◆ m_rotationOption

KisRotationOption KisBrushOp::m_rotationOption
private

Definition at line 74 of file kis_brushop.h.

◆ m_scatterOption

KisScatterOption KisBrushOp::m_scatterOption
private

Definition at line 72 of file kis_brushop.h.

◆ m_sharpnessOption

KisSharpnessOption KisBrushOp::m_sharpnessOption
private

Definition at line 73 of file kis_brushop.h.

◆ m_sizeOption

KisSizeOption KisBrushOp::m_sizeOption
private

Definition at line 66 of file kis_brushop.h.

◆ m_softnessOption

KisSoftnessOption KisBrushOp::m_softnessOption
private

Definition at line 69 of file kis_brushop.h.

◆ m_spacingOption

KisSpacingOption KisBrushOp::m_spacingOption
private

Definition at line 71 of file kis_brushop.h.

◆ m_updateSharedState

UpdateSharedStateSP KisBrushOp::m_updateSharedState
protected

Definition at line 60 of file kis_brushop.h.


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