Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1104)

Unified Diff: chrome/renderer/webview_animating_overlay.cc

Issue 10855151: Gradient overlay for constrained window (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: test Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/webview_animating_overlay.cc
diff --git a/chrome/renderer/webview_animating_overlay.cc b/chrome/renderer/webview_animating_overlay.cc
new file mode 100644
index 0000000000000000000000000000000000000000..10cc32327ffeadc00191c5ae82a0901b40091580
--- /dev/null
+++ b/chrome/renderer/webview_animating_overlay.cc
@@ -0,0 +1,115 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/renderer/webview_animating_overlay.h"
+
+#include "content/public/renderer/render_view.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkPaint.h"
+#include "third_party/skia/include/core/SkRect.h"
+#include "third_party/skia/include/effects/SkGradientShader.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
+#include "ui/gfx/size.h"
+#include "ui/gfx/skia_util.h"
+
+const int kAnimationDurationMiliseconds = 500;
+
+WebViewAnimatingOverlay::WebViewAnimatingOverlay(
+ content::RenderView* render_view)
+ : render_view_(render_view),
+ state_(HIDDEN) {
+}
+
+WebViewAnimatingOverlay::~WebViewAnimatingOverlay() {
+ if (render_view_->GetWebView())
+ render_view_->GetWebView()->removePageOverlay(this);
+}
+
+void WebViewAnimatingOverlay::Show() {
+ if (state_ == ANIMATING_IN || state_ == VISIBLE)
+ return;
+
+ if (state_ == ANIMATING_OUT) {
+ start_time_ = base::Time::Now() - GetAnimationTimeRemaining();
+ } else {
Nico 2012/08/14 21:14:12 DCHECK(state_ == HIDDEN); Alternatively, you coul
sail 2012/08/15 05:26:20 Done.
+ start_time_ = base::Time::Now();
+ if (render_view_->GetWebView())
+ render_view_->GetWebView()->addPageOverlay(this, 0);
+ }
+
+ state_ = ANIMATING_IN;
+ timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(16), this,
Nico 2012/08/14 21:14:12 constant
sail 2012/08/15 05:26:20 Done.
+ &WebViewAnimatingOverlay::OnTimer);
+}
+
+void WebViewAnimatingOverlay::Hide() {
+ if (state_ == ANIMATING_OUT || state_ == HIDDEN)
+ return;
+
+ if (state_ == ANIMATING_IN)
+ start_time_ = base::Time::Now() - GetAnimationTimeRemaining();
+ else
+ start_time_ = base::Time::Now();
+
+ state_ = ANIMATING_OUT;
+ timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(16), this,
+ &WebViewAnimatingOverlay::OnTimer);
+}
+
+void WebViewAnimatingOverlay::paintPageOverlay(WebKit::WebCanvas* canvas) {
+ SkRect rect = gfx::RectToSkRect(gfx::Rect(render_view_->GetSize()));
+
+ // The center of the radial gradient should be near the top middle.
+ SkPoint center_point;
+ center_point.iset(rect.width() * 0.5, rect.height() * 0.05);
+
+ // Animate in or out using the alpha.
+ int alpha = GetAnimationProgress() * 191;
Nico 2012/08/14 21:14:12 This looks like a linear animation. Could ui/base/
sail 2012/08/15 05:26:20 Done.
+ SkColor colors[] = {
+ SkColorSetARGB(alpha, 255, 255, 255),
+ SkColorSetARGB(alpha, 127, 127, 127)
+ };
+
+ SkShader* shader = SkGradientShader::CreateRadial(center_point,
+ SkIntToScalar(rect.width()), colors, NULL, arraysize(colors),
+ SkShader::kClamp_TileMode);
+ SkPaint paint;
+ paint.setShader(shader);
+ paint.setDither(true);
+ shader->unref();
jamesr 2012/08/14 19:08:24 Could you use SkAutoTUnref<> here instead of manua
sail 2012/08/15 05:26:20 Done.
+
+ canvas->drawRect(rect, paint);
+}
+
+void WebViewAnimatingOverlay::OnTimer() {
+ if (GetAnimationTimeRemaining() <= base::TimeDelta()) {
+ timer_.Stop();
+ if (state_ == ANIMATING_IN) {
+ state_ = VISIBLE;
+ } else {
+ DCHECK(state_ == ANIMATING_OUT);
+ state_ = HIDDEN;
+ if (render_view_->GetWebView())
+ render_view_->GetWebView()->removePageOverlay(this);
+ }
+ }
+ render_view_->Repaint(render_view_->GetSize());
+}
+
+base::TimeDelta WebViewAnimatingOverlay::GetAnimationTimeRemaining() const {
+ base::Time end_time = start_time_ +
+ base::TimeDelta::FromMilliseconds(kAnimationDurationMiliseconds);
+ return end_time - base::Time::Now();
jamesr 2012/08/14 19:08:24 we drive most web-based animations of of base::Tim
sail 2012/08/15 05:26:20 Done. Switched to ui/base/animation which already
+}
+
+float WebViewAnimatingOverlay::GetAnimationProgress() const {
+ if (state_ != ANIMATING_IN && state_ != ANIMATING_OUT)
+ return 1.0;
+
+ base::TimeDelta delta = base::Time::Now() - start_time_;
+ float progress = delta.InMillisecondsF() / kAnimationDurationMiliseconds;
+ if (state_ == ANIMATING_OUT)
+ progress = 1.0 - progress;
+ return std::max(std::min(progress, 1.0f), 0.0f);
+}

Powered by Google App Engine
This is Rietveld 408576698