Index: gfx/gtk_util.cc |
=================================================================== |
--- gfx/gtk_util.cc (revision 73487) |
+++ gfx/gtk_util.cc (working copy) |
@@ -1,212 +0,0 @@ |
-// 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/command_line.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 { |
- |
-// A process wide singleton that manages our usage of gdk |
-// cursors. gdk_cursor_new() hits the disk in several places and GdkCursor |
-// instances can be reused throughout the process. |
-class GdkCursorCache { |
- public: |
- GdkCursorCache() {} |
- ~GdkCursorCache() { |
- for (std::map<GdkCursorType, GdkCursor*>::iterator it = |
- cursor_cache_.begin(); it != cursor_cache_.end(); ++it) { |
- gdk_cursor_unref(it->second); |
- } |
- cursor_cache_.clear(); |
- } |
- |
- GdkCursor* GetCursorImpl(GdkCursorType type) { |
- std::map<GdkCursorType, GdkCursor*>::iterator it = cursor_cache_.find(type); |
- GdkCursor* cursor = NULL; |
- if (it == cursor_cache_.end()) { |
- cursor = gdk_cursor_new(type); |
- cursor_cache_.insert(std::make_pair(type, cursor)); |
- } else { |
- cursor = it->second; |
- } |
- |
- // It is not necessary to add a reference here. The callers can ref the |
- // cursor if they need it for something. |
- return cursor; |
- } |
- |
- std::map<GdkCursorType, GdkCursor*> cursor_cache_; |
- |
- DISALLOW_COPY_AND_ASSIGN(GdkCursorCache); |
-}; |
- |
-void FreePixels(guchar* pixels, gpointer data) { |
- free(data); |
-} |
- |
-// Common implementation of ConvertAcceleratorsFromWindowsStyle() and |
-// RemoveWindowsStyleAccelerators(). |
-// Replaces all ampersands (as used in our grd files to indicate mnemonics) |
-// to |target|. Similarly any underscores get replaced with two underscores as |
-// is needed by pango. |
-std::string ConvertAmperstandsTo(const std::string& label, |
- const std::string& target) { |
- std::string ret; |
- ret.reserve(label.length() * 2); |
- for (size_t i = 0; i < label.length(); ++i) { |
- if ('_' == label[i]) { |
- ret.push_back('_'); |
- ret.push_back('_'); |
- } else if ('&' == label[i]) { |
- if (i + 1 < label.length() && '&' == label[i + 1]) { |
- ret.push_back('&'); |
- ++i; |
- } else { |
- ret.append(target); |
- } |
- } else { |
- ret.push_back(label[i]); |
- } |
- } |
- |
- return ret; |
-} |
- |
-} // namespace |
- |
-namespace gfx { |
- |
-void GtkInitFromCommandLine(const CommandLine& command_line) { |
- const std::vector<std::string>& args = command_line.argv(); |
- int argc = args.size(); |
- scoped_array<char *> argv(new char *[argc + 1]); |
- for (size_t i = 0; i < args.size(); ++i) { |
- // TODO(piman@google.com): can gtk_init modify argv? Just being safe |
- // here. |
- argv[i] = strdup(args[i].c_str()); |
- } |
- argv[argc] = NULL; |
- char **argv_pointer = argv.get(); |
- |
- gtk_init(&argc, &argv_pointer); |
- for (size_t i = 0; i < args.size(); ++i) { |
- free(argv[i]); |
- } |
-} |
- |
-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); |
- } |
-} |
- |
-double GetPangoResolution() { |
- static double resolution; |
- static bool determined_resolution = false; |
- if (!determined_resolution) { |
- determined_resolution = true; |
- PangoContext* default_context = gdk_pango_context_get(); |
- resolution = pango_cairo_context_get_resolution(default_context); |
- g_object_unref(default_context); |
- } |
- return resolution; |
-} |
- |
-GdkCursor* GetCursor(int type) { |
- static GdkCursorCache impl; |
- return impl.GetCursorImpl(static_cast<GdkCursorType>(type)); |
-} |
- |
-std::string ConvertAcceleratorsFromWindowsStyle(const std::string& label) { |
- return ConvertAmperstandsTo(label, "_"); |
-} |
- |
-std::string RemoveWindowsStyleAccelerators(const std::string& label) { |
- return ConvertAmperstandsTo(label, ""); |
-} |
- |
-uint8_t* BGRAToRGBA(const uint8_t* pixels, int width, int height, int stride) { |
- if (stride == 0) |
- stride = width * 4; |
- |
- uint8_t* new_pixels = static_cast<uint8_t*>(malloc(height * stride)); |
- |
- // We have to copy the pixels and swap from BGRA to RGBA. |
- for (int i = 0; i < height; ++i) { |
- for (int j = 0; j < width; ++j) { |
- int idx = i * stride + j * 4; |
- new_pixels[idx] = pixels[idx + 2]; |
- new_pixels[idx + 1] = pixels[idx + 1]; |
- new_pixels[idx + 2] = pixels[idx]; |
- new_pixels[idx + 3] = pixels[idx + 3]; |
- } |
- } |
- |
- return new_pixels; |
-} |
- |
-} // namespace gfx |