Commit graph

75 commits

Author SHA1 Message Date
Hermet Park
e811a513f2 lottie: ++slot overriding
- fixed the ommiting the duplicate keyframe data overriding
- code refactoring

issue: https://github.com/thorvg/thorvg/issues/2988
2024-11-26 01:11:03 +09:00
Mira Grudzinska
0cc0d0e1c8 lottie: shapes support in text range selector
@issue: #2178
2024-11-21 01:20:53 +09:00
Mira Grudzinska
a6fb2ef9a7 lottie: easing support in text range selector
@issue: #2178
2024-11-21 01:05:11 +09:00
Hermet Park
22d94ea629 renderer: introduced paint reference counting
The reference count of the Paint object allows
easy & safe shared ownership and control over its lifetime
among users and the engine.

New APIs:
- uint8_t Paint::ref()
- uint8_t Paint::unref(bool free = true)
- uint8_t Paint::refCnt() const

issue: https://github.com/thorvg/thorvg/issues/1372 https://github.com/thorvg/thorvg/issues/2598
2024-11-20 01:53:25 +09:00
Hermet Park
b66ce727ff lottie: Fixed a regression bug
Reverted commit db800c8d45,
which introduced another regression that omitted support
for multiple image asset references.

Updated the data of active images in the pooler
within the override() function to resolve the issue.
2024-11-19 01:55:38 +09:00
Hermet Park
db800c8d45 lottie: fixed a memory leak
A regression bug by efe7440fa0

To address this, removed the non-essential image pooling mechanism.

issue: https://github.com/thorvg/thorvg/issues/2959
2024-11-18 18:51:15 +09:00
Hermet Park
0b0488df82 lottie: corrected an omission in overriding the default slot
issue: https://github.com/thorvg/thorvg/issues/2953
2024-11-18 16:59:17 +09:00
Jinny You
efe7440fa0 lottie/slot: Support image overriding 2024-11-15 17:56:42 +09:00
Mira Grudzinska
88a19b06f9 lottie: maxAmount support in the text range selector
@issue: #2178
2024-11-10 13:16:57 +09:00
Mira Grudzinska
84c7551c9b lottie: smoothness support in the text range selector
@issue: #2178
2024-11-10 13:16:57 +09:00
Mira Grudzinska
4ee73be95b lottie: text range selector++
Change in the algorithm for selecting characters included
in the range selector. This is the first step towards adding
support for maxAmount, smoothness, and easing.

@Issue: https://github.com/thorvg/thorvg/issues/2178
2024-11-10 13:16:57 +09:00
Hermet Park
d8fa8f364c lottie: improve slots to properly override solid fill opacity 2024-11-09 17:28:56 +09:00
Hermet Park
ed01ef717e api: revise the spec
Remove the requirement for unique_ptr in the function prototypes.
This change will simplify the API usage, making it more streamlined
and user-friendly. However, memory management will now be the
responsibility of the user.

C++ API Modification:
- Result Paint::mask(std::unique_ptr<Paint> target, MaskMethod method) -> Result Paint::mask(Paint* target, MaskMethod method)
- Result Paint::clip(std::unique_ptr<Paint> clipper) -> Result Paint::clip(Paint* clipper)
- virtual Result Canvas::push(std::unique_ptr<Paint> paint) -> virtual Result Canvas::push(Paint* paint)
- std::unique_ptr<LinearGradient> LinearGradient::gen() -> LinearGradient* LinearGradient::gen()
- std::unique_ptr<RadialGradient> RadialGradient::gen() -> RadialGradient* RadialGradient::gen()
- Result Shape::strokeFill(std::unique_ptr<Fill> f) -> Result Shape::strokeFill(Fill* f)
- Result Shape::fill(std::unique_ptr<Fill> f) -> Result Shape::fill(Fill* f)
- std::unique_ptr<Shape> Shape::gen() -> Shape* Shape::gen()
- std::unique_ptr<Picture> Picture::gen() -> Result Picture::push(Paint* paint)
- std::unique_ptr<Scene> Scene::gen() -> Scene* Scene::gen()
- Result Text::fill(std::unique_ptr<Fill> f) -> Result Text::fill(Fill* f)
- std::unique_ptr<Text> Text::gen() -> Text* Text::gen()
- std::unique_ptr<SwCanvas> SwCanvas::gen() -> SwCanvas* SwCanvas::gen()
- std::unique_ptr<GlCanvas> GlCanvas::gen() -> GlCanvas* GlCanvas::gen()
- std::unique_ptr<Animation> Animation::gen() -> Animation* Animation::gen()
- Result Saver::background(std::unique_ptr<Paint> paint) -> Result Saver::background(Paint* paint)
- Result Saver::save(std::unique_ptr<Paint> paint, const char* filename, uint32_t quality = 100) -> Result Saver::save(Paint* paint, const char* filename, uint32_t quality = 100)
- std::unique_ptr<Saver> Saver::gen() -> Saver* Saver::gen()
- std::unique_ptr<Accessor> Accessor::gen() -> Accessor* Accessor::gen()

