| // Copyright 2014 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 "ash/system/user/rounded_image_view.h" |
| #include "skia/ext/image_operations.h" |
| #include "third_party/skia/include/core/SkPaint.h" |
| #include "third_party/skia/include/core/SkPath.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/image/image_skia_operations.h" |
| #include "ui/gfx/skia_util.h" |
| |
| namespace ash { |
| namespace tray { |
| |
| RoundedImageView::RoundedImageView(int corner_radius, bool active_user) |
| : active_user_(active_user) { |
| for (int i = 0; i < 4; ++i) |
| corner_radius_[i] = corner_radius; |
| } |
| |
| RoundedImageView::~RoundedImageView() {} |
| |
| void RoundedImageView::SetImage(const gfx::ImageSkia& img, |
| const gfx::Size& size) { |
| image_ = img; |
| image_size_ = size; |
| |
| // Try to get the best image quality for the avatar. |
| resized_ = gfx::ImageSkiaOperations::CreateResizedImage( |
| image_, skia::ImageOperations::RESIZE_BEST, size); |
| if (GetWidget() && visible()) { |
| PreferredSizeChanged(); |
| SchedulePaint(); |
| } |
| } |
| |
| void RoundedImageView::SetCornerRadii(int top_left, |
| int top_right, |
| int bottom_right, |
| int bottom_left) { |
| corner_radius_[0] = top_left; |
| corner_radius_[1] = top_right; |
| corner_radius_[2] = bottom_right; |
| corner_radius_[3] = bottom_left; |
| } |
| |
| gfx::Size RoundedImageView::GetPreferredSize() const { |
| return gfx::Size(image_size_.width() + GetInsets().width(), |
| image_size_.height() + GetInsets().height()); |
| } |
| |
| void RoundedImageView::OnPaint(gfx::Canvas* canvas) { |
| View::OnPaint(canvas); |
| gfx::Rect image_bounds(size()); |
| image_bounds.ClampToCenteredSize(GetPreferredSize()); |
| image_bounds.Inset(GetInsets()); |
| const SkScalar kRadius[8] = { |
| SkIntToScalar(corner_radius_[0]), |
| SkIntToScalar(corner_radius_[0]), |
| SkIntToScalar(corner_radius_[1]), |
| SkIntToScalar(corner_radius_[1]), |
| SkIntToScalar(corner_radius_[2]), |
| SkIntToScalar(corner_radius_[2]), |
| SkIntToScalar(corner_radius_[3]), |
| SkIntToScalar(corner_radius_[3]) |
| }; |
| SkPath path; |
| path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius); |
| SkPaint paint; |
| paint.setAntiAlias(true); |
| paint.setXfermodeMode(active_user_ ? SkXfermode::kSrcOver_Mode |
| : SkXfermode::kLuminosity_Mode); |
| canvas->DrawImageInPath( |
| resized_, image_bounds.x(), image_bounds.y(), path, paint); |
| } |
| |
| } // namespace tray |
| } // namespace ash |