diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-17 06:40:57 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-17 06:40:57 +0000 |
commit | 5c7293a73bdaedbe368bc26426a2345f230f2822 (patch) | |
tree | 9a5c28a66102e61536730d8335843c14ae5e0a10 /gfx/gtk_util.cc | |
parent | af63c908603f8a2f58f69167129f819d5d30820c (diff) | |
download | chromium_src-5c7293a73bdaedbe368bc26426a2345f230f2822.zip chromium_src-5c7293a73bdaedbe368bc26426a2345f230f2822.tar.gz chromium_src-5c7293a73bdaedbe368bc26426a2345f230f2822.tar.bz2 |
Move some more files to toplevel gfx dir.
TBR=darin
BUG=none
TEST=none
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41812 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gfx/gtk_util.cc')
-rw-r--r-- | gfx/gtk_util.cc | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/gfx/gtk_util.cc b/gfx/gtk_util.cc new file mode 100644 index 0000000..3485e6a --- /dev/null +++ b/gfx/gtk_util.cc @@ -0,0 +1,90 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gfx/gtk_util.h" + +#include <gdk/gdk.h> +#include <gtk/gtk.h> +#include <stdlib.h> + +#include "base/basictypes.h" +#include "base/linux_util.h" +#include "gfx/rect.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkUnPreMultiply.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) { + if (bitmap->isNull()) + return NULL; + + bitmap->lockPixels(); + + int width = bitmap->width(); + int height = bitmap->height(); + int stride = bitmap->rowBytes(); + + // SkBitmaps are premultiplied, we need to unpremultiply them. + const int kBytesPerPixel = 4; + uint8* divided = static_cast<uint8*>(malloc(height * stride)); + + for (int y = 0, i = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + uint32 pixel = bitmap->getAddr32(0, y)[x]; + + int alpha = SkColorGetA(pixel); + if (alpha != 0 && alpha != 255) { + SkColor unmultiplied = SkUnPreMultiply::PMColorToColor(pixel); + divided[i + 0] = SkColorGetR(unmultiplied); + divided[i + 1] = SkColorGetG(unmultiplied); + divided[i + 2] = SkColorGetB(unmultiplied); + divided[i + 3] = alpha; + } else { + divided[i + 0] = SkColorGetR(pixel); + divided[i + 1] = SkColorGetG(pixel); + divided[i + 2] = SkColorGetB(pixel); + divided[i + 3] = alpha; + } + i += kBytesPerPixel; + } + } + + // 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( + divided, + GDK_COLORSPACE_RGB, // The only colorspace gtk supports. + true, // There is an alpha channel. + 8, + width, height, stride, &FreePixels, divided); + + bitmap->unlockPixels(); + return pixbuf; +} + +void SubtractRectanglesFromRegion(GdkRegion* region, + const std::vector<Rect>& cutouts) { + for (size_t i = 0; i < cutouts.size(); ++i) { + GdkRectangle rect = cutouts[i].ToGdkRectangle(); + GdkRegion* rect_region = gdk_region_rectangle(&rect); + gdk_region_subtract(region, rect_region); + // TODO(deanm): It would be nice to be able to reuse the GdkRegion here. + gdk_region_destroy(rect_region); + } +} + +} // namespace gfx |