Commit graph

839 commits

Author SHA1 Message Date
Hermet Park
5c48127012 lottie: code clean up
- remove an unused return value.
- move bodies from header to implementation file.
- no logical changes.
2024-06-24 14:29:29 +09:00
Mira Grudzinska
3691ada265 lottie: fix build error without extras
After introducing roundness support, the build
process did not ensure proper compilation
for the case without expression support.
2024-06-24 14:19:28 +09:00
Hermet Park
bcc8dd4f09 lottie: keep the code clean and neat.
- Separate the rounded corner logic from the updateStar
  since its logic has become too lengthy and complicated.
- Revise the path generation to eliminate duplicates.
2024-06-24 14:19:19 +09:00
Mira Grudzinska
47e1d48b28 lottie: implement skew transformation
Added support for skew transformation by
a specified angle around a specified axis.
Applied to layers and shapes, not to repeaters.

@Issue: https://github.com/thorvg/thorvg/issues/2262
2024-06-24 14:19:11 +09:00
Mira Grudzinska
4daaa16384 lottie: fix access violation while updating
Fix access issue when iterating over children
in case of an empty container.

@Issue: https://github.com/thorvg/thorvg/issues/2283
2024-06-24 14:17:21 +09:00
Hermet Park
9ad992a958 lottie: fix compiler warnings. [-Wsign-compare] 2024-06-24 14:17:14 +09:00
Mira Grudzinska
6dc8a3b093 lottie: handle roundness in path
Implemented rounding of corners between
bezier curves that are straight lines.

@Issue: https://github.com/thorvg/thorvg/issues/2230
2024-06-24 14:16:45 +09:00
Mira Grudzinska
0fb37ea195 lottie: support rounded stars
Implementation of the roundness property
for a polystar. Only the corners that were
not subject to rounding by the inner or
outer roundness parameters are affected.

@Issue: https://github.com/thorvg/thorvg/issues/2230
2024-06-24 14:14:16 +09:00
Hermet Park
827a00b076 animation/lottie: improved the precision of frame values.
Refined the logic for updating frame numbers
to ensure greater accuracy in value precision.

issue: https://github.com/thorvg/thorvg/issues/2266
2024-06-24 14:12:00 +09:00
Jinny You
f00d3b5627 lottie/slot: Fix slot resetting bug
When resetting back to animated property, system causes an UAF because frames have been freed.

Mark frames in nullptr at the case, so it doesn't use frame data after freed.

Issue: #2255
2024-06-24 14:11:48 +09:00
Hermet Park
eeb06870a0 lottie: fixed a memory leak
Free the children data properly,
rarely observerd this, only when a layer is hidden.
2024-06-24 12:36:47 +09:00
Hermet Park
293d0ef037 lottie: code refactoring.
text tracking is an optional property.
it's good to initialize it with 0.
2024-06-24 12:36:23 +09:00
Jinny You
45b3583ad2 lottie/text: Support text tracking
Text Tracking value("tr") is parsed and never used.

Calculate text spacing size via the tracking offset.

Issue: #2254
2024-06-24 12:36:14 +09:00
Mira Grudzinska
dcf6ebcf18 svg_loader: move the display property to the style
The display property, like any other node's style property,
should be part of a node style. This ensures its correct
copying and inheritance.
For the 'symbol' node, which is not rendered unless it is
used within a 'use' node, the display property can also be
applied. Because of that it cannot be utilized during scene
construction to determine whether the symbol is being defined
or used within a 'use' context.
2024-06-24 12:35:42 +09:00
Hermet Park
c614efec3d lottie/expressions: fix a build break on windows. 2024-06-24 12:35:33 +09:00
Hermet Park
89d0f44eb9 lottie/expressions: fixed a memory access violation.
Reset memory after freeing the singletone instance.
2024-06-24 12:35:27 +09:00
Mira Grudzinska
eedfc707f8 svg_loader: improved clarity, no logical changes
Unnecessary structure removed, typos corrected,
comment added, an unused function argument removed.
2024-06-24 12:34:42 +09:00
Mira Grudzinska
7779912219 svg_loader: paintOrder property properly copied
The paintOrder property set by the style was
not being copied. Now fixed.
2024-06-24 12:33:33 +09:00
Hermet Park
1fced1905d lottie/expressions: minor size down expressions engine.
- disable unused builtin realm functions.
- disable global this
- disable regexp (potential)
- disable unicode case conversion (potential)

Some features are marked with (potential)
since we are not certain these are used practically.

