summaryrefslogtreecommitdiffstats
path: root/chrome/common/resource_bundle.cc
diff options
context:
space:
mode:
authorevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-01-13 01:52:59 +0000
committerevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-01-13 01:52:59 +0000
commit11c2fe82bca2cd871eeb7aff77043754ef75651a (patch)
tree0fbe3ff9d607c63dd95907f7d9fcb0ad71b39683 /chrome/common/resource_bundle.cc
parent1d8c3419fd7f42b045dde9ddf301babd5d5ae947 (diff)
downloadchromium_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.cc194
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_;
}
}
-