Chromium Code Reviews| Index: chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.cc |
| diff --git a/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.cc b/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.cc |
| index 441b812fa0da4cddf440bfd4a15c918605507c63..13bdbdd0bd058232e18dff7fdd5aff77ab8f2fe6 100644 |
| --- a/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.cc |
| +++ b/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.cc |
| @@ -34,6 +34,8 @@ |
| #include "ui/gfx/color_utils.h" |
| #include "ui/gfx/font.h" |
| #include "ui/gfx/gtk_util.h" |
| +#include "ui/gfx/image/image.h" |
| +#include "ui/gfx/image/cairo_cached_surface.h" |
| #include "ui/gfx/rect.h" |
| #include "ui/gfx/skia_utils_gtk.h" |
| @@ -104,13 +106,13 @@ gfx::Rect GetRectForLine(size_t line, int width) { |
| } |
| // Helper for drawing an entire pixbuf without dithering. |
| -void DrawFullPixbuf(GdkDrawable* drawable, GdkGC* gc, GdkPixbuf* pixbuf, |
| - gint dest_x, gint dest_y) { |
| - gdk_draw_pixbuf(drawable, gc, pixbuf, |
| - 0, 0, // Source. |
| - dest_x, dest_y, // Dest. |
| - -1, -1, // Width/height (auto). |
| - GDK_RGB_DITHER_NONE, 0, 0); // Don't dither. |
| +void DrawFullImage(cairo_t* cr, GtkWidget* widget, const gfx::Image* image, |
| + gint dest_x, gint dest_y) { |
| + gfx::CairoCachedSurface* surface = image->ToCairo(); |
| + surface->SetSource(cr, widget, dest_x, dest_y); |
| + cairo_pattern_set_extend(cairo_get_source(cr), CAIRO_EXTEND_REPEAT); |
| + cairo_rectangle(cr, dest_x, dest_y, surface->Width(), surface->Height()); |
| + cairo_fill(cr); |
| } |
| // TODO(deanm): Find some better home for this, and make it more efficient. |
| @@ -338,8 +340,8 @@ OmniboxPopupViewGtk::~OmniboxPopupViewGtk() { |
| g_object_unref(layout_); |
| gtk_widget_destroy(window_); |
| - for (PixbufMap::iterator it = pixbufs_.begin(); it != pixbufs_.end(); ++it) |
| - g_object_unref(it->second); |
| + for (ImageMap::iterator it = images_.begin(); it != images_.end(); ++it) |
| + delete it->second; |
| } |
| bool OmniboxPopupViewGtk::IsOpen() const { |
| @@ -483,13 +485,13 @@ void OmniboxPopupViewGtk::AcceptLine(size_t line, |
| is_keyword_hint ? string16() : keyword); |
| } |
| -GdkPixbuf* OmniboxPopupViewGtk::IconForMatch(const AutocompleteMatch& match, |
| - bool selected) { |
| +const gfx::Image* OmniboxPopupViewGtk::IconForMatch( |
| + const AutocompleteMatch& match, bool selected) { |
| const SkBitmap* bitmap = model_->GetIconIfExtensionMatch(match); |
| if (bitmap) { |
| - if (!ContainsKey(pixbufs_, bitmap)) |
| - pixbufs_[bitmap] = gfx::GdkPixbufFromSkBitmap(bitmap); |
| - return pixbufs_[bitmap]; |
| + if (!ContainsKey(images_, bitmap)) |
| + images_[bitmap] = new gfx::Image(bitmap); |
| + return images_[bitmap]; |
| } |
| int icon = match.starred ? |
| @@ -517,8 +519,7 @@ GdkPixbuf* OmniboxPopupViewGtk::IconForMatch(const AutocompleteMatch& match, |
| } |
| } |
| - // TODO(estade): Do we want to flip these for RTL? (Windows doesn't). |
| - return theme_service_->GetPixbufNamed(icon); |
| + return theme_service_->GetImageNamed(icon); |
| } |
| gboolean OmniboxPopupViewGtk::HandleMotion(GtkWidget* widget, |
| @@ -583,20 +584,18 @@ gboolean OmniboxPopupViewGtk::HandleExpose(GtkWidget* widget, |
| if (window_rect.width() < (kIconAreaWidth * 3)) |
| return TRUE; |
| - GdkDrawable* drawable = GDK_DRAWABLE(event->window); |
| - GdkGC* gc = gdk_gc_new(drawable); |
| - |
| - // kBorderColor is unallocated, so use the GdkRGB routine. |
| - gdk_gc_set_rgb_fg_color(gc, &border_color_); |
| + cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(widget->window)); |
| + gdk_cairo_rectangle(cr, &event->area); |
| + cairo_clip(cr); |
| // This assert is kinda ugly, but it would be more currently unneeded work |
| // to support painting a border that isn't 1 pixel thick. There is no point |
| // in writing that code now, and explode if that day ever comes. |
| COMPILE_ASSERT(kBorderThickness == 1, border_1px_implied); |
| // Draw the 1px border around the entire window. |
| - gdk_draw_rectangle(drawable, gc, FALSE, |
| - 0, 0, |
| - window_rect.width() - 1, window_rect.height() - 1); |
| + gdk_cairo_set_source_color(cr, &border_color_); |
| + cairo_rectangle(cr, 0, 0, window_rect.width(), window_rect.height()); |
| + cairo_stroke(cr); |
| pango_layout_set_height(layout_, kHeightPerResult * PANGO_SCALE); |
| @@ -610,20 +609,20 @@ gboolean OmniboxPopupViewGtk::HandleExpose(GtkWidget* widget, |
| bool is_selected = (model_->selected_line() == i); |
| bool is_hovered = (model_->hovered_line() == i); |
| if (is_selected || is_hovered) { |
| - gdk_gc_set_rgb_fg_color(gc, is_selected ? &selected_background_color_ : |
| - &hovered_background_color_); |
| + gdk_cairo_set_source_color(cr, is_selected ? &selected_background_color_ : |
| + &hovered_background_color_); |
| // This entry is selected or hovered, fill a rect with the color. |
| - gdk_draw_rectangle(drawable, gc, TRUE, |
| - line_rect.x(), line_rect.y(), |
| - line_rect.width(), line_rect.height()); |
| + cairo_rectangle(cr, line_rect.x(), line_rect.y(), |
| + line_rect.width(), line_rect.height()); |
| + cairo_fill(cr); |
| } |
| int icon_start_x = ltr ? kIconLeftPadding : |
| (line_rect.width() - kIconLeftPadding - kIconWidth); |
| // Draw the icon for this result. |
| - DrawFullPixbuf(drawable, gc, |
| - IconForMatch(match, is_selected), |
| - icon_start_x, line_rect.y() + kIconTopPadding); |
| + DrawFullImage(cr, widget, |
| + IconForMatch(match, is_selected), |
| + icon_start_x, line_rect.y() + kIconTopPadding); |
| // Draw the results text vertically centered in the results space. |
| // First draw the contents / url, but don't let it take up the whole width |
| @@ -634,6 +633,7 @@ gboolean OmniboxPopupViewGtk::HandleExpose(GtkWidget* widget, |
| static_cast<int>(text_width * kContentWidthPercentage) : text_width; |
| pango_layout_set_width(layout_, allocated_content_width * PANGO_SCALE); |
|
Evan Stade
2011/12/02 21:55:54
?
|
| + |
| // Note: We force to URL to LTR for all text directions. |
| SetupLayoutForMatch(layout_, match.contents, match.contents_class, |
| is_selected ? &selected_content_text_color_ : |
| @@ -655,10 +655,13 @@ gboolean OmniboxPopupViewGtk::HandleExpose(GtkWidget* widget, |
| int content_y = std::max(line_rect.y(), |
| line_rect.y() + ((kHeightPerResult - actual_content_height) / 2)); |
| - gdk_draw_layout(drawable, gc, |
| - ltr ? kIconAreaWidth : |
| + cairo_save(cr); |
| + cairo_move_to(cr, |
| + ltr ? kIconAreaWidth : |
| (text_width - actual_content_width), |
| - content_y, layout_); |
| + content_y); |
| + pango_cairo_show_layout(cr, layout_); |
| + cairo_restore(cr); |
| if (has_description) { |
| pango_layout_set_width(layout_, |
| @@ -677,15 +680,18 @@ gboolean OmniboxPopupViewGtk::HandleExpose(GtkWidget* widget, |
| std::string(" - ")); |
| gint actual_description_width; |
| pango_layout_get_size(layout_, &actual_description_width, NULL); |
| - gdk_draw_layout(drawable, gc, ltr ? |
| - (kIconAreaWidth + actual_content_width) : |
| - (text_width - actual_content_width - |
| - (actual_description_width / PANGO_SCALE)), |
| - content_y, layout_); |
| + |
| + cairo_save(cr); |
| + cairo_move_to(cr, ltr ? |
| + (kIconAreaWidth + actual_content_width) : |
| + (text_width - actual_content_width - |
| + (actual_description_width / PANGO_SCALE)), |
| + content_y); |
| + pango_cairo_show_layout(cr, layout_); |
| + cairo_restore(cr); |
| } |
| } |
| - g_object_unref(gc); |
| - |
| + cairo_destroy(cr); |
| return TRUE; |
| } |