123QSvgAbstractAnimatedProperty *QSvgAbstractAnimatedProperty::createAnimatedProperty(
const QString &name)
125 const std::optional<Type> type = name2type(name);
128 qCDebug(lcSvgAnimatedProperty) <<
"Property : " << name <<
" is not animatable";
132 QSvgAbstractAnimatedProperty *prop =
nullptr;
135 case QSvgAbstractAnimatedProperty::Color:
136 prop =
new QSvgAnimatedPropertyColor(name);
138 case QSvgAbstractAnimatedProperty::Transform:
139 prop =
new QSvgAnimatedPropertyTransform(name);
141 case QSvgAbstractAnimatedProperty::Float:
142 prop =
new QSvgAnimatedPropertyFloat(name);
173void QSvgAnimatedPropertyColor::interpolate(uint index, qreal t)
const
175 QColor c1 = m_colors.at(index - 1);
176 QColor c2 = m_colors.at(index);
178 int alpha = q_lerp(c1.alpha(), c2.alpha(), t);
179 int red = q_lerp(c1.red(), c2.red(), t);
180 int green = q_lerp(c1.green(), c2.green(), t);
181 int blue = q_lerp(c1.blue(), c2.blue(), t);
183 m_interpolatedValue = QColor(red, green, blue, alpha);
209void QSvgAnimatedPropertyFloat::interpolate(uint index, qreal t)
const
211 if (index >= (uint)m_keyFrames.size()) {
212 qCWarning(lcSvgAnimatedProperty) <<
"Invalid index for key frames";
216 qreal float1 = m_values.at(index - 1);
217 qreal float2 = m_values.at(index);
219 m_interpolatedValue = q_lerp(float1, float2, t);
257void QSvgAnimatedPropertyTransform::interpolate(uint index, qreal t)
const
259 if (index >= (uint)m_keyFrames.size()) {
260 qCWarning(lcSvgAnimatedProperty) <<
"Invalid index for key frames";
264 if (!m_transformCount ||
265 ((m_components.size() / qsizetype(m_transformCount)) != m_keyFrames.size())) {
269 QTransform transform = QTransform();
271 qsizetype startIndex = (index - 1) * qsizetype(m_transformCount);
272 qsizetype endIndex = index * qsizetype(m_transformCount);
274 for (quint32 i = 0; i < m_transformCount; i++) {
275 TransformComponent tc1 = m_components.at(startIndex + i);
276 TransformComponent tc2 = m_components.at(endIndex + i);
277 if (tc1.type == tc2.type) {
278 if (tc1.type == TransformComponent::Translate) {
279 QPointF t1 = QPointF(tc1.values.at(0), tc1.values.at(1));
280 QPointF t2 = QPointF(tc2.values.at(0), tc2.values.at(1));
281 QPointF tr = pointInterpolator(t1, t2, t);
282 transform.translate(tr.x(), tr.y());
283 }
else if (tc1.type == TransformComponent::Scale) {
284 QPointF s1 = QPointF(tc1.values.at(0), tc1.values.at(1));
285 QPointF s2 = QPointF(tc2.values.at(0), tc2.values.at(1));
286 QPointF sr = pointInterpolator(s1, s2, t);
287 transform.scale(sr.x(), sr.y());
288 }
else if (tc1.type == TransformComponent::Rotate) {
289 QPointF cor1 = QPointF(tc1.values.at(1), tc1.values.at(2));
290 QPointF cor2 = QPointF(tc2.values.at(1), tc2.values.at(2));
291 QPointF corResult = pointInterpolator(cor1, cor2, t);
292 qreal angle1 = tc1.values.at(0);
293 qreal angle2 = tc2.values.at(0);
294 qreal angleResult = q_lerp(angle1, angle2, t);
295 transform.translate(corResult.x(), corResult.y());
296 transform.rotate(angleResult);
297 transform.translate(-corResult.x(), -corResult.y());
298 }
else if (tc1.type == TransformComponent::Skew) {
299 QPointF skew1 = QPointF(tc1.values.at(0), tc1.values.at(1));
300 QPointF skew2 = QPointF(tc2.values.at(0), tc2.values.at(1));
301 QPointF skewResult = pointInterpolator(skew1, skew2, t);
302 transform.shear(qTan(qDegreesToRadians(skewResult.x())),
303 qTan(qDegreesToRadians(skewResult.y())));
308 m_interpolatedValue = transform;