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"
15 FrameBackground::FrameBackground()
18 theme_overlay_image_(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
) {
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.
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
,
76 canvas
->TileImageInt(*top_edge_
,
77 top_left_corner_
->width(),
79 view
->width() - top_left_corner_
->width() - top_right_corner_
->width(),
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_
,
86 top_right_corner_
->width(), top_right_height
,
87 view
->width() - top_right_corner_
->width(), 0,
88 top_right_corner_
->width(), top_right_height
,
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(),
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(
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());
115 int left_edge_height
=
116 view
->height() - top_left_height
- bottom_left_corner_
->height();
117 canvas
->TileImageInt(*left_edge_
,
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_
),
133 // Draw the theme frame.
134 canvas
->TileImageInt(*theme_image_
,
136 -maximized_top_inset_
,
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_
),
149 // If the window is very short, we're done.
150 int remaining_height
= view
->height() - top_area_height_
;
151 if (remaining_height
<= 0)
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.
163 view
->width() - left_edge_
->width() - right_edge_
->width();
164 if (center_width
<= 0)
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()),