diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-06 06:15:55 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-06 06:15:55 +0000 |
commit | cedc395e4adad35437cbac1c00f8107d581e1ee1 (patch) | |
tree | 047b492889b9751eef8d430515d09598ea34fc61 /ui | |
parent | 5f512642e7cb577918bda179e517baf932c578a0 (diff) | |
download | chromium_src-cedc395e4adad35437cbac1c00f8107d581e1ee1.zip chromium_src-cedc395e4adad35437cbac1c00f8107d581e1ee1.tar.gz chromium_src-cedc395e4adad35437cbac1c00f8107d581e1ee1.tar.bz2 |
Use SkRegion (set of rectangles) to record damaged rects
instead of unifying them into single rect.
BUG=none
TEST=non
Review URL: http://codereview.chromium.org/9609020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@125125 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/gfx/compositor/compositor.cc | 2 | ||||
-rw-r--r-- | ui/gfx/compositor/layer.cc | 40 | ||||
-rw-r--r-- | ui/gfx/compositor/layer.h | 8 |
3 files changed, 29 insertions, 21 deletions
diff --git a/ui/gfx/compositor/compositor.cc b/ui/gfx/compositor/compositor.cc index 506b0ca..5f429ba03 100644 --- a/ui/gfx/compositor/compositor.cc +++ b/ui/gfx/compositor/compositor.cc @@ -264,7 +264,7 @@ void Compositor::updateAnimations(double frameBeginTime) { void Compositor::layout() { if (root_layer_) - root_layer_->SendDamagedRect(); + root_layer_->SendDamagedRects(); } void Compositor::applyScrollAndScale(const WebKit::WebSize& scrollDelta, diff --git a/ui/gfx/compositor/layer.cc b/ui/gfx/compositor/layer.cc index b49e642..f4853d7 100644 --- a/ui/gfx/compositor/layer.cc +++ b/ui/gfx/compositor/layer.cc @@ -277,10 +277,11 @@ void Layer::SetColor(SkColor color) { bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { if (type_ == LAYER_SOLID_COLOR || !delegate_) return false; - if (damaged_rect_.IsEmpty()) - damaged_rect_ = invalid_rect; - else - damaged_rect_ = damaged_rect_.Union(invalid_rect); + damaged_region_.op(invalid_rect.x(), + invalid_rect.y(), + invalid_rect.right(), + invalid_rect.bottom(), + SkRegion::kUnion_Op); ScheduleDraw(); return true; } @@ -291,21 +292,26 @@ void Layer::ScheduleDraw() { compositor->ScheduleDraw(); } -void Layer::SendDamagedRect() { - if (delegate_ && !damaged_rect_.IsEmpty()) { - WebKit::WebFloatRect web_rect( - damaged_rect_.x(), - damaged_rect_.y(), - damaged_rect_.width(), - damaged_rect_.height()); - if (!web_layer_is_accelerated_) - web_layer_.to<WebKit::WebContentLayer>().invalidateRect(web_rect); - else - web_layer_.to<WebKit::WebExternalTextureLayer>().invalidateRect(web_rect); - damaged_rect_.SetRect(0, 0, 0, 0); +void Layer::SendDamagedRects() { + if (delegate_ && !damaged_region_.isEmpty()) { + for (SkRegion::Iterator iter(damaged_region_); + !iter.done(); iter.next()) { + const SkIRect& damaged = iter.rect(); + WebKit::WebFloatRect web_rect( + damaged.x(), + damaged.y(), + damaged.width(), + damaged.height()); + if (!web_layer_is_accelerated_) + web_layer_.to<WebKit::WebContentLayer>().invalidateRect(web_rect); + else + web_layer_.to<WebKit::WebExternalTextureLayer>().invalidateRect( + web_rect); + } + damaged_region_.setEmpty(); } for (size_t i = 0; i < children_.size(); ++i) - children_[i]->SendDamagedRect(); + children_[i]->SendDamagedRects(); } void Layer::SuppressPaint() { diff --git a/ui/gfx/compositor/layer.h b/ui/gfx/compositor/layer.h index d4efc38..e5c4134 100644 --- a/ui/gfx/compositor/layer.h +++ b/ui/gfx/compositor/layer.h @@ -14,6 +14,7 @@ #include "base/memory/scoped_ptr.h" #include "base/message_loop.h" #include "third_party/skia/include/core/SkColor.h" +#include "third_party/skia/include/core/SkRegion.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebContentLayerClient.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebLayer.h" #include "ui/gfx/rect.h" @@ -185,8 +186,9 @@ class COMPOSITOR_EXPORT Layer : // SchedulePaint() for that. void ScheduleDraw(); - // Sends damaged rect to |compostior_| to repaint the content. - void SendDamagedRect(); + // Sends damaged rectangles recorded in |damaged_region_| to + // |compostior_| to repaint the content. + void SendDamagedRects(); // Suppresses painting the content by disgarding damaged region and ignoring // new paint requests. @@ -277,7 +279,7 @@ class COMPOSITOR_EXPORT Layer : // Union of damaged rects to be used when compositor is ready to // paint the content. - gfx::Rect damaged_rect_; + SkRegion damaged_region_; float opacity_; |