1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/views/detachable_toolbar_view.h"
6
7 #include "chrome/browser/themes/theme_service.h"
8 #include "grit/theme_resources.h"
9 #include "third_party/skia/include/core/SkBitmap.h"
10 #include "third_party/skia/include/core/SkShader.h"
11 #include "ui/base/resource/resource_bundle.h"
12 #include "ui/gfx/canvas_skia.h"
13 #include "ui/gfx/skia_util.h"
14 #include "views/window/non_client_view.h"
15
16 // How round the 'new tab' style bookmarks bar is.
17 static const int kNewtabBarRoundness = 5;
18
19 const SkColor DetachableToolbarView::kEdgeDividerColor =
20 SkColorSetRGB(222, 234, 248);
21 const SkColor DetachableToolbarView::kMiddleDividerColor =
22 SkColorSetRGB(194, 205, 212);
23
24 // static
PaintBackgroundAttachedMode(gfx::Canvas * canvas,views::View * view,const gfx::Point & background_origin)25 void DetachableToolbarView::PaintBackgroundAttachedMode(
26 gfx::Canvas* canvas,
27 views::View* view,
28 const gfx::Point& background_origin) {
29 ui::ThemeProvider* tp = view->GetThemeProvider();
30 SkColor theme_toolbar_color =
31 tp->GetColor(ThemeService::COLOR_TOOLBAR);
32 canvas->FillRectInt(theme_toolbar_color, 0, 0,
33 view->width(), view->height());
34 canvas->TileImageInt(*tp->GetBitmapNamed(IDR_THEME_TOOLBAR),
35 background_origin.x(), background_origin.y(), 0, 0,
36 view->width(), view->height());
37 }
38
39 // static
CalculateContentArea(double animation_state,double horizontal_padding,double vertical_padding,SkRect * rect,double * roundness,views::View * view)40 void DetachableToolbarView::CalculateContentArea(
41 double animation_state, double horizontal_padding,
42 double vertical_padding, SkRect* rect,
43 double* roundness, views::View* view) {
44 // The 0.5 is to correct for Skia's "draw on pixel boundaries"ness.
45 rect->set(SkDoubleToScalar(horizontal_padding - 0.5),
46 SkDoubleToScalar(vertical_padding - 0.5),
47 SkDoubleToScalar(view->width() - horizontal_padding - 0.5),
48 SkDoubleToScalar(view->height() - vertical_padding - 0.5));
49
50 *roundness = static_cast<double>(kNewtabBarRoundness) * animation_state;
51 }
52
53 // static
PaintHorizontalBorder(gfx::Canvas * canvas,DetachableToolbarView * view)54 void DetachableToolbarView::PaintHorizontalBorder(gfx::Canvas* canvas,
55 DetachableToolbarView* view) {
56 // Border can be at the top or at the bottom of the view depending on whether
57 // the view (bar/shelf) is attached or detached.
58 int thickness = views::NonClientFrameView::kClientEdgeThickness;
59 int y = view->IsDetached() ? 0 : (view->height() - thickness);
60 canvas->FillRectInt(ResourceBundle::toolbar_separator_color,
61 0, y, view->width(), thickness);
62 }
63
64 // static
PaintContentAreaBackground(gfx::Canvas * canvas,ui::ThemeProvider * theme_provider,const SkRect & rect,double roundness)65 void DetachableToolbarView::PaintContentAreaBackground(
66 gfx::Canvas* canvas, ui::ThemeProvider* theme_provider,
67 const SkRect& rect, double roundness) {
68 SkPaint paint;
69 paint.setAntiAlias(true);
70 paint.setColor(theme_provider->GetColor(ThemeService::COLOR_TOOLBAR));
71
72 canvas->AsCanvasSkia()->drawRoundRect(
73 rect, SkDoubleToScalar(roundness), SkDoubleToScalar(roundness), paint);
74 }
75
76 // static
PaintContentAreaBorder(gfx::Canvas * canvas,ui::ThemeProvider * theme_provider,const SkRect & rect,double roundness)77 void DetachableToolbarView::PaintContentAreaBorder(
78 gfx::Canvas* canvas, ui::ThemeProvider* theme_provider,
79 const SkRect& rect, double roundness) {
80 SkPaint border_paint;
81 border_paint.setColor(
82 theme_provider->GetColor(ThemeService::COLOR_NTP_HEADER));
83 border_paint.setStyle(SkPaint::kStroke_Style);
84 border_paint.setAlpha(96);
85 border_paint.setAntiAlias(true);
86
87 canvas->AsCanvasSkia()->drawRoundRect(
88 rect, SkDoubleToScalar(roundness), SkDoubleToScalar(roundness),
89 border_paint);
90 }
91
92 // static
PaintVerticalDivider(gfx::Canvas * canvas,int x,int height,int vertical_padding,const SkColor & top_color,const SkColor & middle_color,const SkColor & bottom_color)93 void DetachableToolbarView::PaintVerticalDivider(
94 gfx::Canvas* canvas, int x, int height, int vertical_padding,
95 const SkColor& top_color,
96 const SkColor& middle_color,
97 const SkColor& bottom_color) {
98 // Draw the upper half of the divider.
99 SkPaint paint;
100 SkSafeUnref(paint.setShader(gfx::CreateGradientShader(vertical_padding + 1,
101 height / 2,
102 top_color,
103 middle_color)));
104 SkRect rc = { SkIntToScalar(x),
105 SkIntToScalar(vertical_padding + 1),
106 SkIntToScalar(x + 1),
107 SkIntToScalar(height / 2) };
108 canvas->AsCanvasSkia()->drawRect(rc, paint);
109
110 // Draw the lower half of the divider.
111 SkPaint paint_down;
112 SkSafeUnref(paint_down.setShader(gfx::CreateGradientShader(
113 height / 2, height - vertical_padding, middle_color, bottom_color)));
114 SkRect rc_down = { SkIntToScalar(x),
115 SkIntToScalar(height / 2),
116 SkIntToScalar(x + 1),
117 SkIntToScalar(height - vertical_padding) };
118 canvas->AsCanvasSkia()->drawRect(rc_down, paint_down);
119 }
120