| Index: chrome/browser/browser_theme_provider.cc
|
| ===================================================================
|
| --- chrome/browser/browser_theme_provider.cc (revision 21313)
|
| +++ chrome/browser/browser_theme_provider.cc (working copy)
|
| @@ -24,6 +24,7 @@
|
| #include "skia/ext/image_operations.h"
|
| #include "skia/ext/skia_utils.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| +#include "third_party/skia/include/core/SkCanvas.h"
|
|
|
| #if defined(OS_WIN)
|
| #include "app/win_util.h"
|
| @@ -66,6 +67,8 @@
|
| "ntp_background_alignment";
|
| const char* BrowserThemeProvider::kDisplayPropertyNTPTiling =
|
| "ntp_background_repeat";
|
| +const char* BrowserThemeProvider::kDisplayPropertyNTPInverseLogo =
|
| + "ntp_logo_alternate";
|
|
|
| // Strings used in alignment properties.
|
| const char* BrowserThemeProvider::kAlignmentTop = "top";
|
| @@ -95,19 +98,19 @@
|
| const SkColor BrowserThemeProvider::kDefaultColorBackgroundTabText =
|
| SkColorSetRGB(64, 64, 64);
|
| const SkColor BrowserThemeProvider::kDefaultColorBookmarkText =
|
| - SkColorSetRGB(64, 64, 64);
|
| + SkColorSetRGB(18, 50, 114);
|
| const SkColor BrowserThemeProvider::kDefaultColorNTPBackground =
|
| SkColorSetRGB(255, 255, 255);
|
| const SkColor BrowserThemeProvider::kDefaultColorNTPText =
|
| SkColorSetRGB(0, 0, 0);
|
| const SkColor BrowserThemeProvider::kDefaultColorNTPLink =
|
| - SkColorSetRGB(0, 0, 204);
|
| + SkColorSetRGB(0, 0, 0);
|
| const SkColor BrowserThemeProvider::kDefaultColorNTPSection =
|
| - SkColorSetRGB(225, 236, 254);
|
| + SkColorSetRGB(75, 140, 220);
|
| const SkColor BrowserThemeProvider::kDefaultColorNTPSectionText =
|
| - SkColorSetRGB(0, 0, 0);
|
| + SkColorSetRGB(255, 255, 255);
|
| const SkColor BrowserThemeProvider::kDefaultColorNTPSectionLink =
|
| - SkColorSetRGB(0, 0, 204);
|
| + SkColorSetRGB(127, 148, 173);
|
| const SkColor BrowserThemeProvider::kDefaultColorControlBackground = NULL;
|
| const SkColor BrowserThemeProvider::kDefaultColorButtonBackground = NULL;
|
|
|
| @@ -128,6 +131,7 @@
|
| BrowserThemeProvider::ALIGN_BOTTOM;
|
| static const int kDefaultDisplayPropertyNTPTiling =
|
| BrowserThemeProvider::NO_REPEAT;
|
| +static const int kDefaultDisplayPropertyNTPInverseLogo = 0;
|
|
|
| // The image resources that will be tinted by the 'button' tint value.
|
| static const int kToolbarButtonIDs[] = {
|
| @@ -142,12 +146,34 @@
|
| IDR_MENU_PAGE, IDR_MENU_PAGE_RTL,
|
| IDR_MENU_CHROME, IDR_MENU_CHROME_RTL,
|
| IDR_MENU_DROPARROW,
|
| - IDR_THROBBER, IDR_THROBBER_WAITING, IDR_THROBBER_LIGHT
|
| + IDR_THROBBER, IDR_THROBBER_WAITING, IDR_THROBBER_LIGHT,
|
| + IDR_LOCATIONBG
|
| };
|
|
|
| // A map for kToolbarButtonIDs.
|
| static std::map<const int, bool> button_images_;
|
|
|
| +// The image resources we will allow people to theme.
|
| +static const int kThemeableImages[] = {
|
| + IDR_THEME_FRAME,
|
| + IDR_THEME_FRAME_INACTIVE,
|
| + IDR_THEME_FRAME_INCOGNITO,
|
| + IDR_THEME_FRAME_INCOGNITO_INACTIVE,
|
| + IDR_THEME_TOOLBAR,
|
| + IDR_THEME_TAB_BACKGROUND,
|
| + IDR_THEME_TAB_BACKGROUND_INCOGNITO,
|
| + IDR_THEME_TAB_BACKGROUND_V,
|
| + IDR_THEME_NTP_BACKGROUND,
|
| + IDR_THEME_FRAME_OVERLAY,
|
| + IDR_THEME_FRAME_OVERLAY_INACTIVE,
|
| + IDR_THEME_BUTTON_BACKGROUND,
|
| + IDR_THEME_NTP_ATTRIBUTION,
|
| + IDR_THEME_WINDOW_CONTROL_BACKGROUND
|
| +};
|
| +
|
| +// A map for kThemeableImages.
|
| +static std::map<const int, bool> themeable_images_;
|
| +
|
| // A map of frame image IDs to the tints for those ids.
|
| static std::map<const int, int> frame_tints_;
|
|
|
| @@ -158,8 +184,13 @@
|
| for (size_t i = 0; i < arraysize(kToolbarButtonIDs); ++i) {
|
| button_images_[kToolbarButtonIDs[i]] = true;
|
| }
|
| + for (size_t i = 0; i < arraysize(kThemeableImages); ++i) {
|
| + themeable_images_[kThemeableImages[i]] = true;
|
| + }
|
| frame_tints_[IDR_THEME_FRAME] = TINT_FRAME;
|
| frame_tints_[IDR_THEME_FRAME_INACTIVE] = TINT_FRAME_INACTIVE;
|
| + frame_tints_[IDR_THEME_FRAME_OVERLAY] = TINT_FRAME;
|
| + frame_tints_[IDR_THEME_FRAME_OVERLAY_INACTIVE] = TINT_FRAME_INACTIVE;
|
| frame_tints_[IDR_THEME_FRAME_INCOGNITO] = TINT_FRAME_INCOGNITO;
|
| frame_tints_[IDR_THEME_FRAME_INCOGNITO_INACTIVE] =
|
| TINT_FRAME_INCOGNITO_INACTIVE;
|
| @@ -179,6 +210,12 @@
|
| SkBitmap* BrowserThemeProvider::GetBitmapNamed(int id) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| + // Check to see whether we should substitute some images.
|
| + int ntp_alternate;
|
| + GetDisplayProperty(NTP_LOGO_ALTERNATE, &ntp_alternate);
|
| + if (id == IDR_PRODUCT_LOGO && ntp_alternate != 0)
|
| + id = IDR_PRODUCT_LOGO_WHITE;
|
| +
|
| // Check to see if we already have the Skia image in the cache.
|
| ImageCache::const_iterator found = image_cache_.find(id);
|
| if (found != image_cache_.end())
|
| @@ -282,6 +319,14 @@
|
| *result = kDefaultDisplayPropertyNTPTiling;
|
| }
|
| return true;
|
| + case NTP_LOGO_ALTERNATE:
|
| + if (display_properties_.find(kDisplayPropertyNTPInverseLogo) !=
|
| + display_properties_.end()) {
|
| + *result = display_properties_[kDisplayPropertyNTPInverseLogo];
|
| + } else {
|
| + *result = kDefaultDisplayPropertyNTPInverseLogo;
|
| + }
|
| + return true;
|
| default:
|
| NOTREACHED() << "Unknown property requested";
|
| }
|
| @@ -289,7 +334,7 @@
|
| }
|
|
|
| bool BrowserThemeProvider::ShouldUseNativeFrame() {
|
| - if (images_.find(IDR_THEME_FRAME) != images_.end())
|
| + if (HasCustomImage(IDR_THEME_FRAME))
|
| return false;
|
| #if defined(OS_WIN)
|
| return win_util::ShouldUseVistaFrame();
|
| @@ -299,6 +344,9 @@
|
| }
|
|
|
| bool BrowserThemeProvider::HasCustomImage(int id) {
|
| + if (!themeable_images_[id])
|
| + return false;
|
| +
|
| return (images_.find(id) != images_.end());
|
| }
|
|
|
| @@ -315,6 +363,7 @@
|
| SetDisplayPropertyData(extension->GetThemeDisplayProperties());
|
| GenerateFrameColors();
|
| GenerateFrameImages();
|
| + GenerateTabImages();
|
|
|
| SaveImageData(extension->GetThemeImages());
|
| SaveColorData();
|
| @@ -362,6 +411,10 @@
|
|
|
| SkBitmap* BrowserThemeProvider::LoadThemeBitmap(int id) {
|
| DCHECK(CalledOnValidThread());
|
| +
|
| + if (!themeable_images_[id])
|
| + return NULL;
|
| +
|
| // Attempt to find the image in our theme bundle.
|
| std::vector<unsigned char> raw_data, png_data;
|
| if (ReadThemeFileData(id, &raw_data)) {
|
| @@ -539,6 +592,12 @@
|
| display_properties_[kDisplayPropertyNTPTiling] =
|
| StringToTiling(val);
|
| }
|
| + if (base::strcasecmp(WideToUTF8(*iter).c_str(),
|
| + kDisplayPropertyNTPInverseLogo) == 0) {
|
| + std::string val;
|
| + if (display_properties_value->GetString(*iter, &val))
|
| + display_properties_[kDisplayPropertyNTPInverseLogo] = StringToInt(val);
|
| + }
|
| ++iter;
|
| }
|
| }
|
| @@ -655,13 +714,24 @@
|
| // If there's no frame image provided for the specified id, then load
|
| // the default provided frame. If that's not provided, skip this whole
|
| // thing and just use the default images.
|
| - int base_id = (id == IDR_THEME_FRAME_INCOGNITO ||
|
| - id == IDR_THEME_FRAME_INCOGNITO_INACTIVE) ?
|
| - IDR_THEME_FRAME_INCOGNITO : IDR_THEME_FRAME;
|
| + int base_id;
|
| + if (id == IDR_THEME_FRAME_INCOGNITO_INACTIVE)
|
| + base_id = (HasCustomImage(IDR_THEME_FRAME_INCOGNITO)) ?
|
| + IDR_THEME_FRAME_INCOGNITO :
|
| + IDR_THEME_FRAME;
|
| + else if (id == IDR_THEME_FRAME_OVERLAY_INACTIVE)
|
| + base_id = IDR_THEME_FRAME_OVERLAY;
|
| + else if (id == IDR_THEME_FRAME_INACTIVE)
|
| + base_id = IDR_THEME_FRAME;
|
| + else if (id == IDR_THEME_FRAME_INCOGNITO &&
|
| + !HasCustomImage(IDR_THEME_FRAME_INCOGNITO))
|
| + base_id = IDR_THEME_FRAME;
|
| + else
|
| + base_id = id;
|
|
|
| - if (images_.find(id) != images_.end()) {
|
| + if (HasCustomImage(id)) {
|
| frame.reset(LoadThemeBitmap(id));
|
| - } else if (base_id != id && images_.find(base_id) != images_.end()) {
|
| + } else if (base_id != id && HasCustomImage(base_id)) {
|
| frame.reset(LoadThemeBitmap(base_id));
|
| } else {
|
| // If the theme doesn't specify an image, then apply the tint to
|
| @@ -679,6 +749,11 @@
|
| }
|
| }
|
|
|
| +void BrowserThemeProvider::GenerateTabImages() {
|
| + GenerateBitmap(IDR_THEME_TAB_BACKGROUND);
|
| + GenerateBitmap(IDR_THEME_TAB_BACKGROUND_INCOGNITO);
|
| +}
|
| +
|
| void BrowserThemeProvider::ClearAllThemeData() {
|
| // Clear our image cache.
|
| ClearCaches();
|
| @@ -707,10 +782,21 @@
|
| std::map<int, SkBitmap*>::iterator it = image_cache_.find(base_id);
|
| if (it != image_cache_.end()) {
|
| SkBitmap* frame = it->second;
|
| + int blur_amount = (HasCustomImage(id)) ? 1 : 5;
|
| SkBitmap blurred =
|
| - skia::ImageOperations::CreateBlurredBitmap(*frame, 5);
|
| + skia::ImageOperations::CreateBlurredBitmap(*frame, blur_amount);
|
| SkBitmap* bg_tab =
|
| new SkBitmap(TintBitmap(blurred, TINT_BACKGROUND_TAB));
|
| +
|
| + // If they've provided a custom image, overlay it.
|
| + if (HasCustomImage(id)) {
|
| + SkBitmap* overlay = LoadThemeBitmap(id);
|
| + SkCanvas canvas(*bg_tab);
|
| + for (int x = 0; x < bg_tab->width(); x += overlay->width())
|
| + canvas.drawBitmap(*overlay, static_cast<SkScalar>(x), 0, NULL);
|
| + }
|
| +
|
| + image_cache_[id] = bg_tab;
|
| return bg_tab;
|
| }
|
| }
|
| @@ -752,7 +838,7 @@
|
| rgb_list->Set(1, Value::CreateIntegerValue(SkColorGetG(rgba)));
|
| rgb_list->Set(2, Value::CreateIntegerValue(SkColorGetB(rgba)));
|
| if (SkColorGetA(rgba) != 255)
|
| - rgb_list->Set(3, Value::CreateRealValue(SkColorGetA(rgba)));
|
| + rgb_list->Set(3, Value::CreateRealValue(SkColorGetA(rgba) / 255.0));
|
| pref_colors->Set(UTF8ToWide((*iter).first), rgb_list);
|
| ++iter;
|
| }
|
| @@ -799,6 +885,11 @@
|
| SetString(UTF8ToWide((*iter).first), TilingToString(
|
| (*iter).second));
|
| }
|
| + if (base::strcasecmp((*iter).first.c_str(),
|
| + kDisplayPropertyNTPInverseLogo) == 0) {
|
| + pref_display_properties->
|
| + SetInteger(UTF8ToWide((*iter).first), (*iter).second);
|
| + }
|
| ++iter;
|
| }
|
| }
|
|
|