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

Unified Diff: ui/views/window/frame_background.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 | « ui/views/window/frame_background.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/window/frame_background.cc
diff --git a/ui/views/window/frame_background.cc b/ui/views/window/frame_background.cc
new file mode 100644
index 0000000000000000000000000000000000000000..5ea51ccc8da8d7cd728ab0f5668cb695adf4f99b
--- /dev/null
+++ b/ui/views/window/frame_background.cc
@@ -0,0 +1,206 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/window/frame_background.h"
+
+#include "grit/ui_resources.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/base/theme_provider.h"
+#include "ui/gfx/canvas.h"
+#include "ui/views/view.h"
+
+namespace views {
+
+FrameBackground::FrameBackground()
+ : frame_color_(0),
+ theme_bitmap_(NULL),
+ theme_overlay_bitmap_(NULL),
+ top_area_height_(0),
+ left_edge_(NULL),
+ top_edge_(NULL),
+ right_edge_(NULL),
+ bottom_edge_(NULL),
+ top_left_corner_(NULL),
+ top_right_corner_(NULL),
+ bottom_left_corner_(NULL),
+ bottom_right_corner_(NULL),
+ maximized_top_left_(NULL),
+ maximized_top_right_(NULL),
+ maximized_top_offset_(0),
+ theme_background_y_(0) {
+}
+
+FrameBackground::~FrameBackground() {
+}
+
+void FrameBackground::SetSideImages(SkBitmap* left,
+ SkBitmap* top,
+ SkBitmap* right,
+ SkBitmap* bottom) {
+ left_edge_ = left;
+ top_edge_ = top;
+ right_edge_ = right;
+ bottom_edge_ = bottom;
+}
+
+void FrameBackground::SetCornerImages(SkBitmap* top_left,
+ SkBitmap* top_right,
+ SkBitmap* bottom_left,
+ SkBitmap* bottom_right) {
+ top_left_corner_ = top_left;
+ top_right_corner_ = top_right;
+ bottom_left_corner_ = bottom_left;
+ bottom_right_corner_ = bottom_right;
+}
+
+void FrameBackground::SetMaximizedCorners(SkBitmap* top_left,
+ SkBitmap* top_right,
+ int top_offset) {
+ maximized_top_left_ = top_left;
+ maximized_top_right_ = top_right;
+ maximized_top_offset_ = top_offset;
+}
+
+void FrameBackground::PaintRestored(gfx::Canvas* canvas, View* view) const {
+ // Fill with the frame color first so we have a constant background for
+ // areas not covered by the theme image.
+ PaintFrameColor(canvas, view);
+
+ // Draw the theme frame.
+ canvas->TileImageInt(*theme_bitmap_,
+ 0, 0, view->width(), theme_bitmap_->height());
+
+ // Draw the theme frame overlay, if available.
+ if (theme_overlay_bitmap_)
+ canvas->DrawBitmapInt(*theme_overlay_bitmap_, 0, 0);
+
+ // Draw the top corners and edge, scaling the corner images down if they
+ // are too big and relative to the vertical space available.
+ int top_left_height =
+ std::min(top_left_corner_->height(),
+ view->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,
+ view->width() - top_left_corner_->width() - top_right_corner_->width(),
+ top_edge_->height());
+ int top_right_height =
+ std::min(top_right_corner_->height(),
+ view->height() - bottom_right_corner_->height());
+ canvas->DrawBitmapInt(*top_right_corner_,
+ 0, 0,
+ top_right_corner_->width(), top_right_height,
+ view->width() - top_right_corner_->width(), 0,
+ top_right_corner_->width(), top_right_height,
+ false);
+
+ // Right edge.
+ int right_edge_height =
+ view->height() - top_right_height - bottom_right_corner_->height();
+ canvas->TileImageInt(*right_edge_,
+ view->width() - right_edge_->width(),
+ top_right_height,
+ right_edge_->width(),
+ right_edge_height);
+
+ // Bottom corners and edge.
+ canvas->DrawBitmapInt(*bottom_right_corner_,
+ view->width() - bottom_right_corner_->width(),
+ view->height() - bottom_right_corner_->height());
+ canvas->TileImageInt(
+ *bottom_edge_,
+ bottom_left_corner_->width(),
+ view->height() - bottom_edge_->height(),
+ view->width() - bottom_left_corner_->width()
+ - bottom_right_corner_->width(),
+ bottom_edge_->height());
+ canvas->DrawBitmapInt(*bottom_left_corner_, 0,
+ view->height() - bottom_left_corner_->height());
+
+ // Left edge.
+ int left_edge_height =
+ view->height() - top_left_height - bottom_left_corner_->height();
+ canvas->TileImageInt(*left_edge_,
+ 0, top_left_height,
+ left_edge_->width(), left_edge_height);
+}
+
+void FrameBackground::PaintMaximized(gfx::Canvas* canvas, View* view) const {
+ // We will be painting from top_offset to top_offset + theme_frame_height. If
+ // this is less than top_area_height_, we need to paint the frame color
+ // to fill in the area beneath the image.
+ // TODO(jamescook): I'm not sure this is correct, as it doesn't seem to fully
+ // account for the top_offset, but this is how it worked before.
+ int theme_frame_bottom = maximized_top_offset_ + theme_bitmap_->height();
+ if (top_area_height_ > theme_frame_bottom) {
+ canvas->FillRect(frame_color_,
+ gfx::Rect(0, 0, view->width(), top_area_height_));
+ }
+
+ int left_offset = 0;
+ int right_offset = 0;
+
+ // Draw top-left and top-right corners to give maximized ChromeOS windows
+ // a rounded appearance.
+ if (maximized_top_left_ || maximized_top_right_) {
+ // If we have either a left or right we should have both.
+ DCHECK(maximized_top_left_ && maximized_top_right_);
+ left_offset = maximized_top_left_->width();
+ right_offset = maximized_top_right_->width();
+ canvas->DrawBitmapInt(*maximized_top_left_, 0, 0);
+ canvas->DrawBitmapInt(*maximized_top_right_,
+ view->width() - right_offset, 0);
+ }
+
+ // Draw the theme frame.
+ canvas->TileImageInt(*theme_bitmap_,
+ left_offset,
+ maximized_top_offset_,
+ view->width() - (left_offset + right_offset),
+ theme_bitmap_->height());
+ // Draw the theme frame overlay, if available.
+ if (theme_overlay_bitmap_)
+ canvas->DrawBitmapInt(*theme_overlay_bitmap_, 0, theme_background_y_);
+}
+
+void FrameBackground::PaintFrameColor(gfx::Canvas* canvas, View* view) const {
+ // Fill the top area.
+ canvas->FillRect(frame_color_,
+ gfx::Rect(0, 0, view->width(), top_area_height_));
+
+ // If the window is very short, we're done.
+ int remaining_height = view->height() - top_area_height_;
+ if (remaining_height <= 0)
+ return;
+
+ // 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(view->width() - right_edge_->width(),
+ top_area_height_,
+ right_edge_->width(),
+ remaining_height));
+
+ // If the window is very narrow, we're done.
+ int center_width =
+ view->width() - left_edge_->width() - right_edge_->width();
+ if (center_width <= 0)
+ return;
+
+ // Fill the bottom area.
+ canvas->FillRect(frame_color_,
+ gfx::Rect(left_edge_->width(),
+ view->height() - bottom_edge_->height(),
+ center_width,
+ bottom_edge_->height()));
+}
+
+} // namespace views
« no previous file with comments | « ui/views/window/frame_background.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698