C++ API removal:
- template<typename T = tvg::Paint> std::unique_ptr<T> cast(Paint* paint)
- template<typename T = tvg::Paint> std::unique_ptr<T> cast(Paint* paint)

issue: https://github.com/thorvg/thorvg/issues
2024-11-09 12:29:15 +09:00
Mira Grudzinska
422674b4c9 api: add focal parameters to the radial apis
API modification:
- Result RadialGradient::radial(float cx, float cy, float radius)
- Result RadialGradient::radial(float cx, float cy, float r, float fx, float fy, float fr)
- Result RadialGradient::radial(float* cx, float* cy, float* radius)
- Result RadialGradient::radial(float* cx, float* cy, float* r, float* fx = nullptr, float* fy = nullptr, float* fr = nullptr)

@Issue: https://github.com/thorvg/thorvg/issues/2860
2024-10-23 11:10:14 +09:00
Hermet Park
f5af7b13a5 lottie: multiply opacity to the fill alpha value,
opacity of a shape may bring a composition
when it has both stroke and fill
2024-10-17 17:07:36 +09:00
Hermet Park
5dabcbac0b lottie: fixed a corrupted colorstop population
the color stop number should be retained during
the population of frames

issue: https://github.com/thorvg/thorvg/issues/2765
2024-10-03 13:31:19 +09:00
Mira Grudzinska
38f4d17eac lottie: fix gradient populating
When populating the gradient, the color/alpha should
be assigned the first possible value from the provided
ones, rather than the default value of 255.
2024-10-03 12:32:48 +09:00
Hermet Park
f08d7aa037 lottie: support layer effect & gaussian blur
issue: https://github.com/thorvg/thorvg/issues/2718
2024-09-29 15:04:22 +09:00
Hermet Park
6712861154 lottie: --type casting warning in MSVC 2024-09-19 23:23:29 +09:00
Jinny You
9c5933a4e5 lottie/text: applied Text Range randomization.
on each parse, if the `randomize` is enabled,
the start and end of the Text Range are redefined
with the same gap as the original range.

