| Index: chrome/browser/gtk/tabs/tab_renderer_gtk.cc
|
| diff --git a/chrome/browser/gtk/tabs/tab_renderer_gtk.cc b/chrome/browser/gtk/tabs/tab_renderer_gtk.cc
|
| index 83f92e1586e6c862f7ea5f471d1768505cfea927..cc6ea8fbb1ce817b2b62502b8a20bb9d2cfc3257 100644
|
| --- a/chrome/browser/gtk/tabs/tab_renderer_gtk.cc
|
| +++ b/chrome/browser/gtk/tabs/tab_renderer_gtk.cc
|
| @@ -128,8 +128,11 @@ TabRendererGtk::LoadingAnimation::Data::Data(
|
|
|
| bool TabRendererGtk::initialized_ = false;
|
| TabRendererGtk::TabImage TabRendererGtk::tab_active_ = {0};
|
| +TabRendererGtk::TabImage TabRendererGtk::tab_active_nano_ = {0};
|
| TabRendererGtk::TabImage TabRendererGtk::tab_inactive_ = {0};
|
| +TabRendererGtk::TabImage TabRendererGtk::tab_inactive_nano_ = {0};
|
| TabRendererGtk::TabImage TabRendererGtk::tab_alpha_ = {0};
|
| +TabRendererGtk::TabImage TabRendererGtk::tab_alpha_nano_ = {0};
|
| gfx::Font* TabRendererGtk::title_font_ = NULL;
|
| int TabRendererGtk::title_font_height_ = 0;
|
| int TabRendererGtk::close_button_width_ = 0;
|
| @@ -275,17 +278,24 @@ TabRendererGtk::~TabRendererGtk() {
|
|
|
| void TabRendererGtk::UpdateData(TabContents* contents,
|
| bool phantom,
|
| + bool app,
|
| bool loading_only) {
|
| DCHECK(contents);
|
| -
|
| theme_provider_ = GtkThemeProvider::GetFrom(contents->profile());
|
|
|
| if (!loading_only) {
|
| data_.title = contents->GetTitle();
|
| data_.off_the_record = contents->profile()->IsOffTheRecord();
|
| data_.crashed = contents->is_crashed();
|
| - data_.favicon = contents->GetFavIcon();
|
| +
|
| + SkBitmap* app_icon = contents->GetExtensionAppIcon();
|
| + if (app_icon)
|
| + data_.favicon = *app_icon;
|
| + else
|
| + data_.favicon = contents->GetFavIcon();
|
| +
|
| data_.phantom = phantom;
|
| + data_.app = app;
|
| // This is kind of a hacky way to determine whether our icon is the default
|
| // favicon. But the plumbing that would be necessary to do it right would
|
| // be a good bit of work and would sully code for other platforms which
|
| @@ -381,11 +391,18 @@ void TabRendererGtk::PaintFavIconArea(GdkEventExpose* event) {
|
| if (!theme_provider_->HasCustomImage(theme_id))
|
| offset_y = background_offset_y_;
|
| }
|
| +
|
| + // If the tab is a nanotab, we must take care to only draw the background
|
| + // within the height of the nanotab.
|
| + int nanoTabOffset = data_.app ? 9 : 0;
|
| SkBitmap* tab_bg = theme_provider_->GetBitmapNamed(theme_id);
|
| canvas.TileImageInt(*tab_bg,
|
| - x() + favicon_bounds_.x(), offset_y + favicon_bounds_.y(),
|
| - favicon_bounds_.x(), favicon_bounds_.y(),
|
| - favicon_bounds_.width(), favicon_bounds_.height());
|
| + x() + favicon_bounds_.x(),
|
| + offset_y + favicon_bounds_.y() + nanoTabOffset,
|
| + favicon_bounds_.x(),
|
| + favicon_bounds_.y() + nanoTabOffset,
|
| + favicon_bounds_.width(),
|
| + favicon_bounds_.height() - nanoTabOffset);
|
|
|
| if (!IsSelected()) {
|
| double throb_value = GetThrobValue();
|
| @@ -455,18 +472,37 @@ void TabRendererGtk::LoadTabImages() {
|
| tab_alpha_.image_l = rb.GetBitmapNamed(IDR_TAB_ALPHA_LEFT);
|
| tab_alpha_.image_r = rb.GetBitmapNamed(IDR_TAB_ALPHA_RIGHT);
|
|
|
| + tab_alpha_nano_.image_l = rb.GetBitmapNamed(IDR_TAB_ALPHA_NANO_LEFT);
|
| + tab_alpha_nano_.image_r = rb.GetBitmapNamed(IDR_TAB_ALPHA_NANO_RIGHT);
|
| +
|
| tab_active_.image_l = rb.GetBitmapNamed(IDR_TAB_ACTIVE_LEFT);
|
| tab_active_.image_c = rb.GetBitmapNamed(IDR_TAB_ACTIVE_CENTER);
|
| tab_active_.image_r = rb.GetBitmapNamed(IDR_TAB_ACTIVE_RIGHT);
|
| tab_active_.l_width = tab_active_.image_l->width();
|
| tab_active_.r_width = tab_active_.image_r->width();
|
|
|
| + const int kNanoTabDiffHeight = 13;
|
| +
|
| + tab_active_nano_.image_l = rb.GetBitmapNamed(IDR_TAB_ACTIVE_NANO_LEFT);
|
| + tab_active_nano_.image_c = rb.GetBitmapNamed(IDR_TAB_ACTIVE_NANO_CENTER);
|
| + tab_active_nano_.image_r = rb.GetBitmapNamed(IDR_TAB_ACTIVE_NANO_RIGHT);
|
| + tab_active_nano_.l_width = tab_active_nano_.image_l->width();
|
| + tab_active_nano_.r_width = tab_active_nano_.image_r->width();
|
| + tab_active_nano_.y_offset = kNanoTabDiffHeight;
|
| +
|
| tab_inactive_.image_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT);
|
| tab_inactive_.image_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER);
|
| tab_inactive_.image_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT);
|
| tab_inactive_.l_width = tab_inactive_.image_l->width();
|
| tab_inactive_.r_width = tab_inactive_.image_r->width();
|
|
|
| + tab_inactive_nano_.image_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_NANO_LEFT);
|
| + tab_inactive_nano_.image_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_NANO_CENTER);
|
| + tab_inactive_nano_.image_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_NANO_RIGHT);
|
| + tab_inactive_nano_.l_width = tab_inactive_.image_l->width();
|
| + tab_inactive_nano_.r_width = tab_inactive_.image_r->width();
|
| + tab_inactive_nano_.y_offset = kNanoTabDiffHeight;
|
| +
|
| close_button_width_ = rb.GetBitmapNamed(IDR_TAB_CLOSE)->width();
|
| close_button_height_ = rb.GetBitmapNamed(IDR_TAB_CLOSE)->height();
|
| }
|
| @@ -822,14 +858,25 @@ void TabRendererGtk::PaintIcon(gfx::Canvas* canvas) {
|
| favicon, favicon_bounds_.x(),
|
| favicon_bounds_.y() + fav_icon_hiding_offset_);
|
| } else {
|
| + // If the favicon is an app icon, it is allowed to be drawn slightly
|
| + // larger than the standard favicon.
|
| + int favIconHeightOffset = data_.app ? -2 : 0;
|
| + int favIconWidthDelta = data_.app ?
|
| + data_.favicon.width() - kFavIconSize : 0;
|
| + int favIconHeightDelta = data_.app ?
|
| + data_.favicon.height() - kFavIconSize : 0;
|
| +
|
| // TODO(pkasting): Use code in tab_icon_view.cc:PaintIcon() (or switch
|
| // to using that class to render the favicon).
|
| canvas->DrawBitmapInt(data_.favicon, 0, 0,
|
| data_.favicon.width(),
|
| data_.favicon.height(),
|
| - favicon_bounds_.x(),
|
| - favicon_bounds_.y() + fav_icon_hiding_offset_,
|
| - kFavIconSize, kFavIconSize,
|
| + favicon_bounds_.x() - favIconWidthDelta/2,
|
| + favicon_bounds_.y() + favIconHeightOffset
|
| + - favIconHeightDelta/2
|
| + + fav_icon_hiding_offset_,
|
| + kFavIconSize + favIconWidthDelta,
|
| + kFavIconSize + favIconHeightDelta,
|
| true);
|
| }
|
| }
|
| @@ -868,6 +915,12 @@ void TabRendererGtk::PaintInactiveTabBackground(gfx::Canvas* canvas) {
|
|
|
| SkBitmap* tab_bg = theme_provider_->GetBitmapNamed(tab_id);
|
|
|
| + // App tabs are drawn slightly differently (as nano tabs).
|
| + TabImage* tab_image = data_.app ? &tab_active_nano_ : &tab_active_;
|
| + TabImage* tab_inactive_image = data_.app ? &tab_inactive_nano_ :
|
| + &tab_inactive_;
|
| + TabImage* alpha = data_.app ? &tab_alpha_nano_ : &tab_alpha_;
|
| +
|
| // If the theme is providing a custom background image, then its top edge
|
| // should be at the top of the tab. Otherwise, we assume that the background
|
| // image is a composited foreground + frame image.
|
| @@ -875,27 +928,35 @@ void TabRendererGtk::PaintInactiveTabBackground(gfx::Canvas* canvas) {
|
| 0 : background_offset_y_;
|
|
|
| // Draw left edge.
|
| - SkBitmap* theme_l = GetMaskedBitmap(tab_alpha_.image_l, tab_bg, offset_x,
|
| + SkBitmap* theme_l = GetMaskedBitmap(alpha->image_l, tab_bg, offset_x,
|
| offset_y);
|
| canvas->DrawBitmapInt(*theme_l, 0, 0);
|
|
|
| // Draw right edge.
|
| - SkBitmap* theme_r = GetMaskedBitmap(tab_alpha_.image_r, tab_bg,
|
| - offset_x + width() - tab_active_.r_width, offset_y);
|
| + SkBitmap* theme_r = GetMaskedBitmap(alpha->image_r, tab_bg,
|
| + offset_x + width() - tab_image->r_width, offset_y);
|
|
|
| canvas->DrawBitmapInt(*theme_r, width() - theme_r->width(), 0);
|
|
|
| // Draw center.
|
| - canvas->TileImageInt(*tab_bg,
|
| - offset_x + tab_active_.l_width, kDropShadowOffset + offset_y,
|
| - tab_active_.l_width, 2,
|
| - width() - tab_active_.l_width - tab_active_.r_width, height() - 2);
|
| -
|
| - canvas->DrawBitmapInt(*tab_inactive_.image_l, 0, 0);
|
| - canvas->TileImageInt(*tab_inactive_.image_c, tab_inactive_.l_width, 0,
|
| - width() - tab_inactive_.l_width - tab_inactive_.r_width, height());
|
| - canvas->DrawBitmapInt(*tab_inactive_.image_r,
|
| - width() - tab_inactive_.r_width, 0);
|
| + canvas->TileImageInt(
|
| + *tab_bg,
|
| + offset_x + tab_image->l_width,
|
| + kDropShadowOffset + offset_y + tab_image->y_offset,
|
| + tab_image->l_width,
|
| + kDropShadowHeight + tab_image->y_offset,
|
| + width() - tab_image->l_width - tab_image->r_width,
|
| + height() - kDropShadowHeight - tab_image->y_offset);
|
| +
|
| + canvas->DrawBitmapInt(*tab_inactive_image->image_l, 0, 0);
|
| + canvas->TileImageInt(
|
| + *tab_inactive_image->image_c,
|
| + tab_inactive_image->l_width,
|
| + 0,
|
| + width() - tab_inactive_image->l_width - tab_inactive_image->r_width,
|
| + height());
|
| + canvas->DrawBitmapInt(*tab_inactive_image->image_r,
|
| + width() - tab_inactive_image->r_width, 0);
|
| }
|
|
|
| void TabRendererGtk::PaintActiveTabBackground(gfx::Canvas* canvas) {
|
| @@ -903,26 +964,32 @@ void TabRendererGtk::PaintActiveTabBackground(gfx::Canvas* canvas) {
|
|
|
| SkBitmap* tab_bg = theme_provider_->GetBitmapNamed(IDR_THEME_TOOLBAR);
|
|
|
| + // App tabs are drawn slightly differently (as nano tabs).
|
| + TabImage* tab_image = data_.app ? &tab_active_nano_ : &tab_active_;
|
| + TabImage* alpha = data_.app ? &tab_alpha_nano_ : &tab_alpha_;
|
| +
|
| // Draw left edge.
|
| - SkBitmap* theme_l = GetMaskedBitmap(tab_alpha_.image_l, tab_bg, offset_x, 0);
|
| + SkBitmap* theme_l = GetMaskedBitmap(alpha->image_l, tab_bg, offset_x, 0);
|
| canvas->DrawBitmapInt(*theme_l, 0, 0);
|
|
|
| // Draw right edge.
|
| - SkBitmap* theme_r = GetMaskedBitmap(tab_alpha_.image_r, tab_bg,
|
| - offset_x + width() - tab_active_.r_width, 0);
|
| - canvas->DrawBitmapInt(*theme_r, width() - tab_active_.r_width, 0);
|
| + SkBitmap* theme_r = GetMaskedBitmap(alpha->image_r, tab_bg,
|
| + offset_x + width() - tab_image->r_width, 0);
|
| + canvas->DrawBitmapInt(*theme_r, width() - tab_image->r_width, 0);
|
|
|
| // Draw center.
|
| canvas->TileImageInt(*tab_bg,
|
| - offset_x + tab_active_.l_width, kDropShadowHeight,
|
| - tab_active_.l_width, kDropShadowHeight,
|
| - width() - tab_active_.l_width - tab_active_.r_width,
|
| - height() - kDropShadowHeight);
|
| -
|
| - canvas->DrawBitmapInt(*tab_active_.image_l, 0, 0);
|
| - canvas->TileImageInt(*tab_active_.image_c, tab_active_.l_width, 0,
|
| - width() - tab_active_.l_width - tab_active_.r_width, height());
|
| - canvas->DrawBitmapInt(*tab_active_.image_r, width() - tab_active_.r_width, 0);
|
| + offset_x + tab_image->l_width,
|
| + kDropShadowHeight + tab_image->y_offset,
|
| + tab_image->l_width,
|
| + kDropShadowHeight + tab_image->y_offset,
|
| + width() - tab_image->l_width - tab_image->r_width,
|
| + height() - kDropShadowHeight - tab_image->y_offset);
|
| +
|
| + canvas->DrawBitmapInt(*tab_image->image_l, 0, 0);
|
| + canvas->TileImageInt(*tab_image->image_c, tab_image->l_width, 0,
|
| + width() - tab_image->l_width - tab_image->r_width, height());
|
| + canvas->DrawBitmapInt(*tab_image->image_r, width() - tab_image->r_width, 0);
|
| }
|
|
|
| void TabRendererGtk::PaintLoadingAnimation(gfx::Canvas* canvas) {
|
|
|