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

#include <KisOptimizedBrushOutline.h>

Classes

class  const_iterator
 

Public Member Functions

void addEllipse (const QPointF &center, qreal rx, qreal ry)
 
void addPath (const KisOptimizedBrushOutline &path)
 
void addPath (const QPainterPath &path)
 
void addRect (const QRectF &rc)
 
const_iterator begin () const
 
QRectF boundingRect () const
 
const_iterator end () const
 
bool isEmpty () const
 
 KisOptimizedBrushOutline ()
 
 KisOptimizedBrushOutline (const QPainterPath &path, const std::optional< QRectF > &bounds=std::nullopt)
 
 KisOptimizedBrushOutline (const QVector< QPolygonF > &subpaths, const std::optional< QRectF > &bounds=std::nullopt)
 
void map (const QTransform &t)
 
KisOptimizedBrushOutline mapped (const QTransform &t) const
 
void translate (const QPointF &offset)
 
void translate (qreal tx, qreal ty)
 

Private Attributes

QVector< QPolygonF > m_additionalDecorations
 
QRectF m_cachedBoundingRect
 
std::optional< QRectF > m_explicitBounds
 
QVector< QPolygonF > m_subpaths
 
QTransform m_transform
 

Detailed Description

An special class for storing the brush outline in an optimized way. It converts the outline into the vector of QPolygonF objects right away and avoids doing any modifications and/or transformations to it until the final stage, when the outline is requested to be drawn.

Definition at line 26 of file KisOptimizedBrushOutline.h.

Constructor & Destructor Documentation

◆ KisOptimizedBrushOutline() [1/3]

KisOptimizedBrushOutline::KisOptimizedBrushOutline ( )

Definition at line 13 of file KisOptimizedBrushOutline.cpp.

14{
15}

◆ KisOptimizedBrushOutline() [2/3]

KisOptimizedBrushOutline::KisOptimizedBrushOutline ( const QPainterPath & path,
const std::optional< QRectF > & bounds = std::nullopt )

Definition at line 17 of file KisOptimizedBrushOutline.cpp.

18 : KisOptimizedBrushOutline(path.toSubpathPolygons().toVector(), bounds)
19{
20 // storing in a form of a QVector is much more efficient
21 // than in a QList
22}
#define bounds(x, a, b)

◆ KisOptimizedBrushOutline() [3/3]

KisOptimizedBrushOutline::KisOptimizedBrushOutline ( const QVector< QPolygonF > & subpaths,
const std::optional< QRectF > & bounds = std::nullopt )

Definition at line 24 of file KisOptimizedBrushOutline.cpp.

25 : m_subpaths(subpaths)
27{
28}
std::optional< QRectF > m_explicitBounds

Member Function Documentation

◆ addEllipse()

void KisOptimizedBrushOutline::addEllipse ( const QPointF & center,
qreal rx,
qreal ry )

Definition at line 126 of file KisOptimizedBrushOutline.cpp.

127{
128 QPainterPath path;
129 path.addEllipse(center, rx, ry);
130 addPath(path);
131}
void addPath(const QPainterPath &path)

References addPath().

◆ addPath() [1/2]

void KisOptimizedBrushOutline::addPath ( const KisOptimizedBrushOutline & path)

Definition at line 138 of file KisOptimizedBrushOutline.cpp.

139{
140 const QTransform invertedTransform = path.m_transform * m_transform.inverted();
141
143 path.m_subpaths.size() +
144 path.m_additionalDecorations.size());
145
146 for (auto it = path.m_subpaths.cbegin(); it != path.m_subpaths.cend(); ++it) {
147 m_additionalDecorations.append(invertedTransform.map(*it));
148 }
149
150 for (auto it = path.m_additionalDecorations.cbegin(); it != path.m_additionalDecorations.cend(); ++it) {
151 m_additionalDecorations.append(invertedTransform.map(*it));
152 }
153
154 m_cachedBoundingRect = QRectF();
155}
QVector< QPolygonF > m_additionalDecorations

References m_additionalDecorations, m_cachedBoundingRect, and m_transform.

◆ addPath() [2/2]

void KisOptimizedBrushOutline::addPath ( const QPainterPath & path)

Definition at line 133 of file KisOptimizedBrushOutline.cpp.

134{
136}

References addPath(), and KisOptimizedBrushOutline().

◆ addRect()

void KisOptimizedBrushOutline::addRect ( const QRectF & rc)

Definition at line 119 of file KisOptimizedBrushOutline.cpp.

120{
121 QPainterPath path;
122 path.addRect(rc);
123 addPath(path);
124}

References addPath().

◆ begin()

KisOptimizedBrushOutline::const_iterator KisOptimizedBrushOutline::begin ( ) const

Begins iteration over the polygons contained in the brush outline. KisOptimizedBrushOutline will never return a constructed QVector of the polygons, because it may require too many memory allocations.

One cannot change the internal polygon, because the returned polygon is transformed using the transformation that is stored separately.

Definition at line 43 of file KisOptimizedBrushOutline.cpp.

44{
45 return const_iterator(this, 0);
46}

