| Index: chrome/browser/views/frame/glass_browser_frame_view.cc
|
| ===================================================================
|
| --- chrome/browser/views/frame/glass_browser_frame_view.cc (revision 56738)
|
| +++ chrome/browser/views/frame/glass_browser_frame_view.cc (working copy)
|
| @@ -33,9 +33,6 @@
|
| // In the window corners, the resize areas don't actually expand bigger, but the
|
| // 16 px at the end of the top and bottom edges triggers diagonal resizing.
|
| const int kResizeAreaCornerSize = 16;
|
| -// In maximized mode, the OTR avatar starts 2 px below the top of the screen, so
|
| -// that it doesn't extend into the "3D edge" portion of the titlebar.
|
| -const int kOTRMaximizedTopSpacing = 2;
|
| // The OTR avatar ends 2 px above the bottom of the tabstrip (which, given the
|
| // way the tabstrip draws its bottom edge, will appear like a 1 px gap to the
|
| // user).
|
| @@ -82,8 +79,9 @@
|
| BaseTabStrip* tabstrip) const {
|
| if (browser_view_->UseVerticalTabs()) {
|
| gfx::Size ps = tabstrip->GetPreferredSize();
|
| - return gfx::Rect(NonClientBorderThickness(), NonClientTopBorderHeight(),
|
| - ps.width(), browser_view_->height());
|
| + return gfx::Rect(NonClientBorderThickness(),
|
| + NonClientTopBorderHeight(false, false), ps.width(),
|
| + browser_view_->height());
|
| }
|
| int minimize_button_offset = frame_->GetMinimizeButtonOffset();
|
| int tabstrip_x = browser_view_->ShouldShowOffTheRecordAvatar() ?
|
| @@ -103,11 +101,16 @@
|
| int tabstrip_width = minimize_button_offset - tabstrip_x -
|
| (frame_->GetWindow()->IsMaximized() ?
|
| kNewTabCaptionMaximizedSpacing : kNewTabCaptionRestoredSpacing);
|
| - return gfx::Rect(tabstrip_x, NonClientTopBorderHeight(),
|
| + return gfx::Rect(tabstrip_x, GetHorizontalTabStripVerticalOffset(false),
|
| std::max(0, tabstrip_width),
|
| tabstrip->GetPreferredHeight());
|
| }
|
|
|
| +int GlassBrowserFrameView::GetHorizontalTabStripVerticalOffset(
|
| + bool restored) const {
|
| + return NonClientTopBorderHeight(restored, true);
|
| +}
|
| +
|
| void GlassBrowserFrameView::UpdateThrobber(bool running) {
|
| if (throbber_running_) {
|
| if (running) {
|
| @@ -145,7 +148,7 @@
|
| return gfx::Rect(rect);
|
| }
|
|
|
| - int top_height = NonClientTopBorderHeight();
|
| + int top_height = NonClientTopBorderHeight(false, false);
|
| int border_thickness = NonClientBorderThickness();
|
| return gfx::Rect(std::max(0, client_bounds.x() - border_thickness),
|
| std::max(0, client_bounds.y() - top_height),
|
| @@ -222,15 +225,19 @@
|
| kNonClientBorderThickness;
|
| }
|
|
|
| -int GlassBrowserFrameView::NonClientTopBorderHeight() const {
|
| - if (frame_->GetWindow()->IsFullscreen())
|
| +int GlassBrowserFrameView::NonClientTopBorderHeight(
|
| + bool restored,
|
| + bool ignore_vertical_tabs) const {
|
| + if (!restored && frame_->GetWindow()->IsFullscreen())
|
| return 0;
|
| - if (browser_view_->UseVerticalTabs())
|
| - return static_cast<BrowserFrameWin*>(frame_)->GetTitleBarHeight();
|
| // We'd like to use FrameBorderThickness() here, but the maximized Aero glass
|
| // frame has a 0 frame border around most edges and a CYSIZEFRAME-thick border
|
| // at the top (see AeroGlassFrame::OnGetMinMaxInfo()).
|
| - return GetSystemMetrics(SM_CYSIZEFRAME) + (browser_view_->IsMaximized() ?
|
| + if (browser_view_->IsTabStripVisible() && !ignore_vertical_tabs &&
|
| + browser_view_->UseVerticalTabs())
|
| + return GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION);
|
| + return GetSystemMetrics(SM_CYSIZEFRAME) +
|
| + ((!restored && browser_view_->IsMaximized()) ?
|
| -kTabstripTopShadowThickness : kNonClientRestoredExtraThickness);
|
| }
|
|
|
| @@ -241,55 +248,56 @@
|
| gfx::Point toolbar_origin(toolbar_bounds.origin());
|
| View::ConvertPointToView(browser_view_, this, &toolbar_origin);
|
| toolbar_bounds.set_origin(toolbar_origin);
|
| + int x = toolbar_bounds.x();
|
| + int w = toolbar_bounds.width();
|
| + int left_x = x - kContentEdgeShadowThickness;
|
|
|
| SkBitmap* theme_toolbar = tp->GetBitmapNamed(IDR_THEME_TOOLBAR);
|
| SkBitmap* toolbar_left = tp->GetBitmapNamed(IDR_CONTENT_TOP_LEFT_CORNER);
|
| SkBitmap* toolbar_center = tp->GetBitmapNamed(IDR_CONTENT_TOP_CENTER);
|
|
|
| if (browser_view_->UseVerticalTabs()) {
|
| - gfx::Rect tabstrip_bounds(browser_view_->tabstrip()->bounds());
|
| - gfx::Point tabstrip_origin(tabstrip_bounds.origin());
|
| + gfx::Point tabstrip_origin(browser_view_->tabstrip()->bounds().origin());
|
| View::ConvertPointToView(browser_view_, this, &tabstrip_origin);
|
| - tabstrip_bounds.set_origin(tabstrip_origin);
|
| -
|
| - int x = tabstrip_bounds.x();
|
| int y = tabstrip_origin.y();
|
| - int w = toolbar_bounds.right() - x;
|
|
|
| - canvas->TileImageInt(*theme_toolbar, 0,
|
| - Tab::GetMinimumUnselectedSize().height(),
|
| - MirroredLeftPointForRect(toolbar_bounds), y,
|
| - toolbar_bounds.width(), theme_toolbar->height());
|
| + // Tile the toolbar image starting at the frame edge on the left and where
|
| + // the horizontal tabstrip would be on the top.
|
| + canvas->TileImageInt(*theme_toolbar, x,
|
| + y - GetHorizontalTabStripVerticalOffset(false), x, y,
|
| + w, theme_toolbar->height());
|
|
|
| // Draw left edge.
|
| int dest_y = y - kNonClientBorderThickness;
|
| canvas->DrawBitmapInt(*toolbar_left, 0, 0, kNonClientBorderThickness,
|
| - kNonClientBorderThickness, x - kNonClientBorderThickness, dest_y,
|
| - kNonClientBorderThickness, kNonClientBorderThickness, false);
|
| + kNonClientBorderThickness, left_x, dest_y,
|
| + kNonClientBorderThickness, kNonClientBorderThickness,
|
| + false);
|
|
|
| // Draw center edge. We need to draw a while line above the toolbar for the
|
| // image to overlay nicely.
|
| - canvas->FillRectInt(SK_ColorWHITE, x, y - 1, w, 1);
|
| - canvas->TileImageInt(*toolbar_center, x, dest_y, w,
|
| - toolbar_center->height());
|
| + int center_offset =
|
| + -kContentEdgeShadowThickness + kNonClientBorderThickness;
|
| + canvas->FillRectInt(SK_ColorWHITE, x + center_offset, y - 1,
|
| + w - (2 * center_offset), 1);
|
| + canvas->TileImageInt(*toolbar_center, x + center_offset, dest_y,
|
| + w - (2 * center_offset), toolbar_center->height());
|
|
|
| // Right edge.
|
| SkBitmap* toolbar_right = tp->GetBitmapNamed(IDR_CONTENT_TOP_RIGHT_CORNER);
|
| canvas->DrawBitmapInt(*toolbar_right,
|
| toolbar_right->width() - kNonClientBorderThickness, 0,
|
| kNonClientBorderThickness, kNonClientBorderThickness,
|
| - x + w - kNonClientBorderThickness, dest_y, kNonClientBorderThickness,
|
| + x + w - center_offset, dest_y, kNonClientBorderThickness,
|
| kNonClientBorderThickness, false);
|
| } else {
|
| - // Draw the toolbar background, setting src_y of the paint to the tab
|
| - // strip height as the toolbar background begins at the top of the tabs.
|
| - int x = toolbar_bounds.x() - kClientEdgeThickness;
|
| + // Tile the toolbar image starting at the frame edge on the left and where
|
| + // the tabstrip is on the top.
|
| int y = toolbar_bounds.y();
|
| - int src_y = browser_view_->GetTabStripHeight() - 1;
|
| - canvas->TileImageInt(*theme_toolbar, 0, src_y, x,
|
| - y + (kFrameShadowThickness * 2),
|
| - toolbar_bounds.width() + (2 * kClientEdgeThickness),
|
| - theme_toolbar->height());
|
| + int dest_y = y + (kFrameShadowThickness * 2);
|
| + canvas->TileImageInt(*theme_toolbar, x,
|
| + dest_y - GetHorizontalTabStripVerticalOffset(false), x,
|
| + dest_y, w, theme_toolbar->height());
|
|
|
| // Draw rounded corners for the tab.
|
| SkBitmap* toolbar_left_mask =
|
| @@ -304,12 +312,11 @@
|
| paint.setXfermodeMode(SkXfermode::kDstIn_Mode);
|
|
|
| // Mask out the top left corner.
|
| - int left_x = x - kContentEdgeShadowThickness;
|
| canvas->DrawBitmapInt(*toolbar_left_mask, left_x, y, paint);
|
|
|
| // Mask out the top right corner.
|
| - int right_x = toolbar_bounds.right() - toolbar_right_mask->width() +
|
| - kContentEdgeShadowThickness + kClientEdgeThickness;
|
| + int right_x =
|
| + x + w + kContentEdgeShadowThickness - toolbar_right_mask->width();
|
| canvas->DrawBitmapInt(*toolbar_right_mask, right_x, y, paint);
|
|
|
| // Draw left edge.
|
| @@ -326,33 +333,29 @@
|
|
|
| // Draw the content/toolbar separator.
|
| canvas->FillRectInt(ResourceBundle::toolbar_separator_color,
|
| - toolbar_bounds.x(), toolbar_bounds.bottom() - kClientEdgeThickness,
|
| - toolbar_bounds.width(), kClientEdgeThickness);
|
| + x + kClientEdgeThickness, toolbar_bounds.bottom() - kClientEdgeThickness,
|
| + w - (2 * kClientEdgeThickness), kClientEdgeThickness);
|
| }
|
|
|
| void GlassBrowserFrameView::PaintOTRAvatar(gfx::Canvas* canvas) {
|
| + // In RTL mode, the avatar icon should be looking the opposite direction.
|
| + canvas->Save();
|
| + if (base::i18n::IsRTL()) {
|
| + canvas->TranslateInt(width(), 0);
|
| + canvas->ScaleInt(-1, 1);
|
| + }
|
| +
|
| SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon();
|
| - int src_x = 0;
|
| - int src_y = (otr_avatar_icon.height() - otr_avatar_bounds_.height()) / 2;
|
| - int dst_x = MirroredLeftPointForRect(otr_avatar_bounds_);
|
| - int dst_y = otr_avatar_bounds_.y();
|
| int w = otr_avatar_bounds_.width();
|
| int h = otr_avatar_bounds_.height();
|
| - if (browser_view_->UseVerticalTabs()) {
|
| - // Only a portion of the otr icon is visible for vertical tabs. Clip it
|
| - // so that it doesn't overlap shadows.
|
| - gfx::Point tabstrip_origin(browser_view_->tabstrip()->bounds().origin());
|
| - View::ConvertPointToView(frame_->GetWindow()->GetClientView(), this,
|
| - &tabstrip_origin);
|
| - canvas->Save();
|
| - canvas->ClipRectInt(dst_x, 2, w, tabstrip_origin.y() - 4);
|
| - canvas->DrawBitmapInt(otr_avatar_icon, src_x, src_y, w, h, dst_x, dst_y,
|
| - w, h, false);
|
| - canvas->Restore();
|
| - } else {
|
| - canvas->DrawBitmapInt(otr_avatar_icon, src_x, src_y, w, h, dst_x, dst_y,
|
| - w, h, false);
|
| - }
|
| + canvas->DrawBitmapInt(otr_avatar_icon, 0,
|
| + // Bias the rounding to select a region that's lower rather than higher,
|
| + // as the shadows at the image top mean the apparent center is below the
|
| + // real center.
|
| + ((otr_avatar_icon.height() - otr_avatar_bounds_.height()) + 1) / 2, w, h,
|
| + otr_avatar_bounds_.x(), otr_avatar_bounds_.y(), w, h, false);
|
| +
|
| + canvas->Restore();
|
| }
|
|
|
| void GlassBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) {
|
| @@ -370,23 +373,10 @@
|
| std::max(client_area_top, height() - NonClientBorderThickness());
|
| int client_area_height = client_area_bottom - client_area_top;
|
|
|
| + // Draw the client edge images.
|
| SkBitmap* right = tp->GetBitmapNamed(IDR_CONTENT_RIGHT_SIDE);
|
| canvas->TileImageInt(*right, client_area_bounds.right(), client_area_top,
|
| right->width(), client_area_height);
|
| -
|
| - // Draw the toolbar color so that the client edges show the right color even
|
| - // where not covered by the toolbar image.
|
| - SkColor toolbar_color = tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR);
|
| - canvas->FillRectInt(toolbar_color,
|
| - client_area_bounds.x() - kClientEdgeThickness, client_area_top,
|
| - kClientEdgeThickness,
|
| - client_area_bottom + kClientEdgeThickness - client_area_top);
|
| - canvas->FillRectInt(toolbar_color, client_area_bounds.x(), client_area_bottom,
|
| - client_area_bounds.width(), kClientEdgeThickness);
|
| - canvas->FillRectInt(toolbar_color, client_area_bounds.right(),
|
| - client_area_top, kClientEdgeThickness,
|
| - client_area_bottom + kClientEdgeThickness - client_area_top);
|
| -
|
| canvas->DrawBitmapInt(
|
| *tp->GetBitmapNamed(IDR_CONTENT_BOTTOM_RIGHT_CORNER),
|
| client_area_bounds.right(), client_area_bottom);
|
| @@ -401,6 +391,21 @@
|
| SkBitmap* left = tp->GetBitmapNamed(IDR_CONTENT_LEFT_SIDE);
|
| canvas->TileImageInt(*left, client_area_bounds.x() - left->width(),
|
| client_area_top, left->width(), client_area_height);
|
| +
|
| + // Draw the toolbar color so that the client edges show the right color even
|
| + // where not covered by the toolbar image. NOTE: We do this after drawing the
|
| + // images because the images are meant to alpha-blend atop the frame whereas
|
| + // these rects are meant to be fully opaque, without anything overlaid.
|
| + SkColor toolbar_color = tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR);
|
| + canvas->FillRectInt(toolbar_color,
|
| + client_area_bounds.x() - kClientEdgeThickness, client_area_top,
|
| + kClientEdgeThickness,
|
| + client_area_bottom + kClientEdgeThickness - client_area_top);
|
| + canvas->FillRectInt(toolbar_color, client_area_bounds.x(), client_area_bottom,
|
| + client_area_bounds.width(), kClientEdgeThickness);
|
| + canvas->FillRectInt(toolbar_color, client_area_bounds.right(),
|
| + client_area_top, kClientEdgeThickness,
|
| + client_area_bottom + kClientEdgeThickness - client_area_top);
|
| }
|
|
|
| void GlassBrowserFrameView::LayoutOTRAvatar() {
|
| @@ -413,20 +418,20 @@
|
| otr_x += width() - frame_->GetMinimizeButtonOffset();
|
|
|
| SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon();
|
| - int otr_height = browser_view_->IsTabStripVisible() ?
|
| - otr_avatar_icon.height() : 0;
|
| - int otr_y = 0;
|
| + int otr_bottom, otr_restored_y;
|
| if (browser_view_->UseVerticalTabs()) {
|
| - otr_y = NonClientTopBorderHeight() - otr_avatar_icon.height();
|
| - } else if (browser_view_->IsTabStripVisible()) {
|
| - int top_height = NonClientTopBorderHeight();
|
| - int tabstrip_height =
|
| + otr_bottom = NonClientTopBorderHeight(false, false) - kOTRBottomSpacing;
|
| + otr_restored_y = kFrameShadowThickness;
|
| + } else {
|
| + otr_bottom = GetHorizontalTabStripVerticalOffset(false) +
|
| browser_view_->GetTabStripHeight() - kOTRBottomSpacing;
|
| - otr_height = frame_->GetWindow()->IsMaximized() ?
|
| - (tabstrip_height - kOTRMaximizedTopSpacing) : otr_avatar_icon.height();
|
| - otr_y = top_height + tabstrip_height - otr_height;
|
| + otr_restored_y = otr_bottom - otr_avatar_icon.height();
|
| }
|
| - otr_avatar_bounds_.SetRect(otr_x, otr_y, otr_avatar_icon.width(), otr_height);
|
| + int otr_y = frame_->GetWindow()->IsMaximized() ?
|
| + (NonClientTopBorderHeight(false, true) + kTabstripTopShadowThickness) :
|
| + otr_restored_y;
|
| + otr_avatar_bounds_.SetRect(otr_x, otr_y, otr_avatar_icon.width(),
|
| + browser_view_->ShouldShowOffTheRecordAvatar() ? (otr_bottom - otr_y) : 0);
|
| }
|
|
|
| void GlassBrowserFrameView::LayoutClientView() {
|
| @@ -438,7 +443,7 @@
|
| if (!browser_view_->IsTabStripVisible())
|
| return gfx::Rect(0, 0, this->width(), this->height());
|
|
|
| - int top_height = NonClientTopBorderHeight();
|
| + int top_height = NonClientTopBorderHeight(false, false);
|
| int border_thickness = NonClientBorderThickness();
|
| return gfx::Rect(border_thickness, top_height,
|
| std::max(0, width - (2 * border_thickness)),
|
|
|