summaryrefslogtreecommitdiffstats
path: root/base/gfx
diff options
context:
space:
mode:
authorthestig@google.com <thestig@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-03 21:13:16 +0000
committerthestig@google.com <thestig@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-03 21:13:16 +0000
commit393fb93afa9f860680d6a6078b75699d651e777d (patch)
treea71bb09c586432ee74c7e5cc8a8d0cd5a86945cf /base/gfx
parentf5b50b81cdf4a883c1eba35394b7b2191179d246 (diff)
downloadchromium_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.cc30
-rw-r--r--base/gfx/gtk_util.h7
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);