Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 9642b31

Browse files
fmalitaSkia Commit-Bot
authored andcommitted
[skottie] Add support for text animator blur
In adition to transforms/opacity/etc, text animators can target per-glyph opacity. Change-Id: I6ab63a6e49a64beaf63fc955f0b672a5b8ba84ba Reviewed-on: https://skia-review.googlesource.com/c/skia/+/272886 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Florin Malita <fmalita@chromium.org>
1 parent cc5415a commit 9642b31

File tree

9 files changed

+36
-14
lines changed

9 files changed

+36
-14
lines changed

modules/skottie/src/SkottiePriv.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ class Transform;
3838
namespace skottie {
3939
namespace internal {
4040

41+
// Close-enough to AE.
42+
static constexpr float kBlurSizeToSigma = 0.3f;
43+
4144
class TextAdapter;
4245
class TransformAdapter2D;
4346
class TransformAdapter3D;

modules/skottie/src/effects/DropShadowEffect.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@ class DropShadowAdapter final : public AnimatablePropertyContainer {
6060
fDropShadow->setOffset(SkVector::Make( fDistance * SkScalarCos(rad),
6161
-fDistance * SkScalarSin(rad)));
6262

63-
// Close enough to AE.
64-
static constexpr SkScalar kSoftnessToSigmaFactor = 0.3f;
65-
const auto sigma = fSoftness * kSoftnessToSigmaFactor;
63+
const auto sigma = fSoftness * kBlurSizeToSigma;
6664
fDropShadow->setSigma(SkVector::Make(sigma, sigma));
6765

6866
fDropShadow->setMode(SkToBool(fShdwOnly)

modules/skottie/src/effects/GaussianBlurEffect.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ class GaussianBlurEffectAdapter final : public AnimatablePropertyContainer {
5656
const auto dim_index = SkTPin<size_t>(static_cast<size_t>(fDimensions),
5757
1, SK_ARRAY_COUNT(kDimensionsMap)) - 1;
5858

59-
// Close enough to AE.
60-
static constexpr SkScalar kBlurrinessToSigmaFactor = 0.3f;
61-
const auto sigma = fBlurriness * kBlurrinessToSigmaFactor;
59+
const auto sigma = fBlurriness * kBlurSizeToSigma;
6260

6361
fBlur->setSigma({ sigma * kDimensionsMap[dim_index].x(),
6462
sigma * kDimensionsMap[dim_index].y() });

modules/skottie/src/effects/RadialWipeEffect.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ class RWipeRenderNode final : public sksg::CustomRenderNode {
4848
fMaskSigma = 0;
4949
fMaskFilter = nullptr;
5050
} else {
51-
static constexpr float kFeatherToSigma = 0.3f; // close enough to AE
52-
fMaskSigma = std::max(fFeather, 0.0f) * kFeatherToSigma;
51+
fMaskSigma = std::max(fFeather, 0.0f) * kBlurSizeToSigma;
5352

5453
// The gradient is inverted between non-blurred and blurred (latter requires dstOut).
5554
const SkColor c0 = fMaskSigma > 0 ? 0xffffffff : 0x00000000,

modules/skottie/src/text/TextAdapter.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "modules/sksg/include/SkSGGroup.h"
1717
#include "modules/sksg/include/SkSGPaint.h"
1818
#include "modules/sksg/include/SkSGRect.h"
19+
#include "modules/sksg/include/SkSGRenderEffect.h"
1920
#include "modules/sksg/include/SkSGText.h"
2021
#include "modules/sksg/include/SkSGTransform.h"
2122

@@ -69,6 +70,7 @@ sk_sp<TextAdapter> TextAdapter::Make(const skjson::ObjectValue& jlayer,
6970

7071
for (const skjson::ObjectValue* janimator : *janimators) {
7172
if (auto animator = TextAnimator::Make(janimator, abuilder, adapter.get())) {
73+
adapter->fHasBlur |= animator->hasBlur();
7274
adapter->fAnimators.push_back(std::move(animator));
7375
}
7476
}
@@ -125,6 +127,12 @@ void TextAdapter::addFragment(const Shaper::Fragment& frag) {
125127
? sksg::Group::Make(std::move(draws))
126128
: std::move(draws[0]);
127129

130+
if (fHasBlur) {
131+
// Optional blur effect.
132+
rec.fBlur = sksg::BlurImageFilter::Make();
133+
draws_node = sksg::ImageFilterEffect::Make(std::move(draws_node), rec.fBlur);
134+
}
135+
128136
fRoot->addChild(sksg::TransformEffect::Make(std::move(draws_node), rec.fMatrixNode));
129137
fFragments.push_back(std::move(rec));
130138
}
@@ -307,6 +315,9 @@ void TextAdapter::pushPropsToFragment(const TextAnimator::ResolvedProps& props,
307315
if (rec.fStrokeColorNode) {
308316
rec.fStrokeColorNode->setColor(scale_alpha(props.stroke_color, props.opacity));
309317
}
318+
if (rec.fBlur) {
319+
rec.fBlur->setSigma(props.blur * kBlurSizeToSigma);
320+
}
310321
}
311322

312323
void TextAdapter::adjustLineTracking(const TextAnimator::ModulatorBuffer& buf,

modules/skottie/src/text/TextAdapter.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
class SkFontMgr;
1919

2020
namespace sksg {
21+
class BlurImageFilter;
2122
class Group;
2223
template <typename T>
2324
class Matrix;
@@ -45,11 +46,12 @@ class TextAdapter final : public AnimatablePropertyContainer {
4546
TextAdapter(sk_sp<SkFontMgr>, sk_sp<Logger>);
4647

4748
struct FragmentRec {
48-
SkPoint fOrigin; // fragment position
49+
SkPoint fOrigin; // fragment position
4950

50-
sk_sp<sksg::Matrix<SkM44>> fMatrixNode;
51-
sk_sp<sksg::Color> fFillColorNode,
52-
fStrokeColorNode;
51+
sk_sp<sksg::Matrix<SkM44>> fMatrixNode;
52+
sk_sp<sksg::Color> fFillColorNode,
53+
fStrokeColorNode;
54+
sk_sp<sksg::BlurImageFilter> fBlur;
5355
};
5456

5557
void reshape();
@@ -89,6 +91,7 @@ class TextAdapter final : public AnimatablePropertyContainer {
8991
};
9092

9193
TextValueTracker fText;
94+
bool fHasBlur = false; // tracks whether any animator targets blur
9295
};
9396

9497
} // namespace internal

modules/skottie/src/text/TextAnimator.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ TextAnimator::ResolvedProps TextAnimator::modulateProps(const ResolvedProps& pro
123123
modulated_props.scale *= SkV3{1,1,1} +
124124
(ValueTraits<VectorValue>::As<SkV3>(fTextProps.scale) * 0.01f - SkV3{1,1,1}) * amount;
125125

126+
// ... as does blur
127+
modulated_props.blur += ValueTraits<VectorValue>::As<SkVector>(fTextProps.blur) * amount;
128+
126129
const auto lerp_color = [](SkColor c0, SkColor c1, float t) {
127130
const auto c0_4f = SkNx_cast<float>(Sk4b::Load(&c0)),
128131
c1_4f = SkNx_cast<float>(Sk4b::Load(&c1)),
@@ -167,6 +170,7 @@ TextAnimator::TextAnimator(std::vector<sk_sp<RangeSelector>>&& selectors,
167170

168171
fHasFillColor = acontainer->bind(*abuilder, jprops["fc"], &fTextProps.fill_color );
169172
fHasStrokeColor = acontainer->bind(*abuilder, jprops["sc"], &fTextProps.stroke_color);
173+
fHasBlur = acontainer->bind(*abuilder, jprops["bl"], &fTextProps.blur );
170174
}
171175

172176
} // namespace internal

modules/skottie/src/text/TextAnimator.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ class TextAnimator final : public SkNVRefCnt<TextAnimator> {
3535
VectorValue position,
3636
scale = { 100, 100, 100 },
3737
fill_color,
38-
stroke_color;
38+
stroke_color,
39+
blur;
3940
// unlike pos/scale which are animated vectors, rotation is separated in each dimension.
4041
SkV3 rotation = { 0, 0, 0 };
4142
ScalarValue opacity = 100,
@@ -50,6 +51,7 @@ class TextAnimator final : public SkNVRefCnt<TextAnimator> {
5051
tracking = 0;
5152
SkColor fill_color = SK_ColorTRANSPARENT,
5253
stroke_color = SK_ColorTRANSPARENT;
54+
SkVector blur = { 0, 0 };
5355
};
5456

5557
struct AnimatedPropsModulator {
@@ -76,6 +78,8 @@ class TextAnimator final : public SkNVRefCnt<TextAnimator> {
7678

7779
void modulateProps(const DomainMaps&, ModulatorBuffer&) const;
7880

81+
bool hasBlur() const { return fHasBlur; }
82+
7983
private:
8084
TextAnimator(std::vector<sk_sp<RangeSelector>>&&,
8185
const skjson::ObjectValue&,
@@ -88,7 +92,8 @@ class TextAnimator final : public SkNVRefCnt<TextAnimator> {
8892

8993
AnimatedProps fTextProps;
9094
bool fHasFillColor : 1,
91-
fHasStrokeColor : 1;
95+
fHasStrokeColor : 1,
96+
fHasBlur : 1;
9297
};
9398

9499
} // namespace internal

resources/skottie/skottie-text-blur.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)