Commit graph

197 commits

Author SHA1 Message Date
Hermet Park
c0582d8d2d lottie/expressions: apply expressions to missing properites. 2024-05-06 11:14:23 +09:00
Hermet Park
81ff238fef lottie/expressions: enhance stability
When the system fails to interpret the expression code,
it forcibly disables the feature per property.

This improvement enhances stability and performance
by avoiding reckless attempts to interpret JavaScript code.

When we confirm the full stability with expressions,
we can revert this code.
2024-05-06 11:14:23 +09:00
Hermet Park
0ea0def99d lottie/expressions: ++exceptional handling.
Add an exceptional handling if interpreting code is failed.
2024-05-06 11:14:23 +09:00
Hermet Park
830e5de0ce lottie/expressions: make it up the insufficient content() behavior
this is a follow-up fix for the initial expressions feature.
2024-05-06 11:14:23 +09:00
Hermet Park
1b4502bade lottie: fix a logic by a mistake. 2024-05-06 11:14:23 +09:00
Hermet Park
6211db93bc lottie/jerryscript - size down the engine.
get rid of unused features in thorvg lottie.
2024-04-30 15:26:37 +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
4d02cda350 lottie/model: Added some essential functions through expressions.
These internal methods have been introduced to search for content within
an object (parent) using a given parameter (name or index).

- LottieLayer* LottieGroup::asset(const char* name)
- LottieLayer* LottieComposition::asset(const char* name)
- LottieLayer* LottieComposition::layer(uint16_t id)
- LottieLayer* LottieComposition::layer(const char* name)

This converts the frame number to the corresponding time.
- float LottieComposition::timeAtFrame(float frameNo)
2024-04-30 15:26:37 +09:00
Hermet Park
ce1fb53c9a lottie: ++binary search stability.
this ensures that the return value is not below 0,
when the frame count is just 2.
2024-04-30 15:26:37 +09:00
Hermet Park
063a5c6c3a lottie: specify the explicit parsing type.
these explicit type values are expected
to be referenced by the expressions.
2024-04-30 15:26:37 +09:00
Hermet Park
8118a9a661 lottie: generalize parent context access in parsing.
ensure parent context is generally accessible,
not limited to gradients.
2024-04-30 15:26:37 +09:00
Hermet Park
e62b144afe lottie: integrate JerryScript engine for expressions
introduced the JerryScript engine to interpret Lottie
expressions, enhancing the capability to support runtime
programmable animation logic within Lottie expressions
spec. This feature, based on js scripting, represents
the most complicated addition to the Lottie spec so far.

ThorVG probably could includes an option to toggle
this feature at build time, allowing for customizable user
configurations according to specific requirements.

removed unused features for the optimal size:
- DEBUGGER
- MEM_STATS
- SNAPSHOT
- BUILTIN_JSON
- BUILTIN_PROXY
- BUILTIN_REFLECT
- BUILTIN_ATOMICS
- PROMISE_CALLBACK
- MODULE_SYSTEM
- SYSTEM_PORT

This is an experimental version.
Please manually enable the 'lottie-expressions' in meson.build
when you wish to use it.

See: https://jerryscript.net/
2024-04-30 15:26:37 +09:00
Jinny You
e7d27f8930 lottie: correct the text alignment
When the Lottie Text Justify sets to center, text alignment should also be center.
2024-04-26 11:11:15 +09:00
Hermet Park
ab4cf28888 lottie: code clean up 2024-04-16 18:14:49 +02:00
Jinny You
54eedd4bb6 lottie/loader: Fix crash when parsing error
When parsing error, lottie loader raises runtime crash.
Check whether the composition is nullptr.
2024-04-16 13:37:27 +02:00
Hermet Park
0268e9e3d1 lottie: ++stability
ensure that the loading has been completed before overriding.
2024-04-16 10:30:14 +09:00
Hermet Park
c713a53f32 lottie: code refactoring.
make it neat and clean.
2024-04-15 21:22:22 +09:00
Hermet Park
be7437e0a3 common: code refactoring
introduced mathDeg2Rad() and mathRad2Deg() for a common implementation.
2024-04-15 20:35:33 +09:00
Hermet Park
4d8f617af6 lottie: code refactoring.
keep the coding style.
2024-04-15 00:23:37 +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
d98cb1a84b lottie: corrected the comp/layer size data type.
Actually, the these size is expected to be a floating-point value.
This correction addresses a parsing error.

issue: https://github.com/thorvg/thorvg/issues/2153
2024-04-11 10:54:49 +09:00
Hermet Park
50707482ba lottie: rectify the frame updates.
Currently, tvg ignores the frame value if the difference
is less than 0.001. In most cases, updating the frames
when the change is less than 1ms is just an unnecessary
burden on the system.

Instead, this ensures that the perfect last frame is reached.

issue: https://github.com/thorvg/thorvg/issues/2147
2024-04-11 10:54:02 +09:00
Hermet Park
99a29ae97f lottie: removed unused code.
Currently, thorvg has no plan to support dotlottie format.
2024-04-04 14:09:04 +09:00
Hermet Park
622b25a3b4 lottie: hotfix memory corruption.
revise the fix that occured a side effect by:
287e6d33d2
2024-04-03 18:27:01 +09:00
Jinny You
287e6d33d2 lottie: Fix heap-buffer-overflow in gradient populate 2024-04-03 13:19:19 +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
c74cd42363 sw_engine: revised the trimpath dash line logic
Support the TrimPath modes (individual/simultaneous)
internally in the engine to handle them efficiently.
2024-04-03 10:46:01 +09:00
Hermet Park
f733e42c95 portability: removed a compiler waring
D:\Projects\thorvg\src\loaders\lottie\tvgLottieParserHandler.h(52): warning C4083: expected ')'; found identifier 'effc'
[44/46] Compiling C++ object src/thorvg-0.dll.p/loaders_lottie_tvgLottieParserHandler.cpp.obj
D:\Projects\thorvg\src\loaders\lottie\tvgLottieParserHandler.h(52): warning C4083: expected ')'; found identifier 'effc'
[45/46] Compiling C++ object src/thorvg-0.dll.p/loaders_lottie_tvgLottieParser.cpp.obj
D:\Projects\thorvg\src\loaders\lottie\tvgLottieParserHandler.h(52): warning C4083: expected ')'; found identifier 'effc'

