| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/views/bubble/bubble_border.h" | 5 #include "ui/views/bubble/bubble_border.h" |
| 6 | 6 |
| 7 #include <algorithm> // for std::max | 7 #include <algorithm> // for std::max |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "grit/ui_resources.h" | 10 #include "grit/ui_resources.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 top_left(NULL), | 22 top_left(NULL), |
| 23 top(NULL), | 23 top(NULL), |
| 24 top_right(NULL), | 24 top_right(NULL), |
| 25 right(NULL), | 25 right(NULL), |
| 26 bottom_right(NULL), | 26 bottom_right(NULL), |
| 27 bottom(NULL), | 27 bottom(NULL), |
| 28 bottom_left(NULL), | 28 bottom_left(NULL), |
| 29 left_arrow(NULL), | 29 left_arrow(NULL), |
| 30 top_arrow(NULL), | 30 top_arrow(NULL), |
| 31 right_arrow(NULL), | 31 right_arrow(NULL), |
| 32 bottom_arrow(NULL) { | 32 bottom_arrow(NULL), |
| 33 pixels_to_border(0) { |
| 33 } | 34 } |
| 34 | 35 |
| 35 SkBitmap* left; | 36 SkBitmap* left; |
| 36 SkBitmap* top_left; | 37 SkBitmap* top_left; |
| 37 SkBitmap* top; | 38 SkBitmap* top; |
| 38 SkBitmap* top_right; | 39 SkBitmap* top_right; |
| 39 SkBitmap* right; | 40 SkBitmap* right; |
| 40 SkBitmap* bottom_right; | 41 SkBitmap* bottom_right; |
| 41 SkBitmap* bottom; | 42 SkBitmap* bottom; |
| 42 SkBitmap* bottom_left; | 43 SkBitmap* bottom_left; |
| 43 SkBitmap* left_arrow; | 44 SkBitmap* left_arrow; |
| 44 SkBitmap* top_arrow; | 45 SkBitmap* top_arrow; |
| 45 SkBitmap* right_arrow; | 46 SkBitmap* right_arrow; |
| 46 SkBitmap* bottom_arrow; | 47 SkBitmap* bottom_arrow; |
| 48 int pixels_to_border; |
| 47 }; | 49 }; |
| 48 | 50 |
| 49 // static | 51 // static |
| 50 struct BubbleBorder::BorderImages* BubbleBorder::normal_images_ = NULL; | 52 struct BubbleBorder::BorderImages* BubbleBorder::normal_images_ = NULL; |
| 51 struct BubbleBorder::BorderImages* BubbleBorder::shadow_images_ = NULL; | 53 struct BubbleBorder::BorderImages* BubbleBorder::shadow_images_ = NULL; |
| 52 | 54 |
| 53 | 55 |
| 54 // The height inside the arrow image, in pixels. | 56 // The height inside the arrow image, in pixels. |
| 55 static const int kArrowInteriorHeight = 7; | 57 static const int kArrowInteriorHeight = 7; |
| 56 | 58 |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 break; | 197 break; |
| 196 | 198 |
| 197 case NONE: | 199 case NONE: |
| 198 case FLOAT: | 200 case FLOAT: |
| 199 // Nothing to do. | 201 // Nothing to do. |
| 200 break; | 202 break; |
| 201 } | 203 } |
| 202 insets->Set(top, left, bottom, right); | 204 insets->Set(top, left, bottom, right); |
| 203 } | 205 } |
| 204 | 206 |
| 207 int BubbleBorder::pixels_to_border() const { |
| 208 return images_->pixels_to_border; |
| 209 } |
| 210 |
| 205 int BubbleBorder::SetArrowOffset(int offset, const gfx::Size& contents_size) { | 211 int BubbleBorder::SetArrowOffset(int offset, const gfx::Size& contents_size) { |
| 206 gfx::Size border_size(contents_size); | 212 gfx::Size border_size(contents_size); |
| 207 gfx::Insets insets; | 213 gfx::Insets insets; |
| 208 GetInsets(&insets); | 214 GetInsets(&insets); |
| 209 border_size.Enlarge(insets.left() + insets.right(), | 215 border_size.Enlarge(insets.left() + insets.right(), |
| 210 insets.top() + insets.bottom()); | 216 insets.top() + insets.bottom()); |
| 211 offset = std::max(arrow_offset_, | 217 offset = std::max(arrow_offset_, |
| 212 std::min(offset, (is_arrow_on_horizontal(arrow_location_) ? | 218 std::min(offset, (is_arrow_on_horizontal(arrow_location_) ? |
| 213 border_size.width() : border_size.height()) - arrow_offset_)); | 219 border_size.width() : border_size.height()) - arrow_offset_)); |
| 214 override_arrow_offset_ = offset; | 220 override_arrow_offset_ = offset; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 225 shadow_images_->top = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_T); | 231 shadow_images_->top = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_T); |
| 226 shadow_images_->top_right = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_TR); | 232 shadow_images_->top_right = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_TR); |
| 227 shadow_images_->right = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_R); | 233 shadow_images_->right = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_R); |
| 228 shadow_images_->bottom_right = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_BR); | 234 shadow_images_->bottom_right = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_BR); |
| 229 shadow_images_->bottom = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_B); | 235 shadow_images_->bottom = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_B); |
| 230 shadow_images_->bottom_left = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_BL); | 236 shadow_images_->bottom_left = rb.GetBitmapNamed(IDR_BUBBLE_SHADOW_BL); |
| 231 shadow_images_->left_arrow = new SkBitmap(); | 237 shadow_images_->left_arrow = new SkBitmap(); |
| 232 shadow_images_->top_arrow = new SkBitmap(); | 238 shadow_images_->top_arrow = new SkBitmap(); |
| 233 shadow_images_->right_arrow = new SkBitmap(); | 239 shadow_images_->right_arrow = new SkBitmap(); |
| 234 shadow_images_->bottom_arrow = new SkBitmap(); | 240 shadow_images_->bottom_arrow = new SkBitmap(); |
| 241 shadow_images_->pixels_to_border = 10; |
| 235 } else if (shadow == NO_SHADOW && normal_images_ == NULL) { | 242 } else if (shadow == NO_SHADOW && normal_images_ == NULL) { |
| 236 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 243 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 237 normal_images_ = new BorderImages(); | 244 normal_images_ = new BorderImages(); |
| 238 normal_images_->left = rb.GetBitmapNamed(IDR_BUBBLE_L); | 245 normal_images_->left = rb.GetBitmapNamed(IDR_BUBBLE_L); |
| 239 normal_images_->top_left = rb.GetBitmapNamed(IDR_BUBBLE_TL); | 246 normal_images_->top_left = rb.GetBitmapNamed(IDR_BUBBLE_TL); |
| 240 normal_images_->top = rb.GetBitmapNamed(IDR_BUBBLE_T); | 247 normal_images_->top = rb.GetBitmapNamed(IDR_BUBBLE_T); |
| 241 normal_images_->top_right = rb.GetBitmapNamed(IDR_BUBBLE_TR); | 248 normal_images_->top_right = rb.GetBitmapNamed(IDR_BUBBLE_TR); |
| 242 normal_images_->right = rb.GetBitmapNamed(IDR_BUBBLE_R); | 249 normal_images_->right = rb.GetBitmapNamed(IDR_BUBBLE_R); |
| 243 normal_images_->bottom_right = rb.GetBitmapNamed(IDR_BUBBLE_BR); | 250 normal_images_->bottom_right = rb.GetBitmapNamed(IDR_BUBBLE_BR); |
| 244 normal_images_->bottom = rb.GetBitmapNamed(IDR_BUBBLE_B); | 251 normal_images_->bottom = rb.GetBitmapNamed(IDR_BUBBLE_B); |
| 245 normal_images_->bottom_left = rb.GetBitmapNamed(IDR_BUBBLE_BL); | 252 normal_images_->bottom_left = rb.GetBitmapNamed(IDR_BUBBLE_BL); |
| 246 normal_images_->left_arrow = rb.GetBitmapNamed(IDR_BUBBLE_L_ARROW); | 253 normal_images_->left_arrow = rb.GetBitmapNamed(IDR_BUBBLE_L_ARROW); |
| 247 normal_images_->top_arrow = rb.GetBitmapNamed(IDR_BUBBLE_T_ARROW); | 254 normal_images_->top_arrow = rb.GetBitmapNamed(IDR_BUBBLE_T_ARROW); |
| 248 normal_images_->right_arrow = rb.GetBitmapNamed(IDR_BUBBLE_R_ARROW); | 255 normal_images_->right_arrow = rb.GetBitmapNamed(IDR_BUBBLE_R_ARROW); |
| 249 normal_images_->bottom_arrow = rb.GetBitmapNamed(IDR_BUBBLE_B_ARROW); | 256 normal_images_->bottom_arrow = rb.GetBitmapNamed(IDR_BUBBLE_B_ARROW); |
| 257 normal_images_->pixels_to_border = 0; |
| 250 } | 258 } |
| 251 return shadow == SHADOW ? shadow_images_ : normal_images_; | 259 return shadow == SHADOW ? shadow_images_ : normal_images_; |
| 252 } | 260 } |
| 253 | 261 |
| 254 BubbleBorder::~BubbleBorder() {} | 262 BubbleBorder::~BubbleBorder() {} |
| 255 | 263 |
| 256 void BubbleBorder::Paint(const views::View& view, gfx::Canvas* canvas) const { | 264 void BubbleBorder::Paint(const views::View& view, gfx::Canvas* canvas) const { |
| 257 // Convenience shorthand variables. | 265 // Convenience shorthand variables. |
| 258 const int tl_width = images_->top_left->width(); | 266 const int tl_width = images_->top_left->width(); |
| 259 const int tl_height = images_->top_left->height(); | 267 const int tl_height = images_->top_left->height(); |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 // contents, which we need to fill with the background color. | 502 // contents, which we need to fill with the background color. |
| 495 // NOTE: This doesn't handle an arrow location of "NONE", which has square top | 503 // NOTE: This doesn't handle an arrow location of "NONE", which has square top |
| 496 // corners. | 504 // corners. |
| 497 SkPaint paint; | 505 SkPaint paint; |
| 498 paint.setAntiAlias(true); | 506 paint.setAntiAlias(true); |
| 499 paint.setStyle(SkPaint::kFill_Style); | 507 paint.setStyle(SkPaint::kFill_Style); |
| 500 paint.setColor(border_->background_color()); | 508 paint.setColor(border_->background_color()); |
| 501 gfx::Path path; | 509 gfx::Path path; |
| 502 gfx::Rect bounds(view->GetContentsBounds()); | 510 gfx::Rect bounds(view->GetContentsBounds()); |
| 503 SkRect rect; | 511 SkRect rect; |
| 512 int offset = border_->pixels_to_border(); |
| 504 rect.set(SkIntToScalar(bounds.x()), SkIntToScalar(bounds.y()), | 513 rect.set(SkIntToScalar(bounds.x()), SkIntToScalar(bounds.y()), |
| 505 SkIntToScalar(bounds.right()), SkIntToScalar(bounds.bottom())); | 514 SkIntToScalar(bounds.right()), SkIntToScalar(bounds.bottom())); |
| 515 rect.inset(-border_->pixels_to_border(), -border_->pixels_to_border()); |
| 506 SkScalar radius = SkIntToScalar(BubbleBorder::GetCornerRadius()); | 516 SkScalar radius = SkIntToScalar(BubbleBorder::GetCornerRadius()); |
| 507 path.addRoundRect(rect, radius, radius); | 517 path.addRoundRect(rect, radius, radius); |
| 508 canvas->GetSkCanvas()->drawPath(path, paint); | 518 canvas->GetSkCanvas()->drawPath(path, paint); |
| 509 } | 519 } |
| 510 | 520 |
| 511 } // namespace views | 521 } // namespace views |
| OLD | NEW |