summaryrefslogtreecommitdiffstats
path: root/chrome/browser/browser_theme_provider.h
diff options
context:
space:
mode:
authorerg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-12-11 22:09:55 +0000
committererg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-12-11 22:09:55 +0000
commit75cbb35fa7fb6ce0a511612ec91998c053247be8 (patch)
tree5abee27b2c5f2c60e5017aa6c00b43d9fe2376f4 /chrome/browser/browser_theme_provider.h
parent9fa8c2f5e9581c2e521fd28aadedc4c77b9b2150 (diff)
downloadchromium_src-75cbb35fa7fb6ce0a511612ec91998c053247be8.zip
chromium_src-75cbb35fa7fb6ce0a511612ec91998c053247be8.tar.gz
chromium_src-75cbb35fa7fb6ce0a511612ec91998c053247be8.tar.bz2
Revert "Completely redo how themes are stored on disk and processed at install
time," as it fails valgrind tests. This reverts commit 86faccd1028937a69ccc718718fd48c06c0cd471 (r34379). Review URL: http://codereview.chromium.org/490025 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@34385 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/browser_theme_provider.h')
-rw-r--r--chrome/browser/browser_theme_provider.h213
1 files changed, 200 insertions, 13 deletions
diff --git a/chrome/browser/browser_theme_provider.h b/chrome/browser/browser_theme_provider.h
index a06d7ee..04117b4 100644
--- a/chrome/browser/browser_theme_provider.h
+++ b/chrome/browser/browser_theme_provider.h
@@ -22,13 +22,48 @@ class Profile;
class DictionaryValue;
class PrefService;
class BrowserThemeProviderTest;
-class BrowserThemePack;
class BrowserThemeProvider : public NonThreadSafe,
public ThemeProvider {
public:
// Public constants used in BrowserThemeProvider and its subclasses:
+ // Strings used by themes to identify colors for different parts of our UI.
+ static const char* kColorFrame;
+ static const char* kColorFrameInactive;
+ static const char* kColorFrameIncognito;
+ static const char* kColorFrameIncognitoInactive;
+ static const char* kColorToolbar;
+ static const char* kColorTabText;
+ static const char* kColorBackgroundTabText;
+ static const char* kColorBookmarkText;
+ static const char* kColorNTPBackground;
+ static const char* kColorNTPText;
+ static const char* kColorNTPLink;
+ static const char* kColorNTPLinkUnderline;
+ static const char* kColorNTPHeader;
+ static const char* kColorNTPSection;
+ static const char* kColorNTPSectionText;
+ static const char* kColorNTPSectionLink;
+ static const char* kColorNTPSectionLinkUnderline;
+ static const char* kColorControlBackground;
+ static const char* kColorButtonBackground;
+
+ // Strings used by themes to identify tints to apply to different parts of
+ // our UI. The frame tints apply to the frame color and produce the
+ // COLOR_FRAME* colors.
+ static const char* kTintButtons;
+ static const char* kTintFrame;
+ static const char* kTintFrameInactive;
+ static const char* kTintFrameIncognito;
+ static const char* kTintFrameIncognitoInactive;
+ static const char* kTintBackgroundTab;
+
+ // Strings used by themes to identify miscellaneous numerical properties.
+ static const char* kDisplayPropertyNTPAlignment;
+ static const char* kDisplayPropertyNTPTiling;
+ static const char* kDisplayPropertyNTPInverseLogo;
+
// Strings used in alignment properties.
static const char* kAlignmentTop;
static const char* kAlignmentBottom;
@@ -41,11 +76,38 @@ class BrowserThemeProvider : public NonThreadSafe,
static const char* kTilingRepeatY;
static const char* kTilingRepeat;
+ // Default colors.
+ static const SkColor kDefaultColorFrame;
+ static const SkColor kDefaultColorFrameInactive;
+ static const SkColor kDefaultColorFrameIncognito;
+ static const SkColor kDefaultColorFrameIncognitoInactive;
+ static const SkColor kDefaultColorToolbar;
+ static const SkColor kDefaultColorTabText;
+ static const SkColor kDefaultColorBackgroundTabText;
+ static const SkColor kDefaultColorBookmarkText;
+ static const SkColor kDefaultColorNTPBackground;
+ static const SkColor kDefaultColorNTPText;
+ static const SkColor kDefaultColorNTPLink;
+ static const SkColor kDefaultColorNTPHeader;
+ static const SkColor kDefaultColorNTPSection;
+ static const SkColor kDefaultColorNTPSectionText;
+ static const SkColor kDefaultColorNTPSectionLink;
+ static const SkColor kDefaultColorControlBackground;
+ static const SkColor kDefaultColorButtonBackground;
+
+ static const color_utils::HSL kDefaultTintButtons;
+ static const color_utils::HSL kDefaultTintFrame;
+ static const color_utils::HSL kDefaultTintFrameInactive;
+ static const color_utils::HSL kDefaultTintFrameIncognito;
+ static const color_utils::HSL kDefaultTintFrameIncognitoInactive;
+ static const color_utils::HSL kDefaultTintBackgroundTab;
+
static const char* kDefaultThemeID;
// Returns true if the image is themeable. Safe to call on any thread.
static bool IsThemeableImage(int resource_id);
+
BrowserThemeProvider();
virtual ~BrowserThemeProvider();
@@ -128,6 +190,10 @@ class BrowserThemeProvider : public NonThreadSafe,
// locally customized.)
std::string GetThemeID() const;
+ // Reads the image data from the theme file into the specified vector. Returns
+ // true on success.
+ RefCountedMemory* ReadThemeFileData(int id) const;
+
// Convert a bitfield alignment into a string like "top left". Public so that
// it can be used to generate CSS values. Takes a bitfield of AlignmentMasks.
static std::string AlignmentToString(int alignment);
@@ -143,21 +209,44 @@ class BrowserThemeProvider : public NonThreadSafe,
// Parse tiling values from something like "no-repeat" into a Tiling value.
static int StringToTiling(const std::string& tiling);
- // Returns the default tint for the given tint |id| TINT_* enum value.
- static color_utils::HSL GetDefaultTint(int id);
-
- // Returns the default color for the given color |id| COLOR_* enum value.
- static SkColor GetDefaultColor(int id);
+ // Lock on write to themed_image_cache_ in UI thread; lock on all cache
+ // access in File thread. This allows the File thread and UI thread to
+ // both read themed images at the same time, while preventing simultaneous
+ // File thread read and UI thread write.
+ static Lock themed_image_cache_lock_;
// Save the images to be written to disk, mapping file path to id.
typedef std::map<FilePath, int> ImagesDiskCache;
+ // Cached images. We cache all retrieved and generated bitmaps and keep
+ // track of the pointers. We own these and will delete them when we're done
+ // using them.
+ typedef std::map<int, SkBitmap*> ImageCache;
+
protected:
+ // Sets an individual color value.
+ void SetColor(const char* id, const SkColor& color);
+
+ // Sets an individual tint value.
+ void SetTint(const char* id, const color_utils::HSL& tint);
+
// Get the specified tint - |id| is one of the TINT_* enum values.
color_utils::HSL GetTint(int id) const;
+ // Generate any frame colors that weren't specified.
+ void GenerateFrameColors();
+
+ // Generate any frame images that weren't specified. The resulting images
+ // will be stored in our cache and written to disk. If images have already
+ // been generated and cached, load them from disk.
+ void GenerateFrameImages() const;
+
+ // Generate any tab images that weren't specified. The resulting images
+ // will be stored in our cache.
+ void GenerateTabImages() const;
+
// Clears all the override fields and saves the dictionary.
- virtual void ClearAllThemeData();
+ void ClearAllThemeData();
// Load theme data from preferences.
virtual void LoadThemePrefs();
@@ -165,33 +254,116 @@ class BrowserThemeProvider : public NonThreadSafe,
// Let all the browser views know that themes have changed.
virtual void NotifyThemeChanged();
+ // Loads a bitmap from the theme, which may be tinted or
+ // otherwise modified, or an application default.
+ virtual SkBitmap* LoadThemeBitmap(int id) const;
+
+ // Save the modified bitmap at image_cache_[id].
+ virtual void SaveThemeBitmap(std::string resource_name, int id) const;
+
// Clears the platform-specific caches. Do not call directly; it's called
// from ClearCaches().
virtual void FreePlatformCaches();
+ // The implementation of GenerateTabBackgroundBitmap(). That function also
+ // must be locked and touches caches; this function only deals with image
+ // generation.
+ SkBitmap* GenerateTabBackgroundBitmapImpl(int id) const;
+
Profile* profile() { return profile_; }
+ // Subclasses may need us to not use the on-disk image cache. The GTK
+ // interface needs to generate some images itself.
+ void force_process_images() { process_images_ = true; }
+
private:
friend class BrowserThemeProviderTest;
- // Saves the filename of the cached theme pack.
- void SavePackName(const FilePath& pack_path);
+ typedef std::map<const int, std::string> ImageMap;
+ typedef std::map<const std::string, SkColor> ColorMap;
+ typedef std::map<const std::string, color_utils::HSL> TintMap;
+ typedef std::map<const std::string, int> DisplayPropertyMap;
+ typedef std::map<const int, scoped_refptr<RefCountedMemory> > RawDataMap;
+ typedef std::map<const int, std::string> ResourceNameMap;
+
+ // Returns the string key for the given tint |id| TINT_* enum value.
+ const std::string GetTintKey(int id) const;
+
+ // Returns the default tint for the given tint |id| TINT_* enum value.
+ color_utils::HSL GetDefaultTint(int id) const;
+
+ // Returns the string key for the given color |id| COLOR_* enum value.
+ const std::string GetColorKey(int id) const;
+
+ // Returns the default color for the given color |id| COLOR_* enum value.
+ SkColor GetDefaultColor(int id) const;
+
+ // Tint |bitmap| with the tint specified by |hsl_id|
+ SkBitmap TintBitmap(const SkBitmap& bitmap, int hsl_id) const;
+
+ // The following load data from specified dictionaries (either from
+ // preferences or from an extension manifest) and update our theme
+ // data appropriately.
+ // Allow any ResourceBundle image to be overridden. |images| should
+ // contain keys defined in ThemeResourceMap, and values as paths to
+ // the images on-disk.
+ void SetImageData(DictionaryValue* images, FilePath images_path);
+
+ // Set our theme colors. The keys of |colors| are any of the kColor*
+ // constants, and the values are a three-item list containing 8-bit
+ // RGB values.
+ void SetColorData(DictionaryValue* colors);
+
+ // Set tint data for our images and colors. The keys of |tints| are
+ // any of the kTint* contstants, and the values are a three-item list
+ // containing real numbers in the range 0-1 (and -1 for 'null').
+ void SetTintData(DictionaryValue* tints);
+
+ // Set miscellaneous display properties. While these can be defined as
+ // strings, they are currently stored as integers.
+ void SetDisplayPropertyData(DictionaryValue* display_properties);
+
+ // Create any images that aren't pregenerated (e.g. background tab images).
+ SkBitmap* GenerateTabBackgroundBitmap(int id) const;
+
+ // Save our data - when saving images we need the original dictionary
+ // from the extension because it contains the text ids that we want to save.
+ void SaveImageData(DictionaryValue* images) const;
+ void SaveColorData() const;
+ void SaveTintData() const;
+ void SaveDisplayPropertyData() const;
+
+ // Save the paths of data we have written to disk in prefs.
+ void SaveCachedImageData() const;
// Save the id of the last theme installed.
void SaveThemeID(const std::string& id);
- // Implementation of SetTheme() (and the fallback from LoadThemePrefs() in
- // case we don't have a theme pack).
- void BuildFromExtension(Extension* extension);
+ // Frees generated images and clears the image cache.
+ void ClearCaches();
// Remove preference values for themes that are no longer in use.
void RemoveUnusedThemes();
+ // Encode image at image_cache_[id] as PNG and write to disk.
+ void WriteImagesToDisk() const;
+
+ // Do we have a custom frame image or custom tints?
+ bool ShouldTintFrames() const;
+
#if defined(OS_LINUX)
// Loads an image and flips it horizontally if |rtl_enabled| is true.
GdkPixbuf* GetPixbufImpl(int id, bool rtl_enabled) const;
#endif
+ mutable ImageCache image_cache_;
+
+ // Keep images generated for theme cache in their own place, so we can lock
+ // them on WRITE from UI thread and READ from file thread. Read from UI
+ // thread will be allowed unlocked, because no other thread has write
+ // access to the cache.
+ mutable ImageCache themed_image_cache_;
+
#if defined(OS_LINUX)
typedef std::map<int, GdkPixbuf*> GdkPixbufMap;
mutable GdkPixbufMap gdk_pixbufs_;
@@ -202,10 +374,25 @@ class BrowserThemeProvider : public NonThreadSafe,
mutable NSColorMap nscolor_cache_;
#endif
+ mutable ImagesDiskCache images_disk_cache_;
+
ResourceBundle& rb_;
Profile* profile_;
- scoped_refptr<BrowserThemePack> theme_pack_;
+ ImageMap images_;
+ ColorMap colors_;
+ TintMap tints_;
+ mutable RawDataMap raw_data_;
+ DisplayPropertyMap display_properties_;
+
+ // Reverse of theme_resources_map, so we can cache images properly.
+ ResourceNameMap resource_names_;
+
+ // If true, process all images; if false, just load from disk.
+ bool process_images_;
+
+ // Where we will store our generated images.
+ FilePath image_dir_;
DISALLOW_COPY_AND_ASSIGN(BrowserThemeProvider);
};