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

#include <KoShapeGradientHandles.h>

Classes

struct  Handle
 

Public Member Functions

Handle getHandle (Handle::Type handleType)
 
QVector< Handlehandles () const
 
 KoShapeGradientHandles (KoFlake::FillVariant fillVariant, KoShape *shape)
 
KUndo2CommandmoveGradientHandle (Handle::Type handleType, const QPointF &absoluteOffset)
 
QGradient::Type type () const
 

Private Member Functions

QPointF getNewHandlePos (const QPointF &oldPos, const QPointF &absoluteOffset, QGradient::CoordinateMode mode)
 
const QGradient * gradient () const
 

Private Attributes

KoFlake::FillVariant m_fillVariant
 
KoShapem_shape
 

Detailed Description

Definition at line 18 of file KoShapeGradientHandles.h.

Constructor & Destructor Documentation

◆ KoShapeGradientHandles()

KoShapeGradientHandles::KoShapeGradientHandles ( KoFlake::FillVariant fillVariant,
KoShape * shape )

Definition at line 17 of file KoShapeGradientHandles.cpp.

18 : m_fillVariant(fillVariant),
19 m_shape(shape)
20{
21}
KoFlake::FillVariant m_fillVariant

Member Function Documentation

◆ getHandle()

KoShapeGradientHandles::Handle KoShapeGradientHandles::getHandle ( Handle::Type handleType)

Definition at line 134 of file KoShapeGradientHandles.cpp.

135{
136 Handle result;
137
138 Q_FOREACH (const Handle &h, handles()) {
139 if (h.type == handleType) {
140 result = h;
141 break;
142 }
143 }
144
145 return result;
146}
QVector< Handle > handles() const

References handles().

◆ getNewHandlePos()

QPointF KoShapeGradientHandles::getNewHandlePos ( const QPointF & oldPos,
const QPointF & absoluteOffset,
QGradient::CoordinateMode mode )
private

Some shapes may have zero-width/height, then inverted transform will not exist. Therefore we should use a special method for that.

Definition at line 153 of file KoShapeGradientHandles.cpp.

154{
155 const QTransform offset = QTransform::fromTranslate(absoluteOffset.x(), absoluteOffset.y());
156 QTransform localToAbsolute = m_shape->absoluteTransformation();
157 QTransform absoluteToLocal = localToAbsolute.inverted();
158
159 if (mode == QGradient::ObjectBoundingMode) {
160 const QRectF rect = m_shape->outlineRect();
161 const QTransform gradientToUser = KisAlgebra2D::mapToRect(rect);
162 localToAbsolute = gradientToUser * localToAbsolute;
163
166 const QTransform userToGradient = KisAlgebra2D::mapToRectInverse(rect);
167 absoluteToLocal = absoluteToLocal * userToGradient;
168 }
169
170 return (localToAbsolute * offset * absoluteToLocal).map(oldPos);
171}
virtual QRectF outlineRect() const
Definition KoShape.cpp:637
QTransform absoluteTransformation() const
Definition KoShape.cpp:382
QTransform mapToRectInverse(const QRectF &rect)
QTransform mapToRect(const QRectF &rect)

References KoShape::absoluteTransformation(), m_shape, KisAlgebra2D::mapToRect(), KisAlgebra2D::mapToRectInverse(), and KoShape::outlineRect().

◆ gradient()

const QGradient * KoShapeGradientHandles::gradient ( ) const
private

Definition at line 148 of file KoShapeGradientHandles.cpp.

148 {
150 return wrapper.gradient();
151}

References KoShapeFillWrapper::gradient(), m_fillVariant, and m_shape.

◆ handles()

QVector< KoShapeGradientHandles::Handle > KoShapeGradientHandles::handles ( ) const

Definition at line 23 of file KoShapeGradientHandles.cpp.

23 {
24 QVector<Handle> result;
25
26 const QGradient *g = gradient();
27 if (!g) return result;
28
29 switch (g->type()) {
30 case QGradient::LinearGradient: {
31 const QLinearGradient *lgradient = static_cast<const QLinearGradient*>(g);
32 result << Handle(Handle::LinearStart, lgradient->start());
33 result << Handle(Handle::LinearEnd, lgradient->finalStop());
34 break;
35 }
36 case QGradient::RadialGradient: {
37 const QRadialGradient *rgradient = static_cast<const QRadialGradient*>(g);
38
39 result << Handle(Handle::RadialCenter, rgradient->center());
40
41 if (rgradient->center() != rgradient->focalPoint()) {
42 result << Handle(Handle::RadialFocalPoint, rgradient->focalPoint());
43 }
44
45 result << Handle(Handle::RadialRadius,
46 rgradient->center() + QPointF(rgradient->centerRadius(), 0));
47 break;
48 }
49 case QGradient::ConicalGradient:
50 // not supported
51 break;
52 case QGradient::NoGradient:
53 // not supported
54 break;
55 }
56
57 if (g->coordinateMode() == QGradient::ObjectBoundingMode) {
58 const QRectF boundingRect = m_shape->outlineRect();
59 const QTransform gradientToUser(boundingRect.width(), 0, 0, boundingRect.height(),
60 boundingRect.x(), boundingRect.y());
61 const QTransform t = gradientToUser * m_shape->absoluteTransformation();
62
63 QVector<Handle>::iterator it = result.begin();
64
65
66
67 for (; it != result.end(); ++it) {
68 it->pos = t.map(it->pos);
69 }
70 }
71
72 return result;
73}
const QGradient * gradient() const

