| Index: chrome/browser/views/tabs/tab_renderer.cc
|
| ===================================================================
|
| --- chrome/browser/views/tabs/tab_renderer.cc (revision 30064)
|
| +++ chrome/browser/views/tabs/tab_renderer.cc (working copy)
|
| @@ -12,6 +12,8 @@
|
| #include "app/gfx/skbitmap_operations.h"
|
| #include "app/l10n_util.h"
|
| #include "app/resource_bundle.h"
|
| +#include "app/slide_animation.h"
|
| +#include "app/throb_animation.h"
|
| #include "chrome/browser/browser.h"
|
| #include "chrome/browser/browser_theme_provider.h"
|
| #include "chrome/browser/defaults.h"
|
| @@ -78,6 +80,12 @@
|
| TabRenderer::TabImage TabRenderer::tab_active = {0};
|
| TabRenderer::TabImage TabRenderer::tab_inactive = {0};
|
|
|
| +// Max opacity for the pinned tab title change animation.
|
| +const double kPinnedThrobOpacity = 0.75;
|
| +
|
| +// Duration for when the title of an inactive pinned tab changes.
|
| +const int kPinnedDuration = 1000;
|
| +
|
| namespace {
|
|
|
| void InitResources() {
|
| @@ -361,6 +369,28 @@
|
| pulse_animation_->Stop();
|
| }
|
|
|
| +void TabRenderer::StartPinnedTabTitleAnimation() {
|
| + if (!pinned_title_animation_.get()) {
|
| + pinned_title_animation_.reset(new ThrobAnimation(this));
|
| + pinned_title_animation_->SetThrobDuration(kPinnedDuration);
|
| + }
|
| +
|
| + if (!pinned_title_animation_->IsAnimating()) {
|
| + pinned_title_animation_->StartThrobbing(2);
|
| + } else if (pinned_title_animation_->cycles_remaining() <= 2) {
|
| + // The title changed while we're already animating. Add at most one more
|
| + // cycle. This is done in an attempt to smooth out pages that continuously
|
| + // change the title.
|
| + pinned_title_animation_->set_cycles_remaining(
|
| + pinned_title_animation_->cycles_remaining() + 2);
|
| + }
|
| +}
|
| +
|
| +void TabRenderer::StopPinnedTabTitleAnimation() {
|
| + if (pinned_title_animation_.get())
|
| + pinned_title_animation_->Stop();
|
| +}
|
| +
|
| // static
|
| gfx::Size TabRenderer::GetMinimumUnselectedSize() {
|
| InitResources();
|
| @@ -610,18 +640,14 @@
|
| // the active representation for the dragged tab.
|
| PaintActiveTabBackground(canvas);
|
| } else {
|
| - // Draw our hover state.
|
| - Animation* animation = hover_animation_.get();
|
| - if (pulse_animation_->IsAnimating())
|
| - animation = pulse_animation_.get();
|
| + PaintInactiveTabBackground(canvas);
|
|
|
| - PaintInactiveTabBackground(canvas);
|
| - if (animation->GetCurrentValue() > 0) {
|
| + double throb_value = GetThrobValue();
|
| + if (throb_value > 0) {
|
| SkRect bounds;
|
| bounds.set(0, 0, SkIntToScalar(width()), SkIntToScalar(height()));
|
| - canvas->saveLayerAlpha(&bounds,
|
| - static_cast<int>(animation->GetCurrentValue() * kHoverOpacity * 0xff),
|
| - SkCanvas::kARGB_ClipLayer_SaveFlag);
|
| + canvas->saveLayerAlpha(&bounds, static_cast<int>(throb_value * 0xff),
|
| + SkCanvas::kARGB_ClipLayer_SaveFlag);
|
| canvas->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode);
|
| PaintActiveTabBackground(canvas);
|
| canvas->restore();
|
| @@ -798,6 +824,17 @@
|
| return !pinned() && (IsSelected() || IconCapacity() >= 3);
|
| }
|
|
|
| +double TabRenderer::GetThrobValue() {
|
| + if (pulse_animation_->IsAnimating())
|
| + return pulse_animation_->GetCurrentValue() * kHoverOpacity;
|
| +
|
| + if (pinned_title_animation_.get() && pinned_title_animation_->IsAnimating())
|
| + return pinned_title_animation_->GetCurrentValue() * kPinnedThrobOpacity;
|
| +
|
| + return hover_animation_.get() ?
|
| + kHoverOpacity * hover_animation_->GetCurrentValue() : 0;
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // TabRenderer, private:
|
|
|
|
|