summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-06 06:15:55 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-06 06:15:55 +0000
commitcedc395e4adad35437cbac1c00f8107d581e1ee1 (patch)
tree047b492889b9751eef8d430515d09598ea34fc61 /ui
parent5f512642e7cb577918bda179e517baf932c578a0 (diff)
downloadchromium_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.cc2
-rw-r--r--ui/gfx/compositor/layer.cc40
-rw-r--r--ui/gfx/compositor/layer.h8
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_;