Index: chrome/common/resource_bundle.cc |
=================================================================== |
--- chrome/common/resource_bundle.cc (revision 10888) |
+++ chrome/common/resource_bundle.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -7,6 +7,8 @@ |
#include "base/gfx/png_decoder.h" |
#include "base/logging.h" |
#include "base/string_piece.h" |
+#include "net/base/file_stream.h" |
+#include "net/base/net_errors.h" |
#include "chrome/common/gfx/chrome_font.h" |
#include "SkBitmap.h" |
@@ -43,23 +45,55 @@ |
void ResourceBundle::FreeImages() { |
for (SkImageMap::iterator i = skia_images_.begin(); |
- i != skia_images_.end(); i++) { |
+ i != skia_images_.end(); i++) { |
delete i->second; |
} |
skia_images_.clear(); |
} |
+void ResourceBundle::SetThemeExtension(const Extension& e) { |
+ theme_extension_.reset(new Extension(e)); |
+} |
+ |
/* static */ |
SkBitmap* ResourceBundle::LoadBitmap(DataHandle data_handle, int resource_id) { |
std::vector<unsigned char> raw_data, png_data; |
- bool success = LoadResourceBytes(data_handle, resource_id, &raw_data); |
+ bool success = false; |
+ // First check to see if we have a registered theme extension and whether |
+ // it can handle this resource. |
+ // TODO(erikkay): It would be nice to use something less brittle than |
+ // resource_id here. |
+ if (g_shared_instance_->theme_extension_.get()) { |
+ FilePath path = |
+ g_shared_instance_->theme_extension_->GetThemeResourcePath(resource_id); |
+ if (!path.empty()) { |
+ net::FileStream file; |
+ int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ; |
+ if (file.Open(path, flags) == net::OK) { |
+ 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())); |
+ if (file.ReadUntilComplete(data, size) == avail) { |
+ success= true; |
+ } else { |
+ raw_data.resize(0); |
+ } |
+ } |
+ } |
+ } |
+ } |
if (!success) |
+ success = LoadResourceBytes(data_handle, resource_id, &raw_data); |
+ if (!success) |
return NULL; |
// Decode the PNG. |
int image_width; |
int image_height; |
- if (!PNGDecoder::Decode(&raw_data.front(), raw_data.size(), PNGDecoder::FORMAT_BGRA, |
+ if (!PNGDecoder::Decode(&raw_data.front(), raw_data.size(), |
+ PNGDecoder::FORMAT_BGRA, |
&png_data, &image_width, &image_height)) { |
NOTREACHED() << "Unable to decode image resource " << resource_id; |
return NULL; |
@@ -126,8 +160,8 @@ |
// The placeholder bitmap is bright red so people notice the problem. |
// This bitmap will be leaked, but this code should never be hit. |
empty_bitmap = new SkBitmap(); |
- empty_bitmap->setConfig(SkBitmap::kARGB_8888_Config, 32, 32); |
- empty_bitmap->allocPixels(); |
+ empty_bitmap->setConfig(SkBitmap::kARGB_8888_Config, 32, 32); |
+ empty_bitmap->allocPixels(); |
empty_bitmap->eraseARGB(255, 255, 0, 0); |
} |
return empty_bitmap; |