OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/views/frame/browser_frame_aura.h" | 5 #include "chrome/browser/ui/views/frame/browser_frame_aura.h" |
6 | 6 |
7 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.h" |
8 #include "ash/shell.h" | 8 #include "ash/shell.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "chrome/browser/chromeos/status/status_area_view.h" | 10 #include "chrome/browser/chromeos/status/status_area_view.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 // Gross hack: We split the toolbar images into two pieces, since sometimes | 65 // Gross hack: We split the toolbar images into two pieces, since sometimes |
66 // (popup mode) the toolbar isn't tall enough to show the whole image. The | 66 // (popup mode) the toolbar isn't tall enough to show the whole image. The |
67 // split happens between the top shadow section and the bottom gradient | 67 // split happens between the top shadow section and the bottom gradient |
68 // section so that we never break the gradient. | 68 // section so that we never break the gradient. |
69 int split_point = views::NonClientFrameView::kFrameShadowThickness * 2; | 69 int split_point = views::NonClientFrameView::kFrameShadowThickness * 2; |
70 int bottom_y = y + split_point; | 70 int bottom_y = y + split_point; |
71 ui::ThemeProvider* tp = browser_view_->GetThemeProvider(); | 71 ui::ThemeProvider* tp = browser_view_->GetThemeProvider(); |
72 SkBitmap* toolbar_left = tp->GetBitmapNamed(IDR_CONTENT_TOP_LEFT_CORNER); | 72 SkBitmap* toolbar_left = tp->GetBitmapNamed(IDR_CONTENT_TOP_LEFT_CORNER); |
73 int bottom_edge_height = std::min(toolbar_left->height(), h) - split_point; | 73 int bottom_edge_height = std::min(toolbar_left->height(), h) - split_point; |
74 | 74 |
75 // Split our canvas out so we can mask out the corners of the toolbar | |
76 // without masking out the frame. | |
77 canvas->SaveLayerAlpha( | |
78 255, gfx::Rect(x - views::NonClientFrameView::kClientEdgeThickness, | |
79 y, | |
80 w + views::NonClientFrameView::kClientEdgeThickness * 3, | |
81 h)); | |
82 canvas->GetSkCanvas()->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode); | |
83 | |
84 canvas->FillRect(gfx::Rect(x, bottom_y, w, bottom_edge_height), | 75 canvas->FillRect(gfx::Rect(x, bottom_y, w, bottom_edge_height), |
85 tp->GetColor(ThemeService::COLOR_TOOLBAR)); | 76 tp->GetColor(ThemeService::COLOR_TOOLBAR)); |
86 | 77 |
87 // Tile the toolbar image starting at the frame edge on the left and where the | 78 // Tile the toolbar image starting at the frame edge on the left and where the |
88 // horizontal tabstrip is (or would be) on the top. | 79 // horizontal tabstrip is (or would be) on the top. |
89 SkBitmap* theme_toolbar = tp->GetBitmapNamed(IDR_THEME_TOOLBAR); | 80 SkBitmap* theme_toolbar = tp->GetBitmapNamed(IDR_THEME_TOOLBAR); |
90 canvas->TileImageInt(*theme_toolbar, x, | 81 canvas->TileImageInt(*theme_toolbar, |
91 bottom_y, x, | 82 x, bottom_y, |
92 bottom_y, w, theme_toolbar->height()); | 83 x, bottom_y, |
93 | 84 w, theme_toolbar->height()); |
94 // Draw rounded corners for the tab. | |
95 SkBitmap* toolbar_left_mask = | |
96 tp->GetBitmapNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK); | |
97 SkBitmap* toolbar_right_mask = | |
98 tp->GetBitmapNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK); | |
99 | |
100 // We mask out the corners by using the DestinationIn transfer mode, | |
101 // which keeps the RGB pixels from the destination and the alpha from | |
102 // the source. | |
103 SkPaint paint; | |
104 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); | |
105 | |
106 // Mask the left edge. | |
107 int left_x = x - kContentEdgeShadowThickness; | |
108 canvas->DrawBitmapInt(*toolbar_left_mask, 0, 0, toolbar_left_mask->width(), | |
109 split_point, left_x, y, toolbar_left_mask->width(), | |
110 split_point, false, paint); | |
111 canvas->DrawBitmapInt(*toolbar_left_mask, 0, | |
112 toolbar_left_mask->height() - bottom_edge_height, | |
113 toolbar_left_mask->width(), bottom_edge_height, left_x, bottom_y, | |
114 toolbar_left_mask->width(), bottom_edge_height, false, paint); | |
115 | |
116 // Mask the right edge. | |
117 int right_x = | |
118 x + w - toolbar_right_mask->width() + kContentEdgeShadowThickness; | |
119 canvas->DrawBitmapInt(*toolbar_right_mask, 0, 0, toolbar_right_mask->width(), | |
120 split_point, right_x, y, toolbar_right_mask->width(), | |
121 split_point, false, paint); | |
122 canvas->DrawBitmapInt(*toolbar_right_mask, 0, | |
123 toolbar_right_mask->height() - bottom_edge_height, | |
124 toolbar_right_mask->width(), bottom_edge_height, right_x, bottom_y, | |
125 toolbar_right_mask->width(), bottom_edge_height, false, paint); | |
126 canvas->Restore(); | |
127 | |
128 canvas->DrawBitmapInt(*toolbar_left, 0, 0, toolbar_left->width(), split_point, | |
129 left_x, y, toolbar_left->width(), split_point, false); | |
130 canvas->DrawBitmapInt(*toolbar_left, 0, | |
131 toolbar_left->height() - bottom_edge_height, toolbar_left->width(), | |
132 bottom_edge_height, left_x, bottom_y, toolbar_left->width(), | |
133 bottom_edge_height, false); | |
134 | 85 |
135 SkBitmap* toolbar_center = | 86 SkBitmap* toolbar_center = |
136 tp->GetBitmapNamed(IDR_CONTENT_TOP_CENTER); | 87 tp->GetBitmapNamed(IDR_CONTENT_TOP_CENTER); |
137 canvas->TileImageInt(*toolbar_center, 0, 0, left_x + toolbar_left->width(), | 88 canvas->TileImageInt(*toolbar_center, |
138 y, right_x - (left_x + toolbar_left->width()), | 89 0, 0, |
139 split_point); | 90 x, y, |
140 | 91 w, split_point); |
141 SkBitmap* toolbar_right = tp->GetBitmapNamed(IDR_CONTENT_TOP_RIGHT_CORNER); | |
142 canvas->DrawBitmapInt(*toolbar_right, 0, 0, toolbar_right->width(), | |
143 split_point, right_x, y, toolbar_right->width(), split_point, false); | |
144 canvas->DrawBitmapInt(*toolbar_right, 0, | |
145 toolbar_right->height() - bottom_edge_height, toolbar_right->width(), | |
146 bottom_edge_height, right_x, bottom_y, toolbar_right->width(), | |
147 bottom_edge_height, false); | |
148 | 92 |
149 // Draw the content/toolbar separator. | 93 // Draw the content/toolbar separator. |
150 canvas->FillRect(gfx::Rect( | 94 canvas->FillRect(gfx::Rect( |
151 x + views::NonClientFrameView::kClientEdgeThickness, | 95 x + views::NonClientFrameView::kClientEdgeThickness, |
152 toolbar_bounds.bottom() - views::NonClientFrameView::kClientEdgeThickness, | 96 toolbar_bounds.bottom() - views::NonClientFrameView::kClientEdgeThickness, |
153 w - (2 * views::NonClientFrameView::kClientEdgeThickness), | 97 w - (2 * views::NonClientFrameView::kClientEdgeThickness), |
154 views::NonClientFrameView::kClientEdgeThickness), | 98 views::NonClientFrameView::kClientEdgeThickness), |
155 ThemeService::GetDefaultColor(ThemeService::COLOR_TOOLBAR_SEPARATOR)); | 99 ThemeService::GetDefaultColor(ThemeService::COLOR_TOOLBAR_SEPARATOR)); |
156 } | 100 } |
157 | 101 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 /////////////////////////////////////////////////////////////////////////////// | 207 /////////////////////////////////////////////////////////////////////////////// |
264 // BrowserFrameAura, public: | 208 // BrowserFrameAura, public: |
265 | 209 |
266 BrowserFrameAura::BrowserFrameAura(BrowserFrame* browser_frame, | 210 BrowserFrameAura::BrowserFrameAura(BrowserFrame* browser_frame, |
267 BrowserView* browser_view) | 211 BrowserView* browser_view) |
268 : views::NativeWidgetAura(browser_frame), | 212 : views::NativeWidgetAura(browser_frame), |
269 browser_view_(browser_view), | 213 browser_view_(browser_view), |
270 window_property_watcher_(new WindowPropertyWatcher(this, browser_frame)) { | 214 window_property_watcher_(new WindowPropertyWatcher(this, browser_frame)) { |
271 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 215 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
272 if (command_line->HasSwitch(ash::switches::kAuraTranslucentFrames)) { | 216 if (command_line->HasSwitch(ash::switches::kAuraTranslucentFrames)) { |
273 // Aura paints layers behind this view, so this must be a layer also. | |
274 // TODO: see if we can avoid this, layers are expensive. | |
275 browser_view_->SetPaintToLayer(true); | |
276 browser_view_->layer()->SetFillsBoundsOpaquely(false); | |
277 // Background only needed for Aura-style windows. | 217 // Background only needed for Aura-style windows. |
278 browser_view_->set_background(new ToolbarBackground(browser_view)); | 218 browser_view_->set_background(new ToolbarBackground(browser_view)); |
279 } | 219 } |
280 GetNativeWindow()->SetName("BrowserFrameAura"); | 220 GetNativeWindow()->SetName("BrowserFrameAura"); |
281 GetNativeWindow()->AddObserver(window_property_watcher_.get()); | 221 GetNativeWindow()->AddObserver(window_property_watcher_.get()); |
282 } | 222 } |
283 | 223 |
284 BrowserFrameAura::~BrowserFrameAura() { | 224 BrowserFrameAura::~BrowserFrameAura() { |
285 } | 225 } |
286 | 226 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 | 263 |
324 //////////////////////////////////////////////////////////////////////////////// | 264 //////////////////////////////////////////////////////////////////////////////// |
325 // NativeBrowserFrame, public: | 265 // NativeBrowserFrame, public: |
326 | 266 |
327 // static | 267 // static |
328 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( | 268 NativeBrowserFrame* NativeBrowserFrame::CreateNativeBrowserFrame( |
329 BrowserFrame* browser_frame, | 269 BrowserFrame* browser_frame, |
330 BrowserView* browser_view) { | 270 BrowserView* browser_view) { |
331 return new BrowserFrameAura(browser_frame, browser_view); | 271 return new BrowserFrameAura(browser_frame, browser_view); |
332 } | 272 } |
OLD | NEW |