diff options
author | jamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-21 23:34:50 +0000 |
---|---|---|
committer | jamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-21 23:34:50 +0000 |
commit | 5f8b102b5fafc489ba7044a11748c4194ad2b3ec (patch) | |
tree | c9aa1cf1eae89373a4f74abc9e1f7d6e98ec99bc /chrome | |
parent | cef99efc12e7fabf12ebfbc0c67fa8322eee8351 (diff) | |
download | chromium_src-5f8b102b5fafc489ba7044a11748c4194ad2b3ec.zip chromium_src-5f8b102b5fafc489ba7044a11748c4194ad2b3ec.tar.gz chromium_src-5f8b102b5fafc489ba7044a11748c4194ad2b3ec.tar.bz2 |
Chromium support for window.webkitRequestAnimationFrame()
This is a very simple scheduler that targets 100fps.
BUG=64848
TEST=layout tests
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=71909
Review URL: http://codereview.chromium.org/6136005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72230 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/renderer/render_widget.cc | 32 | ||||
-rw-r--r-- | chrome/renderer/render_widget.h | 5 |
2 files changed, 34 insertions, 3 deletions
diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc index 9f73dc0..8fb1d55 100644 --- a/chrome/renderer/render_widget.cc +++ b/chrome/renderer/render_widget.cc @@ -76,7 +76,8 @@ RenderWidget::RenderWidget(RenderThreadBase* render_thread, popup_type_(popup_type), pending_window_rect_count_(0), suppress_next_char_events_(false), - is_accelerated_compositing_active_(false) { + is_accelerated_compositing_active_(false), + animation_update_pending_(false) { RenderProcess::current()->AddRefProcess(); DCHECK(render_thread_); } @@ -486,9 +487,16 @@ void RenderWidget::CallDoDeferredUpdate() { Send(pending_input_event_ack_.release()); } +void RenderWidget::UpdateAnimationsIfNeeded() { + if (!is_hidden() && animation_update_pending_ && + base::Time::Now() > animation_floor_time_) { + animation_update_pending_ = false; + webwidget_->animate(); + } +} + void RenderWidget::DoDeferredUpdate() { - if (!webwidget_ || !paint_aggregator_.HasPendingUpdate() || - update_reply_pending()) + if (!webwidget_ || update_reply_pending()) return; // Suppress updating when we are hidden. @@ -498,11 +506,19 @@ void RenderWidget::DoDeferredUpdate() { return; } + if (base::Time::Now() > animation_floor_time_) + UpdateAnimationsIfNeeded(); + // Layout may generate more invalidation. It may also enable the // GPU acceleration, so make sure to run layout before we send the // GpuRenderingActivated message. webwidget_->layout(); + // Suppress painting if nothing is dirty. This has to be done after updating + // animations running layout as these may generate further invalidations. + if (!paint_aggregator_.HasPendingUpdate()) + return; + // OK, save the pending update to a local since painting may cause more // invalidation. Some WebCore rendering objects only layout when painted. PaintAggregator::PendingUpdate update; @@ -684,6 +700,16 @@ void RenderWidget::scheduleComposite() { didInvalidateRect(WebRect(0, 0, 1, 1)); } +void RenderWidget::scheduleAnimation() { + if (!animation_update_pending_) { + animation_update_pending_ = true; + animation_floor_time_ = + base::Time::Now() + base::TimeDelta::FromMilliseconds(10); + MessageLoop::current()->PostDelayedTask(FROM_HERE, NewRunnableMethod( + this, &RenderWidget::UpdateAnimationsIfNeeded), 10); + } +} + void RenderWidget::didChangeCursor(const WebCursorInfo& cursor_info) { // TODO(darin): Eliminate this temporary. WebCursor cursor(cursor_info); diff --git a/chrome/renderer/render_widget.h b/chrome/renderer/render_widget.h index 71a065e..a76623f 100644 --- a/chrome/renderer/render_widget.h +++ b/chrome/renderer/render_widget.h @@ -102,6 +102,7 @@ class RenderWidget : public IPC::Channel::Listener, virtual void didScrollRect(int dx, int dy, const WebKit::WebRect& clipRect); virtual void didActivateAcceleratedCompositing(bool active); virtual void scheduleComposite(); + virtual void scheduleAnimation(); virtual void didFocus(); virtual void didBlur(); virtual void didChangeCursor(const WebKit::WebCursorInfo&); @@ -159,6 +160,7 @@ class RenderWidget : public IPC::Channel::Listener, void PaintDebugBorder(const gfx::Rect& rect, skia::PlatformCanvas* canvas); void CallDoDeferredUpdate(); + void UpdateAnimationsIfNeeded(); void DoDeferredUpdate(); void DoDeferredClose(); void DoDeferredSetWindowRect(const WebKit::WebRect& pos); @@ -368,6 +370,9 @@ class RenderWidget : public IPC::Channel::Listener, // compositor. bool is_accelerated_compositing_active_; + base::Time animation_floor_time_; + bool animation_update_pending_; + DISALLOW_COPY_AND_ASSIGN(RenderWidget); }; |