OLD | NEW |
(Empty) | |
| 1 # `Source/core/paint` |
| 2 |
| 3 This directory contains implementation of painters of layout objects. |
| 4 |
| 5 ## Painters |
| 6 |
| 7 ## Paint invalidation |
| 8 |
| 9 Paint invalidation marks anything that need to be painted differently from the o
riginal |
| 10 cached painting. |
| 11 |
| 12 ### Slimming paint v1 |
| 13 |
| 14 Though described in this document, most of the actual paint invalidation code is
under |
| 15 `Source/core/layout`. |
| 16 |
| 17 Paint invalidation is a document cycle stage after compositing update and before
paint. |
| 18 During the previous stages, objects are marked for needing paint invalidation ch
ecking |
| 19 if needed by style change, layout change, compositing change, etc. In paint inva
lidation stage, |
| 20 we traverse the layout tree for marked subtrees and objects and send the followi
ng information |
| 21 to `GraphicsLayer`s and `PaintController`s: |
| 22 |
| 23 * paint invalidation rects: must cover all areas that will generete different
pixels. |
| 24 * invalidated display item clients: must invalidate all display item clients t
hat will |
| 25 generate different display items. |
| 26 |
| 27 ### Paint invalidation of texts |
| 28 |
| 29 Texts are painted by `InlineTextBoxPainter` using `InlineTextBox` as display ite
m client. |
| 30 Text backgrounds and masks are painted by `InlineTextFlowPainter` using `InlineF
lowBox` |
| 31 as display item client. We should invalidate these display item clients when the
ir painting |
| 32 will change. |
| 33 |
| 34 `LayoutInline`s and `LayoutText`s are marked for full paint invalidation if need
ed when |
| 35 new style is set on them. During paint invalidation, we invalidate the `InlineFl
owBox`s |
| 36 directly contained by the `LayoutInline` in `LayoutInline::invalidateDisplayItem
Clients()` and |
| 37 `InlineTextBox`s contained by the `LayoutText` in `LayoutText::invalidateDisplay
ItemClients()`. |
| 38 We don't need to traverse into the subtree of `InlineFlowBox`s in `LayoutInline:
:invalidateDisplayItemClients()` |
| 39 because the descendant `InlineFlowBox`s and `InlineTextBox`s will be handled by
their |
| 40 owning `LayoutInline`s and `LayoutText`s, respectively, when changed style is pr
opagated. |
| 41 |
| 42 ### Specialty of `::first-line` |
| 43 |
| 44 `::first-line` pseudo style dynamically applies to all `InlineBox`'s in the firs
t line in the |
| 45 block having `::first-line` style. The actual applied style is computed from the
`::first-line` |
| 46 style and other applicable styles. |
| 47 |
| 48 If the first line contains any `LayoutInline`, we compute the style from the `::
first-line` style |
| 49 and the style of the `LayoutInline` and apply the computed style to the first li
ne part of the |
| 50 `LayoutInline`. In blink's style implementation, the combined first line style o
f `LayoutInline` |
| 51 is identified with `FIRST_LINE_INHERITED` pseudo ID. |
| 52 |
| 53 The normal paint invalidation of texts doesn't work for first line because |
| 54 * `ComputedStyle::visualInvalidationDiff()` can't detect first line style chan
ges; |
| 55 * The normal paint invalidation is based on whole LayoutObject's, not aware of
the first line. |
| 56 |
| 57 We have a special path for first line style change: the style system informs the
layout system |
| 58 when the computed first-line style changes through `LayoutObject::firstLineStyle
DidChange()`. |
| 59 When this happens, we invalidate all `InlineBox`es in the first line. |
| 60 |
| 61 ### Slimming paint v2 |
| 62 |
| 63 TODO(wangxianzhu): add details |
OLD | NEW |