| Index: ui/message_center/views/notification_view.cc
|
| diff --git a/ui/message_center/views/notification_view.cc b/ui/message_center/views/notification_view.cc
|
| index f4a0572414d4d1e489d8cd67def9d2b967e62122..00e32047e46676e3d976516819fa91495bb19cf2 100644
|
| --- a/ui/message_center/views/notification_view.cc
|
| +++ b/ui/message_center/views/notification_view.cc
|
| @@ -8,6 +8,7 @@
|
| #include "base/utf_string_conversions.h"
|
| #include "grit/ui_resources.h"
|
| #include "ui/base/accessibility/accessible_view_state.h"
|
| +#include "ui/base/layout.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| #include "ui/base/text/text_elider.h"
|
| #include "ui/gfx/canvas.h"
|
| @@ -26,14 +27,14 @@
|
| #include "ui/views/controls/label.h"
|
| #include "ui/views/layout/box_layout.h"
|
| #include "ui/views/layout/fill_layout.h"
|
| +#include "ui/views/widget/widget.h"
|
|
|
| namespace {
|
|
|
| // Dimensions.
|
| -const int kIconColumnWidth = message_center::kNotificationIconSize;
|
| +const int kIconSize = message_center::kNotificationIconSize;
|
| const int kLegacyIconSize = 40;
|
| -const int kTextLeftPadding = kIconColumnWidth +
|
| - message_center::kIconToTextPadding;
|
| +const int kTextLeftPadding = kIconSize + message_center::kIconToTextPadding;
|
| const int kTextBottomPadding = 12;
|
| const int kTextRightPadding = 23;
|
| const int kItemTitleToMessagePadding = 3;
|
| @@ -87,6 +88,36 @@ views::Border* MakeSeparatorBorder(int top, int left, SkColor color) {
|
| return views::Border::CreateSolidSidedBorder(top, left, 0, 0, color);
|
| }
|
|
|
| +// static
|
| +// Return true if and only if the image is null or has alpha.
|
| +bool HasAlpha(gfx::ImageSkia& image, views::Widget* widget) {
|
| + // Determine which bitmap to use.
|
| + ui::ScaleFactor factor = ui::SCALE_FACTOR_100P;
|
| + if (widget) {
|
| + factor = ui::GetScaleFactorForNativeView(widget->GetNativeView());
|
| + if (factor == ui::SCALE_FACTOR_NONE)
|
| + factor = ui::SCALE_FACTOR_100P;
|
| + }
|
| +
|
| + // Extract that bitmap's alpha and look for a non-opaque pixel there.
|
| + SkBitmap bitmap = image.GetRepresentation(factor).sk_bitmap();
|
| + if (!bitmap.isNull()) {
|
| + SkBitmap alpha;
|
| + alpha.setConfig(SkBitmap::kA1_Config, bitmap.width(), bitmap.height(), 0);
|
| + bitmap.extractAlpha(&alpha);
|
| + for (int y = 0; y < bitmap.height(); ++y) {
|
| + for (int x = 0; x < bitmap.width(); ++x) {
|
| + if (alpha.getColor(x, y) != SK_ColorBLACK) {
|
| + return true;
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + // If no opaque pixel was found, return false unless the bitmap is empty.
|
| + return bitmap.isNull();
|
| +}
|
| +
|
| // ItemView ////////////////////////////////////////////////////////////////////
|
|
|
| // ItemViews are responsible for drawing each list notification item's title and
|
| @@ -385,16 +416,20 @@ NotificationView::NotificationView(const Notification& notification,
|
| }
|
|
|
| // Create the notification icon view.
|
| - if (notification.type() == NOTIFICATION_TYPE_SIMPLE) {
|
| + gfx::ImageSkia icon = notification.icon().AsImageSkia();
|
| + if (notification.type() == NOTIFICATION_TYPE_SIMPLE &&
|
| + (icon.width() != kIconSize ||
|
| + icon.height() != kIconSize ||
|
| + HasAlpha(icon, GetWidget()))) {
|
| views::ImageView* icon_view = new views::ImageView();
|
| - icon_view->SetImage(notification.icon().AsImageSkia());
|
| + icon_view->SetImage(icon);
|
| icon_view->SetImageSize(gfx::Size(kLegacyIconSize, kLegacyIconSize));
|
| icon_view->SetHorizontalAlignment(views::ImageView::CENTER);
|
| icon_view->SetVerticalAlignment(views::ImageView::CENTER);
|
| icon_view->set_background(MakeBackground(kLegacyIconBackgroundColor));
|
| icon_view_ = icon_view;
|
| } else {
|
| - icon_view_ = new ProportionalImageView(notification.icon().AsImageSkia());
|
| + icon_view_ = new ProportionalImageView(icon);
|
| }
|
|
|
| // Create the bottom_view_, which collects into a vertical box all content
|
| @@ -451,8 +486,7 @@ int NotificationView::GetHeightForWidth(int width) {
|
| gfx::Insets insets = GetInsets();
|
| int top_height = top_view_->GetHeightForWidth(width - insets.width());
|
| int bottom_height = bottom_view_->GetHeightForWidth(width - insets.width());
|
| - int icon_size = message_center::kNotificationIconSize;
|
| - return std::max(top_height, icon_size) + bottom_height + insets.height();
|
| + return std::max(top_height, kIconSize) + bottom_height + insets.height();
|
| }
|
|
|
| void NotificationView::Layout() {
|
| @@ -473,11 +507,10 @@ void NotificationView::Layout() {
|
| top_view_->SetBounds(insets.left(), insets.top(), content_width, top_height);
|
|
|
| // Icon.
|
| - int icon_size = message_center::kNotificationIconSize;
|
| - icon_view_->SetBounds(insets.left(), insets.top(), icon_size, icon_size);
|
| + icon_view_->SetBounds(insets.left(), insets.top(), kIconSize, kIconSize);
|
|
|
| // Bottom views.
|
| - int bottom_y = insets.top() + std::max(top_height, icon_size);
|
| + int bottom_y = insets.top() + std::max(top_height, kIconSize);
|
| int bottom_height = bottom_view_->GetHeightForWidth(content_width);
|
| bottom_view_->SetBounds(insets.left(), bottom_y,
|
| content_width, bottom_height);
|
|
|