mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-15 12:34:30 +00:00
lottie: fix transformations in text range selector
Since the translate API was used while text updating, the subsequent range selector transformations gets overwritten when updating the shape (scale and rotate, adding another translation will persist). This caused unexpected results. Fixed by using the transform API when additional transformations are needed - also fixes applying more than one range selector.
This commit is contained in:
parent
33cfc16569
commit
a851d1706e
2 changed files with 36 additions and 29 deletions
|
@ -1060,6 +1060,11 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo)
|
||||||
shape->stroke(doc.stroke.color.rgb[0], doc.stroke.color.rgb[1], doc.stroke.color.rgb[2]);
|
shape->stroke(doc.stroke.color.rgb[0], doc.stroke.color.rgb[1], doc.stroke.color.rgb[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!text->ranges.empty()) {
|
||||||
|
Point scaling = {1.0f, 1.0f};
|
||||||
|
auto rotation = 0.0f;
|
||||||
|
auto translation = cursor;
|
||||||
|
|
||||||
//text range process
|
//text range process
|
||||||
for (auto s = text->ranges.begin(); s < text->ranges.end(); ++s) {
|
for (auto s = text->ranges.begin(); s < text->ranges.end(); ++s) {
|
||||||
float start, end;
|
float start, end;
|
||||||
|
@ -1071,23 +1076,18 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo)
|
||||||
else if ((*s)->based == LottieTextRange::Based::Lines) basedIdx = line;
|
else if ((*s)->based == LottieTextRange::Based::Lines) basedIdx = line;
|
||||||
|
|
||||||
if (basedIdx < start || basedIdx >= end) continue;
|
if (basedIdx < start || basedIdx >= end) continue;
|
||||||
auto matrix = shape->transform();
|
|
||||||
|
translation = translation + (*s)->style.position(frameNo);
|
||||||
|
auto temp = (*s)->style.scale(frameNo);
|
||||||
|
scaling.x *= temp.x * 0.01f;
|
||||||
|
scaling.y *= temp.y * 0.01f;
|
||||||
|
rotation += (*s)->style.rotation(frameNo);
|
||||||
|
|
||||||
shape->opacity((*s)->style.opacity(frameNo));
|
shape->opacity((*s)->style.opacity(frameNo));
|
||||||
|
|
||||||
auto color = (*s)->style.fillColor(frameNo);
|
auto color = (*s)->style.fillColor(frameNo);
|
||||||
shape->fill(color.rgb[0], color.rgb[1], color.rgb[2], (*s)->style.fillOpacity(frameNo));
|
shape->fill(color.rgb[0], color.rgb[1], color.rgb[2], (*s)->style.fillOpacity(frameNo));
|
||||||
|
|
||||||
rotate(&matrix, (*s)->style.rotation(frameNo));
|
|
||||||
|
|
||||||
auto glyphScale = (*s)->style.scale(frameNo) * 0.01f;
|
|
||||||
tvg::scale(&matrix, glyphScale.x, glyphScale.y);
|
|
||||||
|
|
||||||
auto position = (*s)->style.position(frameNo);
|
|
||||||
translate(&matrix, position.x, position.y);
|
|
||||||
|
|
||||||
shape->transform(matrix);
|
|
||||||
|
|
||||||
if (doc.stroke.render) {
|
if (doc.stroke.render) {
|
||||||
auto strokeColor = (*s)->style.strokeColor(frameNo);
|
auto strokeColor = (*s)->style.strokeColor(frameNo);
|
||||||
shape->stroke((*s)->style.strokeWidth(frameNo) / scale);
|
shape->stroke((*s)->style.strokeWidth(frameNo) / scale);
|
||||||
|
@ -1098,6 +1098,13 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo)
|
||||||
auto spacing = (*s)->style.lineSpacing(frameNo);
|
auto spacing = (*s)->style.lineSpacing(frameNo);
|
||||||
if (spacing > lineSpacing) lineSpacing = spacing;
|
if (spacing > lineSpacing) lineSpacing = spacing;
|
||||||
}
|
}
|
||||||
|
Matrix matrix;
|
||||||
|
identity(&matrix);
|
||||||
|
translate(&matrix, translation.x, translation.y);
|
||||||
|
tvg::scale(&matrix, scaling.x, scaling.y);
|
||||||
|
rotate(&matrix, rotation);
|
||||||
|
shape->transform(matrix);
|
||||||
|
}
|
||||||
|
|
||||||
scene->push(cast(shape));
|
scene->push(cast(shape));
|
||||||
|
|
||||||
|
|
|
@ -107,7 +107,7 @@ namespace tvg
|
||||||
|
|
||||||
bool transform(const Matrix& m)
|
bool transform(const Matrix& m)
|
||||||
{
|
{
|
||||||
tr.m = m;
|
if (&tr.m != &m) tr.m = m;
|
||||||
tr.overriding = true;
|
tr.overriding = true;
|
||||||
renderFlag |= RenderUpdateFlag::Transform;
|
renderFlag |= RenderUpdateFlag::Transform;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue