Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_scalar_keyframe_channel.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Jouni Pentikäinen <joupent@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#ifndef _KIS_SCALAR_KEYFRAME_CHANNEL_H
7#define _KIS_SCALAR_KEYFRAME_CHANNEL_H
8
10
11
16 qreal lower;
17 qreal upper;
18
19 ScalarKeyframeLimits(qreal x, qreal y){
20 KIS_ASSERT(x != y);
21
22 // Supports (high, low) or (low, high) assignment.
23 lower = x < y ? x : y;
24 upper = x > y ? x : y;
25 }
26
28 qreal clamp(qreal value){
29 value = value < lower ? lower : value;
30 value = value > upper ? upper : value;
31 return value;
32 }
33};
34
35
39class KRITAIMAGE_EXPORT KisScalarKeyframe : public KisKeyframe
40{
41 Q_OBJECT
42public:
51
56 Smooth
57 };
58
60 KisScalarKeyframe(qreal value, InterpolationMode interpMode, TangentsMode tangentMode, QPointF leftTangent, QPointF rightTangent, QSharedPointer<ScalarKeyframeLimits> limits);
61
62 KisKeyframeSP duplicate(KisKeyframeChannel* newChannel = 0) override;
63
64 void setValue(qreal val, KUndo2Command* parentUndoCmd = nullptr);
65 qreal value() const;
66
67 void setInterpolationMode(InterpolationMode mode, KUndo2Command* parentUndoCmd = nullptr);
68 InterpolationMode interpolationMode() const;
69
70 void setTangentsMode(TangentsMode mode, KUndo2Command* parentUndoCmd = nullptr);
71 TangentsMode tangentsMode() const;
72
73 void setInterpolationTangents(QPointF leftTangent, QPointF rightTangent, KUndo2Command* parentUndoCmd = nullptr);
74 QPointF leftTangent() const;
75 QPointF rightTangent() const;
76
77 void setLimits(QSharedPointer<ScalarKeyframeLimits> limits);
78
83 QMetaObject::Connection valueChangedChannelConnection;
84
85 // Friend class for commands to avoid multi-signal calls..
87
88Q_SIGNALS:
89 void sigChanged(const KisScalarKeyframe* scalarKey);
90
91private:
92 qreal m_value;
95 QPointF m_leftTangent;
104};
105
106
119class KRITAIMAGE_EXPORT KisScalarKeyframeChannel : public KisKeyframeChannel
120{
121 Q_OBJECT
122public:
125 ~KisScalarKeyframeChannel() override;
126
128 void addScalarKeyframe(int time, qreal value, KUndo2Command *parentUndoCmd = nullptr);
129
132 void setLimits(qreal low, qreal high);
134 void removeLimits();
135
137 qreal valueAt(int time) const;
138 qreal currentValue() { return valueAt(currentTime()); }
139
140 bool isCurrentTimeAffectedBy(int keyTime);
141
142 void setDefaultValue(qreal value);
143 void setDefaultInterpolationMode(KisScalarKeyframe::InterpolationMode mode);
144
145 static QPointF interpolate(QPointF point1, QPointF rightTangent, QPointF leftTangent, QPointF point2, qreal t);
146
147 virtual void insertKeyframe(int time, KisKeyframeSP keyframe, KUndo2Command *parentUndoCmd = nullptr) override;
148 virtual void removeKeyframe(int time, KUndo2Command *parentUndoCmd = nullptr) override;
149 virtual KisTimeSpan affectedFrames(int time) const override;
150 virtual KisTimeSpan identicalFrames(int time) const override;
151
152private:
153 static qreal findCubicCurveParameter(int time0, qreal delta0, qreal delta1, int time1, int time);
154 static qreal cubicBezier(qreal p0, qreal delta1, qreal delta2, qreal p3, qreal t);
155 static void normalizeTangents(const QPointF point1, QPointF &rightTangent, QPointF &leftTangent, const QPointF point2);
156
157 virtual KisKeyframeSP createKeyframe() override;
158 virtual QRect affectedRect(int time) const override;
159 virtual QPair<int, KisKeyframeSP> loadKeyframe(const QDomElement &keyframeNode) override;
160 virtual void saveKeyframe(KisKeyframeSP keyframe, QDomElement keyframeElement, const QString &layerFilename) override;
161
162 struct Private;
163 QScopedPointer<Private> m_d;
164};
165
166#endif
float value(const T *src, size_t ch)
QPointF p0
QPointF p3
KisKeyframeChannel stores and manages KisKeyframes. Maps units of time to virtual keyframe values....
Krita's base keyframe class. Mainly contained by KisKeyframeChannels. A core part of Krita's animatio...
virtual KisKeyframeSP duplicate(class KisKeyframeChannel *newChannel=nullptr)=0
The KisScalarKeyframeChannel is a concrete KisKeyframeChannel subclass that stores and manages KisSca...
The KisScalarKeyframe class is a concrete subclass of KisKeyframe that wraps a scalar value and inter...
InterpolationMode
Controls the type of interpolation between this KisScalarKeyframe and the next.
InterpolationMode m_interpolationMode
QMetaObject::Connection valueChangedChannelConnection
For now, scalar keyframes have a callback connection to the channel that owns them in order to signal...
void sigChanged(const KisScalarKeyframe *scalarKey)
TangentsMode
Controls the behavior of the left and right tangents on a given keyframe for different curve shapes.
QWeakPointer< ScalarKeyframeLimits > m_channelLimits
Definition KoID.h:30
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
#define bounds(x, a, b)
This structure represents an optional limited range of values that be handled by KisScalarKeyframeCha...