---
# System prepended metadata

title: Paint Helper Class
tags: [Chromium-Graphics, elkurin-daily-note]

---

# Paint Helper Class

Painting is a complex operation. In chromium, there are many helper classes used here.  
[View::Paint](https://source.chromium.org/chromium/chromium/src/+/main:ui/views/view.cc;l=1172;drc=abbfc06e9b070c9ea64af2b233624646cef00252) is responsible for painting stuff, so let's check the methods used inside here.

## PaintInfo
[PaintInfo](https://source.chromium.org/chromium/chromium/src/+/main:ui/views/paint_info.h) is a class which manages the context for [View::Paint](https://source.chromium.org/chromium/chromium/src/+/main:ui/views/view.cc;l=1172;drc=abbfc06e9b070c9ea64af2b233624646cef00252).  
PaintInfo is passed to View::Paint method itself, but there seems to be nothing special here. This class just stores a data to paint.

It stores
- paint_recording_scale_x_
- paint_recording_scale_y_
- paint_recording_bounds_
- offset_from_parent_
- context_
- root_context_

`paint_recording_bounds_` is relative to the root PaintInfo.  
Some methods inside this such as GetSnappedRecordingBounds converts the position into the correct coordinates.

## ClipRecorder
[CliipRecorder](https://source.chromium.org/chromium/chromium/src/+/main:ui/compositor/clip_recorder.h;l=25;drc=abbfc06e9b070c9ea64af2b233624646cef00252) class provides a scoped clip. It conveys the clip info to the children.

[ClipRect](https://source.chromium.org/chromium/chromium/src/+/main:ui/compositor/clip_recorder.cc;l=30;drc=cf5c86ba22fcf6752ba8c5af6cde8bbc04e8e67f) specifies the `clip_rect` value and set it to [cc::DisplayItemList](https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/display_item_list.h;l=50;drc=abbfc06e9b070c9ea64af2b233624646cef00252) as [ClipRectOp](https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/paint_op.h;l=342;drc=abbfc06e9b070c9ea64af2b233624646cef00252).  
It will perform the clipping against all DisplayItems added to this list.

### [cc::DisplayItemList](https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/display_item_list.h;l=50;drc=abbfc06e9b070c9ea64af2b233624646cef00252)
[cc::DisplayItemList](https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/display_item_list.h;l=50;drc=abbfc06e9b070c9ea64af2b233624646cef00252) is a container of paint operations.  
The operations are stored as [PaintOpBuffer](https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/display_item_list.h;l=223;drc=abbfc06e9b070c9ea64af2b233624646cef00252)

## PaintRecorder
[PaintRecorder](https://source.chromium.org/chromium/chromium/src/+/main:ui/compositor/paint_recorder.h;l=27;drc=abbfc06e9b070c9ea64af2b233624646cef00252) is used to hide the complexity behind setting up a recording into a DisplayItem.  
~Recorder classes are a wrapper of DisplayItemList.

It records a refernce to [PaintContext](https://source.chromium.org/chromium/chromium/src/+/main:ui/compositor/paint_context.h;l=22;drc=abbfc06e9b070c9ea64af2b233624646cef00252) which hols [DisplayItemList](https://source.chromium.org/chromium/chromium/src/+/main:ui/compositor/paint_context.h;l=93;drc=abbfc06e9b070c9ea64af2b233624646cef00252).

## Paint methods in View
There are [four methods](https://source.chromium.org/chromium/chromium/src/+/main:ui/views/view.cc;l=2293-2316;drc=abbfc06e9b070c9ea64af2b233624646cef00252) implemented in view.
- PaintChildren
- OnPaint
- OnPaintBackground
- OnPintBorder

[Paint](https://source.chromium.org/chromium/chromium/src/+/main:ui/views/view.cc;l=1172;drc=abbfc06e9b070c9ea64af2b233624646cef00252) triggers [OnPaint](https://source.chromium.org/chromium/chromium/src/+/main:ui/views/view.cc;l=2298;drc=abbfc06e9b070c9ea64af2b233624646cef00252) after manipulating ClipRecorder, TranformRecorder and PaintRecorder. It implies that OnPaint is called after the content is painted.  
Inside OnPaint, it calls [OnPaintBackground](https://source.chromium.org/chromium/chromium/src/+/main:ui/views/view.cc;l=2304;drc=abbfc06e9b070c9ea64af2b233624646cef00252) and [OnPaintBorder](https://source.chromium.org/chromium/chromium/src/+/main:ui/views/view.cc;l=2311;drc=abbfc06e9b070c9ea64af2b233624646cef00252).  
Each of them interacts with [`background_`](https://source.chromium.org/chromium/chromium/src/+/main:ui/views/view.h;l=2275;drc=abbfc06e9b070c9ea64af2b233624646cef00252) and [`border_`](https://source.chromium.org/chromium/chromium/src/+/main:ui/views/view.h;l=2271;drc=abbfc06e9b070c9ea64af2b233624646cef00252) and call Paint for those views.  
This painting is completed when all children views are done.