diff options
author | thestig@google.com <thestig@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-03 21:13:16 +0000 |
---|---|---|
committer | thestig@google.com <thestig@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-03 21:13:16 +0000 |
commit | 393fb93afa9f860680d6a6078b75699d651e777d (patch) | |
tree | a71bb09c586432ee74c7e5cc8a8d0cd5a86945cf /base/gfx | |
parent | f5b50b81cdf4a883c1eba35394b7b2191179d246 (diff) | |
download | chromium_src-393fb93afa9f860680d6a6078b75699d651e777d.zip chromium_src-393fb93afa9f860680d6a6078b75699d651e777d.tar.gz chromium_src-393fb93afa9f860680d6a6078b75699d651e777d.tar.bz2 |
Merge app/gfx/gtk_util into base/gfx/gtk_util.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/118174
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17535 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/gfx')
-rw-r--r-- | base/gfx/gtk_util.cc | 30 | ||||
-rw-r--r-- | base/gfx/gtk_util.h | 7 |
2 files changed, 37 insertions, 0 deletions
diff --git a/base/gfx/gtk_util.cc b/base/gfx/gtk_util.cc index 03acfbf..005ec54 100644 --- a/base/gfx/gtk_util.cc +++ b/base/gfx/gtk_util.cc @@ -9,13 +9,43 @@ #include <stdlib.h> #include "base/gfx/rect.h" +#include "base/linux_util.h" +#include "third_party/skia/include/core/SkBitmap.h" +namespace { + +void FreePixels(guchar* pixels, gpointer data) { + free(data); +} + +} // namespace namespace gfx { const GdkColor kGdkWhite = GDK_COLOR_RGB(0xff, 0xff, 0xff); const GdkColor kGdkBlack = GDK_COLOR_RGB(0x00, 0x00, 0x00); const GdkColor kGdkGreen = GDK_COLOR_RGB(0x00, 0xff, 0x00); +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 = base::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); + + bitmap->unlockPixels(); + return pixbuf; +} + void SubtractRectanglesFromRegion(GdkRegion* region, const std::vector<Rect>& cutouts) { for (size_t i = 0; i < cutouts.size(); ++i) { diff --git a/base/gfx/gtk_util.h b/base/gfx/gtk_util.h index 0d21216..c219dab 100644 --- a/base/gfx/gtk_util.h +++ b/base/gfx/gtk_util.h @@ -13,8 +13,11 @@ #include "base/scoped_ptr.h" typedef struct _GdkColor GdkColor; +typedef struct _GdkPixbuf GdkPixbuf; typedef struct _GdkRegion GdkRegion; +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: // GdkColor white = GDK_COLOR_RGB(0xff, 0xff, 0xff); @@ -28,6 +31,10 @@ extern const GdkColor kGdkWhite; extern const GdkColor kGdkBlack; extern const GdkColor kGdkGreen; +// Convert and copy a SkBitmap to a GdkPixbuf. NOTE: this uses BGRAToRGBA, so +// it is an expensive operation. +GdkPixbuf* GdkPixbufFromSkBitmap(const SkBitmap* bitmap); + // Modify the given region by subtracting the given rectangles. void SubtractRectanglesFromRegion(GdkRegion* region, const std::vector<Rect>& cutouts); |