summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/gtk/ImageGtk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/gtk/ImageGtk.cpp')
-rw-r--r--WebCore/platform/graphics/gtk/ImageGtk.cpp73
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;
+}
+
}