diff options
author | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-13 01:52:59 +0000 |
---|---|---|
committer | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-13 01:52:59 +0000 |
commit | 11c2fe82bca2cd871eeb7aff77043754ef75651a (patch) | |
tree | 0fbe3ff9d607c63dd95907f7d9fcb0ad71b39683 /chrome/common/resource_bundle.cc | |
parent | 1d8c3419fd7f42b045dde9ddf301babd5d5ae947 (diff) | |
download | chromium_src-11c2fe82bca2cd871eeb7aff77043754ef75651a.zip chromium_src-11c2fe82bca2cd871eeb7aff77043754ef75651a.tar.gz chromium_src-11c2fe82bca2cd871eeb7aff77043754ef75651a.tar.bz2 |
Refactor resource_bundle into a _win file.
Linux changes forthcoming.
Review URL: http://codereview.chromium.org/17472
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@7914 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common/resource_bundle.cc')
-rw-r--r-- | chrome/common/resource_bundle.cc | 194 |
1 files changed, 15 insertions, 179 deletions
diff --git a/chrome/common/resource_bundle.cc b/chrome/common/resource_bundle.cc index c7cbad1..ed15af8 100644 --- a/chrome/common/resource_bundle.cc +++ b/chrome/common/resource_bundle.cc @@ -6,33 +6,12 @@ #include <atlbase.h> -#include "base/file_util.h" #include "base/gfx/png_decoder.h" #include "base/logging.h" -#include "base/path_service.h" -#include "base/resource_util.h" -#include "base/scoped_ptr.h" -#include "base/string_piece.h" -#include "base/string_util.h" -#include "base/win_util.h" -#include "chrome/app/chrome_dll_resource.h" -#include "chrome/common/chrome_paths.h" #include "chrome/common/gfx/chrome_font.h" -#include "chrome/common/l10n_util.h" -#include "chrome/common/win_util.h" #include "SkBitmap.h" -using namespace std; - -ResourceBundle *ResourceBundle::g_shared_instance_ = NULL; - -// Returns the flags that should be passed to LoadLibraryEx. -DWORD GetDataDllLoadFlags() { - if (win_util::GetWinVersion() >= win_util::WINVERSION_VISTA) - return LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE | LOAD_LIBRARY_AS_IMAGE_RESOURCE; - - return DONT_RESOLVE_DLL_REFERENCES; -} +ResourceBundle* ResourceBundle::g_shared_instance_ = NULL; /* static */ void ResourceBundle::InitSharedInstance(const std::wstring& pref_locale) { @@ -58,85 +37,31 @@ ResourceBundle& ResourceBundle::GetSharedInstance() { } ResourceBundle::ResourceBundle() - : locale_resources_dll_(NULL), - theme_dll_(NULL) { + : locale_resources_data_(NULL), + theme_data_(NULL) { } -ResourceBundle::~ResourceBundle() { +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(); - - if (locale_resources_dll_) { - BOOL rv = FreeLibrary(locale_resources_dll_); - DCHECK(rv); - } - if (theme_dll_) { - BOOL rv = FreeLibrary(theme_dll_); - DCHECK(rv); - } -} - -void ResourceBundle::LoadLocaleResources(const std::wstring& pref_locale) { - DCHECK(NULL == locale_resources_dll_) << "locale dll already loaded"; - const std::wstring& locale_path = GetLocaleDllPath(pref_locale); - if (locale_path.empty()) { - // It's possible that there are no locale dlls found, in which case we just - // return. - NOTREACHED(); - return; - } - - // The dll should only have resources, not executable code. - locale_resources_dll_ = LoadLibraryEx(locale_path.c_str(), NULL, - GetDataDllLoadFlags()); - DCHECK(locale_resources_dll_ != NULL) << "unable to load generated resources"; -} - -std::wstring ResourceBundle::GetLocaleDllPath(const std::wstring& pref_locale) { - std::wstring locale_path; - PathService::Get(chrome::DIR_LOCALES, &locale_path); - - const std::wstring app_locale = l10n_util::GetApplicationLocale(pref_locale); - if (app_locale.empty()) - return app_locale; - - file_util::AppendToPath(&locale_path, app_locale + L".dll"); - return locale_path; -} - -void ResourceBundle::LoadThemeResources() { - DCHECK(NULL == theme_dll_) << "theme dll already loaded"; - std::wstring theme_dll_path; - PathService::Get(chrome::DIR_THEMES, &theme_dll_path); - file_util::AppendToPath(&theme_dll_path, L"default.dll"); - - // The dll should only have resources, not executable code. - theme_dll_ = LoadLibraryEx(theme_dll_path.c_str(), NULL, - GetDataDllLoadFlags()); - DCHECK(theme_dll_ != NULL) << "unable to load " << theme_dll_path; } /* static */ -SkBitmap* ResourceBundle::LoadBitmap(HINSTANCE dll_inst, int resource_id) { - void* data_ptr = NULL; - size_t data_size; - bool success = base::GetDataResourceFromModule(dll_inst, resource_id, - &data_ptr, &data_size); +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); if (!success) return NULL; - unsigned char* data = static_cast<unsigned char*>(data_ptr); - // Decode the PNG. - vector<unsigned char> png_data; int image_width; int image_height; - if (!PNGDecoder::Decode(data, 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 theme resource " << resource_id; + NOTREACHED() << "Unable to decode image resource " << resource_id; return NULL; } @@ -156,13 +81,15 @@ SkBitmap* ResourceBundle::GetBitmapNamed(int resource_id) { scoped_ptr<SkBitmap> bitmap; - // Try to load the bitmap from the theme dll. - if (theme_dll_) - bitmap.reset(LoadBitmap(theme_dll_, resource_id)); + // Try to load the bitmap from the theme data. + if (theme_data_) + bitmap.reset(LoadBitmap(theme_data_, resource_id)); +#if defined(OS_WIN) // If we did not find the bitmap in the theme DLL, try the current one. if (!bitmap.get()) bitmap.reset(LoadBitmap(_AtlBaseModule.GetModuleInstance(), resource_id)); +#endif // We loaded successfully. Cache the Skia version of the bitmap. if (bitmap.get()) { @@ -196,96 +123,6 @@ SkBitmap* ResourceBundle::GetBitmapNamed(int resource_id) { } } -bool ResourceBundle::LoadImageResourceBytes(int resource_id, - vector<unsigned char>* bytes) { - return LoadModuleResourceBytes(theme_dll_, resource_id, bytes); -} - -bool ResourceBundle::LoadDataResourceBytes(int resource_id, - vector<unsigned char>* bytes) { - return LoadModuleResourceBytes(_AtlBaseModule.GetModuleInstance(), - resource_id, bytes); -} - -bool ResourceBundle::LoadModuleResourceBytes( - HINSTANCE module, - int resource_id, - std::vector<unsigned char>* bytes) { - void* data_ptr; - size_t data_size; - if (base::GetDataResourceFromModule(module, resource_id, &data_ptr, - &data_size)) { - bytes->resize(data_size); - memcpy(&(bytes->front()), data_ptr, data_size); - return true; - } else { - return false; - } -} - -HICON ResourceBundle::LoadThemeIcon(int icon_id) { - return ::LoadIcon(theme_dll_, MAKEINTRESOURCE(icon_id)); -} - -std::string ResourceBundle::GetDataResource(int resource_id) { - return GetRawDataResource(resource_id).as_string(); -} - -StringPiece ResourceBundle::GetRawDataResource(int resource_id) { - void* data_ptr; - size_t data_size; - if (base::GetDataResourceFromModule(_AtlBaseModule.GetModuleInstance(), - resource_id, - &data_ptr, - &data_size)) { - return StringPiece(static_cast<const char*>(data_ptr), data_size); - } else if (locale_resources_dll_ && - base::GetDataResourceFromModule(locale_resources_dll_, - resource_id, - &data_ptr, - &data_size)) { - return StringPiece(static_cast<const char*>(data_ptr), data_size); - } - return StringPiece(); -} -// Loads and returns the global accelerators from the current module. -HACCEL ResourceBundle::GetGlobalAccelerators() { - return ::LoadAccelerators(_AtlBaseModule.GetModuleInstance(), - MAKEINTRESOURCE(IDR_MAINFRAME)); -} - -// Loads and returns a cursor from the current module. -HCURSOR ResourceBundle::LoadCursor(int cursor_id) { - return ::LoadCursor(_AtlBaseModule.GetModuleInstance(), - MAKEINTRESOURCE(cursor_id)); -} - -std::wstring ResourceBundle::GetLocalizedString(int message_id) { - // If for some reason we were unable to load a resource dll, return an empty - // string (better than crashing). - if (!locale_resources_dll_) - return std::wstring(); - - DCHECK(IS_INTRESOURCE(message_id)); - - // Get a reference directly to the string resource. - HINSTANCE hinstance = locale_resources_dll_; - const ATLSTRINGRESOURCEIMAGE* image = AtlGetStringResourceImage(hinstance, - message_id); - if (!image) { - // Fall back on the current module (shouldn't be any strings here except - // in unittests). - image = AtlGetStringResourceImage(_AtlBaseModule.GetModuleInstance(), - message_id); - if (!image) { - NOTREACHED() << "unable to find resource: " << message_id; - return std::wstring(); - } - } - // Copy into a wstring and return. - return std::wstring(image->achString, image->nLength); -} - void ResourceBundle::LoadFontsIfNecessary() { AutoLock lock_scope(lock_); if (!base_font_.get()) { @@ -327,4 +164,3 @@ ChromeFont ResourceBundle::GetFont(FontStyle style) { return *base_font_; } } - |