Index: chrome/browser/profiles/profile_avatar_icon_util.cc |
diff --git a/chrome/browser/profiles/profile_avatar_icon_util.cc b/chrome/browser/profiles/profile_avatar_icon_util.cc |
index 2d82b35a684ce27f9220bf0795ba8455ffd41856..a9e4e90446d30cb6c2b4b016027b4bc3e15349f0 100644 |
--- a/chrome/browser/profiles/profile_avatar_icon_util.cc |
+++ b/chrome/browser/profiles/profile_avatar_icon_util.cc |
@@ -29,6 +29,7 @@ |
#include "ui/gfx/image/canvas_image_source.h" |
#include "ui/gfx/image/image.h" |
#include "ui/gfx/image/image_skia_operations.h" |
+#include "ui/gfx/path.h" |
#include "ui/gfx/skia_util.h" |
#include "url/gurl.h" |
#include "url/url_canon.h" |
@@ -72,7 +73,8 @@ class AvatarImageSource : public gfx::CanvasImageSource { |
const gfx::Size& canvas_size, |
int width, |
AvatarPosition position, |
- AvatarBorder border); |
+ AvatarBorder border, |
+ profiles::AvatarShape shape=profiles::SHAPE_SQUARE); |
~AvatarImageSource() override; |
// CanvasImageSource override: |
@@ -84,8 +86,12 @@ class AvatarImageSource : public gfx::CanvasImageSource { |
const int width_; |
const int height_; |
const AvatarPosition position_; |
+#if !defined(OS_ANDROID) |
+ const profiles::AvatarShape shape_; |
+#endif |
const AvatarBorder border_; |
+ |
DISALLOW_COPY_AND_ASSIGN(AvatarImageSource); |
}; |
@@ -93,13 +99,18 @@ AvatarImageSource::AvatarImageSource(gfx::ImageSkia avatar, |
const gfx::Size& canvas_size, |
int width, |
AvatarPosition position, |
- AvatarBorder border) |
+ AvatarBorder border, |
+ profiles::AvatarShape shape) |
: gfx::CanvasImageSource(canvas_size, false), |
canvas_size_(canvas_size), |
width_(width), |
height_(GetScaledAvatarHeightForWidth(width, avatar)), |
position_(position), |
- border_(border) { |
+ #if !defined(OS_ANDROID) |
+ shape_(shape), |
+ #endif |
+ border_(border) |
+{ |
avatar_ = gfx::ImageSkiaOperations::CreateResizedImage( |
avatar, skia::ImageOperations::RESIZE_BEST, |
gfx::Size(width_, height_)); |
@@ -121,6 +132,22 @@ void AvatarImageSource::Draw(gfx::Canvas* canvas) { |
y = canvas_size_.height() - height_ - 1; |
} |
+#if !defined(OS_ANDROID) |
+ if (shape_ == profiles::SHAPE_CIRCLE) { |
+ // Draw the avatar on the bottom center of the canvas; overrides the |
+ // previous position specification. |
+ y = canvas_size_.height() - height_; |
+ |
+ // Calculate the circular mask that will be used to display the avatar |
+ // image. |
+ gfx::Path circular_mask; |
+ circular_mask.addCircle(SkIntToScalar(canvas_size_.width() / 2), |
+ SkIntToScalar(canvas_size_.height() / 2), |
+ SkIntToScalar(canvas_size_.width() / 2)); |
+ canvas->ClipPath(circular_mask, true); |
+ } |
+#endif |
+ |
canvas->DrawImageInt(avatar_, x, y); |
// The border should be square. |
@@ -226,7 +253,8 @@ const size_t kPlaceholderAvatarIndex = 26; |
gfx::Image GetSizedAvatarIcon(const gfx::Image& image, |
bool is_rectangle, |
- int width, int height) { |
+ int width, int height, |
+ AvatarShape shape) { |
if (!is_rectangle && image.Height() <= height) |
return image; |
@@ -235,7 +263,8 @@ gfx::Image GetSizedAvatarIcon(const gfx::Image& image, |
// Source for a centered, sized icon. GAIA images get a border. |
std::unique_ptr<gfx::ImageSkiaSource> source(new AvatarImageSource( |
*image.ToImageSkia(), size, std::min(width, height), |
- AvatarImageSource::POSITION_CENTER, AvatarImageSource::BORDER_NONE)); |
+ AvatarImageSource::POSITION_CENTER, AvatarImageSource::BORDER_NONE, |
+ shape)); |
return gfx::Image(gfx::ImageSkia(source.release(), size)); |
} |