Index: ui/compositor/clip_recorder.cc |
diff --git a/ui/compositor/clip_recorder.cc b/ui/compositor/clip_recorder.cc |
index e4668032d68a35aaa3c0ab403d626accd15071fb..0a3bc15ea981b7f3bd44119f774c3883767380a5 100644 |
--- a/ui/compositor/clip_recorder.cc |
+++ b/ui/compositor/clip_recorder.cc |
@@ -9,29 +9,36 @@ |
#include "cc/playback/display_item_list.h" |
#include "ui/compositor/paint_context.h" |
#include "ui/gfx/canvas.h" |
+#include "ui/gfx/geometry/rect.h" |
#include "ui/gfx/path.h" |
namespace ui { |
-ClipRecorder::ClipRecorder(const PaintContext& context) |
- : context_(context), num_closers_(0) { |
-} |
+ClipRecorder::ClipRecorder(const PaintContext& context, |
+ const gfx::Size& size_in_layer) |
+ : context_(context), |
+ bounds_in_layer_(context.ToLayerSpaceBounds(size_in_layer)), |
+ num_closers_(0) {} |
ClipRecorder::~ClipRecorder() { |
for (size_t i = num_closers_; i > 0; --i) { |
switch (closers_[i - 1]) { |
case CLIP_RECT: |
- context_.list_->CreateAndAppendItem<cc::EndClipDisplayItem>(); |
+ context_.list_->CreateAndAppendItem<cc::EndClipDisplayItem>( |
+ bounds_in_layer_); |
break; |
case CLIP_PATH: |
- context_.list_->CreateAndAppendItem<cc::EndClipPathDisplayItem>(); |
+ context_.list_->CreateAndAppendItem<cc::EndClipPathDisplayItem>( |
+ bounds_in_layer_); |
break; |
} |
} |
} |
void ClipRecorder::ClipRect(const gfx::Rect& clip_rect) { |
- auto* item = context_.list_->CreateAndAppendItem<cc::ClipDisplayItem>(); |
+ gfx::Rect clip_in_layer_space = context_.ToLayerSpaceRect(clip_rect); |
+ auto* item = context_.list_->CreateAndAppendItem<cc::ClipDisplayItem>( |
+ clip_in_layer_space); |
item->SetNew(clip_rect, std::vector<SkRRect>()); |
DCHECK_LT(num_closers_, arraysize(closers_)); |
closers_[num_closers_++] = CLIP_RECT; |
@@ -39,7 +46,9 @@ void ClipRecorder::ClipRect(const gfx::Rect& clip_rect) { |
void ClipRecorder::ClipPath(const gfx::Path& clip_path) { |
bool anti_alias = false; |
- auto* item = context_.list_->CreateAndAppendItem<cc::ClipPathDisplayItem>(); |
+ // As a further optimization, consider passing a more granular visual rect. |
+ auto* item = context_.list_->CreateAndAppendItem<cc::ClipPathDisplayItem>( |
+ bounds_in_layer_); |
item->SetNew(clip_path, SkRegion::kIntersect_Op, anti_alias); |
DCHECK_LT(num_closers_, arraysize(closers_)); |
closers_[num_closers_++] = CLIP_PATH; |
@@ -48,7 +57,9 @@ void ClipRecorder::ClipPath(const gfx::Path& clip_path) { |
void ClipRecorder::ClipPathWithAntiAliasing( |
const gfx::Path& clip_path) { |
bool anti_alias = true; |
- auto* item = context_.list_->CreateAndAppendItem<cc::ClipPathDisplayItem>(); |
+ // As a further optimization, consider passing a more granular visual rect. |
+ auto* item = context_.list_->CreateAndAppendItem<cc::ClipPathDisplayItem>( |
+ bounds_in_layer_); |
item->SetNew(clip_path, SkRegion::kIntersect_Op, anti_alias); |
DCHECK_LT(num_closers_, arraysize(closers_)); |
closers_[num_closers_++] = CLIP_PATH; |