| Index: chrome/browser/ui/gtk/tabs/tab_renderer_gtk.h
|
| diff --git a/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.h b/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.h
|
| index fec065f1dce7b593581e8d95ebb65008b7ffc891..6e63d2f886b435c54d4cc6cc96f39af9c868878f 100644
|
| --- a/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.h
|
| +++ b/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.h
|
| @@ -12,6 +12,7 @@
|
| #include "base/basictypes.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/string16.h"
|
| +#include "chrome/browser/ui/gtk/cairo_cached_surface.h"
|
| #include "content/public/browser/notification_observer.h"
|
| #include "content/public/browser/notification_registrar.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| @@ -26,17 +27,17 @@ namespace gfx {
|
| class Size;
|
| } // namespace gfx
|
|
|
| +class CairoCachedSurface;
|
| class CustomDrawButton;
|
| class TabContents;
|
| -class ThemeService;
|
| +class GtkThemeService;
|
|
|
| namespace ui {
|
| class SlideAnimation;
|
| class ThrobAnimation;
|
| }
|
|
|
| -class TabRendererGtk : public ui::AnimationDelegate,
|
| - public content::NotificationObserver {
|
| +class TabRendererGtk : public ui::AnimationDelegate {
|
| public:
|
| // Possible animation states.
|
| enum AnimationState {
|
| @@ -48,17 +49,15 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| class LoadingAnimation : public content::NotificationObserver {
|
| public:
|
| struct Data {
|
| - explicit Data(ThemeService* theme_service);
|
| + explicit Data(GtkThemeService* theme_service);
|
| Data(int loading, int waiting, int waiting_to_loading);
|
|
|
| - SkBitmap* waiting_animation_frames;
|
| - SkBitmap* loading_animation_frames;
|
| int loading_animation_frame_count;
|
| int waiting_animation_frame_count;
|
| int waiting_to_loading_frame_count_ratio;
|
| };
|
|
|
| - explicit LoadingAnimation(ThemeService* theme_service);
|
| + explicit LoadingAnimation(GtkThemeService* theme_service);
|
|
|
| // Used in unit tests to inject specific data.
|
| explicit LoadingAnimation(const LoadingAnimation::Data& data);
|
| @@ -73,13 +72,6 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| AnimationState animation_state() const { return animation_state_; }
|
| int animation_frame() const { return animation_frame_; }
|
|
|
| - const SkBitmap* waiting_animation_frames() const {
|
| - return data_->waiting_animation_frames;
|
| - }
|
| - const SkBitmap* loading_animation_frames() const {
|
| - return data_->loading_animation_frames;
|
| - }
|
| -
|
| // Provide content::NotificationObserver implementation.
|
| virtual void Observe(int type,
|
| const content::NotificationSource& source,
|
| @@ -92,7 +84,7 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| content::NotificationRegistrar registrar_;
|
|
|
| // Gives us our throbber images.
|
| - ThemeService* theme_service_;
|
| + GtkThemeService* theme_service_;
|
|
|
| // Current state of the animation.
|
| AnimationState animation_state_;
|
| @@ -103,7 +95,7 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| DISALLOW_COPY_AND_ASSIGN(LoadingAnimation);
|
| };
|
|
|
| - explicit TabRendererGtk(ThemeService* theme_service);
|
| + explicit TabRendererGtk(GtkThemeService* theme_service);
|
| virtual ~TabRendererGtk();
|
|
|
| // TabContents. If only the loading state was updated, the loading_only flag
|
| @@ -146,16 +138,17 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| // Sets the visibility of the Tab.
|
| virtual void SetVisible(bool visible) const;
|
|
|
| - // Paints the tab into |canvas|.
|
| - virtual void Paint(gfx::Canvas* canvas);
|
| + // Paints the tab using resources from the display that |widget| is on,
|
| + // drawing into |cr|.
|
| + void Paint(GtkWidget* widget, cairo_t* cr);
|
|
|
| // Paints the tab, and keeps the result server-side. The returned surface must
|
| // be freed with cairo_surface_destroy().
|
| - virtual cairo_surface_t* PaintToSurface();
|
| + cairo_surface_t* PaintToSurface(GtkWidget* widget, cairo_t* cr);
|
|
|
| // There is no PaintNow available, so the fastest we can do is schedule a
|
| // paint with the windowing system.
|
| - virtual void SchedulePaint();
|
| + void SchedulePaint();
|
|
|
| // Notifies the Tab that the close button has been clicked.
|
| virtual void CloseButtonClicked();
|
| @@ -163,18 +156,13 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| // Sets the bounds of the tab.
|
| virtual void SetBounds(const gfx::Rect& bounds);
|
|
|
| - // Provide NotificationObserver implementation.
|
| - virtual void Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details);
|
| -
|
| // Advance the loading animation to the next frame, or hide the animation if
|
| // the tab isn't loading. Returns |true| if the icon area needs to be
|
| // repainted.
|
| bool ValidateLoadingAnimation(AnimationState animation_state);
|
|
|
| // Repaint only the area of the tab that contains the favicon.
|
| - void PaintFaviconArea(GdkEventExpose* event);
|
| + void PaintFaviconArea(GtkWidget* widget, cairo_t* cr);
|
|
|
| // Returns whether the Tab should display a favicon.
|
| bool ShouldShowIcon() const;
|
| @@ -192,9 +180,6 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| // Returns the width for mini-tabs. Mini-tabs always have this width.
|
| static int GetMiniWidth();
|
|
|
| - // Loads the images to be used for the tab background.
|
| - static void LoadTabImages();
|
| -
|
| // Sets the colors used for painting text on the tabs.
|
| static void SetSelectedTitleColor(SkColor color);
|
| static void SetUnselectedTitleColor(SkColor color);
|
| @@ -246,34 +231,15 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| private:
|
| class FaviconCrashAnimation;
|
|
|
| - // The data structure used to hold cached bitmaps. We need to manually free
|
| - // the bitmap in CachedBitmap when we remove it from |cached_bitmaps_|. We
|
| - // handle this when we replace images in the map and in the destructor.
|
| - struct CachedBitmap {
|
| - int bg_offset_x;
|
| - int bg_offset_y;
|
| - SkBitmap* bitmap;
|
| - };
|
| - typedef std::map<std::pair<const SkBitmap*, const SkBitmap*>, CachedBitmap>
|
| - BitmapCache;
|
| -
|
| // Model data. We store this here so that we don't need to ask the underlying
|
| // model, which is tricky since instances of this object can outlive the
|
| // corresponding objects in the underlying model.
|
| struct TabData {
|
| - TabData()
|
| - : is_default_favicon(false),
|
| - loading(false),
|
| - crashed(false),
|
| - incognito(false),
|
| - show_icon(true),
|
| - mini(false),
|
| - blocked(false),
|
| - animating_mini_change(false),
|
| - app(false) {
|
| - }
|
| + TabData();
|
| + ~TabData();
|
|
|
| SkBitmap favicon;
|
| + CairoCachedSurface cairo_favicon;
|
| bool is_default_favicon;
|
| string16 title;
|
| bool loading;
|
| @@ -286,16 +252,6 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| bool app;
|
| };
|
|
|
| - // TODO(jhawkins): Move into TabResources class.
|
| - struct TabImage {
|
| - SkBitmap* image_l;
|
| - SkBitmap* image_c;
|
| - SkBitmap* image_r;
|
| - int l_width;
|
| - int r_width;
|
| - int y_offset;
|
| - };
|
| -
|
| // Overridden from ui::AnimationDelegate:
|
| virtual void AnimationProgressed(const ui::Animation* animation);
|
| virtual void AnimationCanceled(const ui::Animation* animation);
|
| @@ -327,31 +283,35 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| // Returns the largest of the favicon, title text, and the close button.
|
| static int GetContentHeight();
|
|
|
| - // A helper method for generating the masked bitmaps used to draw the curved
|
| - // edges of tabs. We cache the generated bitmaps because they can take a
|
| - // long time to compute.
|
| - SkBitmap* GetMaskedBitmap(const SkBitmap* mask,
|
| - const SkBitmap* background,
|
| - int bg_offset_x,
|
| - int bg_offset_y);
|
| - BitmapCache cached_bitmaps_;
|
| -
|
| - // Paints the tab, minus the close button.
|
| - void PaintTab(GdkEventExpose* event);
|
| + void PaintTab(GtkWidget* widget, GdkEventExpose* event);
|
|
|
| // Paint various portions of the Tab
|
| - void PaintTitle(gfx::Canvas* canvas);
|
| - void PaintIcon(gfx::Canvas* canvas);
|
| - void PaintTabBackground(gfx::Canvas* canvas);
|
| - void PaintInactiveTabBackground(gfx::Canvas* canvas);
|
| - void PaintActiveTabBackground(gfx::Canvas* canvas);
|
| - void PaintLoadingAnimation(gfx::Canvas* canvas);
|
| + void PaintTitle(GtkWidget* widget, cairo_t* cr);
|
| + void PaintIcon(GtkWidget* widget, cairo_t* cr);
|
| + void PaintTabBackground(GtkWidget* widget, cairo_t* cr);
|
| + void PaintInactiveTabBackground(GtkWidget* widget, cairo_t* cr);
|
| + void PaintActiveTabBackground(GtkWidget* widget, cairo_t* cr);
|
| + void PaintLoadingAnimation(GtkWidget* widget, cairo_t* cairo);
|
| +
|
| + // Draws the given |tab_bg| onto |cr| using the tab shape masks along the
|
| + // sides for the rounded tab shape.
|
| + void DrawTabBackground(cairo_t* cr,
|
| + GtkWidget* widget,
|
| + CairoCachedSurface* tab_bg,
|
| + int offset_x,
|
| + int offset_y);
|
| +
|
| + // Draws the tab shadow using the given idr resources onto |cr|.
|
| + void DrawTabShadow(cairo_t* cr,
|
| + GtkWidget* widget,
|
| + int left_idr,
|
| + int center_idr,
|
| + int right_idr);
|
|
|
| // Returns the number of favicon-size elements that can fit in the tab's
|
| // current size.
|
| int IconCapacity() const;
|
|
|
| -
|
| // Returns whether the Tab should display a close button.
|
| bool ShouldShowCloseBox() const;
|
|
|
| @@ -387,9 +347,10 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
|
|
| TabData data_;
|
|
|
| - static TabImage tab_active_;
|
| - static TabImage tab_inactive_;
|
| - static TabImage tab_alpha_;
|
| + static int tab_active_l_width_;
|
| + static int tab_active_l_height_;
|
| + static int tab_inactive_l_width_;
|
| + static int tab_inactive_l_height_;
|
|
|
| static gfx::Font* title_font_;
|
| static int title_font_height_;
|
| @@ -444,7 +405,7 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| // alignment in the BrowserTitlebar.
|
| int background_offset_y_;
|
|
|
| - ThemeService* theme_service_;
|
| + GtkThemeService* theme_service_;
|
|
|
| // The close button.
|
| scoped_ptr<CustomDrawButton> close_button_;
|
| @@ -455,9 +416,6 @@ class TabRendererGtk : public ui::AnimationDelegate,
|
| // Indicates whether this tab is the active one.
|
| bool is_active_;
|
|
|
| - // Used to listen for theme change notifications.
|
| - content::NotificationRegistrar registrar_;
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(TabRendererGtk);
|
| };
|
|
|
|
|