Integrated: 8332895: Support interpolation for backgrounds and borders

Michael Strauß mstrauss at openjdk.org
Tue Oct 1 19:33:51 UTC 2024


On Tue, 30 Jul 2024 16:03:46 GMT, Michael Strauß <mstrauss at 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ß <mstrauss at 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


More information about the openjfx-dev mailing list