Chromium Code Reviews| Index: ui/views/view.cc |
| diff --git a/ui/views/view.cc b/ui/views/view.cc |
| index 996b5483a5a29861dbcad0df0d1ad5ff26ba8673..5373566d42224ed55b6b4987ab7bd881c3ceb576 100644 |
| --- a/ui/views/view.cc |
| +++ b/ui/views/view.cc |
| @@ -764,64 +764,66 @@ void View::SchedulePaintInRect(const gfx::Rect& rect) { |
| } |
| void View::Paint(gfx::Canvas* canvas, const CullSet& cull_set) { |
| + if (!visible_) |
| + return; |
| // The cull_set may allow us to skip painting without canvas construction or |
| // even canvas rect intersection. |
| - if (cull_set.ShouldPaint(this)) { |
| - TRACE_EVENT1("views", "View::Paint", "class", GetClassName()); |
| - |
| - gfx::ScopedCanvas scoped_canvas(canvas); |
| - |
| - // Paint this View and its children, setting the clip rect to the bounds |
| - // of this View and translating the origin to the local bounds' top left |
| - // point. |
| - // |
| - // Note that the X (or left) position we pass to ClipRectInt takes into |
| - // consideration whether or not the view uses a right-to-left layout so that |
| - // we paint our view in its mirrored position if need be. |
| - gfx::Rect clip_rect = bounds(); |
| - clip_rect.Inset(clip_insets_); |
| - if (parent_) |
| - clip_rect.set_x(parent_->GetMirroredXForRect(clip_rect)); |
| - canvas->ClipRect(clip_rect); |
| - if (canvas->IsClipEmpty()) |
| - return; |
| + if (!cull_set.ShouldPaint(this)) |
| + return; |
| - // Non-empty clip, translate the graphics such that 0,0 corresponds to where |
| - // this view is located (related to its parent). |
| - canvas->Translate(GetMirroredPosition().OffsetFromOrigin()); |
| - canvas->Transform(GetTransform()); |
| + TRACE_EVENT1("views", "View::Paint", "class", GetClassName()); |
| - // If we are a paint root, we need to construct our own CullSet object for |
| - // propagation to our children. |
| - if (IsPaintRoot()) { |
| - if (!bounds_tree_) |
| - bounds_tree_.reset(new BoundsTree(2, 5)); |
| + gfx::ScopedCanvas scoped_canvas(canvas); |
| - // Recompute our bounds tree as needed. |
| - UpdateRootBounds(bounds_tree_.get(), gfx::Vector2d()); |
| + // Paint this View and its children, setting the clip rect to the bounds |
| + // of this View and translating the origin to the local bounds' top left |
| + // point. |
| + // |
| + // Note that the X (or left) position we pass to ClipRectInt takes into |
| + // consideration whether or not the view uses a right-to-left layout so that |
| + // we paint our view in its mirrored position if need be. |
| + gfx::Rect clip_rect = bounds(); |
| + clip_rect.Inset(clip_insets_); |
| + if (parent_) |
| + clip_rect.set_x(parent_->GetMirroredXForRect(clip_rect)); |
| + canvas->ClipRect(clip_rect); |
| + if (canvas->IsClipEmpty()) |
| + return; |
| - // Grab the clip rect from the supplied canvas to use as the query rect. |
| - gfx::Rect canvas_bounds; |
| - if (!canvas->GetClipBounds(&canvas_bounds)) { |
| - NOTREACHED() << "Failed to get clip bounds from the canvas!"; |
| - return; |
| - } |
| + // Non-empty clip, translate the graphics such that 0,0 corresponds to where |
| + // this view is located (related to its parent). |
| + canvas->Translate(GetMirroredPosition().OffsetFromOrigin()); |
| + canvas->Transform(GetTransform()); |
| - // Now query our bounds_tree_ for a set of damaged views that intersect |
| - // our canvas bounds. |
| - scoped_ptr<base::hash_set<intptr_t> > damaged_views( |
| - new base::hash_set<intptr_t>()); |
| - bounds_tree_->AppendIntersectingRecords( |
| - canvas_bounds, damaged_views.get()); |
| - // Construct a CullSet to wrap the damaged views set, it will delete it |
| - // for us on scope exit. |
| - CullSet paint_root_cull_set(damaged_views.Pass()); |
| - // Paint all descendents using our new cull set. |
| - PaintCommon(canvas, paint_root_cull_set); |
| - } else { |
| - // Not a paint root, so we can proceed as normal. |
| - PaintCommon(canvas, cull_set); |
| + // If we are a paint root, we need to construct our own CullSet object for |
| + // propagation to our children. |
| + if (IsPaintRoot()) { |
| + if (!bounds_tree_) |
| + bounds_tree_.reset(new BoundsTree(2, 5)); |
| + |
| + // Recompute our bounds tree as needed. |
| + UpdateRootBounds(bounds_tree_.get(), gfx::Vector2d()); |
| + |
| + // Grab the clip rect from the supplied canvas to use as the query rect. |
| + gfx::Rect canvas_bounds; |
| + if (!canvas->GetClipBounds(&canvas_bounds)) { |
| + NOTREACHED() << "Failed to get clip bounds from the canvas!"; |
| + return; |
| } |
| + |
| + // Now query our bounds_tree_ for a set of damaged views that intersect |
| + // our canvas bounds. |
| + scoped_ptr<base::hash_set<intptr_t>> damaged_views( |
| + new base::hash_set<intptr_t>()); |
| + bounds_tree_->AppendIntersectingRecords(canvas_bounds, damaged_views.get()); |
| + // Construct a CullSet to wrap the damaged views set, it will delete it |
| + // for us on scope exit. |
| + CullSet paint_root_cull_set(damaged_views.Pass()); |
| + // Paint all descendents using our new cull set. |
| + PaintCommon(canvas, paint_root_cull_set); |
| + } else { |
| + // Not a paint root, so we can proceed as normal. |
| + PaintCommon(canvas, cull_set); |
| } |
| } |
| @@ -1462,6 +1464,8 @@ void View::UpdateChildLayerBounds(const gfx::Vector2d& offset) { |
| } |
| void View::OnPaintLayer(gfx::Canvas* canvas) { |
| + if (!visible_) |
|
sky
2015/03/24 22:11:21
I'm tempted to say this should be a DCHECK, but it
danakj
2015/03/24 22:15:20
It would get garbage if it claimed to be opaque "s
|
| + return; |
| if (!layer() || !layer()->fills_bounds_opaquely()) |
| canvas->DrawColor(SK_ColorBLACK, SkXfermode::kClear_Mode); |
| PaintCommon(canvas, CullSet()); |
| @@ -1748,9 +1752,6 @@ void View::SchedulePaintBoundsChanged(SchedulePaintType type) { |
| } |
| void View::PaintCommon(gfx::Canvas* canvas, const CullSet& cull_set) { |
| - if (!visible_) |
| - return; |
| - |
| { |
| // If the View we are about to paint requested the canvas to be flipped, we |
| // should change the transform appropriately. |