On Tue, 30 Jul 2024 16:03:46 GMT, Michael Strauß <mstra...@openjdk.org> wrote:

> This PR completes the CSS Transitions story (see #870) by adding 
> interpolation support for backgrounds and borders, making them targetable by 
> transitions.
> 
> `Background` and `Border` objects are deeply immutable, but not 
> interpolatable. Consider the following `Background`, which describes the 
> background of a `Region`:
> 
> 
> Background {
>     fills = [
>         BackgroundFill {
>             fill = Color.RED
>         }
>     ]
> }
> 
> 
> Since backgrounds are deeply immutable, changing the region's background to 
> another color requires the construction of a new `Background`, containing a 
> new `BackgroundFill`, containing the new `Color`.
> 
> Animating the background color using a CSS transition therefore requires the 
> entire Background object graph to be interpolatable in order to generate 
> intermediate backgrounds.
> 
> More specifically, the following types will now implement `Interpolatable`.
> 
> - `Insets`
> - `Background`
> - `BackgroundFill`
> - `BackgroundImage`
> - `BackgroundPosition`
> - `BackgroundSize`
> - `Border`
> - `BorderImage`
> - `BorderStroke`
> - `BorderWidths`
> - `CornerRadii`
> - `Stop`
> - `Paint` and all of its subclasses
> - `Margins` (internal type)
> - `BorderImageSlices` (internal type)
> 
> ## Interpolation of composite objects
> 
> As of now, only `Color`, `Point2D`, and `Point3D` are interpolatable. Each of 
> these classes is an aggregate of `double` values, which are combined using 
> linear interpolation. However, many of the new interpolatable classes 
> comprise of not only `double` values, but a whole range of other types. This 
> requires us to more precisely define what we mean by "interpolation".
> 
> Mirroring the CSS specification, the `Interpolatable` interface defines 
> several types of component interpolation:
> 
> | Interpolation type | Description |
> |---|---|
> | default | Component types that implement `Interpolatable` are interpolated 
> by calling the `interpolate(Object, double)}` method. |
> | linear | Two components are combined by linear interpolation such that `t = 
> 0` produces the start value, and `t = 1` produces the end value. This 
> interpolation type is usually applicable for numeric components. |
> | discrete | If two components cannot be meaningfully combined, the 
> intermediate component value is equal to the start value for `t < 0.5` and 
> equal to the end value for `t >= 0.5`. |
> | pairwise | Two lists are combined by pairwise interpolation. If the start 
> list has fewer elements than the target list, the missing elements are copied 
> from the target list. If the start list has more elements than the ...

This pull request has now been integrated.

Changeset: 01e9e7ea
Author:    Michael Strauß <mstra...@openjdk.org>
URL:       
https://git.openjdk.org/jfx/commit/01e9e7eadb21aabc801d4764ed5bd5e3de8d451b
Stats:     6718 lines in 77 files changed: 5851 ins; 371 del; 496 mod

8332895: Support interpolation for backgrounds and borders
8226911: Interpolatable's contract should be reexamined

Reviewed-by: angorya, jhendrikx, nlisker, kcr

-------------

PR: https://git.openjdk.org/jfx/pull/1522

Reply via email to