diff options
Diffstat (limited to 'WebCore/platform/graphics/gtk/ImageGtk.cpp')
-rw-r--r-- | WebCore/platform/graphics/gtk/ImageGtk.cpp | 73 |
1 files changed, 67 insertions, 6 deletions
diff --git a/WebCore/platform/graphics/gtk/ImageGtk.cpp b/WebCore/platform/graphics/gtk/ImageGtk.cpp index b745209..0e92d6c 100644 --- a/WebCore/platform/graphics/gtk/ImageGtk.cpp +++ b/WebCore/platform/graphics/gtk/ImageGtk.cpp @@ -26,12 +26,52 @@ #include "config.h" #include "BitmapImage.h" +#include "CString.h" +#include "GOwnPtr.h" -// This function loads resources from WebKit -Vector<char> loadResourceIntoArray(const char*); +#include <cairo.h> +#include <gtk/gtk.h> + +namespace WTF { + +template <> void freeOwnedGPtr<GtkIconInfo>(GtkIconInfo* info) +{ + if (info) + gtk_icon_info_free(info); +} + +} namespace WebCore { +static CString getIconFileNameOrFallback(const char* name, const char* fallback) +{ + GOwnPtr<GtkIconInfo> info(gtk_icon_theme_lookup_icon(gtk_icon_theme_get_default(), + name, 16, GTK_ICON_LOOKUP_NO_SVG)); + if (!info) + return String::format("%s/webkit-1.0/images/%s.png", DATA_DIR, fallback).utf8(); + + return CString(gtk_icon_info_get_filename(info.get())); +} + +static PassRefPtr<SharedBuffer> loadResourceSharedBuffer(const char* name) +{ + CString fileName; + + // Find the path for the image + if (strcmp("missingImage", name) == 0) + fileName = getIconFileNameOrFallback(GTK_STOCK_MISSING_IMAGE, "missingImage"); + else + fileName = String::format("%s/webkit-1.0/images/%s.png", DATA_DIR, name).utf8(); + + GOwnPtr<gchar> content; + gsize length; + if (!g_file_get_contents(fileName.data(), &content.outPtr(), &length, 0)) + return SharedBuffer::create(); + + return SharedBuffer::create(content.get(), length); +} + void BitmapImage::initPlatformData() { } @@ -40,13 +80,34 @@ void BitmapImage::invalidatePlatformData() { } -PassRefPtr<Image> Image::loadPlatformResource(const char *name) +PassRefPtr<Image> Image::loadPlatformResource(const char* name) { - Vector<char> arr = loadResourceIntoArray(name); RefPtr<BitmapImage> img = BitmapImage::create(); - RefPtr<SharedBuffer> buffer = SharedBuffer::create(arr.data(), arr.size()); - img->setData(buffer, true); + RefPtr<SharedBuffer> buffer = loadResourceSharedBuffer(name); + img->setData(buffer.release(), true); return img.release(); } +GdkPixbuf* BitmapImage::getGdkPixbuf() +{ + int width = cairo_image_surface_get_width(frameAtIndex(currentFrame())); + int height = cairo_image_surface_get_height(frameAtIndex(currentFrame())); + + int bestDepth = gdk_visual_get_best_depth(); + GdkColormap* cmap = gdk_colormap_new(gdk_visual_get_best_with_depth(bestDepth), true); + + GdkPixmap* pixmap = gdk_pixmap_new(0, width, height, bestDepth); + gdk_drawable_set_colormap(GDK_DRAWABLE(pixmap), cmap); + cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(pixmap)); + cairo_set_source_surface(cr, frameAtIndex(currentFrame()), 0, 0); + cairo_paint(cr); + cairo_destroy(cr); + + GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable(0, GDK_DRAWABLE(pixmap), 0, 0, 0, 0, 0, width, height); + g_object_unref(pixmap); + g_object_unref(cmap); + + return pixbuf; +} + } |