Chromium Code Reviews| Index: chrome/browser/chromeos/status/network_menu_icon.cc |
| diff --git a/chrome/browser/chromeos/status/network_menu_icon.cc b/chrome/browser/chromeos/status/network_menu_icon.cc |
| index fb2b819bff97b2632573ce122a75696d97c6f89f..df4a653bf7a52a0b82a91b19870a7c19f85b5381 100644 |
| --- a/chrome/browser/chromeos/status/network_menu_icon.cc |
| +++ b/chrome/browser/chromeos/status/network_menu_icon.cc |
| @@ -17,8 +17,8 @@ |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/gfx/canvas.h" |
| +#include "ui/gfx/image/image_skia_operations.h" |
| #include "ui/gfx/image/image_skia_source.h" |
| -#include "ui/gfx/skbitmap_operations.h" |
| using std::max; |
| using std::min; |
| @@ -158,47 +158,25 @@ const gfx::ImageSkia* BadgeForNetworkTechnology( |
| return ResourceBundle::GetSharedInstance().GetImageSkiaNamed(id); |
| } |
| -const SkBitmap GetEmptyBitmapOfSameSize(const gfx::ImageSkiaRep& reference) { |
| - typedef std::pair<int, int> SizeKey; |
| - typedef std::map<SizeKey, SkBitmap> SizeBitmapMap; |
| - static SizeBitmapMap* empty_bitmaps_ = new SizeBitmapMap; |
| - |
| - SizeKey key(reference.pixel_width(), reference.pixel_height()); |
| - |
| - SizeBitmapMap::iterator iter = empty_bitmaps_->find(key); |
| - if (iter != empty_bitmaps_->end()) |
| - return iter->second; |
| - |
| - SkBitmap empty; |
| - empty.setConfig(SkBitmap::kARGB_8888_Config, key.first, key.second); |
| - empty.allocPixels(); |
| - empty.eraseARGB(0, 0, 0, 0); |
| - (*empty_bitmaps_)[key] = empty; |
| - return empty; |
| -} |
| - |
| -class FadedImageSource : public gfx::ImageSkiaSource { |
| +class EmptyImageSource: public gfx::ImageSkiaSource { |
| public: |
| - FadedImageSource(const gfx::ImageSkia& source, double alpha) |
| - : source_(source), |
| - alpha_(alpha) { |
| + EmptyImageSource(const gfx::Size& size) |
| + : size_(size) { |
| } |
| - virtual ~FadedImageSource() {} |
| virtual gfx::ImageSkiaRep GetImageForScale( |
| ui::ScaleFactor scale_factor) OVERRIDE { |
| - gfx::ImageSkiaRep image_rep = source_.GetRepresentation(scale_factor); |
| - const SkBitmap empty_bitmap = GetEmptyBitmapOfSameSize(image_rep); |
| - SkBitmap faded_bitmap = SkBitmapOperations::CreateBlendedBitmap( |
| - empty_bitmap, image_rep.sk_bitmap(), alpha_); |
| - return gfx::ImageSkiaRep(faded_bitmap, image_rep.scale_factor()); |
| + SkBitmap empty; |
| + empty.setConfig(SkBitmap::kARGB_8888_Config, size_.width(), |
| + size_.height()); |
| + empty.allocPixels(); |
| + empty.eraseARGB(0, 0, 0, 0); |
|
oshima
2012/07/13 16:54:55
can we cache this? I think it'd save more than cac
|
| + return gfx::ImageSkiaRep(empty, scale_factor); |
| } |
| - |
| private: |
| - const gfx::ImageSkia source_; |
| - const float alpha_; |
| + const gfx::Size size_; |
| - DISALLOW_COPY_AND_ASSIGN(FadedImageSource); |
| + DISALLOW_COPY_AND_ASSIGN(EmptyImageSource); |
| }; |
| // This defines how we assemble a network icon. |
| @@ -252,74 +230,6 @@ class NetworkIconImageSource : public gfx::ImageSkiaSource { |
| DISALLOW_COPY_AND_ASSIGN(NetworkIconImageSource); |
| }; |
| -// This defines how we assemble a network menu icon. |
| -class NetworkMenuIconSource : public gfx::ImageSkiaSource { |
| - public: |
| - NetworkMenuIconSource(NetworkMenuIcon::ImageType type, |
| - int index, |
| - NetworkMenuIcon::ResourceColorTheme color) |
| - : type_(type), |
| - index_(index), |
| - color_(color) { |
| - } |
| - virtual ~NetworkMenuIconSource() {} |
| - |
| - virtual gfx::ImageSkiaRep GetImageForScale( |
| - ui::ScaleFactor scale_factor) OVERRIDE { |
| - int width, height; |
| - gfx::ImageSkia* images; |
| - if (type_ == NetworkMenuIcon::ARCS) { |
| - if (index_ >= kNumArcsImages) |
| - return gfx::ImageSkiaRep(); |
| - images = ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
| - color_ == NetworkMenuIcon::COLOR_DARK ? |
| - IDR_STATUSBAR_NETWORK_ARCS_DARK : IDR_STATUSBAR_NETWORK_ARCS_LIGHT); |
| - width = images->width(); |
| - height = images->height() / kNumArcsImages; |
| - } else { |
| - if (index_ >= kNumBarsImages) |
| - return gfx::ImageSkiaRep(); |
| - |
| - images = ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
| - color_ == NetworkMenuIcon::COLOR_DARK ? |
| - IDR_STATUSBAR_NETWORK_BARS_DARK : IDR_STATUSBAR_NETWORK_BARS_LIGHT); |
| - width = images->width(); |
| - height = images->height() / kNumBarsImages; |
| - } |
| - gfx::ImageSkiaRep image_rep = images->GetRepresentation(scale_factor); |
| - |
| - float scale = ui::GetScaleFactorScale(image_rep.scale_factor()); |
| - height *= scale; |
| - width *= scale; |
| - |
| - SkIRect subset = SkIRect::MakeXYWH(0, index_ * height, width, height); |
| - |
| - SkBitmap dst_bitmap; |
| - image_rep.sk_bitmap().extractSubset(&dst_bitmap, subset); |
| - return gfx::ImageSkiaRep(dst_bitmap, image_rep.scale_factor()); |
| - } |
| - |
| - gfx::Size size() const { |
| - // NeworkMenuIcons all have the same size in DIP for arc/bars. |
| - if (type_ == NetworkMenuIcon::ARCS) { |
| - gfx::Size size = ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
| - IDR_STATUSBAR_NETWORK_ARCS_DARK)->size(); |
| - return gfx::Size(size.width(), size.height() / kNumArcsImages); |
| - } else { |
| - gfx::Size size = ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
| - IDR_STATUSBAR_NETWORK_BARS_DARK)->size(); |
| - return gfx::Size(size.width(), size.height() / kNumBarsImages); |
| - } |
| - } |
| - |
| - private: |
| - const NetworkMenuIcon::ImageType type_; |
| - const int index_; |
| - const NetworkMenuIcon::ResourceColorTheme color_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(NetworkMenuIconSource); |
| -}; |
| - |
| gfx::ImageSkia CreateVpnImage() { |
| ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| const gfx::ImageSkia* ethernet_icon = rb.GetImageSkiaNamed(IDR_STATUSBAR_VPN); |
| @@ -328,6 +238,22 @@ gfx::ImageSkia CreateVpnImage() { |
| *ethernet_icon, NULL, NULL, vpn_badge, NULL); |
| } |
| +gfx::ImageSkia CreateEmptyImage(const gfx::Size& size) { |
|
oshima
2012/07/13 16:54:55
GetEmptyImage is probably better. Is this only pla
pkotwicz
2012/07/15 03:36:48
I haven't found a place which does something simil
|
| + typedef std::pair<int, int> SizeKey; |
| + typedef std::map<SizeKey, gfx::ImageSkia> SizeImageMap; |
| + static SizeImageMap* empty_images = new SizeImageMap; |
| + |
| + SizeKey key(size.width(), size.height()); |
| + SizeImageMap::iterator iter = empty_images->find(key); |
| + |
| + if (iter != empty_images->end()) |
| + return iter->second; |
| + |
| + gfx::ImageSkia empty = gfx::ImageSkia(new EmptyImageSource(size), size); |
| + (*empty_images)[key] = empty; |
| + return empty; |
| +} |
| + |
| } // namespace |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -833,8 +759,8 @@ void NetworkMenuIcon::SetActiveNetworkIconAndText(const Network* network) { |
| // Even though this is the only place we use vpn_connecting_badge_, |
| // it is important that this is a member variable since we set a |
| // pointer to it and access that pointer in icon_->GenerateImage(). |
| - vpn_connecting_badge_ = gfx::ImageSkia( |
| - new FadedImageSource(*vpn_badge, animation), vpn_badge->size()); |
| + vpn_connecting_badge_ = gfx::ImageSkiaOperations::CreateBlendedImage( |
| + CreateEmptyImage(vpn_badge->size()), *vpn_badge, animation); |
| icon_->set_bottom_left_badge(&vpn_connecting_badge_); |
| } |
| } |
| @@ -910,8 +836,8 @@ const gfx::ImageSkia NetworkMenuIcon::GenerateImageFromComponents( |
| // We blend connecting icons with a black image to generate a faded icon. |
| const gfx::ImageSkia NetworkMenuIcon::GenerateConnectingImage( |
| const gfx::ImageSkia& source) { |
| - return gfx::ImageSkia(new FadedImageSource(source, kConnectingImageAlpha), |
| - source.size()); |
| + return gfx::ImageSkiaOperations::CreateBlendedImage( |
| + CreateEmptyImage(source.size()), source, kConnectingImageAlpha); |
| } |
| // Generates and caches an icon image for a network's current state. |
| @@ -955,8 +881,28 @@ const gfx::ImageSkia NetworkMenuIcon::GetVpnImage() { |
| const gfx::ImageSkia NetworkMenuIcon::GetImage(ImageType type, |
| int index, |
| ResourceColorTheme color) { |
| - NetworkMenuIconSource* source = new NetworkMenuIconSource(type, index, color); |
| - return gfx::ImageSkia(source, source->size()); |
| + int width, height; |
| + gfx::ImageSkia* images; |
| + if (type == NetworkMenuIcon::ARCS) { |
| + if (index >= kNumArcsImages) |
| + return gfx::ImageSkia(); |
| + images = ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
| + color == NetworkMenuIcon::COLOR_DARK ? |
| + IDR_STATUSBAR_NETWORK_ARCS_DARK : IDR_STATUSBAR_NETWORK_ARCS_LIGHT); |
| + width = images->width(); |
| + height = images->height() / kNumArcsImages; |
| + } else { |
| + if (index >= kNumBarsImages) |
| + return gfx::ImageSkia(); |
| + |
| + images = ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
| + color == NetworkMenuIcon::COLOR_DARK ? |
| + IDR_STATUSBAR_NETWORK_BARS_DARK : IDR_STATUSBAR_NETWORK_BARS_LIGHT); |
| + width = images->width(); |
| + height = images->height() / kNumBarsImages; |
| + } |
| + return gfx::ImageSkiaOperations::ExtractSubset(*images, |
| + gfx::Rect(0, index * height, width, height)); |
| } |
| const gfx::ImageSkia NetworkMenuIcon::GetDisconnectedImage( |