I'm not sure this option is really necessary.
2024-03-29 16:41:32 +09:00
Hermet Park
128923c05d lottie: polish up a comment. 2024-03-29 16:41:22 +09:00
Hermet Park
e69d63688b lottie: Removed redundant code.
The settings were incorrect;
'direction' and 'fillRule' do not have a relationship.
2024-03-29 13:45:19 +09:00
Hermet Park
a1463cdc3e lottie: optimize the rendering performance.
this optimization nicely merges shapes
when a child group has a only (transformed) pathes.

this also fixes the following compatibility issue nicely.

issue: https://github.com/thorvg/thorvg/issues/2061
2024-03-29 12:28:16 +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
Jinny You
ca7b59876a lottie: Fix crash from invalid masking method
This change is better for stability. Returns `None` if the `mode` attribute cannot be parsed.

related issue: #2072
2024-03-27 23:39:34 +09:00
Jinny You
0d0f6d4710 lottie: Fix crash when an invalid gradient is provided
When lottie is broken and provides invalid gradient, the program crashes in segmentation fault.

At that time, in the `populate` function, `ColorStop& color` doesn't have `input` but tries to use it.

Added checking nullptr logic. The function `populate` will not proceed and return 0 in that case.

related issue: #2072
2024-03-27 20:25:57 +09:00
Jinny You
f48137505b lottie/slot: Fixed potential overriding bug
Slot overriding tries to set property via the `LottieObject`. It potentially causes unexpected changes.

Revised the `override` function. The purpose of this patch is to aim atomic property to be overriden.
2024-03-26 09:41:12 +09:00
Vincent Torri
2ec9fdb932 [common] code clean up
use fmodf() instead of fmod()
2024-03-23 11:45:11 +09:00
vtorri
04977c43f1
[common] code clean up
use MATH_PI and MATH_PI2 instead of M_PI and M_PI_2
2024-03-22 23:48:25 +09:00
Jinny You
b3f09cab6b lottie: Support the slot reverting feature
Implemented the ability to revert Lottie slots by calling override with nullptr.
This functionality allows for the complete reversal of applied slots.

usage:
- `animation->override(nullptr)`

Co-Authored-By: Hermet Park <hermet@lottiefiles.com>
2024-03-21 16:56:28 +09:00
Hermet Park
b70520322f lottie/property: code refactoring
introduce the release() method for memory freeing.
This method can be used for any demands.
2024-03-21 16:56:28 +09:00
JunsuChoi
54f0ddcc2d loader/lottie: Prevent leak memory when image load fails
When image data fails to load or image parsing fails,
the id is leaked without being assigned to the name.
To prevent that, free id value when obj is nullptr.

related issue: https://github.com/thorvg/thorvg/issues/2072
BrokenLottie.7z/test3_IDX_130_RAND_18289244608080059871.json
BrokenLottie.7z/test3_IDX_131_RAND_7772102071213376276.json
BrokenLottie.7z/test3_IDX_132_RAND_3072617087893397532.json
BrokenLottie.7z/test3_IDX_134_RAND_17738488813555566674.json
BrokenLottie.7z/test3_IDX_137_RAND_13903188963759129023.json
BrokenLottie.7z/test3_IDX_138_RAND_1645404078965858130.json
2024-03-21 15:33:19 +09:00
Jinny You
dcdec440df lottie: Added gradient population preventing logic
`LottieGradient.populate` function checks whether the value has already been calculated and populated via the flag `populated`.
2024-03-21 12:00:41 +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
Jinny You
ba82ba08a8 lottie: Renamed function names with prefix
Fixed naming conflict in short names.

issue: #2062
2024-03-18 11:01:58 +09:00
Hermet Park
211f0dc9b6 lottie: fixed a compiler warning:
error: storing the address of local variable 'context' in '*this.LottieParser::context' [-Werror=dangling-pointer=]
 1255 |     this->context = &context;

issue: https://github.com/thorvg/thorvg/issues/2051
2024-03-15 02:10:56 +09:00
Jinny You
8146a6ef25 lottie/slot: Support overriding plural sids
Previously, slot overriding only works in single sid, the others are ignored.

This patch enables slot overriding for all sids within a single slot.
2024-03-12 11:40:09 +09:00
Hermet Park
5b76206540 lottie/slot: ++reliability 2024-03-07 13:26:18 +09:00
Hermet Park
60eec8353b lottie: fix potential memory leaks.
memory could be leaked during the slot property overriding.
2024-03-07 13:26:18 +09:00
Jinny You
449cee7cf0 lottie/api: specify clear result for override API
In case the given JSON is invalid, it's more closed to `Result::InvalidArguments`.
2024-03-06 17:32:02 +09:00
Hermet Park
103252642e lottie: code refactoring.
Maintains compact lines of code and functions without altering logic,
consistently prioritizing simplicity in software complexity metrics.
2024-03-03 14:04:34 +09:00