| Index: webkit/port/platform/graphics/skia/GdkSkia.cc
|
| diff --git a/webkit/port/platform/graphics/skia/GdkSkia.cc b/webkit/port/platform/graphics/skia/GdkSkia.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4774aafb7899b688535b323d4d3ea8f92da92876
|
| --- /dev/null
|
| +++ b/webkit/port/platform/graphics/skia/GdkSkia.cc
|
| @@ -0,0 +1,508 @@
|
| +/* Based on GTK code by the Chromium Authors. The original header for that code
|
| + * continues below */
|
| +
|
| +/* GDK - The GIMP Drawing Kit
|
| + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
| + *
|
| + * This library is free software; you can redistribute it and/or
|
| + * modify it under the terms of the GNU Lesser General Public
|
| + * License as published by the Free Software Foundation; either
|
| + * version 2 of the License, or (at your option) any later version.
|
| + *
|
| + * This library is distributed in the hope that it will be useful,
|
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| + * Lesser General Public License for more details.
|
| + *
|
| + * You should have received a copy of the GNU Lesser General Public
|
| + * License along with this library; if not, write to the
|
| + * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
| + * Boston, MA 02111-1307, USA.
|
| + */
|
| +
|
| +/*
|
| + * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
| + * file for a list of people on the GTK+ Team. See the ChangeLog
|
| + * files for a list of changes. These files are distributed with
|
| + * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
| + */
|
| +
|
| +#include <stdio.h>
|
| +
|
| +#include <gdk/gdk.h>
|
| +#include <SkCanvas.h>
|
| +#include <SkBitmap.h>
|
| +#include <SkDevice.h>
|
| +
|
| +#include "GdkSkia.h"
|
| +
|
| +static GdkGC *gdk_skia_create_gc (GdkDrawable *drawable,
|
| + GdkGCValues *values,
|
| + GdkGCValuesMask mask);
|
| +static void gdk_skia_draw_rectangle (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + gboolean filled,
|
| + gint x,
|
| + gint y,
|
| + gint width,
|
| + gint height);
|
| +static void gdk_skia_draw_arc (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + gboolean filled,
|
| + gint x,
|
| + gint y,
|
| + gint width,
|
| + gint height,
|
| + gint angle1,
|
| + gint angle2);
|
| +static void gdk_skia_draw_polygon (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + gboolean filled,
|
| + GdkPoint *points,
|
| + gint npoints);
|
| +static void gdk_skia_draw_text (GdkDrawable *drawable,
|
| + GdkFont *font,
|
| + GdkGC *gc,
|
| + gint x,
|
| + gint y,
|
| + const gchar *text,
|
| + gint text_length);
|
| +static void gdk_skia_draw_text_wc (GdkDrawable *drawable,
|
| + GdkFont *font,
|
| + GdkGC *gc,
|
| + gint x,
|
| + gint y,
|
| + const GdkWChar *text,
|
| + gint text_length);
|
| +static void gdk_skia_draw_drawable (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkPixmap *src,
|
| + gint xsrc,
|
| + gint ysrc,
|
| + gint xdest,
|
| + gint ydest,
|
| + gint width,
|
| + gint height);
|
| +static void gdk_skia_draw_points (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkPoint *points,
|
| + gint npoints);
|
| +static void gdk_skia_draw_segments (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkSegment *segs,
|
| + gint nsegs);
|
| +static void gdk_skia_draw_lines (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkPoint *points,
|
| + gint npoints);
|
| +
|
| +static void gdk_skia_draw_glyphs (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + PangoFont *font,
|
| + gint x,
|
| + gint y,
|
| + PangoGlyphString *glyphs);
|
| +static void gdk_skia_draw_glyphs_transformed (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + PangoMatrix *matrix,
|
| + PangoFont *font,
|
| + gint x,
|
| + gint y,
|
| + PangoGlyphString *glyphs);
|
| +
|
| +static void gdk_skia_draw_image (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkImage *image,
|
| + gint xsrc,
|
| + gint ysrc,
|
| + gint xdest,
|
| + gint ydest,
|
| + gint width,
|
| + gint height);
|
| +static void gdk_skia_draw_pixbuf (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkPixbuf *pixbuf,
|
| + gint src_x,
|
| + gint src_y,
|
| + gint dest_x,
|
| + gint dest_y,
|
| + gint width,
|
| + gint height,
|
| + GdkRgbDither dither,
|
| + gint x_dither,
|
| + gint y_dither);
|
| +static void gdk_skia_draw_trapezoids (GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkTrapezoid *trapezoids,
|
| + gint n_trapezoids);
|
| +
|
| +static void gdk_skia_real_get_size (GdkDrawable *drawable,
|
| + gint *width,
|
| + gint *height);
|
| +
|
| +static GdkImage* gdk_skia_copy_to_image (GdkDrawable *drawable,
|
| + GdkImage *image,
|
| + gint src_x,
|
| + gint src_y,
|
| + gint dest_x,
|
| + gint dest_y,
|
| + gint width,
|
| + gint height);
|
| +
|
| +static cairo_surface_t *gdk_skia_ref_cairo_surface (GdkDrawable *drawable);
|
| +
|
| +static GdkVisual* gdk_skia_real_get_visual (GdkDrawable *drawable);
|
| +static gint gdk_skia_real_get_depth (GdkDrawable *drawable);
|
| +static void gdk_skia_real_set_colormap (GdkDrawable *drawable,
|
| + GdkColormap *cmap);
|
| +static GdkColormap* gdk_skia_real_get_colormap (GdkDrawable *drawable);
|
| +static GdkScreen* gdk_skia_real_get_screen (GdkDrawable *drawable);
|
| +static void gdk_skia_init (GdkSkiaObject *skia);
|
| +static void gdk_skia_class_init (GdkSkiaObjectClass *klass);
|
| +static void gdk_skia_finalize (GObject *object);
|
| +
|
| +static gpointer parent_class = NULL;
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Usually GDK code is C code. However, since we are interfacing to a C++
|
| +// library, we must compile in C++ mode to parse its headers etc. Thankfully,
|
| +// these are the only non-static symbol in the file so we can just wrap them in
|
| +// an extern decl to disable name mangling and everything should be happy.
|
| +// -----------------------------------------------------------------------------
|
| +extern "C" {
|
| +GType
|
| +gdk_skia_get_type (void)
|
| +{
|
| + static GType object_type = 0;
|
| +
|
| + if (!object_type)
|
| + object_type = g_type_register_static_simple (GDK_TYPE_DRAWABLE,
|
| + "GdkSkia",
|
| + sizeof (GdkSkiaObjectClass),
|
| + (GClassInitFunc) gdk_skia_class_init,
|
| + sizeof (GdkSkiaObject),
|
| + (GInstanceInitFunc) gdk_skia_init,
|
| + (GTypeFlags) 0);
|
| +
|
| + return object_type;
|
| +}
|
| +
|
| +GdkSkia*
|
| +gdk_skia_new(SkCanvas *canvas)
|
| +{
|
| + GdkSkia *skia = GDK_SKIA(g_object_new (GDK_TYPE_SKIA, NULL));
|
| + reinterpret_cast<GdkSkiaObject*>(skia)->canvas = canvas;
|
| + return skia;
|
| +}
|
| +
|
| +} // extern "C"
|
| +
|
| +static void
|
| +gdk_skia_init (GdkSkiaObject *skia)
|
| +{
|
| + /* 0 initialization is fine for us */
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_class_init (GdkSkiaObjectClass *klass)
|
| +{
|
| + GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
| + GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
|
| +
|
| + parent_class = g_type_class_peek_parent (klass);
|
| +
|
| + object_class->finalize = gdk_skia_finalize;
|
| +
|
| + drawable_class->create_gc = gdk_skia_create_gc;
|
| + drawable_class->draw_rectangle = gdk_skia_draw_rectangle;
|
| + drawable_class->draw_arc = gdk_skia_draw_arc;
|
| + drawable_class->draw_polygon = gdk_skia_draw_polygon;
|
| + drawable_class->draw_text = gdk_skia_draw_text;
|
| + drawable_class->draw_text_wc = gdk_skia_draw_text_wc;
|
| + drawable_class->draw_drawable = gdk_skia_draw_drawable;
|
| + drawable_class->draw_points = gdk_skia_draw_points;
|
| + drawable_class->draw_segments = gdk_skia_draw_segments;
|
| + drawable_class->draw_lines = gdk_skia_draw_lines;
|
| + drawable_class->draw_glyphs = gdk_skia_draw_glyphs;
|
| + drawable_class->draw_glyphs_transformed = gdk_skia_draw_glyphs_transformed;
|
| + drawable_class->draw_image = gdk_skia_draw_image;
|
| + drawable_class->draw_pixbuf = gdk_skia_draw_pixbuf;
|
| + drawable_class->draw_trapezoids = gdk_skia_draw_trapezoids;
|
| + drawable_class->get_depth = gdk_skia_real_get_depth;
|
| + drawable_class->get_screen = gdk_skia_real_get_screen;
|
| + drawable_class->get_size = gdk_skia_real_get_size;
|
| + drawable_class->set_colormap = gdk_skia_real_set_colormap;
|
| + drawable_class->get_colormap = gdk_skia_real_get_colormap;
|
| + drawable_class->get_visual = gdk_skia_real_get_visual;
|
| + drawable_class->_copy_to_image = gdk_skia_copy_to_image;
|
| + drawable_class->ref_cairo_surface = gdk_skia_ref_cairo_surface;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_finalize (GObject *object)
|
| +{
|
| + GdkSkiaObject *const skia = (GdkSkiaObject *) object;
|
| + if (skia->surface)
|
| + cairo_surface_destroy(skia->surface);
|
| + G_OBJECT_CLASS (parent_class)->finalize(object);
|
| +}
|
| +
|
| +#define NOTIMPLEMENTED fprintf(stderr, "GDK Skia not implemented: %s\n", __PRETTY_FUNCTION__)
|
| +
|
| +static GdkGC *
|
| +gdk_skia_create_gc(GdkDrawable *drawable,
|
| + GdkGCValues *values,
|
| + GdkGCValuesMask mask) {
|
| + NOTIMPLEMENTED;
|
| + return NULL;
|
| +}
|
| +
|
| +static void
|
| +gc_set_paint(GdkGC *gc, SkPaint *paint) {
|
| + GdkGCValues values;
|
| + gdk_gc_get_values(gc, &values);
|
| +
|
| + paint->setARGB(255,
|
| + values.foreground.pixel >> 16,
|
| + values.foreground.pixel >> 8,
|
| + values.foreground.pixel);
|
| + paint->setStrokeWidth(values.line_width);
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_rectangle(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + gboolean filled,
|
| + gint x,
|
| + gint y,
|
| + gint width,
|
| + gint height) {
|
| + GdkSkiaObject *skia = (GdkSkiaObject *) drawable;
|
| + SkPaint paint;
|
| + gc_set_paint(gc, &paint);
|
| +
|
| + if (filled) {
|
| + paint.setStyle(SkPaint::kFill_Style);
|
| + } else {
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| + }
|
| +
|
| + SkRect rect;
|
| + rect.set(x, y, x + width, y + height);
|
| +
|
| + skia->canvas->drawRect(rect, paint);
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_arc(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + gboolean filled,
|
| + gint x,
|
| + gint y,
|
| + gint width,
|
| + gint height,
|
| + gint angle1,
|
| + gint angle2) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_polygon(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + gboolean filled,
|
| + GdkPoint *points,
|
| + gint npoints) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_text(GdkDrawable *drawable,
|
| + GdkFont *font,
|
| + GdkGC *gc,
|
| + gint x,
|
| + gint y,
|
| + const gchar *text,
|
| + gint text_length) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_text_wc(GdkDrawable *drawable,
|
| + GdkFont *font,
|
| + GdkGC *gc,
|
| + gint x,
|
| + gint y,
|
| + const GdkWChar *text,
|
| + gint text_length) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_drawable(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkPixmap *src,
|
| + gint xsrc,
|
| + gint ysrc,
|
| + gint xdest,
|
| + gint ydest,
|
| + gint width,
|
| + gint height) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_points(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkPoint *points,
|
| + gint npoints) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_segments(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkSegment *segs,
|
| + gint nsegs) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_lines(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkPoint *points,
|
| + gint npoints) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_glyphs(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + PangoFont *font,
|
| + gint x,
|
| + gint y,
|
| + PangoGlyphString *glyphs) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_glyphs_transformed(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + PangoMatrix *matrix,
|
| + PangoFont *font,
|
| + gint x,
|
| + gint y,
|
| + PangoGlyphString *glyphs) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_image(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkImage *image,
|
| + gint xsrc,
|
| + gint ysrc,
|
| + gint xdest,
|
| + gint ydest,
|
| + gint width,
|
| + gint height) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_pixbuf(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkPixbuf *pixbuf,
|
| + gint src_x,
|
| + gint src_y,
|
| + gint dest_x,
|
| + gint dest_y,
|
| + gint width,
|
| + gint height,
|
| + GdkRgbDither dither,
|
| + gint x_dither,
|
| + gint y_dither) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_draw_trapezoids(GdkDrawable *drawable,
|
| + GdkGC *gc,
|
| + GdkTrapezoid *trapezoids,
|
| + gint n_trapezoids) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_real_get_size(GdkDrawable *drawable,
|
| + gint *width,
|
| + gint *height) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static GdkImage*
|
| +gdk_skia_copy_to_image(GdkDrawable *drawable,
|
| + GdkImage *image,
|
| + gint src_x,
|
| + gint src_y,
|
| + gint dest_x,
|
| + gint dest_y,
|
| + gint width,
|
| + gint height) {
|
| + NOTIMPLEMENTED;
|
| + return NULL;
|
| +}
|
| +
|
| +static cairo_surface_t *
|
| +gdk_skia_ref_cairo_surface(GdkDrawable *drawable) {
|
| + GdkSkiaObject *const skia = (GdkSkiaObject *) drawable;
|
| +
|
| + if (!skia->surface) {
|
| + SkDevice *const dev = skia->canvas->getDevice();
|
| + const SkBitmap *const bm = &dev->accessBitmap(true);
|
| +
|
| + skia->surface = cairo_image_surface_create_for_data
|
| + ((unsigned char *) bm->getPixels(),
|
| + CAIRO_FORMAT_ARGB32, dev->width(), dev->height(), bm->rowBytes());
|
| + }
|
| +
|
| + return cairo_surface_reference(skia->surface);
|
| +}
|
| +
|
| +static GdkVisual*
|
| +gdk_skia_real_get_visual(GdkDrawable *drawable) {
|
| + NOTIMPLEMENTED;
|
| + return NULL;
|
| +}
|
| +
|
| +static gint
|
| +gdk_skia_real_get_depth(GdkDrawable *drawable) {
|
| + GdkSkiaObject *skia = (GdkSkiaObject *) drawable;
|
| + const SkBitmap::Config config = skia->canvas->getDevice()->config();
|
| +
|
| + switch (config) {
|
| + case SkBitmap::kARGB_8888_Config:
|
| + return 24;
|
| + default:
|
| + // NOTREACHED
|
| + *reinterpret_cast<char*>(NULL) = 0;
|
| + return 0;
|
| + }
|
| +}
|
| +
|
| +static void
|
| +gdk_skia_real_set_colormap(GdkDrawable *drawable,
|
| + GdkColormap *cmap) {
|
| + NOTIMPLEMENTED;
|
| +}
|
| +
|
| +static GdkColormap*
|
| +gdk_skia_real_get_colormap(GdkDrawable *drawable) {
|
| + NOTIMPLEMENTED;
|
| + return NULL;
|
| +}
|
| +
|
| +static GdkScreen*
|
| +gdk_skia_real_get_screen(GdkDrawable *drawable) {
|
| + NOTIMPLEMENTED;
|
| + return NULL;
|
| +}
|
|
|