blob: 3ca2dd902ac85243399bfdec45ef5c09c1c400b4 [file] [view]
# CSS Paint API
This directory contains the implementation of the CSS Paint API.
See [CSS Paint API](https://drafts.css-houdini.org/css-paint-api/) for the web exposed APIs this
implements.
## Implementation
### [CSSPaintDefinition](CSSPaintDefinition.h)
Represents a class registered by the author through `PaintWorkletGlobalScope#registerPaint`.
Specifically this class holds onto the javascript constructor and paint functions of the class via
persistent handles. This class keeps these functions alive so they don't get garbage collected.
The `CSSPaintDefinition` also holds onto an instance of the paint class via a persistent handle. This
instance is lazily created upon first use. If the constructor throws for some reason the constructor
is marked as invalid and will always produce invalid images.
The `PaintWorkletGlobalScope` has a map of paint `name` to `CSSPaintDefinition`.
### [CSSPaintImageGenerator][generator] and [CSSPaintImageGeneratorImpl][generator-impl]
`CSSPaintImageGenerator` represents the interface from which the `CSSPaintValue` can generate
`Image`s. This is done via the `CSSPaintImageGenerator#paint` method. Each `CSSPaintValue` owns a
separate instance of `CSSPaintImageGenerator`.
`CSSPaintImageGeneratorImpl` is the implementation which lives in `modules/csspaint`. (We have this
interface / implementation split as `core/` cannot depend on `modules/`).
When created the generator will access its paint worklet and lookup it's corresponding
`CSSPaintDefinition` via `PaintWorkletGlobalScope#findDefinition`.
If the paint worklet does not have a `CSSPaintDefinition` matching the paint `name` the
`CSSPaintImageGeneratorImpl` is placed in a "pending" map. Once a paint class with `name` is
registered the generator is notified so it can invalidate an display the correct image.
[generator]: ../../core/css/CSSPaintImageGenerator.h
[generator-impl]: CSSPaintImageGeneratorImpl.h
[paint-value]: ../../core/css/CSSPaintValue.h
### Generating a [PaintGeneratedImage](../../platform/graphics/PaintGeneratedImage.h)
`PaintGeneratedImage` is a `Image` which just paints a single `SkPicture`.
A `CSSPaintValue` can generate an image from the method `CSSPaintImageGenerator#paint`. This method
calls through to `CSSPaintDefinition#paint` which actually invokes the javascript paint method.
This method returns the `PaintGeneratedImage`.
The `SkPicture` is produced from a `RecordingImageBufferSurface`.
### Style Invalidation
The `CSSPaintDefinition` keeps a list of both native and custom properties it will invalidate on.
During style invalidation `ComputedStyle` checks if it has any `CSSPaintValue`s, and if any of their
properties have changed; if so it will invalidate paint for that `ComputedStyle`.
If the `CSSPaintValue` doesn't have a corresponding `CSSPaintDefinition` yet, it doesn't invalidate
paint.
## Testing
Tests live [here](../../../LayoutTests/csspaint/).