◆ boundingRect()

QRectF KisOptimizedBrushOutline::boundingRect ( ) const

We don't use normal begin()/end() iteration here, because it makes too many allocations for the polygons. Instead we calculate the bounding rect by mere iteration over points.

This is a highly optimized way to accumulate a rect from a set of points:

1) QRectF::isEmpty() is expensive, so use resultInitialized instead 2) Use KisAlgebra2D::accumulateBoundsNonEmpty to avoid calling isEmpty()

Definition at line 53 of file KisOptimizedBrushOutline.cpp.

54{
55 if (!m_cachedBoundingRect.isNull()) return m_cachedBoundingRect;
56
64 QRectF result;
65 bool resultInitialized = false;
66
67 if (m_explicitBounds && !m_explicitBounds->isEmpty()) {
68 result = m_transform.mapRect(*m_explicitBounds);
69 resultInitialized = true;
70 }
71
72 for (auto polyIt = m_subpaths.cbegin(); polyIt != m_subpaths.cend(); ++polyIt) {
82 auto it = polyIt->cbegin();
83
84 if (!resultInitialized && it != polyIt->cend()) {
86 resultInitialized = true;
87 ++it;
88 }
89
90 for (; it != polyIt->cend(); ++it) {
92 }
93 }
94
95 for (auto polyIt = m_additionalDecorations.cbegin(); polyIt != m_additionalDecorations.cend(); ++polyIt) {
96 auto it = polyIt->cbegin();
97
98 if (!resultInitialized && it != polyIt->cend()) {
100 resultInitialized = true;
101 ++it;
102 }
103
104 for (; it != polyIt->cend(); ++it) {
106 }
107 }
108
109 m_cachedBoundingRect = result;
110
111 return result;
112}
void resetEmptyRectangle(const QPoint &pt, QRect *rc)
void accumulateBoundsNonEmpty(const Point &pt, Rect *bounds)

References KisAlgebra2D::accumulateBoundsNonEmpty(), m_additionalDecorations, m_cachedBoundingRect, m_explicitBounds, m_subpaths, m_transform, and KisAlgebra2D::Private::resetEmptyRectangle().

◆ end()

KisOptimizedBrushOutline::const_iterator KisOptimizedBrushOutline::end ( ) const

End iterator for iteration over all the embedded polygons

Definition at line 48 of file KisOptimizedBrushOutline.cpp.

49{
50 return const_iterator(this, m_subpaths.size() + m_additionalDecorations.size());
51}

References m_additionalDecorations, and m_subpaths.

◆ isEmpty()

bool KisOptimizedBrushOutline::isEmpty ( ) const

Definition at line 114 of file KisOptimizedBrushOutline.cpp.

115{
116 return begin() == end();
117}

References begin(), and end().

◆ map()

void KisOptimizedBrushOutline::map ( const QTransform & t)

Transforms all the polygons belonging to the outline. The transformation is done in optimized way, that is, no polygons are transformed until the final iteration over them.

Definition at line 30 of file KisOptimizedBrushOutline.cpp.

31{
32 m_transform *= t;
33 m_cachedBoundingRect = QRectF();
34}

References m_cachedBoundingRect, and m_transform.

◆ mapped()

KisOptimizedBrushOutline KisOptimizedBrushOutline::mapped ( const QTransform & t) const

A helper function for

See also
map()

Definition at line 36 of file KisOptimizedBrushOutline.cpp.

37{
38 KisOptimizedBrushOutline result(*this);
39 result.map(t);
40 return result;
41}

References map().

◆ translate() [1/2]

void KisOptimizedBrushOutline::translate ( const QPointF & offset)

Definition at line 162 of file KisOptimizedBrushOutline.cpp.

163{
164 translate(offset.x(), offset.y());
165}
void translate(qreal tx, qreal ty)

References translate().

◆ translate() [2/2]

void KisOptimizedBrushOutline::translate ( qreal tx,
qreal ty )

Definition at line 157 of file KisOptimizedBrushOutline.cpp.

158{
159 map(QTransform::fromTranslate(tx, ty));
160}
void map(const QTransform &t)

References map().

Member Data Documentation

◆ m_additionalDecorations

QVector<QPolygonF> KisOptimizedBrushOutline::m_additionalDecorations
private

Definition at line 112 of file KisOptimizedBrushOutline.h.

◆ m_cachedBoundingRect

QRectF KisOptimizedBrushOutline::m_cachedBoundingRect
mutableprivate

Definition at line 115 of file KisOptimizedBrushOutline.h.

◆ m_explicitBounds

std::optional<QRectF> KisOptimizedBrushOutline::m_explicitBounds
private

Definition at line 113 of file KisOptimizedBrushOutline.h.

◆ m_subpaths

QVector<QPolygonF> KisOptimizedBrushOutline::m_subpaths
private

Definition at line 111 of file KisOptimizedBrushOutline.h.

◆ m_transform

QTransform KisOptimizedBrushOutline::m_transform
private

Definition at line 114 of file KisOptimizedBrushOutline.h.


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