Index: chrome/browser/gtk/nine_box.cc |
=================================================================== |
--- chrome/browser/gtk/nine_box.cc (revision 14956) |
+++ chrome/browser/gtk/nine_box.cc (working copy) |
@@ -51,7 +51,7 @@ |
NineBox::~NineBox() { |
} |
-void NineBox::RenderToWidget(GtkWidget* dst) { |
+void NineBox::RenderToWidget(GtkWidget* dst) const { |
// TODO(evanm): this is stupid; it should just be implemented with SkBitmaps |
// and convert to a GdkPixbuf at the last second. |
@@ -61,7 +61,7 @@ |
// This function paints one row at a time. |
// To make indexing sane, |images| points at the current row of images, |
// so images[0] always refers to the left-most image of the current row. |
- GdkPixbuf** images = &images_[0]; |
+ GdkPixbuf* const* images = &images_[0]; |
// The upper-left and lower-right corners of the center square in the |
// rendering of the ninebox. |
@@ -113,14 +113,63 @@ |
DrawPixbuf(dst, images[2], x2, y2); |
} |
-void NineBox::RenderTopCenterStrip(GtkWidget* dst, int x1, int x2, int y1) { |
+void NineBox::RenderTopCenterStrip(GtkWidget* dst, int x1, |
+ int x2, int y1) const { |
TileImage(dst, images_[1], |
x1, y1, |
x2, y1); |
} |
+void NineBox::ChangeWhiteToTransparent() { |
+ for (int image_idx = 0; image_idx < 9; ++image_idx) { |
+ GdkPixbuf* pixbuf = images_[image_idx]; |
+ if (!pixbuf) |
+ continue; |
+ |
+ guchar* pixels = gdk_pixbuf_get_pixels(pixbuf); |
+ int rowstride = gdk_pixbuf_get_rowstride(pixbuf); |
+ |
+ for (int i = 0; i < gdk_pixbuf_get_height(pixbuf); ++i) { |
+ for (int j = 0; j < gdk_pixbuf_get_width(pixbuf); ++j) { |
+ guchar* pixel = &pixels[i * rowstride + j * 4]; |
+ if (pixel[0] == 0xff && pixel[1] == 0xff && pixel[2] == 0xff) { |
+ pixel[3] = 0; |
+ } |
+ } |
+ } |
+ } |
+} |
+ |
+void NineBox::ContourWidget(GtkWidget* widget) const { |
+ int x1 = gdk_pixbuf_get_width(images_[0]); |
+ int x2 = widget->allocation.width - gdk_pixbuf_get_width(images_[2]); |
+ |
+ // Paint the left and right sides. |
+ GdkBitmap* mask = gdk_pixmap_new(NULL, widget->allocation.width, |
+ widget->allocation.height, 1); |
+ gdk_pixbuf_render_threshold_alpha(images_[0], mask, |
+ 0, 0, |
+ 0, 0, -1, -1, |
+ 1); |
+ gdk_pixbuf_render_threshold_alpha(images_[2], mask, |
+ 0, 0, |
+ x2, 0, -1, -1, |
+ 1); |
+ |
+ // Assume no transparency in the middle rectangle. |
+ cairo_t* cr = gdk_cairo_create(mask); |
+ cairo_rectangle(cr, x1, 0, x2 - x1, widget->allocation.height); |
+ cairo_fill(cr); |
+ |
+ // Mask the widget's window's shape. |
+ gtk_widget_shape_combine_mask(widget, mask, 0, 0); |
+ |
+ g_object_unref(mask); |
+ cairo_destroy(cr); |
+} |
+ |
void NineBox::TileImage(GtkWidget* dst, GdkPixbuf* src, |
- int x1, int y1, int x2, int y2) { |
+ int x1, int y1, int x2, int y2) const { |
GdkGC* gc = dst->style->fg_gc[GTK_WIDGET_STATE(dst)]; |
const int src_width = gdk_pixbuf_get_width(src); |
const int src_height = gdk_pixbuf_get_height(src); |