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

Unified Diff: ui/views/bubble/bubble_border_2.cc

Issue 10905311: Consolidate bubble border code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove USE_AURA ifdef for kBigShadowImages and kSmalleShadowImages Created 8 years, 3 months 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/bubble/bubble_border_2.h ('k') | ui/views/bubble/bubble_border_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/bubble/bubble_border_2.cc
diff --git a/ui/views/bubble/bubble_border_2.cc b/ui/views/bubble/bubble_border_2.cc
deleted file mode 100644
index 0f909d16df32355aa5e1a41b3614f7514646ae5b..0000000000000000000000000000000000000000
--- a/ui/views/bubble/bubble_border_2.cc
+++ /dev/null
@@ -1,399 +0,0 @@
-// Copyright (c) 2012 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/bubble/bubble_border_2.h"
-
-#include <algorithm> // for std::max
-
-#include "base/logging.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/path.h"
-#include "ui/gfx/rect.h"
-#include "ui/gfx/screen.h"
-#include "ui/gfx/skia_util.h"
-
-namespace {
-
-// Bubble border corner radius.
-const int kCornerRadius = 2;
-
-// Arrow width and height.
-const int kArrowHeight = 10;
-const int kArrowWidth = 20;
-
-const int kBorderSize = 1;
-const SkColor kBorderColor = SkColorSetARGB(0x26, 0, 0, 0);
-const SkColor kBackgroundColor = SK_ColorWHITE;
-
-const int kShadowOffsetX = 0;
-const int kShadowOffsetY = 5;
-const double kShadowBlur = 30;
-const SkColor kShadowColor = SkColorSetARGB(0x72, 0, 0, 0);
-
-// Builds a bubble shape for given |bounds|.
-void BuildShape(const gfx::Rect& bounds,
- views::BubbleBorder::ArrowLocation arrow_location,
- SkScalar arrow_offset,
- SkScalar padding,
- SkPath* path,
- int corner_radius_int,
- int arrow_height_int,
- int arrow_width_int) {
- const SkScalar corner_radius = SkIntToScalar(corner_radius_int);
-
- const SkScalar left = SkIntToScalar(bounds.x()) + padding;
- const SkScalar top = SkIntToScalar(bounds.y()) + padding;
- const SkScalar right = SkIntToScalar(bounds.right()) - padding;
- const SkScalar bottom = SkIntToScalar(bounds.bottom()) - padding;
-
- const SkScalar center_x = SkIntToScalar((bounds.x() + bounds.right()) / 2);
- const SkScalar center_y = SkIntToScalar((bounds.y() + bounds.bottom()) / 2);
-
- const SkScalar half_arrow_width =
- (SkIntToScalar(arrow_width_int) - padding) / 2;
- const SkScalar arrow_height = SkIntToScalar(arrow_height_int) - padding;
-
- path->reset();
- path->incReserve(12);
-
- switch (arrow_location) {
- case views::BubbleBorder::TOP_LEFT:
- case views::BubbleBorder::TOP_RIGHT:
- path->moveTo(center_x, bottom);
- path->arcTo(right, bottom, right, center_y, corner_radius);
- path->arcTo(right, top, center_x - half_arrow_width, top,
- corner_radius);
- path->lineTo(center_x + arrow_offset + half_arrow_width, top);
- path->lineTo(center_x + arrow_offset, top - arrow_height);
- path->lineTo(center_x + arrow_offset - half_arrow_width, top);
- path->arcTo(left, top, left, center_y, corner_radius);
- path->arcTo(left, bottom, center_x, bottom, corner_radius);
- break;
- case views::BubbleBorder::BOTTOM_LEFT:
- case views::BubbleBorder::BOTTOM_RIGHT:
- path->moveTo(center_x, top);
- path->arcTo(left, top, left, center_y, corner_radius);
- path->arcTo(left, bottom, center_x - half_arrow_width, bottom,
- corner_radius);
- path->lineTo(center_x + arrow_offset - half_arrow_width, bottom);
- path->lineTo(center_x + arrow_offset, bottom + arrow_height);
- path->lineTo(center_x + arrow_offset + half_arrow_width, bottom);
- path->arcTo(right, bottom, right, center_y, corner_radius);
- path->arcTo(right, top, center_x, top, corner_radius);
- break;
- case views::BubbleBorder::LEFT_TOP:
- case views::BubbleBorder::LEFT_BOTTOM:
- path->moveTo(right, center_y);
- path->arcTo(right, top, center_x, top, corner_radius);
- path->arcTo(left, top, left, center_y + arrow_offset - half_arrow_width,
- corner_radius);
- path->lineTo(left, center_y + arrow_offset - half_arrow_width);
- path->lineTo(left - arrow_height, center_y + arrow_offset);
- path->lineTo(left, center_y + arrow_offset + half_arrow_width);
- path->arcTo(left, bottom, center_x, bottom, corner_radius);
- path->arcTo(right, bottom, right, center_y, corner_radius);
- break;
- case views::BubbleBorder::RIGHT_TOP:
- case views::BubbleBorder::RIGHT_BOTTOM:
- path->moveTo(left, center_y);
- path->arcTo(left, bottom, center_x, bottom, corner_radius);
- path->arcTo(right, bottom,
- right, center_y + arrow_offset + half_arrow_width,
- corner_radius);
- path->lineTo(right, center_y + arrow_offset + half_arrow_width);
- path->lineTo(right + arrow_height, center_y + arrow_offset);
- path->lineTo(right, center_y + arrow_offset - half_arrow_width);
- path->arcTo(right, top, center_x, top, corner_radius);
- path->arcTo(left, top, left, center_y, corner_radius);
- break;
- default:
- // No arrows.
- path->addRoundRect(gfx::RectToSkRect(bounds),
- corner_radius,
- corner_radius);
- break;
- }
-
- path->close();
-}
-
-} // namespace
-
-namespace views {
-
-BubbleBorder2::BubbleBorder2(ArrowLocation arrow_location)
- : BubbleBorder(arrow_location, views::BubbleBorder::NO_SHADOW),
- corner_radius_(kCornerRadius),
- border_size_(kBorderSize),
- arrow_height_(kArrowHeight),
- arrow_width_(kArrowWidth),
- background_color_(kBackgroundColor),
- border_color_(kBorderColor) {
- SetShadow(gfx::ShadowValue(gfx::Point(kShadowOffsetX, kShadowOffsetY),
- kShadowBlur, kShadowColor));
-}
-
-BubbleBorder2::~BubbleBorder2() {}
-
-gfx::Rect BubbleBorder2::ComputeOffsetAndUpdateBubbleRect(
- gfx::Rect bubble_rect,
- const gfx::Rect& anchor_view_rect) {
- offset_ = gfx::Point();
-
- gfx::Rect monitor_rect = gfx::Screen::GetDisplayNearestPoint(
- anchor_view_rect.CenterPoint()).bounds();
- if (monitor_rect.IsEmpty() || monitor_rect.Contains(bubble_rect))
- return bubble_rect;
-
- gfx::Point offset;
-
- if (has_arrow(arrow_location())) {
- if (is_arrow_on_horizontal(arrow_location())) {
- if (bubble_rect.x() < monitor_rect.x())
- offset.set_x(monitor_rect.x() - bubble_rect.x());
- else if (bubble_rect.right() > monitor_rect.right())
- offset.set_x(monitor_rect.right() - bubble_rect.right());
- } else {
- if (bubble_rect.y() < monitor_rect.y())
- offset.set_y(monitor_rect.y() - bubble_rect.y());
- else if (bubble_rect.bottom() > monitor_rect.bottom())
- offset.set_y(monitor_rect.bottom() - bubble_rect.bottom());
- }
- }
-
- bubble_rect.Offset(offset);
- set_offset(offset);
-
- return bubble_rect;
-}
-
-void BubbleBorder2::GetMask(const gfx::Rect& bounds,
- gfx::Path* mask) const {
- gfx::Insets insets;
- GetInsets(&insets);
-
- gfx::Rect content_bounds(bounds);
- content_bounds.Inset(insets);
-
- BuildShape(content_bounds,
- arrow_location(),
- SkIntToScalar(GetArrowOffset()),
- SkIntToScalar(kBorderSize),
- mask,
- corner_radius_,
- arrow_height_,
- arrow_width_);
-}
-
-void BubbleBorder2::SetShadow(gfx::ShadowValue shadow) {
- shadows_.clear();
- shadows_.push_back(shadow);
-}
-
-int BubbleBorder2::GetBorderThickness() const {
- return border_size_;
-}
-
-void BubbleBorder2::PaintBackground(gfx::Canvas* canvas,
- const gfx::Rect& bounds) const {
- canvas->FillRect(bounds, background_color_);
-}
-
-int BubbleBorder2::GetArrowOffset() const {
- if (has_arrow(arrow_location())) {
- if (is_arrow_on_horizontal(arrow_location())) {
- // Picks x offset and moves bubble arrow in the opposite direction.
- // i.e. If bubble bounds is moved to right (positive offset), we need to
- // move arrow to left so that it points to the same position.
- return -offset_.x();
- } else {
- // Picks y offset and moves bubble arrow in the opposite direction.
- return -offset_.y();
- }
- }
-
- // Other style does not have an arrow, so return 0.
- return 0;
-}
-
-void BubbleBorder2::GetInsets(gfx::Insets* insets) const {
- // Negate to change from outer margin to inner padding.
- gfx::Insets shadow_padding(-gfx::ShadowValue::GetMargin(shadows_));
-
- if (arrow_location() == views::BubbleBorder::TOP_LEFT ||
- arrow_location() == views::BubbleBorder::TOP_RIGHT) {
- // Arrow at top.
- insets->Set(shadow_padding.top() + arrow_height_,
- shadow_padding.left(),
- shadow_padding.bottom(),
- shadow_padding.right());
- } else if (arrow_location() == views::BubbleBorder::BOTTOM_LEFT ||
- arrow_location() == views::BubbleBorder::BOTTOM_RIGHT) {
- // Arrow at bottom.
- insets->Set(shadow_padding.top(),
- shadow_padding.left(),
- shadow_padding.bottom() + arrow_height_,
- shadow_padding.right());
- } else if (arrow_location() == views::BubbleBorder::LEFT_TOP ||
- arrow_location() == views::BubbleBorder::LEFT_BOTTOM) {
- // Arrow on left.
- insets->Set(shadow_padding.top(),
- shadow_padding.left() + arrow_height_,
- shadow_padding.bottom(),
- shadow_padding.right());
- } else if (arrow_location() == views::BubbleBorder::RIGHT_TOP ||
- arrow_location() == views::BubbleBorder::RIGHT_BOTTOM) {
- // Arrow on right.
- insets->Set(shadow_padding.top(),
- shadow_padding.left(),
- shadow_padding.bottom(),
- shadow_padding.right() + arrow_height_);
- }
-}
-
-gfx::Rect BubbleBorder2::GetBounds(const gfx::Rect& position_relative_to,
- const gfx::Size& contents_size) const {
- gfx::Size border_size(contents_size);
- gfx::Insets insets;
- GetInsets(&insets);
- border_size.Enlarge(insets.width(), insets.height());
-
- // Negate to change from outer margin to inner padding.
- gfx::Insets shadow_padding(-gfx::ShadowValue::GetMargin(shadows_));
-
- // Anchor center that arrow aligns with.
- const int anchor_center_x =
- (position_relative_to.x() + position_relative_to.right()) / 2;
- const int anchor_center_y =
- (position_relative_to.y() + position_relative_to.bottom()) / 2;
-
- // Arrow position relative to top-left of bubble. |arrow_tip_x| is used for
- // arrow at the top or bottom and |arrow_tip_y| is used for arrow on left or
- // right. The 1px offset for |arrow_tip_y| is needed because the app list grid
- // icon start at a different position (1px earlier) compared with bottom
- // launcher bar.
- // TODO(xiyuan): Remove 1px offset when app list icon image asset is updated.
- int arrow_tip_x = insets.left() + contents_size.width() / 2 +
- GetArrowOffset();
- int arrow_tip_y = insets.top() + contents_size.height() / 2 +
- GetArrowOffset() + 1;
-
- if (arrow_location() == views::BubbleBorder::TOP_LEFT ||
- arrow_location() == views::BubbleBorder::TOP_RIGHT) {
- // Arrow at top.
- return gfx::Rect(
- gfx::Point(anchor_center_x - arrow_tip_x,
- position_relative_to.bottom() - shadow_padding.top()),
- border_size);
- } else if (arrow_location() == views::BubbleBorder::BOTTOM_LEFT ||
- arrow_location() == views::BubbleBorder::BOTTOM_RIGHT) {
- // Arrow at bottom.
- return gfx::Rect(
- gfx::Point(anchor_center_x - arrow_tip_x,
- position_relative_to.y() - border_size.height() +
- shadow_padding.bottom()),
- border_size);
- } else if (arrow_location() == views::BubbleBorder::LEFT_TOP ||
- arrow_location() == views::BubbleBorder::LEFT_BOTTOM) {
- // Arrow on left.
- return gfx::Rect(
- gfx::Point(position_relative_to.right() - shadow_padding.left(),
- anchor_center_y - arrow_tip_y),
- border_size);
- } else if (arrow_location() == views::BubbleBorder::RIGHT_TOP ||
- arrow_location() == views::BubbleBorder::RIGHT_BOTTOM) {
- // Arrow on right.
- return gfx::Rect(
- gfx::Point(position_relative_to.x() - border_size.width() +
- shadow_padding.right(),
- anchor_center_y - arrow_tip_y),
- border_size);
- }
-
- // No arrow bubble, center align with anchor.
- return position_relative_to.Center(border_size);
-}
-
-void BubbleBorder2::GetInsetsForArrowLocation(gfx::Insets* insets,
- ArrowLocation arrow_loc) const {
- int top = border_size_;
- int bottom = border_size_;
- int left = border_size_;
- int right = border_size_;
- switch (arrow_loc) {
- case TOP_LEFT:
- case TOP_RIGHT:
- top = std::max(top, arrow_height_);
- break;
-
- case BOTTOM_LEFT:
- case BOTTOM_RIGHT:
- bottom = std::max(bottom, arrow_height_);
- break;
-
- case LEFT_TOP:
- case LEFT_BOTTOM:
- left = std::max(left, arrow_height_);
- break;
-
- case RIGHT_TOP:
- case RIGHT_BOTTOM:
- right = std::max(right, arrow_height_);
- break;
-
- case NONE:
- case FLOAT:
- // Nothing to do.
- break;
- }
- insets->Set(top, left, bottom, right);
-}
-
-void BubbleBorder2::Paint(const views::View& view, gfx::Canvas* canvas) const {
- gfx::Insets insets;
- GetInsets(&insets);
-
- gfx::Rect content_bounds = view.bounds();
- content_bounds.Inset(insets);
-
- SkPath path;
- // Pads with 0.5 pixel since anti alias is used.
- BuildShape(content_bounds,
- arrow_location(),
- SkIntToScalar(GetArrowOffset()),
- SkDoubleToScalar(0.5),
- &path,
- corner_radius_,
- arrow_height_,
- arrow_width_);
-
- // Draw border and shadow. Note fill is needed to generate enough shadow.
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setStyle(SkPaint::kStrokeAndFill_Style);
- paint.setStrokeWidth(SkIntToScalar(border_size_));
- paint.setColor(border_color_);
- SkSafeUnref(paint.setLooper(gfx::CreateShadowDrawLooper(shadows_)));
- canvas->DrawPath(path, paint);
-
- // Pads with |border_size_| pixels to leave space for border lines.
- BuildShape(content_bounds,
- arrow_location(),
- SkIntToScalar(GetArrowOffset()),
- SkIntToScalar(border_size_),
- &path,
- corner_radius_,
- arrow_height_,
- arrow_width_);
- canvas->Save();
- canvas->ClipPath(path);
-
- // Use full bounds so that arrow is also painted.
- const gfx::Rect& bounds = view.bounds();
- PaintBackground(canvas, bounds);
-
- canvas->Restore();
-}
-
-} // namespace views
« no previous file with comments | « ui/views/bubble/bubble_border_2.h ('k') | ui/views/bubble/bubble_border_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698