References KoShape::absoluteTransformation(), gradient(), KoShapeGradientHandles::Handle::LinearEnd, KoShapeGradientHandles::Handle::LinearStart, m_shape, KoShape::outlineRect(), KoShapeGradientHandles::Handle::RadialCenter, KoShapeGradientHandles::Handle::RadialFocalPoint, and KoShapeGradientHandles::Handle::RadialRadius.

◆ moveGradientHandle()

KUndo2Command * KoShapeGradientHandles::moveGradientHandle ( Handle::Type handleType,
const QPointF & absoluteOffset )

Definition at line 81 of file KoShapeGradientHandles.cpp.

82{
84
86 const QGradient *originalGradient = wrapper.gradient();
87 QTransform originalTransform = wrapper.gradientTransform();
88 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(originalGradient, 0);
89
90 QScopedPointer<QGradient> newGradient;
91
92 switch (originalGradient->type()) {
93 case QGradient::LinearGradient: {
95 handleType == Handle::LinearEnd, 0);
96
97 newGradient.reset(KoFlake::cloneGradient(originalGradient));
98 QLinearGradient *lgradient = static_cast<QLinearGradient*>(newGradient.data());
99
100 if (handleType == Handle::LinearStart) {
101 lgradient->setStart(getNewHandlePos(lgradient->start(), absoluteOffset, newGradient->coordinateMode()));
102 } else if (handleType == Handle::LinearEnd) {
103 lgradient->setFinalStop(getNewHandlePos(lgradient->finalStop(), absoluteOffset, newGradient->coordinateMode()));
104
105 }
106 break;
107 }
108 case QGradient::RadialGradient: {
109 newGradient.reset(KoFlake::cloneGradient(originalGradient));
110 QRadialGradient *rgradient = static_cast<QRadialGradient*>(newGradient.data());
111
112 if (handleType == Handle::RadialCenter) {
113 rgradient->setCenter(getNewHandlePos(rgradient->center(), absoluteOffset, newGradient->coordinateMode()));
114 } else if (handleType == Handle::RadialFocalPoint) {
115 rgradient->setFocalPoint(getNewHandlePos(rgradient->focalPoint(), absoluteOffset, newGradient->coordinateMode()));
116 } else if (handleType == Handle::RadialRadius) {
117 QPointF radiusPos = rgradient->center() + QPointF(QPointF(rgradient->radius(), 0));
118 radiusPos = getNewHandlePos(radiusPos, absoluteOffset, newGradient->coordinateMode());
119 rgradient->setRadius(radiusPos.x() - rgradient->center().x());
120 }
121 break;
122 }
123 case QGradient::ConicalGradient:
124 // not supported
125 break;
126 case QGradient::NoGradient:
127 // not supported
128 break;
129 }
130
131 return wrapper.setGradient(newGradient.data(), originalTransform);
132}
QPointF getNewHandlePos(const QPointF &oldPos, const QPointF &absoluteOffset, QGradient::CoordinateMode mode)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
KRITAFLAKE_EXPORT QGradient * cloneGradient(const QGradient *gradient)
clones the given gradient
Definition KoFlake.cpp:17

References KoFlake::cloneGradient(), getNewHandlePos(), KoShapeFillWrapper::gradient(), KoShapeFillWrapper::gradientTransform(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, KoShapeGradientHandles::Handle::LinearEnd, KoShapeGradientHandles::Handle::LinearStart, m_fillVariant, m_shape, KoShapeGradientHandles::Handle::None, KoShapeGradientHandles::Handle::RadialCenter, KoShapeGradientHandles::Handle::RadialFocalPoint, KoShapeGradientHandles::Handle::RadialRadius, and KoShapeFillWrapper::setGradient().

◆ type()

QGradient::Type KoShapeGradientHandles::type ( ) const

Definition at line 75 of file KoShapeGradientHandles.cpp.

76{
77 const QGradient *g = gradient();
78 return g ? g->type() : QGradient::NoGradient;
79}

References gradient().

Member Data Documentation

◆ m_fillVariant

KoFlake::FillVariant KoShapeGradientHandles::m_fillVariant
private

Definition at line 53 of file KoShapeGradientHandles.h.

◆ m_shape

KoShape* KoShapeGradientHandles::m_shape
private

Definition at line 54 of file KoShapeGradientHandles.h.


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