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..0eeffc9295124d04d2e377b930f45b13873b5bff |
--- /dev/null |
+++ b/chrome/renderer/webview_animating_overlay.cc |
@@ -0,0 +1,113 @@ |
+// 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 "base/logging.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; |
+const int kAnimationFrameRate = 60; |
+const int kTargetAlpha = 191; |
+ |
+WebViewAnimatingOverlay::WebViewAnimatingOverlay( |
+ content::RenderView* render_view) |
+ : render_view_(render_view), |
+ state_(HIDDEN), |
+ animation_(kAnimationDurationMiliseconds, kAnimationFrameRate, this) { |
+} |
+ |
+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) { |
+ animation_.SetCurrentValue(1.0 - animation_.GetCurrentValue()); |
+ } else { |
+ DCHECK_EQ(HIDDEN, state_); |
+ if (render_view_->GetWebView()) |
+ render_view_->GetWebView()->addPageOverlay(this, 0); |
+ } |
+ |
+ state_ = ANIMATING_IN; |
+ animation_.Start(); |
+} |
+ |
+void WebViewAnimatingOverlay::Hide() { |
+ if (state_ == ANIMATING_OUT || state_ == HIDDEN) |
+ return; |
+ |
+ if (state_ == ANIMATING_IN) |
+ animation_.SetCurrentValue(1.0 - animation_.GetCurrentValue()); |
+ |
+ state_ = ANIMATING_OUT; |
+ animation_.Start(); |
+} |
+ |
+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); |
+ int radius = static_cast<int>(rect.width()); |
+ |
+ // Animate in or out using the alpha. |
+ int alpha = GetCurrentAlpha(); |
+ SkColor colors[] = { |
+ SkColorSetARGB(alpha, 255, 255, 255), |
+ SkColorSetARGB(alpha, 127, 127, 127) |
+ }; |
+ |
+ SkAutoTUnref<SkShader> shader(SkGradientShader::CreateRadial(center_point, |
+ SkIntToScalar(radius), colors, NULL, arraysize(colors), |
+ SkShader::kClamp_TileMode)); |
+ SkPaint paint; |
+ paint.setShader(shader); |
+ paint.setDither(true); |
+ |
+ canvas->drawRect(rect, paint); |
+} |
+ |
+void WebViewAnimatingOverlay::AnimationEnded(const ui::Animation* animation) { |
+ if (state_ == ANIMATING_IN) { |
+ state_ = VISIBLE; |
+ } else { |
+ DCHECK_EQ(ANIMATING_OUT, state_); |
+ state_ = HIDDEN; |
+ if (render_view_->GetWebView()) |
+ render_view_->GetWebView()->removePageOverlay(this); |
+ } |
+} |
+ |
+void WebViewAnimatingOverlay::AnimationProgressed( |
+ const ui::Animation* animation) { |
+ render_view_->Repaint(render_view_->GetSize()); |
+} |
+ |
+int WebViewAnimatingOverlay::GetCurrentAlpha() { |
+ switch (state_) { |
+ case ANIMATING_IN: |
+ return animation_.CurrentValueBetween(0, kTargetAlpha); |
+ case ANIMATING_OUT: |
+ return animation_.CurrentValueBetween(kTargetAlpha, 0); |
+ case VISIBLE: |
+ case HIDDEN: |
+ return kTargetAlpha; |
+ } |
+ NOTREACHED(); |
+ return 1.0; |
+} |