| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/views/tabs/tab_renderer.h" | 5 #include "chrome/browser/views/tabs/tab_renderer.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "app/animation_container.h" | 9 #include "app/animation_container.h" |
| 10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 static int waiting_to_loading_frame_count_ratio = 0; | 83 static int waiting_to_loading_frame_count_ratio = 0; |
| 84 | 84 |
| 85 // Used when |render_as_new_tab| is true. | 85 // Used when |render_as_new_tab| is true. |
| 86 static SkBitmap* new_tab_mask = NULL; | 86 static SkBitmap* new_tab_mask = NULL; |
| 87 static SkBitmap* new_tab_shadow = NULL; | 87 static SkBitmap* new_tab_shadow = NULL; |
| 88 | 88 |
| 89 TabRenderer::TabImage TabRenderer::tab_alpha = {0}; | 89 TabRenderer::TabImage TabRenderer::tab_alpha = {0}; |
| 90 TabRenderer::TabImage TabRenderer::tab_active = {0}; | 90 TabRenderer::TabImage TabRenderer::tab_active = {0}; |
| 91 TabRenderer::TabImage TabRenderer::tab_active_nano = {0}; | 91 TabRenderer::TabImage TabRenderer::tab_active_nano = {0}; |
| 92 TabRenderer::TabImage TabRenderer::tab_inactive = {0}; | 92 TabRenderer::TabImage TabRenderer::tab_inactive = {0}; |
| 93 TabRenderer::TabImage TabRenderer::tab_inactive_nano = {0}; |
| 93 TabRenderer::TabImage TabRenderer::tab_alpha_nano = {0}; | 94 TabRenderer::TabImage TabRenderer::tab_alpha_nano = {0}; |
| 94 | 95 |
| 95 // Max opacity for the mini-tab title change animation. | 96 // Max opacity for the mini-tab title change animation. |
| 96 const double kMiniTitleChangeThrobOpacity = 0.75; | 97 const double kMiniTitleChangeThrobOpacity = 0.75; |
| 97 | 98 |
| 98 // Duration for when the title of an inactive mini-tab changes. | 99 // Duration for when the title of an inactive mini-tab changes. |
| 99 const int kMiniTitleChangeThrobDuration = 1000; | 100 const int kMiniTitleChangeThrobDuration = 1000; |
| 100 | 101 |
| 101 // When the title of a mini-tab in the background changes the size of the icon | 102 // When the title of a mini-tab in the background changes the size of the icon |
| 102 // animates. This is the max size we let the icon go to. | 103 // animates. This is the max size we let the icon go to. |
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 if (GetWidget() && | 729 if (GetWidget() && |
| 729 GetWidget()->GetWindow()->GetNonClientView()->UseNativeFrame()) { | 730 GetWidget()->GetWindow()->GetNonClientView()->UseNativeFrame()) { |
| 730 tab_id = IDR_THEME_TAB_BACKGROUND_V; | 731 tab_id = IDR_THEME_TAB_BACKGROUND_V; |
| 731 } else { | 732 } else { |
| 732 tab_id = is_otr ? IDR_THEME_TAB_BACKGROUND_INCOGNITO : | 733 tab_id = is_otr ? IDR_THEME_TAB_BACKGROUND_INCOGNITO : |
| 733 IDR_THEME_TAB_BACKGROUND; | 734 IDR_THEME_TAB_BACKGROUND; |
| 734 } | 735 } |
| 735 | 736 |
| 736 SkBitmap* tab_bg = GetThemeProvider()->GetBitmapNamed(tab_id); | 737 SkBitmap* tab_bg = GetThemeProvider()->GetBitmapNamed(tab_id); |
| 737 | 738 |
| 739 // App tabs are drawn slightly differently (as nano tabs). |
| 740 TabImage* tab_image = data_.app ? &tab_active_nano : &tab_active; |
| 741 TabImage* tab_inactive_image = data_.app ? &tab_inactive_nano : |
| 742 &tab_inactive; |
| 743 TabImage* alpha = data_.app ? &tab_alpha_nano : &tab_alpha; |
| 744 |
| 738 // If the theme is providing a custom background image, then its top edge | 745 // If the theme is providing a custom background image, then its top edge |
| 739 // should be at the top of the tab. Otherwise, we assume that the background | 746 // should be at the top of the tab. Otherwise, we assume that the background |
| 740 // image is a composited foreground + frame image. | 747 // image is a composited foreground + frame image. |
| 741 int bg_offset_y = GetThemeProvider()->HasCustomImage(tab_id) ? | 748 int bg_offset_y = GetThemeProvider()->HasCustomImage(tab_id) ? |
| 742 0 : background_offset_.y(); | 749 0 : background_offset_.y(); |
| 743 | 750 |
| 744 if (!data_.app) { | 751 // Draw left edge. Don't draw over the toolbar, as we're not the foreground |
| 745 // Draw left edge. Don't draw over the toolbar, as we're not the foreground | 752 // tab. |
| 746 // tab. | 753 SkBitmap tab_l = SkBitmapOperations::CreateTiledBitmap( |
| 747 SkBitmap tab_l = SkBitmapOperations::CreateTiledBitmap( | 754 *tab_bg, offset, bg_offset_y, tab_image->l_width, height()); |
| 748 *tab_bg, offset, bg_offset_y, tab_active.l_width, height()); | 755 SkBitmap theme_l = |
| 749 SkBitmap theme_l = | 756 SkBitmapOperations::CreateMaskedBitmap(tab_l, *alpha->image_l); |
| 750 SkBitmapOperations::CreateMaskedBitmap(tab_l, *tab_alpha.image_l); | 757 canvas->DrawBitmapInt(theme_l, |
| 751 canvas->DrawBitmapInt(theme_l, | 758 0, 0, theme_l.width(), theme_l.height() - kToolbarOverlap, |
| 752 0, 0, theme_l.width(), theme_l.height() - kToolbarOverlap, | 759 0, 0, theme_l.width(), theme_l.height() - kToolbarOverlap, |
| 753 0, 0, theme_l.width(), theme_l.height() - kToolbarOverlap, | 760 false); |
| 754 false); | |
| 755 | 761 |
| 756 // Draw right edge. Again, don't draw over the toolbar. | 762 // Draw right edge. Again, don't draw over the toolbar. |
| 757 SkBitmap tab_r = SkBitmapOperations::CreateTiledBitmap(*tab_bg, | 763 SkBitmap tab_r = SkBitmapOperations::CreateTiledBitmap(*tab_bg, |
| 758 offset + width() - tab_active.r_width, bg_offset_y, | 764 offset + width() - tab_image->r_width, bg_offset_y, |
| 759 tab_active.r_width, height()); | 765 tab_image->r_width, height()); |
| 760 SkBitmap theme_r = | 766 SkBitmap theme_r = |
| 761 SkBitmapOperations::CreateMaskedBitmap(tab_r, *tab_alpha.image_r); | 767 SkBitmapOperations::CreateMaskedBitmap(tab_r, *alpha->image_r); |
| 762 canvas->DrawBitmapInt(theme_r, | 768 canvas->DrawBitmapInt(theme_r, |
| 763 0, 0, theme_r.width(), theme_r.height() - kToolbarOverlap, | 769 0, 0, theme_r.width(), theme_r.height() - kToolbarOverlap, |
| 764 width() - theme_r.width(), 0, theme_r.width(), | 770 width() - theme_r.width(), 0, theme_r.width(), |
| 765 theme_r.height() - kToolbarOverlap, false); | 771 theme_r.height() - kToolbarOverlap, false); |
| 766 | 772 |
| 767 // Draw center. Instead of masking out the top portion we simply skip over | 773 // Draw center. Instead of masking out the top portion we simply skip over |
| 768 // it by incrementing by kDropShadowHeight, since it's a simple rectangle. | 774 // it by incrementing by kDropShadowHeight, since it's a simple rectangle. |
| 769 // And again, don't draw over the toolbar. | 775 // And again, don't draw over the toolbar. |
| 770 canvas->TileImageInt(*tab_bg, | 776 canvas->TileImageInt(*tab_bg, |
| 771 offset + tab_active.l_width, bg_offset_y + kDropShadowHeight, | 777 offset + tab_image->l_width, |
| 772 tab_active.l_width, kDropShadowHeight, | 778 bg_offset_y + kDropShadowHeight + tab_image->y_offset, |
| 773 width() - tab_active.l_width - tab_active.r_width, | 779 tab_image->l_width, |
| 774 height() - kDropShadowHeight - kToolbarOverlap); | 780 kDropShadowHeight + tab_image->y_offset, |
| 781 width() - tab_image->l_width - tab_image->r_width, |
| 782 height() - kDropShadowHeight - kToolbarOverlap - tab_image->y_offset); |
| 775 | 783 |
| 776 // Now draw the highlights/shadows around the tab edge. | 784 // Now draw the highlights/shadows around the tab edge. |
| 777 canvas->DrawBitmapInt(*tab_inactive.image_l, 0, 0); | 785 canvas->DrawBitmapInt(*tab_inactive_image->image_l, 0, 0); |
| 778 canvas->TileImageInt(*tab_inactive.image_c, | 786 canvas->TileImageInt(*tab_inactive_image->image_c, |
| 779 tab_inactive.l_width, 0, | 787 tab_inactive_image->l_width, 0, |
| 780 width() - tab_inactive.l_width - tab_inactive.r_width, | 788 width() - tab_inactive_image->l_width - |
| 781 height()); | 789 tab_inactive_image->r_width, |
| 782 canvas->DrawBitmapInt(*tab_inactive.image_r, | 790 height()); |
| 783 width() - tab_inactive.r_width, 0); | 791 canvas->DrawBitmapInt(*tab_inactive_image->image_r, |
| 784 } | 792 width() - tab_inactive_image->r_width, 0); |
| 785 } | 793 } |
| 786 | 794 |
| 787 void TabRenderer::PaintActiveTabBackground(gfx::Canvas* canvas) { | 795 void TabRenderer::PaintActiveTabBackground(gfx::Canvas* canvas) { |
| 788 int offset = GetX(views::View::APPLY_MIRRORING_TRANSFORMATION) + | 796 int offset = GetX(views::View::APPLY_MIRRORING_TRANSFORMATION) + |
| 789 background_offset_.x(); | 797 background_offset_.x(); |
| 790 ThemeProvider* tp = GetThemeProvider(); | 798 ThemeProvider* tp = GetThemeProvider(); |
| 791 if (!tp) | 799 if (!tp) |
| 792 NOTREACHED() << "Unable to get theme provider"; | 800 NOTREACHED() << "Unable to get theme provider"; |
| 793 | 801 |
| 794 SkBitmap* tab_bg = GetThemeProvider()->GetBitmapNamed(IDR_THEME_TOOLBAR); | 802 SkBitmap* tab_bg = GetThemeProvider()->GetBitmapNamed(IDR_THEME_TOOLBAR); |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 990 tab_active_nano.l_width = tab_active_nano.image_l->width(); | 998 tab_active_nano.l_width = tab_active_nano.image_l->width(); |
| 991 tab_active_nano.r_width = tab_active_nano.image_r->width(); | 999 tab_active_nano.r_width = tab_active_nano.image_r->width(); |
| 992 tab_active_nano.y_offset = kMiniTabDiffHeight; | 1000 tab_active_nano.y_offset = kMiniTabDiffHeight; |
| 993 | 1001 |
| 994 tab_inactive.image_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT); | 1002 tab_inactive.image_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT); |
| 995 tab_inactive.image_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER); | 1003 tab_inactive.image_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER); |
| 996 tab_inactive.image_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT); | 1004 tab_inactive.image_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT); |
| 997 tab_inactive.l_width = tab_inactive.image_l->width(); | 1005 tab_inactive.l_width = tab_inactive.image_l->width(); |
| 998 tab_inactive.r_width = tab_inactive.image_r->width(); | 1006 tab_inactive.r_width = tab_inactive.image_r->width(); |
| 999 | 1007 |
| 1008 tab_inactive_nano.image_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_NANO_LEFT); |
| 1009 tab_inactive_nano.image_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_NANO_CENTER); |
| 1010 tab_inactive_nano.image_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_NANO_RIGHT); |
| 1011 tab_inactive_nano.l_width = tab_inactive_nano.image_l->width(); |
| 1012 tab_inactive_nano.r_width = tab_inactive_nano.image_r->width(); |
| 1013 tab_inactive_nano.y_offset = kMiniTabDiffHeight; |
| 1014 |
| 1000 loading_animation_frames = rb.GetBitmapNamed(IDR_THROBBER); | 1015 loading_animation_frames = rb.GetBitmapNamed(IDR_THROBBER); |
| 1001 waiting_animation_frames = rb.GetBitmapNamed(IDR_THROBBER_WAITING); | 1016 waiting_animation_frames = rb.GetBitmapNamed(IDR_THROBBER_WAITING); |
| 1002 | 1017 |
| 1003 new_tab_mask = rb.GetBitmapNamed(IDR_TAB_ALPHA_NEW_TAB); | 1018 new_tab_mask = rb.GetBitmapNamed(IDR_TAB_ALPHA_NEW_TAB); |
| 1004 new_tab_shadow = rb.GetBitmapNamed(IDR_TAB_NEW_TAB_SHADOW); | 1019 new_tab_shadow = rb.GetBitmapNamed(IDR_TAB_NEW_TAB_SHADOW); |
| 1005 } | 1020 } |
| 1006 | 1021 |
| 1007 void TabRenderer::SetBlocked(bool blocked) { | 1022 void TabRenderer::SetBlocked(bool blocked) { |
| 1008 if (data_.blocked == blocked) | 1023 if (data_.blocked == blocked) |
| 1009 return; | 1024 return; |
| 1010 data_.blocked = blocked; | 1025 data_.blocked = blocked; |
| 1011 if (blocked) | 1026 if (blocked) |
| 1012 StartPulse(); | 1027 StartPulse(); |
| 1013 else | 1028 else |
| 1014 StopPulse(); | 1029 StopPulse(); |
| 1015 } | 1030 } |
| OLD | NEW |