Pin Chrome's shortcut to the Win10 Start menu on install and OS upgrade.
[chromium-blink-merge.git] / ui / views / window / frame_background.cc
bloba325dbf9b3d413b6f9664608eba79479b1a25880
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
3 // found in the LICENSE file.
5 #include "ui/views/window/frame_background.h"
7 #include "third_party/skia/include/core/SkCanvas.h"
8 #include "third_party/skia/include/core/SkColor.h"
9 #include "ui/base/theme_provider.h"
10 #include "ui/gfx/canvas.h"
11 #include "ui/views/view.h"
13 namespace views {
15 FrameBackground::FrameBackground()
16 : frame_color_(0),
17 theme_image_(NULL),
18 theme_overlay_image_(NULL),
19 top_area_height_(0),
20 left_edge_(NULL),
21 top_edge_(NULL),
22 right_edge_(NULL),
23 bottom_edge_(NULL),
24 top_left_corner_(NULL),
25 top_right_corner_(NULL),
26 bottom_left_corner_(NULL),
27 bottom_right_corner_(NULL),
28 maximized_top_inset_(0) {
31 FrameBackground::~FrameBackground() {
34 void FrameBackground::SetSideImages(const gfx::ImageSkia* left,
35 const gfx::ImageSkia* top,
36 const gfx::ImageSkia* right,
37 const gfx::ImageSkia* bottom) {
38 left_edge_ = left;
39 top_edge_ = top;
40 right_edge_ = right;
41 bottom_edge_ = bottom;
44 void FrameBackground::SetCornerImages(const gfx::ImageSkia* top_left,
45 const gfx::ImageSkia* top_right,
46 const gfx::ImageSkia* bottom_left,
47 const gfx::ImageSkia* bottom_right) {
48 top_left_corner_ = top_left;
49 top_right_corner_ = top_right;
50 bottom_left_corner_ = bottom_left;
51 bottom_right_corner_ = bottom_right;
54 void FrameBackground::PaintRestored(gfx::Canvas* canvas, View* view) const {
55 // Fill with the frame color first so we have a constant background for
56 // areas not covered by the theme image.
57 PaintFrameColor(canvas, view);
59 // Draw the theme frame.
60 canvas->TileImageInt(*theme_image_,
61 0, 0, view->width(), theme_image_->height());
63 // Draw the theme frame overlay, if available.
64 if (theme_overlay_image_)
65 canvas->DrawImageInt(*theme_overlay_image_, 0, 0);
67 // Draw the top corners and edge, scaling the corner images down if they
68 // are too big and relative to the vertical space available.
69 int top_left_height =
70 std::min(top_left_corner_->height(),
71 view->height() - bottom_left_corner_->height());
72 canvas->DrawImageInt(*top_left_corner_,
73 0, 0, top_left_corner_->width(), top_left_height,
74 0, 0, top_left_corner_->width(), top_left_height,
75 false);
76 canvas->TileImageInt(*top_edge_,
77 top_left_corner_->width(),
79 view->width() - top_left_corner_->width() - top_right_corner_->width(),
80 top_edge_->height());
81 int top_right_height =
82 std::min(top_right_corner_->height(),
83 view->height() - bottom_right_corner_->height());
84 canvas->DrawImageInt(*top_right_corner_,
85 0, 0,
86 top_right_corner_->width(), top_right_height,
87 view->width() - top_right_corner_->width(), 0,
88 top_right_corner_->width(), top_right_height,
89 false);
91 // Right edge.
92 int right_edge_height =
93 view->height() - top_right_height - bottom_right_corner_->height();
94 canvas->TileImageInt(*right_edge_,
95 view->width() - right_edge_->width(),
96 top_right_height,
97 right_edge_->width(),
98 right_edge_height);
100 // Bottom corners and edge.
101 canvas->DrawImageInt(*bottom_right_corner_,
102 view->width() - bottom_right_corner_->width(),
103 view->height() - bottom_right_corner_->height());
104 canvas->TileImageInt(
105 *bottom_edge_,
106 bottom_left_corner_->width(),
107 view->height() - bottom_edge_->height(),
108 view->width() - bottom_left_corner_->width()
109 - bottom_right_corner_->width(),
110 bottom_edge_->height());
111 canvas->DrawImageInt(*bottom_left_corner_, 0,
112 view->height() - bottom_left_corner_->height());
114 // Left edge.
115 int left_edge_height =
116 view->height() - top_left_height - bottom_left_corner_->height();
117 canvas->TileImageInt(*left_edge_,
118 0, top_left_height,
119 left_edge_->width(), left_edge_height);
122 void FrameBackground::PaintMaximized(gfx::Canvas* canvas, View* view) const {
123 // We will be painting from -|maximized_top_inset_| to
124 // -|maximized_top_inset_| + |theme_image_|->height(). If this is less than
125 // |top_area_height_|, we need to paint the frame color to fill in the area
126 // beneath the image.
127 int theme_frame_bottom = -maximized_top_inset_ + theme_image_->height();
128 if (top_area_height_ > theme_frame_bottom) {
129 canvas->FillRect(gfx::Rect(0, 0, view->width(), top_area_height_),
130 frame_color_);
133 // Draw the theme frame.
134 canvas->TileImageInt(*theme_image_,
136 -maximized_top_inset_,
137 view->width(),
138 theme_image_->height());
139 // Draw the theme frame overlay, if available.
140 if (theme_overlay_image_)
141 canvas->DrawImageInt(*theme_overlay_image_, 0, -maximized_top_inset_);
144 void FrameBackground::PaintFrameColor(gfx::Canvas* canvas, View* view) const {
145 // Fill the top area.
146 canvas->FillRect(gfx::Rect(0, 0, view->width(), top_area_height_),
147 frame_color_);
149 // If the window is very short, we're done.
150 int remaining_height = view->height() - top_area_height_;
151 if (remaining_height <= 0)
152 return;
154 // Fill down the sides.
155 canvas->FillRect(gfx::Rect(0, top_area_height_, left_edge_->width(),
156 remaining_height), frame_color_);
157 canvas->FillRect(gfx::Rect(view->width() - right_edge_->width(),
158 top_area_height_, right_edge_->width(),
159 remaining_height), frame_color_);
161 // If the window is very narrow, we're done.
162 int center_width =
163 view->width() - left_edge_->width() - right_edge_->width();
164 if (center_width <= 0)
165 return;
167 // Fill the bottom area.
168 canvas->FillRect(gfx::Rect(left_edge_->width(),
169 view->height() - bottom_edge_->height(),
170 center_width, bottom_edge_->height()),
171 frame_color_);
174 } // namespace views