Roll src/third_party/WebKit f36d5e0:68b67cd (svn 193299:193303)
[chromium-blink-merge.git] / ash / system / user / rounded_image_view.cc
blob9c42a2c1e28d2534844a339e0b6a2e143de5b6ff
1 // Copyright 2014 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 "ash/system/user/rounded_image_view.h"
6 #include "skia/ext/image_operations.h"
7 #include "third_party/skia/include/core/SkPaint.h"
8 #include "third_party/skia/include/core/SkPath.h"
9 #include "ui/gfx/canvas.h"
10 #include "ui/gfx/image/image_skia_operations.h"
11 #include "ui/gfx/skia_util.h"
13 namespace ash {
14 namespace tray {
16 RoundedImageView::RoundedImageView(int corner_radius, bool active_user)
17 : active_user_(active_user) {
18 for (int i = 0; i < 4; ++i)
19 corner_radius_[i] = corner_radius;
22 RoundedImageView::~RoundedImageView() {}
24 void RoundedImageView::SetImage(const gfx::ImageSkia& img,
25 const gfx::Size& size) {
26 image_ = img;
27 image_size_ = size;
29 // Try to get the best image quality for the avatar.
30 resized_ = gfx::ImageSkiaOperations::CreateResizedImage(
31 image_, skia::ImageOperations::RESIZE_BEST, size);
32 if (GetWidget() && visible()) {
33 PreferredSizeChanged();
34 SchedulePaint();
38 void RoundedImageView::SetCornerRadii(int top_left,
39 int top_right,
40 int bottom_right,
41 int bottom_left) {
42 corner_radius_[0] = top_left;
43 corner_radius_[1] = top_right;
44 corner_radius_[2] = bottom_right;
45 corner_radius_[3] = bottom_left;
48 gfx::Size RoundedImageView::GetPreferredSize() const {
49 return gfx::Size(image_size_.width() + GetInsets().width(),
50 image_size_.height() + GetInsets().height());
53 void RoundedImageView::OnPaint(gfx::Canvas* canvas) {
54 View::OnPaint(canvas);
55 gfx::Rect image_bounds(size());
56 image_bounds.ClampToCenteredSize(GetPreferredSize());
57 image_bounds.Inset(GetInsets());
58 const SkScalar kRadius[8] = {
59 SkIntToScalar(corner_radius_[0]),
60 SkIntToScalar(corner_radius_[0]),
61 SkIntToScalar(corner_radius_[1]),
62 SkIntToScalar(corner_radius_[1]),
63 SkIntToScalar(corner_radius_[2]),
64 SkIntToScalar(corner_radius_[2]),
65 SkIntToScalar(corner_radius_[3]),
66 SkIntToScalar(corner_radius_[3])
68 SkPath path;
69 path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius);
70 SkPaint paint;
71 paint.setAntiAlias(true);
72 paint.setXfermodeMode(active_user_ ? SkXfermode::kSrcOver_Mode
73 : SkXfermode::kLuminosity_Mode);
74 canvas->DrawImageInPath(
75 resized_, image_bounds.x(), image_bounds.y(), path, paint);
78 } // namespace tray
79 } // namespace ash