Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7673)

Unified Diff: chrome/browser/ui/views/frame/opaque_browser_frame_view.cc

Issue 8772060: Refactor window frame painting into a window background class (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: final cleanup of PaintRestored Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/views/frame/opaque_browser_frame_view.h ('k') | ui/base/resource/resource_bundle.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
index 87399e91eff0eacbe83965108df2a1e377f1a75f..173d33eb93e9997d186f8f98f0a2453db059eaaa 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -39,6 +39,7 @@
#include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/widget/root_view.h"
+#include "ui/views/window/frame_background.h"
#include "ui/views/window/window_shape.h"
#if defined(USE_VIRTUAL_KEYBOARD)
@@ -125,7 +126,8 @@ OpaqueBrowserFrameView::OpaqueBrowserFrameView(BrowserFrame* frame,
restore_button_(new views::ImageButton(this))),
ALLOW_THIS_IN_INITIALIZER_LIST(
close_button_(new views::ImageButton(this))),
- window_icon_(NULL) {
+ window_icon_(NULL),
+ frame_background_(new views::FrameBackground()) {
ui::ThemeProvider* tp = frame->GetThemeProvider();
SkColor color = tp->GetColor(ThemeService::COLOR_BUTTON_BACKGROUND);
SkBitmap* background =
@@ -576,169 +578,70 @@ gfx::Rect OpaqueBrowserFrameView::IconBounds() const {
}
void OpaqueBrowserFrameView::PaintRestoredFrameBorder(gfx::Canvas* canvas) {
- ui::ThemeProvider* tp = GetThemeProvider();
+ frame_background_->set_frame_color(GetFrameColor());
+ frame_background_->set_theme_bitmap(GetFrameBitmap());
+ frame_background_->set_theme_overlay_bitmap(GetFrameOverlayBitmap());
+ frame_background_->set_top_area_height(GetTopAreaHeight());
+ ui::ThemeProvider* tp = GetThemeProvider();
+ frame_background_->SetSideImages(
+ tp->GetBitmapNamed(IDR_WINDOW_LEFT_SIDE),
+ tp->GetBitmapNamed(IDR_WINDOW_TOP_CENTER),
+ tp->GetBitmapNamed(IDR_WINDOW_RIGHT_SIDE),
+ tp->GetBitmapNamed(IDR_WINDOW_BOTTOM_CENTER));
#if defined(USE_AURA)
// TODO(jamescook): Remove this when Aura defaults to its own window frame,
// BrowserNonClientFrameViewAura. Until then, use custom square corners to
// avoid performance penalties associated with transparent layers.
- SkBitmap* top_left_corner = tp->GetBitmapNamed(IDR_AURA_WINDOW_TOP_LEFT);
- SkBitmap* top_right_corner = tp->GetBitmapNamed(IDR_AURA_WINDOW_TOP_RIGHT);
- SkBitmap* bottom_left_corner =
- tp->GetBitmapNamed(IDR_AURA_WINDOW_BOTTOM_LEFT);
- SkBitmap* bottom_right_corner =
- tp->GetBitmapNamed(IDR_AURA_WINDOW_BOTTOM_RIGHT);
+ frame_background_->SetCornerImages(
+ tp->GetBitmapNamed(IDR_AURA_WINDOW_TOP_LEFT),
+ tp->GetBitmapNamed(IDR_AURA_WINDOW_TOP_RIGHT),
+ tp->GetBitmapNamed(IDR_AURA_WINDOW_BOTTOM_LEFT),
+ tp->GetBitmapNamed(IDR_AURA_WINDOW_BOTTOM_RIGHT));
#else
- SkBitmap* top_left_corner = tp->GetBitmapNamed(IDR_WINDOW_TOP_LEFT_CORNER);
- SkBitmap* top_right_corner = tp->GetBitmapNamed(IDR_WINDOW_TOP_RIGHT_CORNER);
- SkBitmap* bottom_left_corner =
- tp->GetBitmapNamed(IDR_WINDOW_BOTTOM_LEFT_CORNER);
- SkBitmap* bottom_right_corner =
- tp->GetBitmapNamed(IDR_WINDOW_BOTTOM_RIGHT_CORNER);
+ frame_background_->SetCornerImages(
+ tp->GetBitmapNamed(IDR_WINDOW_TOP_LEFT_CORNER),
+ tp->GetBitmapNamed(IDR_WINDOW_TOP_RIGHT_CORNER),
+ tp->GetBitmapNamed(IDR_WINDOW_BOTTOM_LEFT_CORNER),
+ tp->GetBitmapNamed(IDR_WINDOW_BOTTOM_RIGHT_CORNER));
#endif
- SkBitmap* top_edge = tp->GetBitmapNamed(IDR_WINDOW_TOP_CENTER);
- SkBitmap* right_edge = tp->GetBitmapNamed(IDR_WINDOW_RIGHT_SIDE);
- SkBitmap* left_edge = tp->GetBitmapNamed(IDR_WINDOW_LEFT_SIDE);
- SkBitmap* bottom_edge = tp->GetBitmapNamed(IDR_WINDOW_BOTTOM_CENTER);
-
- // Fill with the frame color first so we have a constant background for
- // areas not covered by the theme image.
- SkBitmap* theme_frame = GetFrameBitmap();
- int top_area_height = theme_frame->height();
- if (browser_view()->IsTabStripVisible()) {
- top_area_height = std::max(top_area_height,
- GetBoundsForTabStrip(browser_view()->tabstrip()).bottom());
- }
- SkColor frame_color = GetFrameColor();
- canvas->FillRect(frame_color, gfx::Rect(0, 0, width(), top_area_height));
-
- int remaining_height = height() - top_area_height;
- if (remaining_height > 0) {
- // Now fill down the sides.
- canvas->FillRect(frame_color,
- gfx::Rect(0, top_area_height, left_edge->width(),
- remaining_height));
- canvas->FillRect(frame_color,
- gfx::Rect(width() - right_edge->width(),
- top_area_height, right_edge->width(),
- remaining_height));
- int center_width = width() - left_edge->width() - right_edge->width();
- if (center_width > 0) {
- // Now fill the bottom area.
- canvas->FillRect(frame_color,
- gfx::Rect(left_edge->width(),
- height() - bottom_edge->height(),
- center_width, bottom_edge->height()));
- }
- }
-
- // Draw the theme frame.
- canvas->TileImageInt(*theme_frame, 0, 0, width(), theme_frame->height());
+ frame_background_->PaintRestored(canvas, this);
- // Draw the theme frame overlay.
- if (tp->HasCustomImage(IDR_THEME_FRAME_OVERLAY) &&
- browser_view()->IsBrowserTypeNormal() &&
- !browser_view()->IsOffTheRecord()) {
- canvas->DrawBitmapInt(*tp->GetBitmapNamed(ShouldPaintAsActive() ?
- IDR_THEME_FRAME_OVERLAY : IDR_THEME_FRAME_OVERLAY_INACTIVE), 0, 0);
- }
-
- // Top.
- int top_left_height = std::min(top_left_corner->height(),
- height() - bottom_left_corner->height());
- canvas->DrawBitmapInt(*top_left_corner, 0, 0, top_left_corner->width(),
- top_left_height, 0, 0, top_left_corner->width(), top_left_height, false);
- canvas->TileImageInt(*top_edge, top_left_corner->width(), 0,
- width() - top_left_corner->width() - top_right_corner->width(),
- top_edge->height());
- int top_right_height = std::min(top_right_corner->height(),
- height() - bottom_right_corner->height());
- canvas->DrawBitmapInt(*top_right_corner, 0, 0, top_right_corner->width(),
- top_right_height, width() - top_right_corner->width(), 0,
- top_right_corner->width(), top_right_height, false);
// Note: When we don't have a toolbar, we need to draw some kind of bottom
// edge here. Because the App Window graphics we use for this have an
// attached client edge and their sizing algorithm is a little involved, we do
// all this in PaintRestoredClientEdge().
-
- // Right.
- canvas->TileImageInt(*right_edge, width() - right_edge->width(),
- top_right_height, right_edge->width(),
- height() - top_right_height - bottom_right_corner->height());
-
- // Bottom.
- canvas->DrawBitmapInt(*bottom_right_corner,
- width() - bottom_right_corner->width(),
- height() - bottom_right_corner->height());
- canvas->TileImageInt(*bottom_edge, bottom_left_corner->width(),
- height() - bottom_edge->height(),
- width() - bottom_left_corner->width() - bottom_right_corner->width(),
- bottom_edge->height());
- canvas->DrawBitmapInt(*bottom_left_corner, 0,
- height() - bottom_left_corner->height());
-
- // Left.
- canvas->TileImageInt(*left_edge, 0, top_left_height, left_edge->width(),
- height() - top_left_height - bottom_left_corner->height());
}
void OpaqueBrowserFrameView::PaintMaximizedFrameBorder(gfx::Canvas* canvas) {
- ui::ThemeProvider* tp = GetThemeProvider();
+ frame_background_->set_frame_color(GetFrameColor());
+ frame_background_->set_theme_bitmap(GetFrameBitmap());
+ frame_background_->set_theme_overlay_bitmap(GetFrameOverlayBitmap());
+ frame_background_->set_top_area_height(GetTopAreaHeight());
// Allow customization of these attributes.
SkBitmap* left = NULL;
SkBitmap* right = NULL;
int top_offset = 0;
ModifyMaximizedFramePainting(&top_offset, &left, &right);
+ frame_background_->SetMaximizedCorners(left, right, top_offset);
- // We will be painting from top_offset to top_offset + theme_frame_height. If
- // this is less than GetBoundsForTabStrip.bottom, we need to paint the frame
- // color.
- SkBitmap* theme_frame = GetFrameBitmap();
- int theme_frame_bottom = top_offset + theme_frame->height();
- int top_area_height =
- GetBoundsForTabStrip(browser_view()->tabstrip()).bottom();
- if (top_area_height > theme_frame_bottom) {
- SkColor frame_color = GetFrameColor();
- canvas->FillRect(frame_color, gfx::Rect(0, 0, width(), top_area_height));
- }
-
- // Draw the theme frame. It must be aligned with the tabstrip as if we were
+ // Theme frame must be aligned with the tabstrip as if we were
// in restored mode. Note that the top of the tabstrip is
// kTabstripTopShadowThickness px off the top of the screen.
int theme_background_y = -(GetHorizontalTabStripVerticalOffset(true) +
kTabstripTopShadowThickness);
- int left_offset = 0, right_offset = 0;
-
- if (left || right) {
- // If we have either a left or right we should have both.
- DCHECK(left && right);
- left_offset = left->width();
- right_offset = right->width();
- canvas->DrawBitmapInt(*left, 0, 0);
- canvas->DrawBitmapInt(*right, width() - right_offset, 0);
- }
+ frame_background_->set_theme_background_y(theme_background_y);
- canvas->TileImageInt(*theme_frame,
- left_offset,
- top_offset,
- width() - (left_offset + right_offset),
- theme_frame->height());
- // Draw the theme frame overlay
- if (tp->HasCustomImage(IDR_THEME_FRAME_OVERLAY) &&
- browser_view()->IsBrowserTypeNormal() &&
- !browser_view()->IsOffTheRecord()) {
- SkBitmap* theme_overlay = tp->GetBitmapNamed(ShouldPaintAsActive() ?
- IDR_THEME_FRAME_OVERLAY : IDR_THEME_FRAME_OVERLAY_INACTIVE);
- canvas->DrawBitmapInt(*theme_overlay, 0, theme_background_y);
- }
+ frame_background_->PaintMaximized(canvas, this);
+ // TODO(jamescook): Migrate this into FrameBackground.
if (!browser_view()->IsToolbarVisible()) {
// There's no toolbar to edge the frame border, so we need to draw a bottom
// edge. The graphic we use for this has a built in client edge, so we clip
// it off the bottom.
SkBitmap* top_center =
- tp->GetBitmapNamed(IDR_APP_TOP_CENTER);
+ GetThemeProvider()->GetBitmapNamed(IDR_APP_TOP_CENTER);
int edge_height = top_center->height() - kClientEdgeThickness;
canvas->TileImageInt(*top_center, 0,
frame()->client_view()->y() - edge_height, width(), edge_height);
@@ -959,6 +862,27 @@ void OpaqueBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) {
client_area_bottom + kClientEdgeThickness - client_area_top));
}
+SkColor OpaqueBrowserFrameView::GetFrameColor() const {
+ bool is_incognito = browser_view()->IsOffTheRecord();
+ if (browser_view()->IsBrowserTypeNormal()) {
+ if (ShouldPaintAsActive()) {
+ return GetThemeProvider()->GetColor(is_incognito ?
+ ThemeService::COLOR_FRAME_INCOGNITO : ThemeService::COLOR_FRAME);
+ }
+ return GetThemeProvider()->GetColor(is_incognito ?
+ ThemeService::COLOR_FRAME_INCOGNITO_INACTIVE :
+ ThemeService::COLOR_FRAME_INACTIVE);
+ }
+ // Never theme app and popup windows.
+ if (ShouldPaintAsActive()) {
+ return is_incognito ?
+ ResourceBundle::frame_color_incognito : ResourceBundle::frame_color;
+ }
+ return is_incognito ?
+ ResourceBundle::frame_color_incognito_inactive :
+ ResourceBundle::frame_color_inactive;
+}
+
SkBitmap* OpaqueBrowserFrameView::GetFrameBitmap() const {
bool is_incognito = browser_view()->IsOffTheRecord();
int resource_id;
@@ -984,25 +908,25 @@ SkBitmap* OpaqueBrowserFrameView::GetFrameBitmap() const {
return rb.GetBitmapNamed(resource_id);
}
-SkColor OpaqueBrowserFrameView::GetFrameColor() const {
- bool is_incognito = browser_view()->IsOffTheRecord();
- if (browser_view()->IsBrowserTypeNormal()) {
- if (ShouldPaintAsActive()) {
- return GetThemeProvider()->GetColor(is_incognito ?
- ThemeService::COLOR_FRAME_INCOGNITO : ThemeService::COLOR_FRAME);
- }
- return GetThemeProvider()->GetColor(is_incognito ?
- ThemeService::COLOR_FRAME_INCOGNITO_INACTIVE :
- ThemeService::COLOR_FRAME_INACTIVE);
+SkBitmap* OpaqueBrowserFrameView::GetFrameOverlayBitmap() const {
+ ui::ThemeProvider* tp = GetThemeProvider();
+ if (tp->HasCustomImage(IDR_THEME_FRAME_OVERLAY) &&
+ browser_view()->IsBrowserTypeNormal() &&
+ !browser_view()->IsOffTheRecord()) {
+ return tp->GetBitmapNamed(ShouldPaintAsActive() ?
+ IDR_THEME_FRAME_OVERLAY : IDR_THEME_FRAME_OVERLAY_INACTIVE);
}
- // Never theme app and popup windows.
- if (ShouldPaintAsActive()) {
- return is_incognito ?
- ResourceBundle::frame_color_incognito : ResourceBundle::frame_color;
+ return NULL;
+}
+
+int OpaqueBrowserFrameView::GetTopAreaHeight() const {
+ SkBitmap* frame_bitmap = GetFrameBitmap();
+ int top_area_height = frame_bitmap->height();
+ if (browser_view()->IsTabStripVisible()) {
+ top_area_height = std::max(top_area_height,
+ GetBoundsForTabStrip(browser_view()->tabstrip()).bottom());
}
- return is_incognito ?
- ResourceBundle::frame_color_incognito_inactive :
- ResourceBundle::frame_color_inactive;
+ return top_area_height;
}
void OpaqueBrowserFrameView::LayoutWindowControls() {
« no previous file with comments | « chrome/browser/ui/views/frame/opaque_browser_frame_view.h ('k') | ui/base/resource/resource_bundle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698