Index: chrome/browser/chromeos/status/network_menu.cc |
=================================================================== |
--- chrome/browser/chromeos/status/network_menu.cc (revision 76240) |
+++ chrome/browser/chromeos/status/network_menu.cc (working copy) |
@@ -80,6 +80,15 @@ |
}; |
*/ |
+// static |
+const int NetworkMenu::kNumAnimatingImages = 10; |
+ |
+// static |
+SkBitmap NetworkMenu::kAnimatingImages[kNumAnimatingImages]; |
+ |
+// static |
+SkBitmap NetworkMenu::kAnimatingImagesBlack[kNumAnimatingImages]; |
+ |
NetworkMenu::NetworkMenu() |
: min_width_(-1) { |
use_settings_ui_ = !CommandLine::ForCurrentProcess()->HasSwitch( |
@@ -355,11 +364,11 @@ |
} |
// static |
-SkBitmap NetworkMenu::IconForNetworkStrength(const WifiNetwork* wifi, |
- bool black) { |
+const SkBitmap* NetworkMenu::IconForNetworkStrength(const WifiNetwork* wifi, |
+ bool black) { |
DCHECK(wifi); |
if (wifi->strength() == 0) { |
- return *ResourceBundle::GetSharedInstance().GetBitmapNamed( |
+ return ResourceBundle::GetSharedInstance().GetBitmapNamed( |
black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : |
IDR_STATUSBAR_NETWORK_BARS0); |
} |
@@ -367,17 +376,17 @@ |
nextafter(static_cast<float>(kNumBarsImages), 0)); |
index = std::max(std::min(index, kNumBarsImages - 1), 0); |
const int* images = black ? kBarsImagesBlack : kBarsImages; |
- return *ResourceBundle::GetSharedInstance().GetBitmapNamed(images[index]); |
+ return ResourceBundle::GetSharedInstance().GetBitmapNamed(images[index]); |
} |
// static |
-SkBitmap NetworkMenu::IconForNetworkStrength(const CellularNetwork* cellular, |
- bool black) { |
+const SkBitmap* NetworkMenu::IconForNetworkStrength( |
+ const CellularNetwork* cellular, bool black) { |
DCHECK(cellular); |
// If no data, then we show 0 bars. |
if (cellular->strength() == 0 || |
cellular->data_left() == CellularNetwork::DATA_NONE) { |
- return *ResourceBundle::GetSharedInstance().GetBitmapNamed( |
+ return ResourceBundle::GetSharedInstance().GetBitmapNamed( |
black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : |
IDR_STATUSBAR_NETWORK_BARS0); |
} |
@@ -385,30 +394,43 @@ |
nextafter(static_cast<float>(kNumBarsImages), 0)); |
index = std::max(std::min(index, kNumBarsImages - 1), 0); |
const int* images = black ? kBarsImagesBlack : kBarsImages; |
- return *ResourceBundle::GetSharedInstance().GetBitmapNamed(images[index]); |
+ return ResourceBundle::GetSharedInstance().GetBitmapNamed(images[index]); |
} |
// static |
-SkBitmap NetworkMenu::IconForNetworkConnecting(double animation_value, |
- bool black) { |
+const SkBitmap* NetworkMenu::IconForNetworkConnecting(double animation_value, |
+ bool black) { |
// Draw animation of bars icon fading in and out. |
// We are fading between 0 bars and a third of the opacity of 4 bars. |
// Use the current value of the animation to calculate the alpha value |
// of how transparent the icon is. |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- return SkBitmapOperations::CreateBlendedBitmap( |
- *rb.GetBitmapNamed(black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : |
- IDR_STATUSBAR_NETWORK_BARS0), |
- *rb.GetBitmapNamed(black ? IDR_STATUSBAR_NETWORK_BARS4_BLACK : |
- IDR_STATUSBAR_NETWORK_BARS4), |
- animation_value / 3); |
+ |
+ int index = static_cast<int>(animation_value * |
+ nextafter(static_cast<float>(kNumAnimatingImages), 0)); |
+ index = std::max(std::min(index, kNumAnimatingImages - 1), 0); |
+ |
+ SkBitmap* images = black ? kAnimatingImagesBlack : kAnimatingImages; |
+ // Lazily cache images. |
+ if (images[index].empty()) { |
+ // Divide index (0-9) by 9 (assume kNumAnimatingImages==10) to get (0.0-1.0) |
+ // Then we take a third of that for the alpha value. |
+ double alpha = (static_cast<double>(index) / (kNumAnimatingImages - 1)) / 3; |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ images[index] = SkBitmapOperations::CreateBlendedBitmap( |
+ *rb.GetBitmapNamed(black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : |
+ IDR_STATUSBAR_NETWORK_BARS0), |
+ *rb.GetBitmapNamed(black ? IDR_STATUSBAR_NETWORK_BARS4_BLACK : |
+ IDR_STATUSBAR_NETWORK_BARS4), |
+ alpha); |
+ } |
+ return &images[index]; |
} |
// static |
-SkBitmap NetworkMenu::BadgeForNetworkTechnology( |
+const SkBitmap* NetworkMenu::BadgeForNetworkTechnology( |
const CellularNetwork* cellular) { |
if (!cellular) |
- return SkBitmap(); |
+ return NULL; |
int id = -1; |
switch (cellular->network_technology()) { |
@@ -471,21 +493,25 @@ |
break; |
} |
if (id == -1) |
- return SkBitmap(); |
+ return NULL; |
else |
- return *ResourceBundle::GetSharedInstance().GetBitmapNamed(id); |
+ return ResourceBundle::GetSharedInstance().GetBitmapNamed(id); |
} |
// static |
-SkBitmap NetworkMenu::IconForDisplay(SkBitmap icon, SkBitmap badge) { |
+SkBitmap NetworkMenu::IconForDisplay(const SkBitmap* icon, |
+ const SkBitmap* badge) { |
+ DCHECK(icon); |
+ if (badge == NULL) |
+ return *icon; |
+ |
// Draw badge at (14,14). |
static const int kBadgeX = 14; |
static const int kBadgeY = 14; |
- gfx::CanvasSkia canvas(icon.width(), icon.height(), false); |
- canvas.DrawBitmapInt(icon, 0, 0); |
- if (!badge.empty()) |
- canvas.DrawBitmapInt(badge, kBadgeX, kBadgeY); |
+ gfx::CanvasSkia canvas(icon->width(), icon->height(), false); |
+ canvas.DrawBitmapInt(*icon, 0, 0); |
+ canvas.DrawBitmapInt(*badge, kBadgeX, kBadgeY); |
return canvas.ExtractBitmap(); |
} |
@@ -546,9 +572,9 @@ |
} else { |
label = l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET); |
} |
- SkBitmap icon = *rb.GetBitmapNamed(IDR_STATUSBAR_WIRED_BLACK); |
- SkBitmap badge = ethernet_connecting || ethernet_connected ? |
- SkBitmap() : *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED); |
+ const SkBitmap* icon = rb.GetBitmapNamed(IDR_STATUSBAR_WIRED_BLACK); |
+ const SkBitmap* badge = ethernet_connecting || ethernet_connected ? |
+ NULL : rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED); |
int flag = FLAG_ETHERNET; |
if (ethernet_connecting || ethernet_connected) |
flag |= FLAG_ASSOCIATED; |
@@ -584,9 +610,9 @@ |
} |
} |
- SkBitmap icon = IconForNetworkStrength(wifi_networks[i], true); |
- SkBitmap badge = wifi_networks[i]->encrypted() ? |
- *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_SECURE) : SkBitmap(); |
+ const SkBitmap* icon = IconForNetworkStrength(wifi_networks[i], true); |
+ const SkBitmap* badge = wifi_networks[i]->encrypted() ? |
+ rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_SECURE) : NULL; |
int flag = FLAG_WIFI; |
if (!wifi_networks[i]->connectable()) |
flag |= FLAG_DISABLED; |
@@ -644,8 +670,8 @@ |
} |
} |
- SkBitmap icon = IconForNetworkStrength(cell_networks[i], true); |
- SkBitmap badge = BadgeForNetworkTechnology(cell_networks[i]); |
+ const SkBitmap* icon = IconForNetworkStrength(cell_networks[i], true); |
+ const SkBitmap* badge = BadgeForNetworkTechnology(cell_networks[i]); |
int flag = FLAG_CELLULAR; |
if (!cell_networks[i]->connectable()) |
flag |= FLAG_DISABLED; |
@@ -692,8 +718,7 @@ |
menu_items_.push_back(MenuItem( |
ui::MenuModel::TYPE_COMMAND, |
l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_OTHER_NETWORKS), |
- IconForDisplay(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0_BLACK), |
- SkBitmap()), |
+ *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0_BLACK), |
std::string(), FLAG_OTHER_NETWORK)); |
} |