| Index: ui/base/resource/resource_bundle.cc
|
| diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc
|
| index ed5c14c30cba930f027fb8ef69ce73f22ac60862..7d60cfc44b5628a87b248eb2ee9b57364f914e2a 100644
|
| --- a/ui/base/resource/resource_bundle.cc
|
| +++ b/ui/base/resource/resource_bundle.cc
|
| @@ -13,6 +13,7 @@
|
| #include "ui/base/resource/data_pack.h"
|
| #include "ui/gfx/codec/png_codec.h"
|
| #include "ui/gfx/font.h"
|
| +#include "ui/gfx/image.h"
|
|
|
| namespace ui {
|
|
|
| @@ -94,50 +95,48 @@ ResourceBundle& ResourceBundle::GetSharedInstance() {
|
| }
|
|
|
| SkBitmap* ResourceBundle::GetBitmapNamed(int resource_id) {
|
| - // Check to see if we already have the Skia image in the cache.
|
| + const SkBitmap* bitmap =
|
| + static_cast<const SkBitmap*>(GetImageNamed(resource_id));
|
| + return const_cast<SkBitmap*>(bitmap);
|
| +}
|
| +
|
| +gfx::Image& ResourceBundle::GetImageNamed(int resource_id) {
|
| + // Check to see if the image is already in the cache.
|
| {
|
| base::AutoLock lock_scope(*lock_);
|
| - SkImageMap::const_iterator found = skia_images_.find(resource_id);
|
| - if (found != skia_images_.end())
|
| - return found->second;
|
| + ImageMap::const_iterator found = images_.find(resource_id);
|
| + if (found != images_.end())
|
| + return *found->second;
|
| }
|
|
|
| - scoped_ptr<SkBitmap> bitmap;
|
| -
|
| - bitmap.reset(LoadBitmap(resources_data_, resource_id));
|
| -
|
| + scoped_ptr<SkBitmap> bitmap(LoadBitmap(resources_data_, resource_id));
|
| if (bitmap.get()) {
|
| - // We loaded successfully. Cache the Skia version of the bitmap.
|
| + // The load was successful, so cache the image.
|
| base::AutoLock lock_scope(*lock_);
|
|
|
| - // Another thread raced us, and has already cached the skia image.
|
| - if (skia_images_.count(resource_id))
|
| - return skia_images_[resource_id];
|
| + // Another thread raced the load and has already cached the image.
|
| + if (images_.count(resource_id))
|
| + return *images_[resource_id];
|
|
|
| - skia_images_[resource_id] = bitmap.get();
|
| - return bitmap.release();
|
| + gfx::Image* image = new gfx::Image(bitmap.release());
|
| + images_[resource_id] = image;
|
| + return *image;
|
| }
|
|
|
| - // We failed to retrieve the bitmap, show a debugging red square.
|
| - {
|
| - LOG(WARNING) << "Unable to load bitmap with id " << resource_id;
|
| - NOTREACHED(); // Want to assert in debug mode.
|
| -
|
| - base::AutoLock lock_scope(*lock_); // Guard empty_bitmap initialization.
|
| -
|
| - static SkBitmap* empty_bitmap = NULL;
|
| - if (!empty_bitmap) {
|
| - // 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->eraseARGB(255, 255, 0, 0);
|
| - }
|
| - return empty_bitmap;
|
| - }
|
| + // The load failed to retrieve the image; show a debugging red square.
|
| + LOG(WARNING) << "Unable to load image with id " << resource_id;
|
| + NOTREACHED(); // Want to assert in debug mode.
|
| + return *GetEmptyImage();
|
| }
|
|
|
| +#if !defined(OS_MACOSX) && !defined(OS_LINUX)
|
| +// Only Mac and Linux have non-Skia native image types. All other platforms use
|
| +// Skia natively, so just use GetImageNamed().
|
| +gfx::Image& ResourceBundle::GetNativeImageNamed(int resource_id) {
|
| + return GetImageNamed(resource_id);
|
| +}
|
| +#endif
|
| +
|
| RefCountedStaticMemory* ResourceBundle::LoadDataResourceBytes(
|
| int resource_id) const {
|
| RefCountedStaticMemory* bytes =
|
| @@ -171,17 +170,6 @@ const gfx::Font& ResourceBundle::GetFont(FontStyle style) {
|
| }
|
| }
|
|
|
| -gfx::NativeImage ResourceBundle::GetNativeImageNamed(int resource_id) {
|
| - ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
| -#if defined(OS_MACOSX)
|
| - return rb.GetNSImageNamed(resource_id);
|
| -#elif defined(USE_X11) && !defined(TOOLKIT_VIEWS)
|
| - return rb.GetPixbufNamed(resource_id);
|
| -#else
|
| - return rb.GetBitmapNamed(resource_id);
|
| -#endif
|
| -}
|
| -
|
| ResourceBundle::ResourceBundle()
|
| : lock_(new base::Lock),
|
| resources_data_(NULL),
|
| @@ -189,9 +177,9 @@ ResourceBundle::ResourceBundle()
|
| }
|
|
|
| void ResourceBundle::FreeImages() {
|
| - STLDeleteContainerPairSecondPointers(skia_images_.begin(),
|
| - skia_images_.end());
|
| - skia_images_.clear();
|
| + STLDeleteContainerPairSecondPointers(images_.begin(),
|
| + images_.end());
|
| + images_.clear();
|
| }
|
|
|
| void ResourceBundle::LoadFontsIfNecessary() {
|
| @@ -235,6 +223,21 @@ SkBitmap* ResourceBundle::LoadBitmap(DataHandle data_handle, int resource_id) {
|
| return new SkBitmap(bitmap);
|
| }
|
|
|
| +gfx::Image* ResourceBundle::GetEmptyImage() {
|
| + base::AutoLock lock(*lock_);
|
| +
|
| + static gfx::Image* empty_image = NULL;
|
| + if (!empty_image) {
|
| + // The placeholder bitmap is bright red so people notice the problem.
|
| + // This bitmap will be leaked, but this code should never be hit.
|
| + SkBitmap* bitmap = new SkBitmap();
|
| + bitmap->setConfig(SkBitmap::kARGB_8888_Config, 32, 32);
|
| + bitmap->allocPixels();
|
| + bitmap->eraseARGB(255, 255, 0, 0);
|
| + empty_image = new gfx::Image(bitmap);
|
| + }
|
| + return empty_image;
|
| +}
|
|
|
| // LoadedDataPack -------------------------------------------------------------
|
|
|
|
|