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..bc1eb4ac4015f7f494b6de57edf22369a3eb7cbd 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: |
@@ -85,6 +87,7 @@ class AvatarImageSource : public gfx::CanvasImageSource { |
const int height_; |
const AvatarPosition position_; |
const AvatarBorder border_; |
+ const profiles::AvatarShape shape_; |
DISALLOW_COPY_AND_ASSIGN(AvatarImageSource); |
}; |
@@ -93,13 +96,15 @@ 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) { |
+ border_(border), |
+ shape_(shape) { |
avatar_ = gfx::ImageSkiaOperations::CreateResizedImage( |
avatar, skia::ImageOperations::RESIZE_BEST, |
gfx::Size(width_, height_)); |
@@ -113,7 +118,20 @@ void AvatarImageSource::Draw(gfx::Canvas* canvas) { |
int x = (canvas_size_.width() - width_) / 2; |
int y; |
- if (position_ == POSITION_CENTER) { |
+ if (shape_ == profiles::SHAPE_CIRCLE) { |
+ // Draw the avatar on the bottom center of the canvas; overrides the |
+ // position specification. |
+ y = canvas_size_.height() - height_; |
+ #if !defined(OS_ANDROID) |
+ // 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 |
+ } else if (position_ == POSITION_CENTER) { |
Roger Tawa OOO till Jul 10th
2016/06/14 15:25:13
If someone happens to use SHAPE_CIRCLE in clank, t
Jane
2016/06/15 14:21:13
Done. I assume you meant putting the if condition
Roger Tawa OOO till Jul 10th
2016/06/17 14:35:56
As is, the CIRCLE enum is still defined on android
|
// Draw the avatar centered on the canvas. |
y = (canvas_size_.height() - height_) / 2; |
} else { |
@@ -226,7 +244,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 +254,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)); |
} |