diff options
author | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-15 23:53:46 +0000 |
---|---|---|
committer | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-15 23:53:46 +0000 |
commit | 796de69f454b9de23ce143687fdbd76a9b3c9d54 (patch) | |
tree | 555b4389d14e8fbe10805de9013fcb1c5763ef5a /base/gfx | |
parent | cd12f48e108d6be67685dfbd7ded93fd35dff698 (diff) | |
download | chromium_src-796de69f454b9de23ce143687fdbd76a9b3c9d54.zip chromium_src-796de69f454b9de23ce143687fdbd76a9b3c9d54.tar.gz chromium_src-796de69f454b9de23ce143687fdbd76a9b3c9d54.tar.bz2 |
Reverts the previous two commits. (r13812 and r13811).
Review URL: http://codereview.chromium.org/75023
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13813 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/gfx')
-rwxr-xr-x | base/gfx/gtk_util.cc | 55 | ||||
-rwxr-xr-x | base/gfx/gtk_util.h | 15 |
2 files changed, 70 insertions, 0 deletions
diff --git a/base/gfx/gtk_util.cc b/base/gfx/gtk_util.cc index e01a2bd..0d2eee0 100755 --- a/base/gfx/gtk_util.cc +++ b/base/gfx/gtk_util.cc @@ -8,6 +8,16 @@ #include <gtk/gtk.h> #include "base/gfx/rect.h" +#include "skia/include/SkBitmap.h" + +namespace { + +// Callback used in RemoveAllChildren. +void RemoveWidget(GtkWidget* widget, gpointer container) { + gtk_container_remove(GTK_CONTAINER(container), widget); +} + +} // namespace namespace gfx { @@ -26,6 +36,10 @@ void SubtractRectanglesFromRegion(GdkRegion* region, } } +static void FreePixels(guchar* pixels, gpointer data) { + free(data); +} + uint8_t* BGRAToRGBA(const uint8_t* pixels, int width, int height, int stride) { if (stride == 0) stride = width * 4; @@ -46,4 +60,45 @@ uint8_t* BGRAToRGBA(const uint8_t* pixels, int width, int height, int stride) { return new_pixels; } +GdkPixbuf* GdkPixbufFromSkBitmap(const SkBitmap* bitmap) { + bitmap->lockPixels(); + int width = bitmap->width(); + int height = bitmap->height(); + int stride = bitmap->rowBytes(); + const guchar* orig_data = static_cast<guchar*>(bitmap->getPixels()); + guchar* data = BGRAToRGBA(orig_data, width, height, stride); + + // This pixbuf takes ownership of our malloc()ed data and will + // free it for us when it is destroyed. + GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data( + data, + GDK_COLORSPACE_RGB, // The only colorspace gtk supports. + true, // There is an alpha channel. + 8, + width, height, stride, &FreePixels, data); + + // Assume ownership of pixbuf. + g_object_ref_sink(pixbuf); + bitmap->unlockPixels(); + return pixbuf; +} + +GtkWidget* CreateGtkBorderBin(GtkWidget* child, const GdkColor* color, + int top, int bottom, int left, int right) { + // Use a GtkEventBox to get the background painted. However, we can't just + // use a container border, since it won't paint there. Use an alignment + // inside to get the sizes exactly of how we want the border painted. + GtkWidget* ebox = gtk_event_box_new(); + gtk_widget_modify_bg(ebox, GTK_STATE_NORMAL, color); + GtkWidget* alignment = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); + gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), top, bottom, left, right); + gtk_container_add(GTK_CONTAINER(alignment), child); + gtk_container_add(GTK_CONTAINER(ebox), alignment); + return ebox; +} + +void RemoveAllChildren(GtkWidget* container) { + gtk_container_foreach(GTK_CONTAINER(container), RemoveWidget, container); +} + } // namespace gfx diff --git a/base/gfx/gtk_util.h b/base/gfx/gtk_util.h index 3a1a1d4..f2f860f 100755 --- a/base/gfx/gtk_util.h +++ b/base/gfx/gtk_util.h @@ -9,7 +9,10 @@ #include <vector> typedef struct _GdkColor GdkColor; +typedef struct _GdkPixbuf GdkPixbuf; typedef struct _GdkRegion GdkRegion; +typedef struct _GtkWidget GtkWidget; +class SkBitmap; // Define a macro for creating GdkColors from RGB values. This is a macro to // allow static construction of literals, etc. Use this like: @@ -33,6 +36,18 @@ void SubtractRectanglesFromRegion(GdkRegion* region, // it's assumed to be 4 * |width|. uint8_t* BGRAToRGBA(const uint8_t* pixels, int width, int height, int stride); +// Convert and copy a SkBitmap to a GdkPixbuf. NOTE: this uses BGRAToRGBA, so +// it is an expensive operation. +GdkPixbuf* GdkPixbufFromSkBitmap(const SkBitmap* bitmap); + +// Create a GtkBin with |child| as its child widget. This bin will paint a +// border of color |color| with the sizes specified in pixels. +GtkWidget* CreateGtkBorderBin(GtkWidget* child, const GdkColor* color, + int top, int bottom, int left, int right); + +// Remove all children from this container. +void RemoveAllChildren(GtkWidget* container); + } // namespace gfx #endif // BASE_GFX_GTK_UTIL_H_ |