Chromium Code Reviews| Index: chrome/browser/browser_theme_provider.cc |
| diff --git a/chrome/browser/browser_theme_provider.cc b/chrome/browser/browser_theme_provider.cc |
| index f234d8433ae694a844a329c158bce2502abd0a93..61623722a7cda9d0dc3512340808eb137e4dbe00 100644 |
| --- a/chrome/browser/browser_theme_provider.cc |
| +++ b/chrome/browser/browser_theme_provider.cc |
| @@ -447,9 +447,7 @@ bool BrowserThemeProvider::HasCustomImage(int id) const { |
| UTF8ToWide(names_iter->second), false); |
| } |
| -bool BrowserThemeProvider::GetRawData( |
| - int id, |
| - std::vector<unsigned char>* raw_data) const { |
| +RefCountedMemory* BrowserThemeProvider::GetRawData(int id) const { |
| // Check to see whether we should substitute some images. |
| int ntp_alternate; |
| GetDisplayProperty(NTP_LOGO_ALTERNATE, &ntp_alternate); |
| @@ -458,16 +456,17 @@ bool BrowserThemeProvider::GetRawData( |
| RawDataMap::const_iterator data_iter = raw_data_.find(id); |
| if (data_iter != raw_data_.end()) { |
| - *raw_data = data_iter->second; |
| - return true; |
| + return data_iter->second; |
| } |
|
brettw
2009/10/16 23:03:12
You should also remove the {} for this conditional
|
| - if (!ReadThemeFileData(id, raw_data) && |
| - !rb_.LoadImageResourceBytes(id, raw_data)) |
| - return false; |
| + RefCountedMemory* data = ReadThemeFileData(id); |
| + if (!data) |
| + data = rb_.LoadImageResourceBytes(id); |
| + if (!data) |
| + return NULL; |
| - raw_data_[id] = *raw_data; |
| - return true; |
| + raw_data_[id] = data; |
| + return data; |
| } |
| void BrowserThemeProvider::SetTheme(Extension* extension) { |
| @@ -522,8 +521,7 @@ std::string BrowserThemeProvider::GetThemeID() const { |
| return WideToUTF8(id); |
| } |
| -bool BrowserThemeProvider::ReadThemeFileData( |
| - int id, std::vector<unsigned char>* raw_data) const { |
| +RefCountedMemory* BrowserThemeProvider::ReadThemeFileData(int id) const { |
| ImageMap::const_iterator images_iter = images_.find(id); |
| if (images_iter != images_.end()) { |
| // First check to see if we have a registered theme extension and whether |
| @@ -540,16 +538,17 @@ bool BrowserThemeProvider::ReadThemeFileData( |
| int64 avail = file.Available(); |
| if (avail > 0 && avail < INT_MAX) { |
| size_t size = static_cast<size_t>(avail); |
| - raw_data->resize(size); |
| - char* data = reinterpret_cast<char*>(&(raw_data->front())); |
| + std::vector<unsigned char> raw_data; |
| + raw_data.resize(size); |
| + char* data = reinterpret_cast<char*>(&(raw_data.front())); |
| if (file.ReadUntilComplete(data, size) == avail) |
| - return true; |
| + return RefCountedBytes::TakeVector(&raw_data); |
| } |
| } |
| } |
| } |
| - return false; |
| + return NULL; |
| } |
| // static |
| @@ -803,14 +802,27 @@ SkBitmap* BrowserThemeProvider::LoadThemeBitmap(int id) const { |
| if (!themeable_images.count(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)) { |
| + scoped_refptr<RefCountedMemory> raw_data; |
| + |
| + // We special case images related to the NTP so we first try raw data. Why? |
| + // Because the DOMUI stuff uses that interface and otherwise we would be |
| + // loading big images twice. Ouch. So either we prime the cache for when |
| + // DOMUIThemeSource requests our image, or we take advantage of the already |
| + // loaded data, saving a trip to disk. |
|
brettw
2009/10/16 23:03:12
In person, I asked for some clarification of the c
|
| + if (id == IDR_THEME_NTP_BACKGROUND) |
| + raw_data = GetRawData(id); |
| + |
| + if (!raw_data) |
| + raw_data = ReadThemeFileData(id); |
| + |
| + if (raw_data) { |
| + std::vector<unsigned char> png_data; |
| + |
| // Decode the PNG. |
| int image_width = 0; |
| int image_height = 0; |
| - if (!gfx::PNGCodec::Decode(&raw_data.front(), raw_data.size(), |
| + if (!gfx::PNGCodec::Decode(raw_data->front(), raw_data->size(), |
| gfx::PNGCodec::FORMAT_BGRA, &png_data, |
| &image_width, &image_height)) { |
| NOTREACHED() << "Unable to decode theme image resource " << id; |