until now, total binary size diff by expressions: +287kb
2024-06-24 12:33:19 +09:00
Hermet Park
7f1fbdcaa4 lottie/expressions: ++exceptional handling
Stop handling if the interpreting result is invalid.
2024-06-24 12:33:04 +09:00
Hermet Park
9cff11f25e lottie/expressions: apply expressions to missing properites. 2024-06-24 12:32:57 +09:00
Hermet Park
027e0fd6f0 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-06-24 12:32:14 +09:00
Hermet Park
fca4ef3109 lottie/expressions: ++exceptional handling.
Add an exceptional handling if interpreting code is failed.
2024-06-24 12:32:06 +09:00
Hermet Park
ac477d6896 lottie/expressions: make it up the insufficient content() behavior
this is a follow-up fix for the initial expressions feature.
2024-06-24 12:31:58 +09:00
Hermet Park
10c07476c6 lottie: fix a logic by a mistake. 2024-06-24 12:31:48 +09:00
Hermet Park
d80b9969de lottie/jerryscript - size down the engine.
get rid of unused features in thorvg lottie.
2024-06-24 12:29:29 +09:00
Hermet Park
709ef9158f 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-06-24 12:29:17 +09:00
Hermet Park
a685ed5ce5 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-06-24 12:28:09 +09:00
Hermet Park
09a45b007e lottie: ++binary search stability.
this ensures that the return value is not below 0,
when the frame count is just 2.
2024-06-24 12:28:01 +09:00
Hermet Park
060f858568 lottie: specify the explicit parsing type.
these explicit type values are expected
to be referenced by the expressions.
2024-06-24 12:27:52 +09:00
Hermet Park
acd42f3bfa lottie: generalize parent context access in parsing.
ensure parent context is generally accessible,
not limited to gradients.
2024-06-24 12:27:45 +09:00
Hermet Park
625a5ca747 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-06-24 12:27:26 +09:00
Jinny You
7ecd90810d lottie: correct the text alignment
When the Lottie Text Justify sets to center, text alignment should also be center.
2024-06-24 12:24:04 +09:00
JunsuChoi
dca857d129 loader/svg: Check current graphics node that not closed
If any of the graphics nodes are not closed,
the graphics nodes between them are ignored.

related issue: https://github.com/thorvg/thorvg/issues/2210
2024-06-24 12:23:57 +09:00
JunsuChoi
6f6f311bb7 loader/svg: If link string is empty, not create picture object
An empty link causes the wrong loader to be found and causes various problems.

related issue : https://github.com/thorvg/thorvg/issues/2078#issuecomment-2067726046
2024-06-24 12:23:51 +09:00
Mira Grudzinska
4a8148f147 svg_loader: fix opacity cloning
The opacity value should be copied along
with other node properties.
2024-06-24 12:23:29 +09:00
Mira Grudzinska
81228855f9 svg_loader: copy display property
The display property was not copied along with other
node properties. This caused incorrect rendering
of an object with display=none if accessed through
a use tag.
2024-06-24 12:21:50 +09:00
Mira Grudzinska
4316dd2620 svg_loader: correct polygon's points loading
Only an even number of correctly read points defining
a polygon should be loaded and passed on for rendering.
Any remaining points should be ignored.
2024-06-24 12:21:44 +09:00
Mira Grudzinska
c5266725d4 Revert "loader/svg: Skip to invalid polygon"
This reverts commit 75e587a9a9.
If incorrect data for the points in a polygon is provided,
the element should still be rendered, but only up to the point
where the error occurs—using an even number of the points that
have been successfully loaded.
2024-06-24 12:21:38 +09:00
Mira Grudzinska
cc92865634 build: enforcing saver/loader usage for given tool
Selecting a tool without choosing the required tools
resulted in a usage error. Now, the activation
of the appropriate saver/loader for a given tool
is enforced.
2024-06-24 12:21:10 +09:00
Hermet Park
39e9d6b583 lottie: code clean up 2024-06-24 12:18:16 +09:00
Jinny You
557de3eb40 lottie/loader: Fix crash when parsing error
When parsing error, lottie loader raises runtime crash.
Check whether the composition is nullptr.
2024-06-24 12:17:59 +09:00
JunsuChoi
c69049ad78 loader/svg: Return actual decoded size
Returns the actual length of the decoded array.

related issue: https://github.com/thorvg/thorvg/issues/2156
2024-06-24 12:17:51 +09:00
Hermet Park
0c12e662e4 lottie: ++stability
ensure that the loading has been completed before overriding.
2024-06-24 12:12:56 +09:00
JunsuChoi
db1107c41b loader/svg: Add null to the end of data
Because memcpy() is not guaranteed to copy null at the end of the data array,
it increase the size by 1 and add null
This prevents invalid access of string functions in parser.
2024-06-24 12:12:40 +09:00
Hermet Park
c7d51ad0bb lottie: code refactoring.
make it neat and clean.
2024-06-24 12:12:26 +09:00
Hermet Park
bfed28e86e common: code refactoring
introduced mathDeg2Rad() and mathRad2Deg() for a common implementation.
2024-06-24 12:12:19 +09:00
Hermet Park
026d85f6a8 lottie: code refactoring.
keep the coding style.
2024-06-24 12:05:59 +09:00
Lucas Niu
194bd8f01d 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-06-24 12:00:25 +09:00
JunsuChoi
6a03c4c2c1 loader/svg: Ignore unrecognized commands following 'z'
If the command after `m` is not recognized, it must be recognized as `l` or `L`.
However, if it is not recognized after ending with `z`, all commands after it are ignored.

```
<svg width="100" version="1.0" xmlns="http://www.w3.org/2000/svg" height="100" xmlns:xlink="http://www.w3.org/1999/xlink">

<path style="stroke:#F00" d="m 20,20 0,50 50 0 -50 -50 z  70,70 0,50 50 0 -50 -50 z  "/>

</svg>
```
2024-06-24 11:59:55 +09:00