Index: ash/system/user/rounded_image_view.cc |
diff --git a/ash/system/user/rounded_image_view.cc b/ash/system/user/rounded_image_view.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b5a38bd560ebf0cc7647128dde0b89b92598c1c4 |
--- /dev/null |
+++ b/ash/system/user/rounded_image_view.cc |
@@ -0,0 +1,79 @@ |
+// 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() { |
+ 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 |