summaryrefslogtreecommitdiffstats
path: root/ash/system/user/rounded_image_view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ash/system/user/rounded_image_view.cc')
-rw-r--r--ash/system/user/rounded_image_view.cc79
1 files changed, 79 insertions, 0 deletions
diff --git a/ash/system/user/rounded_image_view.cc b/ash/system/user/rounded_image_view.cc
new file mode 100644
index 0000000..b5a38bd
--- /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