| OLD | NEW | 
|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "chrome/browser/gtk/gtk_theme_provider.h" | 5 #include "chrome/browser/gtk/gtk_theme_provider.h" | 
| 6 | 6 | 
| 7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> | 
| 8 | 8 | 
| 9 #include "app/gfx/color_utils.h" | 9 #include "app/gfx/color_utils.h" | 
| 10 #include "app/gfx/gtk_util.h" | 10 #include "app/gfx/gtk_util.h" | 
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 169   // the base color counts more than once. | 169   // the base color counts more than once. | 
| 170   GdkColor color; | 170   GdkColor color; | 
| 171   color.pixel = 0; | 171   color.pixel = 0; | 
| 172   color.red = (text.red + (bg.red * kBgWeight)) / (1 + kBgWeight); | 172   color.red = (text.red + (bg.red * kBgWeight)) / (1 + kBgWeight); | 
| 173   color.green = (text.green + (bg.green * kBgWeight)) / (1 + kBgWeight); | 173   color.green = (text.green + (bg.green * kBgWeight)) / (1 + kBgWeight); | 
| 174   color.blue = (text.blue + (bg.blue * kBgWeight)) / (1 + kBgWeight); | 174   color.blue = (text.blue + (bg.blue * kBgWeight)) / (1 + kBgWeight); | 
| 175 | 175 | 
| 176   return color; | 176   return color; | 
| 177 } | 177 } | 
| 178 | 178 | 
|  | 179 void GtkThemeProvider::GetScrollbarColors(GdkColor* thumb_active_color, | 
|  | 180                                           GdkColor* thumb_inactive_color, | 
|  | 181                                           GdkColor* track_color, | 
|  | 182                                           bool use_gtk_theme) { | 
|  | 183   if (!use_gtk_theme) { | 
|  | 184     // If using the default non-GTK colors, pick some reasonable choices of | 
|  | 185     // different greys. | 
|  | 186     thumb_active_color->pixel   = 0; | 
|  | 187     thumb_active_color->red     = 64250; | 
|  | 188     thumb_active_color->green   = 63736; | 
|  | 189     thumb_active_color->blue    = 62965; | 
|  | 190     thumb_inactive_color->pixel = 0; | 
|  | 191     thumb_inactive_color->red   = 61680; | 
|  | 192     thumb_inactive_color->green = 60395; | 
|  | 193     thumb_inactive_color->blue  = 58853; | 
|  | 194     track_color->pixel          = 0; | 
|  | 195     track_color->red            = 58339; | 
|  | 196     track_color->green          = 56797; | 
|  | 197     track_color->blue           = 55512; | 
|  | 198     return; | 
|  | 199   } | 
|  | 200 | 
|  | 201   // Create window containing scrollbar elements | 
|  | 202   GtkWidget* window    = gtk_window_new(GTK_WINDOW_POPUP); | 
|  | 203   GtkWidget* fixed     = gtk_fixed_new(); | 
|  | 204   GtkWidget* scrollbar = gtk_hscrollbar_new(NULL); | 
|  | 205   gtk_container_add(GTK_CONTAINER(window), fixed); | 
|  | 206   gtk_container_add(GTK_CONTAINER(fixed),  scrollbar); | 
|  | 207   gtk_widget_realize(window); | 
|  | 208   gtk_widget_realize(scrollbar); | 
|  | 209 | 
|  | 210   // Draw scrollbar thumb part and track into offscreen image | 
|  | 211   int kWidth        = 100; | 
|  | 212   int kHeight       = 20; | 
|  | 213   GtkStyle*  style  = gtk_rc_get_style(scrollbar); | 
|  | 214   GdkPixmap* pm     = gdk_pixmap_new(window->window, kWidth, kHeight, -1); | 
|  | 215   GdkRectangle rect = { 0, 0, kWidth, kHeight }; | 
|  | 216   unsigned char data[3*kWidth*kHeight]; | 
|  | 217   for (int i = 0; i < 3; ++i) { | 
|  | 218     if (i < 2) { | 
|  | 219       // Thumb part | 
|  | 220       gtk_paint_slider(style, pm, | 
|  | 221                        i == 0 ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL, | 
|  | 222                        GTK_SHADOW_OUT, &rect, scrollbar, "slider", 0, 0, | 
|  | 223                        kWidth, kHeight, GTK_ORIENTATION_HORIZONTAL); | 
|  | 224     } else { | 
|  | 225       // Track | 
|  | 226       gtk_paint_box(style, pm, GTK_STATE_ACTIVE, GTK_SHADOW_IN, &rect, | 
|  | 227                     scrollbar, "trough-upper", 0, 0, kWidth, kHeight); | 
|  | 228     } | 
|  | 229     GdkPixbuf* pb = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, | 
|  | 230                                              FALSE, 8, kWidth, kHeight, | 
|  | 231                                              3*kWidth, 0, 0); | 
|  | 232     gdk_pixbuf_get_from_drawable(pb, pm, NULL, 0, 0, 0, 0, kWidth, kHeight); | 
|  | 233 | 
|  | 234     // Sample pixels | 
|  | 235     int components[3] = { 0 }; | 
|  | 236     for (int y = 2; y < kHeight-2; ++y) { | 
|  | 237       for (int c = 0; c < 3; ++c) { | 
|  | 238         // Sample a vertical slice of pixels at about one-thirds from the | 
|  | 239         // left edge. This allows us to avoid any fixed graphics that might be | 
|  | 240         // located at the edges or in the center of the scrollbar. | 
|  | 241         // Each pixel is made up of a red, green, and blue component; taking up | 
|  | 242         // a total of three bytes. | 
|  | 243         components[c] += data[3*(kWidth/3 + y*kWidth) + c]; | 
|  | 244       } | 
|  | 245     } | 
|  | 246     GdkColor* color = i == 0 ? thumb_active_color : | 
|  | 247                       i == 1 ? thumb_inactive_color : | 
|  | 248                                track_color; | 
|  | 249     color->pixel = 0; | 
|  | 250     // We sampled pixels across the full height of the image, ignoring a two | 
|  | 251     // pixel border. In some themes, the border has a completely different | 
|  | 252     // color which we do not want to factor into our average color computation. | 
|  | 253     // | 
|  | 254     // We now need to scale the colors from the 0..255 range, to the wider | 
|  | 255     // 0..65535 range, and we need to actually compute the average color; so, | 
|  | 256     // we divide by the total number of pixels in the sample. | 
|  | 257     color->red   = components[0] * 65535 / (255*(kHeight-4)); | 
|  | 258     color->green = components[1] * 65535 / (255*(kHeight-4)); | 
|  | 259     color->blue  = components[2] * 65535 / (255*(kHeight-4)); | 
|  | 260 | 
|  | 261     g_object_unref(pb); | 
|  | 262   } | 
|  | 263   g_object_unref(pm); | 
|  | 264 | 
|  | 265   gtk_widget_destroy(window); | 
|  | 266 } | 
|  | 267 | 
| 179 CairoCachedSurface* GtkThemeProvider::GetSurfaceNamed( | 268 CairoCachedSurface* GtkThemeProvider::GetSurfaceNamed( | 
| 180     int id, GtkWidget* widget_on_display) { | 269     int id, GtkWidget* widget_on_display) { | 
| 181   GdkDisplay* display = gtk_widget_get_display(widget_on_display); | 270   GdkDisplay* display = gtk_widget_get_display(widget_on_display); | 
| 182   CairoCachedSurfaceMap& surface_map = per_display_surfaces_[display]; | 271   CairoCachedSurfaceMap& surface_map = per_display_surfaces_[display]; | 
| 183 | 272 | 
| 184   // Check to see if we already have the pixbuf in the cache. | 273   // Check to see if we already have the pixbuf in the cache. | 
| 185   CairoCachedSurfaceMap::const_iterator found = surface_map.find(id); | 274   CairoCachedSurfaceMap::const_iterator found = surface_map.find(id); | 
| 186   if (found != surface_map.end()) | 275   if (found != surface_map.end()) | 
| 187     return found->second; | 276     return found->second; | 
| 188 | 277 | 
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 473 } | 562 } | 
| 474 | 563 | 
| 475 void GtkThemeProvider::OnDestroyChromeButton(GtkWidget* button, | 564 void GtkThemeProvider::OnDestroyChromeButton(GtkWidget* button, | 
| 476                                              GtkThemeProvider* provider) { | 565                                              GtkThemeProvider* provider) { | 
| 477   std::vector<GtkWidget*>::iterator it = | 566   std::vector<GtkWidget*>::iterator it = | 
| 478       find(provider->chrome_buttons_.begin(), provider->chrome_buttons_.end(), | 567       find(provider->chrome_buttons_.begin(), provider->chrome_buttons_.end(), | 
| 479            button); | 568            button); | 
| 480   if (it != provider->chrome_buttons_.end()) | 569   if (it != provider->chrome_buttons_.end()) | 
| 481     provider->chrome_buttons_.erase(it); | 570     provider->chrome_buttons_.erase(it); | 
| 482 } | 571 } | 
| OLD | NEW | 
|---|