Index: ui/views/view.cc |
diff --git a/ui/views/view.cc b/ui/views/view.cc |
index da1491dd6de2e633432815af2cc363c60c4eadef..387363a855348aa5dfc15801fc72b7a4d7b14a3f 100644 |
--- a/ui/views/view.cc |
+++ b/ui/views/view.cc |
@@ -24,6 +24,7 @@ |
#include "ui/compositor/layer.h" |
#include "ui/compositor/layer_animator.h" |
#include "ui/compositor/paint_context.h" |
+#include "ui/compositor/paint_recorder.h" |
#include "ui/events/event_target_iterator.h" |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/geometry/point3_f.h" |
@@ -774,16 +775,18 @@ void View::Paint(const ui::PaintContext& parent_context) { |
TRACE_EVENT1("views", "View::Paint", "class", GetClassName()); |
- gfx::Canvas* canvas = context.canvas(); |
- gfx::ScopedCanvas scoped_canvas(canvas); |
- |
// If the view is backed by a layer, it should paint with itself as the origin |
// rather than relative to its parent. |
- if (!layer()) { |
+ bool paint_relative_to_parent = !layer(); |
+ if (paint_relative_to_parent) { |
// Set the clip rect to the bounds of this View. Note that the X (or left) |
// position we pass to ClipRect takes into consideration whether or not the |
// View uses a right-to-left layout so that we paint the View in its |
// mirrored position if need be. |
+ ui::PaintRecorder recorder(context); |
+ gfx::Canvas* canvas = recorder.canvas(); |
+ canvas->Save(); |
+ |
gfx::Rect clip_rect = bounds(); |
clip_rect.Inset(clip_insets_); |
if (parent_) |
@@ -797,12 +800,15 @@ void View::Paint(const ui::PaintContext& parent_context) { |
} |
{ |
+ ui::PaintRecorder recorder(context); |
+ gfx::Canvas* canvas = recorder.canvas(); |
+ gfx::ScopedCanvas scoped_canvas(canvas); |
+ |
// If the View we are about to paint requested the canvas to be flipped, we |
// should change the transform appropriately. |
// The canvas mirroring is undone once the View is done painting so that we |
// don't pass the canvas with the mirrored transform to Views that didn't |
// request the canvas to be flipped. |
- gfx::ScopedCanvas scoped(canvas); |
if (FlipCanvasOnPaintForRTLUI()) { |
canvas->Translate(gfx::Vector2d(width(), 0)); |
canvas->Scale(-1, 1); |
@@ -812,7 +818,13 @@ void View::Paint(const ui::PaintContext& parent_context) { |
OnPaint(canvas); |
} |
+ // View::Paint recursion over the subtree. |
PaintChildren(context); |
+ |
+ if (paint_relative_to_parent) { |
+ ui::PaintRecorder recorder(context); |
+ recorder.canvas()->Restore(); |
+ } |
} |
void View::set_background(Background* b) { |