• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2019 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkottieRangeSelector_DEFINED
9 #define SkottieRangeSelector_DEFINED
10 
11 #include "include/core/SkRefCnt.h"
12 #include "modules/skottie/src/SkottiePriv.h"
13 #include "modules/skottie/src/text/TextAnimator.h"
14 
15 #include <tuple>
16 #include <vector>
17 
18 namespace skottie {
19 namespace internal {
20 
21 class RangeSelector final : public SkNVRefCnt<RangeSelector> {
22 public:
23     static sk_sp<RangeSelector> Make(const skjson::ObjectValue*,
24                                      const AnimationBuilder*,
25                                      AnimatablePropertyContainer*);
26 
27     enum class Units : uint8_t {
28         kPercentage,  // values are percentages of domain size
29         kIndex,       // values are direct domain indices
30     };
31 
32     enum class Domain : uint8_t {
33         kChars,                   // domain indices map to glyph indices
34         kCharsExcludingSpaces,    // domain indices map to glyph indices (ignoring spaces)
35         kWords,                   // domain indices map to word indices
36         kLines,                   // domain indices map to line indices
37     };
38 
39     enum class Mode : uint8_t {
40         kAdd,
41         // kSubtract,
42         // kIntersect,
43         // kMin,
44         // kMax,
45         // kDifference,
46     };
47 
48     enum class Shape : uint8_t {
49         kSquare,
50         kRampUp,
51         kRampDown,
52         kTriangle,
53         kRound,
54         kSmooth,
55     };
56 
57     void modulateCoverage(const TextAnimator::DomainMaps&, TextAnimator::ModulatorBuffer&) const;
58 
59 private:
60     RangeSelector(Units, Domain, Mode, Shape);
61 
62     // Resolves this selector to a range in the coverage buffer index domain.
63     std::tuple<float, float> resolve(size_t domain_size) const;
64 
65     const Units  fUnits;
66     const Domain fDomain;
67     const Mode   fMode;
68     const Shape  fShape;
69 
70     float        fStart,
71                  fEnd,
72                  fOffset,
73                  fAmount     = 100,
74                  fEaseLo     =   0,
75                  fEaseHi     =   0,
76                  fSmoothness = 100;
77 };
78 
79 } // namespace internal
80 } // namespace skottie
81 
82 #endif // SkottieRangeSelector_DEFINED
83