issue: https://github.com/thorvg/thorvg/issues/2178
2024-09-19 11:05:24 +09:00
Mira Grudzinska
ac2b5c86e6 lottie: handle trim path edge cases
According to the definition of trim path elements,
the begin and end values are specified as percentages
in the range of 0-100% (this is also confirmed by AE,
where it's not possible to exceed this range).
Added clamping to align with spec.
2024-09-02 11:47:30 +09:00
Mira Grudzinska
76c1b20dee lottie: fix trim path regression
To avoid editing the trim path values provided
by the user, the logic for their interpretation
was moved from the API to the renderer (7c87d8e).
This caused an issue in the lottie animations when
the trim path is applied more than once. Now fixed.

@issue: https://github.com/thorvg/thorvg/issues/2670
2024-08-28 23:03:44 +09:00
Hermet Park
62f88ec072 lottie: ++scene rendering optimization
Apply LottieRenderPooler to maskings.
2024-08-12 13:55:31 +09:00
Hermet Park
c8c565df92 lottie/expressions: feature support enhancement
- revised the transformation building logic.
- rectified to properly search "this" composition layers.
- rectified the linear interpolation implementation.
- added "pingpong" looping attributes.
2024-07-24 11:26:20 +09:00
Hermet Park
3804bbec57 lottie: code refactoring
- removed unnecessary variables.
- migrated the composition methods to the precomp layer.
2024-07-24 11:26:20 +09:00
Hermet Park
18eb465fe8 lottie: ++optimization with object culling
More precisely, culling the render objects by
determining if the group has no renderable objects.

Additionally, check opacity to quickly return
in the rendering process.
2024-07-22 17:17:08 +09:00
Hermet Park
f06127ab93 lottie: ++scene rendering optimization
Apply LottieRenderPooler to path/rect/ellipse/polystar.

This enhances the animation performance: ~10%
2024-07-14 19:26:51 +09:00
Hermet Park
c20ecbcc58 lottie: introduced LottieRenderPooler
LottieRenderPooler is designed to manages rendering
instances(paints) efficiently through a simple pooling
mechanism to resuse among the animations

This replaces the previous individusal paints implemenations
among solidfill, precomp vierport and pictures,
also fix a potential paints corruption problems.
2024-07-13 19:22:06 +09:00
Hermet Park
4cb327c9fd lottie: ++ scene composing optimization
retain resuable layer solid paint during animation.
2024-07-11 21:30:31 +09:00
Hermet Park
d95ec72335 lottie: ++ scene composing optimization
retain reusable precomp clipper shapes during animation.
2024-07-11 21:30:31 +09:00
Hermet Park
5a2a6fc4a9 common: replace the round() with nearbyint()
nearbyint() is 2x faster than round() in our local test.
2024-07-10 23:43:10 +09:00
Hermet Park
44955b704e common/math: code refactoring
Replaced the prefix "math" with "tvg" namespace.
2024-07-10 00:21:02 +09:00
Hermet Park
79cf7ca5af common/math: introduced custom atan2()
the custom atan2 algorithm by Remez.
see: https://en.wikipedia.org/wiki/Remez_algorithm

This improved the Lottie example by ~2ms.
Total atan2 performance time was reduced by 43%
2024-07-09 23:50:37 +09:00
Hermet Park
cbf124632f lottie: allow image asset sharing among LottiePicture instances
Previously, the Lottie builder didn't account for image asset sharing
among multiple layers. This update rectifies the situation.

issue: https://github.com/thorvg/thorvg/issues/2428
2024-07-03 13:21:47 +09:00
Josh Soref
e061fa6628
common: fix 178+ spelling errors 2024-07-01 21:58:46 +09:00
Mira Grudzinska
33f5ea34c0 common: strokeTrim api introduced
New api sets/gets the trim of the stroke
along the defined path segment, allowing
control over which part of the stroke is
visible.

@issue: https://github.com/thorvg/thorvg/issues/2190
2024-06-05 11:55:36 +09:00
Hermet Park
309f7b6763 lottie: try packing data compactly. 2024-05-30 13:00:42 +09:00
Hermet Park
80d0f5397a lottie: optimize the internal data
encode the object name with the hash value
to save memory and enable fast data comparison.
2024-05-30 13:00:42 +09:00
Mira Grudzinska
1ee79a6c2a lottie: add 'tp' tag support
So far it hasn't been possible to specify
a matte layer - by default, it was the layer
above the calling layer. The 'tp' tag support
has been introduced, enabling referencing any
layer by its index.
In cases where the layer referencing the matte
was the first one, a segmentation fault was
observed. This issue has now been resolved.

@Issue: https://github.com/thorvg/thorvg/issues/2325
2024-05-29 23:17:13 +09:00
Hermet Park
c261cc55ac lottie: code clean up
- remove an unused return value.
- move bodies from header to implementation file.
- no logical changes.
2024-05-20 11:47:26 +09:00
Hermet Park
b2adb2b8f3 lottie: fixed a memory leak
Free the children data properly,
rarely observerd this, only when a layer is hidden.
2024-05-09 21:23:27 +09:00
Hermet Park
c0582d8d2d lottie/expressions: apply expressions to missing properites. 2024-05-06 11:14:23 +09:00
Hermet Park
324d0f8943 lottie: support the expression feature
The current development of the expression engine is experimental.
It does not support multi-threading.

Therefore, when tvg::Initializer::init() is configured
with more than one thread, expressions will be automatically disabled.

issue: https://github.com/thorvg/thorvg/issues/1640
2024-04-30 15:26:37 +09:00
Hermet Park
be7437e0a3 common: code refactoring
introduced mathDeg2Rad() and mathRad2Deg() for a common implementation.
2024-04-15 20:35:33 +09:00
Lucas Niu
3af9faf116 lottie: Support the Animation Segment(Marker)
A single animation might have a desinated markers with naming: 0 ~ 0.5 (sector A), 0.5 ~ 1.0  (sector B). Selecting one of them using a marker name(sector A) and could play only that part with animation controllers.

usage:
- `animation->segment("sectionA") // Named segment(Marker)`
- `auto cnt = animation->markerCnt()`
- `auto name = animation->markers(index)`
- `animation->segment(0, 0.5) // Segment`
- `animation->segment(&begin, &end)`

Co-authored-by: Jinny You <jinny@lottiefiles.com>
2024-04-14 23:54:26 +09:00
Hermet Park
cbed261ba2 lottie: Properly handle the TrimPath mode.
This correction addresses the drawing order of
objects when a group contains a TrimPath and
is merging shapes.

Additionally, the TrimPath method is can applied
to the engine to control the drawing behavior by
7f3dc541d6b7abcdc03facd884489f37c327fd98

issue: https://github.com/thorvg/thorvg/issues/2047
2024-04-03 10:46:01 +09:00
Hermet Park
41ae563a84 lottie: optimize the rendering by preventing partial rendering branches.
this optimization is to figure out if this group is a simple path drawing.
In that case, the rendering context can be sharable with the parent's.
2024-03-29 12:28:16 +09:00
Hermet Park
41f835598a lottie: code refactoring.
removed unused static condition.

static was prepared for optimization,
but not used at all.

we will revisit this later when time permits.

binary size: -6kb
2024-03-28 00:04:48 +09:00
Vincent Torri
2ec9fdb932 [common] code clean up
use fmodf() instead of fmod()
2024-03-23 11:45:11 +09:00
JunsuChoi
dd2e7b9b4e lottie: Prevent memory leak when file is invalid
When json file is invalid in the parser,
the LottieComposition object is not released and the parse() returns false.
To prevent memory leaks, free the memory before returning false.

related issue : https://github.com/thorvg/thorvg/issues/2070
2024-03-19 11:48:02 +09:00