| Index: third_party/WebKit/Source/platform/graphics/paint/README.md | 
| diff --git a/third_party/WebKit/Source/platform/graphics/paint/README.md b/third_party/WebKit/Source/platform/graphics/paint/README.md | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..2de5acaa676fe4971a447ad98f86edca862c1216 | 
| --- /dev/null | 
| +++ b/third_party/WebKit/Source/platform/graphics/paint/README.md | 
| @@ -0,0 +1,115 @@ | 
| +# Platform paint code | 
| + | 
| +This directory contains the implementation of display lists and display | 
| +list-based painting, except for code which requires knowledge of `core/` | 
| +concepts, such as DOM elements and layout objects. | 
| + | 
| +This code is owned by the [paint team][paint-team-site]. | 
| + | 
| +Slimming Paint v2 is currently being implemented. Unlike Slimming Paint v1, SPv2 | 
| +represents its paint artifact not as a flat display list, but as a list of | 
| +drawings, and a list of paint chunks, stored together. | 
| + | 
| +This document explains the SPv2 world as it develops, not the SPv1 world it | 
| +replaces. | 
| + | 
| +[paint-team-site]: https://www.chromium.org/developers/paint-team | 
| + | 
| +## Paint artifact | 
| + | 
| +The SPv2 paint artifact consists of a list of display items (ideally mostly or | 
| +all drawings), partitioned into *paint chunks* which define certain *paint | 
| +properties* which affect how the content should be drawn or composited. | 
| + | 
| +## Paint properties | 
| + | 
| +Paint properties define characteristics of how a paint chunk should be drawn, | 
| +such as the transform it should be drawn with. To enable efficient updates, | 
| +a chunk's paint properties are described hierarchically. For instance, each | 
| +chunk is associated with a transform node, whose matrix should be multiplied by | 
| +its ancestor transform nodes in order to compute the final transformation matrix | 
| +to the screen. | 
| + | 
| +*** note | 
| +Support for all paint properties has yet to be implemented in SPv2. | 
| +*** | 
| + | 
| +*** aside | 
| +TODO(jbroman): Explain the semantics of transforms, clips, scrolls and effects | 
| +as support for them is added to SPv2. | 
| +*** | 
| + | 
| +## Display items | 
| + | 
| +A display item is the smallest unit of a display list in Blink. Each display | 
| +item is identified by an ID consisting of: | 
| + | 
| +* an opaque pointer to the *display item client* that produced it | 
| +* a type (from the `DisplayItem::Type` enum) | 
| +* a scope number | 
| + | 
| +*** aside | 
| +TODO(jbroman): Explain scope numbers. | 
| +*** | 
| + | 
| +In practice, display item clients are generally subclasses of `LayoutObject`, | 
| +but can be other Blink objects which get painted, such as inline boxes and drag | 
| +images. | 
| + | 
| +*** note | 
| +It is illegal for there to be two drawings with the same ID in a display item | 
| +list. | 
| +*** | 
| + | 
| +Generally, clients of this code should use stack-allocated recorder classes to | 
| +emit display items to a `DisplayItemList` (using `GraphicsContext`). | 
| + | 
| +### Standalone display items | 
| + | 
| +#### [CachedDisplayItem](CachedDisplayItem.h) | 
| + | 
| +The type `DisplayItem::CachedSubsequence` indicates that the previous frame's | 
| +display item list contains a contiguous sequence of display items which should | 
| +be reused in place of this `CachedDisplayItem`. | 
| + | 
| +*** note | 
| +Support for cached subsequences for SPv2 is planned, but not yet fully | 
| +implemented. | 
| +*** | 
| + | 
| +Other cached display items refer to a single `DrawingDisplayItem` with a | 
| +corresponding type which should be reused in place of this `CachedDisplayItem`. | 
| + | 
| +#### [DrawingDisplayItem](DrawingDisplayItem.h) | 
| + | 
| +Holds an `SkPicture` which contains the Skia commands required to draw some atom | 
| +of content. | 
| + | 
| +### Paired begin/end display items | 
| + | 
| +*** aside | 
| +TODO(jbroman): Describe how these work, once we've worked out what happens to | 
| +them in SPv2. | 
| +*** | 
| + | 
| +## Display item list | 
| + | 
| +Callers use `GraphicsContext` (via its drawing methods, and its | 
| +`displayItemList()` accessor) and scoped recorder classes, which emit items into | 
| +a `DisplayItemList`. | 
| + | 
| +`DisplayItemList` is responsible for producing the paint artifact. It contains | 
| +the *current* paint artifact, which is always complete (i.e. it has no | 
| +`CachedDisplayItem` objects), and *new* display items and paint chunks, which | 
| +are added as content is painted. | 
| + | 
| +When the new display items have been populated, clients call | 
| +`commitNewDisplayItems`, which merges the previous artifact with the new data, | 
| +producing a new paint artifact, where `CachedDisplayItem` objects have been | 
| +replaced with the cached content from the previous artifact. | 
| + | 
| +At this point, the paint artifact is ready to be drawn or composited. | 
| + | 
| +*** aside | 
| +TODO(jbroman): Explain invalidation. | 
| +*** | 
|  |