+++ /dev/null
-/* config.h. Generated from config.h.in by configure. */
-/* config.h.in. Generated from configure.in by autoheader. */
-
-/* always defined to indicate that i18n is enabled */
-#define ENABLE_NLS 1
-
-/* Gettext package */
-#define GETTEXT_PACKAGE "libgnomecanvas-2.0"
-
-/* Define the location where the catalogs will be installed */
-#define GNOMECANVASLOCALEDIR "/usr/share/locale"
-
-/* Define to 1 if you have the `bind_textdomain_codeset' function. */
-#define HAVE_BIND_TEXTDOMAIN_CODESET 1
-
-/* Define to 1 if you have the `dcgettext' function. */
-#define HAVE_DCGETTEXT 1
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define if the GNU gettext() function is already present or preinstalled. */
-#define HAVE_GETTEXT 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define if your <locale.h> file defines LC_MESSAGES. */
-#define HAVE_LC_MESSAGES 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-#define HAVE_LOCALE_H 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-#define LT_OBJDIR ".libs/"
-
-/* Name of package */
-#define PACKAGE "libgnomecanvas"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=libgnomecanvas"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "libgnomecanvas"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "libgnomecanvas 2.30.1"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "libgnomecanvas"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "2.30.1"
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Version number of package */
-#define VERSION "2.30.1"
+++ /dev/null
-/* Bpath item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998,1999 The Free Software Foundation
- *
- * Authors: Federico Mena <federico@nuclecu.unam.mx>
- * Raph Levien <raph@acm.org>
- * Lauris Kaplinski <lauris@ximian.com>
- * Miguel de Icaza <miguel@kernel.org>
- * Cody Russell <bratsche@gnome.org>
- * Rusty Conover <rconover@bangtail.net>
- */
-
-/* These includes are set up for standalone compile. If/when this codebase
- is integrated into libgnomeui, the includes will need to change. */
-
-#include <math.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include "gnome-canvas.h"
-#include "gnome-canvas-util.h"
-
-#include "gnome-canvas-bpath.h"
-#include "gnome-canvas-shape.h"
-#include "gnome-canvas-shape-private.h"
-#include "gnome-canvas-path-def.h"
-
-enum {
- PROP_0,
- PROP_BPATH
-};
-
-static void gnome_canvas_bpath_class_init (GnomeCanvasBpathClass *class);
-static void gnome_canvas_bpath_init (GnomeCanvasBpath *bpath);
-static void gnome_canvas_bpath_destroy (GtkObject *object);
-static void gnome_canvas_bpath_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_bpath_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void gnome_canvas_bpath_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
-
-
-static GnomeCanvasShapeClass *parent_class;
-
-GType
-gnome_canvas_bpath_get_type (void)
-{
- static GType bpath_type;
-
- if (!bpath_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasBpathClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_bpath_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasBpath),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_bpath_init,
- NULL /* value_table */
- };
-
- bpath_type = g_type_register_static (GNOME_TYPE_CANVAS_SHAPE, "GnomeCanvasBpath",
- &object_info, 0);
- }
-
- return bpath_type;
-}
-
-static void
-gnome_canvas_bpath_class_init (GnomeCanvasBpathClass *class)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- gobject_class = (GObjectClass *) class;
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- parent_class = g_type_class_peek_parent (class);
-
- /* when this gets checked into libgnomeui, change the
- GTK_TYPE_POINTER to GTK_TYPE_GNOME_CANVAS_BPATH, and add an
- entry to gnome-boxed.defs */
-
- gobject_class->set_property = gnome_canvas_bpath_set_property;
- gobject_class->get_property = gnome_canvas_bpath_get_property;
-
- object_class->destroy = gnome_canvas_bpath_destroy;
-
- g_object_class_install_property (gobject_class,
- PROP_BPATH,
- g_param_spec_boxed ("bpath", NULL, NULL,
- GNOME_TYPE_CANVAS_PATH_DEF,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- item_class->update = gnome_canvas_bpath_update;
-}
-
-static void
-gnome_canvas_bpath_init (GnomeCanvasBpath* bpath)
-{
-
-}
-
-static void
-gnome_canvas_bpath_destroy (GtkObject *object)
-{
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-static void
-gnome_canvas_bpath_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- GnomeCanvasPathDef *gpp;
-
- item = GNOME_CANVAS_ITEM (object);
-
- switch (param_id) {
- case PROP_BPATH:
- gpp = (GnomeCanvasPathDef*) g_value_get_boxed (value);
-
- gnome_canvas_shape_set_path_def (GNOME_CANVAS_SHAPE (object), gpp);
-
- gnome_canvas_item_request_update (item);
- break;
-
- default:
- break;
- }
-}
-
-
-static void
-gnome_canvas_bpath_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasShape *shape;
-
- shape = GNOME_CANVAS_SHAPE(object);
-
- switch (param_id) {
- case PROP_BPATH:
- g_value_set_boxed (value, shape->priv->path);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-gnome_canvas_bpath_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- if(GNOME_CANVAS_ITEM_CLASS(parent_class)->update) {
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->update)(item, affine, clip_path, flags);
- }
-}
+++ /dev/null
-/* Bpath item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998,1999 The Free Software Foundation
- *
- * Authors: Federico Mena <federico@nuclecu.unam.mx>
- * Raph Levien <raph@acm.org>
- * Lauris Kaplinski <lauris@ximian.com>
- * Rusty Conover <rconover@bangtail.net>
- */
-
-#ifndef GNOME_CANVAS_BPATH_H
-#define GNOME_CANVAS_BPATH_H
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-shape.h>
-#include <libgnomecanvas/gnome-canvas-path-def.h>
-
-G_BEGIN_DECLS
-
-
-/* Bpath item for the canvas.
- *
- * The following object arguments are available:
- *
- * name type read/write description
- * ------------------------------------------------------------------------------------------
- * bpath GnomeCanvasPathDef * RW Pointer to an GnomeCanvasPathDef structure.
- * This can be created by a call to
- * gp_path_new() in (gp-path.h).
- */
-
-#define GNOME_TYPE_CANVAS_BPATH (gnome_canvas_bpath_get_type ())
-#define GNOME_CANVAS_BPATH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_BPATH, GnomeCanvasBpath))
-#define GNOME_CANVAS_BPATH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_BPATH, GnomeCanvasBpathClass))
-#define GNOME_IS_CANVAS_BPATH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_BPATH))
-#define GNOME_IS_CANVAS_BPATH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_BPATH))
-
-
-typedef struct _GnomeCanvasBpath GnomeCanvasBpath;
-typedef struct _GnomeCanvasBpathPriv GnomeCanvasBpathPriv;
-typedef struct _GnomeCanvasBpathClass GnomeCanvasBpathClass;
-
-struct _GnomeCanvasBpath {
- GnomeCanvasShape item;
-
-};
-
-struct _GnomeCanvasBpathClass {
- GnomeCanvasShapeClass parent_class;
-};
-
-
-/* Standard Gtk function */
-GType gnome_canvas_bpath_get_type (void) G_GNUC_CONST;
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-#define GNOME_CANVAS_CLIPGROUP_C
-
-/* Clipping group for GnomeCanvas
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998,1999 The Free Software Foundation
- *
- * Author:
- * Lauris Kaplinski <lauris@ximian.com>
- */
-
-/* These includes are set up for standalone compile. If/when this codebase
- is integrated into libgnomeui, the includes will need to change. */
-
-#include <math.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <libart_lgpl/art_misc.h>
-#include <libart_lgpl/art_rect.h>
-#include <libart_lgpl/art_vpath.h>
-#include <libart_lgpl/art_bpath.h>
-#include <libart_lgpl/art_vpath.h>
-#include <libart_lgpl/art_vpath_bpath.h>
-#include <libart_lgpl/art_svp.h>
-#include <libart_lgpl/art_svp_vpath.h>
-#include <libart_lgpl/art_rect_svp.h>
-#include <libart_lgpl/art_gray_svp.h>
-#include <libart_lgpl/art_svp_intersect.h>
-#include <libart_lgpl/art_svp_ops.h>
-
-#include "gnome-canvas.h"
-#include "gnome-canvas-util.h"
-#include "gnome-canvas-clipgroup.h"
-
-enum {
- PROP_0,
- PROP_PATH,
- PROP_WIND
-};
-
-static void gnome_canvas_clipgroup_class_init (GnomeCanvasClipgroupClass *klass);
-static void gnome_canvas_clipgroup_init (GnomeCanvasClipgroup *clipgroup);
-static void gnome_canvas_clipgroup_destroy (GtkObject *object);
-static void gnome_canvas_clipgroup_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_clipgroup_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_clipgroup_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- int flags);
-
-/*
- * Generic clipping stuff
- *
- * This is somewhat slow and memory-hungry - we add extra
- * composition, extra SVP render and allocate 65536
- * bytes for each clip level. It could be done more
- * efficently per-object basis - but to make clipping
- * universal, there is no alternative to double
- * buffering (although it should be done into RGBA
- * buffer by other method than ::render to make global
- * opacity possible).
- * Using art-render could possibly optimize that a bit,
- * although I am not sure.
- */
-
-#define GCG_BUF_WIDTH 128
-#define GCG_BUF_HEIGHT 128
-#define GCG_BUF_PIXELS (GCG_BUF_WIDTH * GCG_BUF_HEIGHT)
-#define GCG_BUF_SIZE (GCG_BUF_WIDTH * GCG_BUF_HEIGHT * 3)
-
-#define noSHOW_SHADOW
-
-static guchar *gcg_buf_new (void);
-static void gcg_buf_free (guchar *buf);
-static guchar *gcg_mask_new (void);
-static void gcg_mask_free (guchar *mask);
-
-static void gnome_canvas_clipgroup_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
-
-static GnomeCanvasGroupClass *parent_class;
-
-GType
-gnome_canvas_clipgroup_get_type (void)
-{
- static GType clipgroup_type;
-
- if (!clipgroup_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasClipgroupClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_clipgroup_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasClipgroup),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_clipgroup_init,
- NULL /* value_table */
- };
-
- clipgroup_type = g_type_register_static (GNOME_TYPE_CANVAS_GROUP, "GnomeCanvasClipgroup",
- &object_info, 0);
- }
-
- return clipgroup_type;
-}
-
-static void
-gnome_canvas_clipgroup_class_init (GnomeCanvasClipgroupClass *klass)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- gobject_class = (GObjectClass *) klass;
- object_class = (GtkObjectClass *) klass;
- item_class = (GnomeCanvasItemClass *) klass;
- parent_class = g_type_class_ref (GNOME_TYPE_CANVAS_GROUP);
-
- object_class->destroy = gnome_canvas_clipgroup_destroy;
- gobject_class->set_property = gnome_canvas_clipgroup_set_property;
- gobject_class->get_property = gnome_canvas_clipgroup_get_property;
- item_class->update = gnome_canvas_clipgroup_update;
- item_class->render = gnome_canvas_clipgroup_render;
-
- g_object_class_install_property (gobject_class,
- PROP_PATH,
- g_param_spec_pointer ("path", NULL, NULL,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_WIND,
- g_param_spec_uint ("wind", NULL, NULL,
- 0, G_MAXUINT, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-}
-
-static void
-gnome_canvas_clipgroup_init (GnomeCanvasClipgroup *clipgroup)
-{
- clipgroup->path = NULL;
- clipgroup->wind = ART_WIND_RULE_NONZERO; /* default winding rule */
- clipgroup->svp = NULL;
-}
-
-static void
-gnome_canvas_clipgroup_destroy (GtkObject *object)
-{
- GnomeCanvasClipgroup *clipgroup;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_CLIPGROUP (object));
-
- clipgroup = GNOME_CANVAS_CLIPGROUP (object);
-
- if (clipgroup->path) {
- gnome_canvas_path_def_unref (clipgroup->path);
- clipgroup->path = NULL;
- }
-
- if (clipgroup->svp) {
- art_svp_free (clipgroup->svp);
- clipgroup->svp = NULL;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-
-static void
-gnome_canvas_clipgroup_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- GnomeCanvasClipgroup *cgroup;
- GnomeCanvasPathDef *gpp;
-
- item = GNOME_CANVAS_ITEM (object);
- cgroup = GNOME_CANVAS_CLIPGROUP (object);
-
- switch (param_id) {
- case PROP_PATH:
- gpp = g_value_get_pointer (value);
-
- if (cgroup->path) {
- gnome_canvas_path_def_unref (cgroup->path);
- cgroup->path = NULL;
- }
- if (gpp != NULL) {
- cgroup->path = gnome_canvas_path_def_closed_parts (gpp);
- }
-
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_WIND:
- cgroup->wind = g_value_get_uint (value);
- gnome_canvas_item_request_update (item);
- break;
-
- default:
- break;
- }
-}
-
-static void
-gnome_canvas_clipgroup_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasClipgroup * cgroup;
-
- cgroup = GNOME_CANVAS_CLIPGROUP (object);
-
- switch (param_id) {
- case PROP_PATH:
- g_value_set_pointer (value, cgroup->path);
- break;
-
- case PROP_WIND:
- g_value_set_uint (value, cgroup->wind);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-gnome_canvas_clipgroup_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- GnomeCanvasClipgroup *clipgroup;
- ArtSvpWriter *swr;
- ArtBpath *bp;
- ArtBpath *bpath;
- ArtVpath *vpath;
- ArtSVP *svp, *svp1, *svp2;
-
- clipgroup = GNOME_CANVAS_CLIPGROUP (item);
-
- if (clipgroup->svp) {
- art_svp_free (clipgroup->svp);
- clipgroup->svp = NULL;
- }
-
- if (clipgroup->path) {
- bp = gnome_canvas_path_def_bpath (clipgroup->path);
- bpath = art_bpath_affine_transform (bp, affine);
-
- vpath = art_bez_path_to_vec (bpath, 0.25);
- art_free (bpath);
-
- svp1 = art_svp_from_vpath (vpath);
- art_free (vpath);
-
- swr = art_svp_writer_rewind_new (clipgroup->wind);
- art_svp_intersector (svp1, swr);
-
- svp2 = art_svp_writer_rewind_reap (swr);
- art_svp_free (svp1);
-
- if (clip_path != NULL) {
- svp = art_svp_intersect (svp2, clip_path);
- art_svp_free (svp2);
- } else {
- svp = svp2;
- }
-
- clipgroup->svp = svp;
- }
-
- if (GNOME_CANVAS_ITEM_CLASS (parent_class)->update)
- (GNOME_CANVAS_ITEM_CLASS (parent_class)->update) (item, affine, NULL, flags);
-
- if (clipgroup->svp) {
- ArtDRect cbox;
- art_drect_svp (&cbox, clipgroup->svp);
- item->x1 = MAX (item->x1, cbox.x0 - 1.0);
- item->y1 = MAX (item->y1, cbox.y0 - 1.0);
- item->x2 = MIN (item->x2, cbox.x1 + 1.0);
- item->y2 = MIN (item->y2, cbox.y1 + 1.0);
- }
-}
-
-/* non-premultiplied composition into RGB */
-
-#define COMPOSEN11(fc,fa,bc) (((255 - (guint) (fa)) * (guint) (bc) + (guint) (fc) * (guint) (fa) + 127) / 255)
-
-static void
-gnome_canvas_clipgroup_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
-{
- GnomeCanvasClipgroup *cg;
- GnomeCanvasBuf lbuf;
- guchar *mask;
-
- cg = GNOME_CANVAS_CLIPGROUP (item);
-
- if (cg->svp) {
- gint bw, bh, sw, sh;
- gint x, y;
-
- /* fixme: We could optimize background handling (lauris) */
-
- if (buf->is_bg) {
- gnome_canvas_buf_ensure_buf (buf);
- buf->is_bg = FALSE;
- buf->is_buf = TRUE;
- }
-
- bw = buf->rect.x1 - buf->rect.x0;
- bh = buf->rect.y1 - buf->rect.y0;
- if ((bw < 1) || (bh < 1)) return;
-
- if (bw * bh <= GCG_BUF_PIXELS) {
- /* We can go with single buffer */
- sw = bw;
- sh = bh;
- } else if (bw <= (GCG_BUF_PIXELS >> 3)) {
- /* Go with row buffer */
- sw = bw;
- sh = GCG_BUF_PIXELS / bw;
- } else if (bh <= (GCG_BUF_PIXELS >> 3)) {
- /* Go with column buffer */
- sw = GCG_BUF_PIXELS / bh;
- sh = bh;
- } else {
- /* Tile buffer */
- sw = GCG_BUF_WIDTH;
- sh = GCG_BUF_HEIGHT;
- }
-
- /* Set up local buffer */
- lbuf.buf = gcg_buf_new ();
- lbuf.bg_color = buf->bg_color;
- lbuf.is_bg = FALSE;
- lbuf.is_buf = TRUE;
- /* Allocate mask */
- mask = gcg_mask_new ();
-
- for (y = buf->rect.y0; y < buf->rect.y1; y += sh) {
- for (x = buf->rect.x0; x < buf->rect.x1; x += sw) {
- gint r, xx, yy;
- /* Set up local buffer */
- lbuf.rect.x0 = x;
- lbuf.rect.y0 = y;
- lbuf.rect.x1 = MIN (x + sw, buf->rect.x1);
- lbuf.rect.y1 = MIN (y + sh, buf->rect.y1);
- lbuf.buf_rowstride = 3 * (lbuf.rect.x1 - lbuf.rect.x0);
- /* Copy background */
- for (r = lbuf.rect.y0; r < lbuf.rect.y1; r++) {
- memcpy (lbuf.buf + (r - lbuf.rect.y0) * lbuf.buf_rowstride,
- buf->buf + (r - buf->rect.y0) * buf->buf_rowstride + (x - buf->rect.x0) * 3,
- (lbuf.rect.x1 - lbuf.rect.x0) * 3);
- }
- /* Invoke render method */
- if (((GnomeCanvasItemClass *) parent_class)->render)
- ((GnomeCanvasItemClass *) parent_class)->render (item, &lbuf);
- /* Render mask */
- art_gray_svp_aa (cg->svp, lbuf.rect.x0, lbuf.rect.y0, lbuf.rect.x1, lbuf.rect.y1,
- mask, lbuf.rect.x1 - lbuf.rect.x0);
- /* Combine */
- for (yy = lbuf.rect.y0; yy < lbuf.rect.y1; yy++) {
- guchar *s, *m, *d;
- s = lbuf.buf + (yy - lbuf.rect.y0) * lbuf.buf_rowstride;
- m = mask + (yy - lbuf.rect.y0) * (lbuf.rect.x1 - lbuf.rect.x0);
- d = buf->buf + (yy - buf->rect.y0) * buf->buf_rowstride + (x - buf->rect.x0) * 3;
- for (xx = lbuf.rect.x0; xx < lbuf.rect.x1; xx++) {
-#ifndef SHOW_SHADOW
- d[0] = COMPOSEN11 (s[0], m[0], d[0]);
- d[1] = COMPOSEN11 (s[1], m[0], d[1]);
- d[2] = COMPOSEN11 (s[2], m[0], d[2]);
-#else
- d[0] = COMPOSEN11 (s[0], m[0] | 0x7f, d[0]);
- d[1] = COMPOSEN11 (s[1], m[0] | 0x7f, d[1]);
- d[2] = COMPOSEN11 (s[2], m[0] | 0x7f, d[2]);
-#endif
- s += 3;
- m += 1;
- d += 3;
- }
- }
- }
- }
- /* Free buffers */
- gcg_mask_free (mask);
- gcg_buf_free (lbuf.buf);
- } else {
- if (((GnomeCanvasItemClass *) parent_class)->render)
- ((GnomeCanvasItemClass *) parent_class)->render (item, buf);
- }
-}
-
-static GSList *gcg_buffers = NULL;
-static GSList *gcg_masks = NULL;
-
-static guchar *
-gcg_buf_new (void)
-{
- guchar *buf;
-
- if (!gcg_buffers) {
- buf = g_new (guchar, GCG_BUF_SIZE);
- } else {
- buf = (guchar *) gcg_buffers->data;
- gcg_buffers = g_slist_remove (gcg_buffers, buf);
- }
-
- return buf;
-}
-
-static void
-gcg_buf_free (guchar *buf)
-{
- gcg_buffers = g_slist_prepend (gcg_buffers, buf);
-}
-
-static guchar *
-gcg_mask_new (void)
-{
- guchar *mask;
-
- if (!gcg_masks) {
- mask = g_new (guchar, GCG_BUF_PIXELS);
- } else {
- mask = (guchar *) gcg_masks->data;
- gcg_masks = g_slist_remove (gcg_masks, mask);
- }
-
- return mask;
-}
-
-static void
-gcg_mask_free (guchar *mask)
-{
- gcg_masks = g_slist_prepend (gcg_masks, mask);
-}
+++ /dev/null
-#ifndef GNOME_CANVAS_CLIPGROUP_H
-#define GNOME_CANVAS_CLIPGROUP_H
-
-/* Clipping group implementation for GnomeCanvas
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- * TODO: Implement this in libgnomeui, possibly merge with real group
- *
- * Copyright (C) 1998,1999 The Free Software Foundation
- *
- * Author:
- * Lauris Kaplinski <lauris@ximian.com>
- */
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-util.h>
-
-#include <libart_lgpl/art_bpath.h>
-#include <libart_lgpl/art_svp_wind.h>
-#include <libart_lgpl/art_vpath_dash.h>
-#include <libgnomecanvas/gnome-canvas-path-def.h>
-
-G_BEGIN_DECLS
-
-
-#define GNOME_TYPE_CANVAS_CLIPGROUP (gnome_canvas_clipgroup_get_type ())
-#define GNOME_CANVAS_CLIPGROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_CLIPGROUP, GnomeCanvasClipgroup))
-#define GNOME_CANVAS_CLIPGROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_CLIPGROUP, GnomeCanvasClipgroupClass))
-#define GNOME_IS_CANVAS_CLIPGROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_CLIPGROUP))
-#define GNOME_IS_CANVAS_CLIPGROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_CLIPGROUP))
-
-
-typedef struct _GnomeCanvasClipgroup GnomeCanvasClipgroup;
-typedef struct _GnomeCanvasClipgroupClass GnomeCanvasClipgroupClass;
-
-struct _GnomeCanvasClipgroup {
- GnomeCanvasGroup group;
-
- GnomeCanvasPathDef * path;
- ArtWindRule wind;
-
- ArtSVP * svp;
-};
-
-struct _GnomeCanvasClipgroupClass {
- GnomeCanvasGroupClass parent_class;
-};
-
-
-/* Standard Gtk function */
-GType gnome_canvas_clipgroup_get_type (void) G_GNUC_CONST;
-
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-
-/*
- * Handles all of the internationalization configuration options.
- * Author: Tom Tromey <tromey@creche.cygnus.com>
- */
-
-#ifndef __LIBGNOME_CANVAS_I18N_H__
-#define __LIBGNOME_CANVAS_I18N_H__
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-#if !defined(__LIBGNOME_CANVAS_I18NP_H__)
-
-#ifdef ENABLE_NLS
-# include <libintl.h>
-# ifdef GNOME_EXPLICIT_TRANSLATION_DOMAIN
-# undef _
-# define _(String) dgettext (GNOME_EXPLICIT_TRANSLATION_DOMAIN, String)
-# else
-# define _(String) gettext (String)
-# endif
-# ifdef gettext_noop
-# define N_(String) gettext_noop (String)
-# else
-# define N_(String) (String)
-# endif
-#else
-/* Stubs that do something close enough. */
-# define textdomain(String) (String)
-# define gettext(String) (String)
-# define dgettext(Domain,Message) (Message)
-# define dcgettext(Domain,Message,Type) (Message)
-# define bindtextdomain(Domain,Directory) (Domain)
-# define _(String) (String)
-# define N_(String) (String)
-#endif
-
-#endif
-
-G_END_DECLS
-
-#endif /* __LIBGNOME_CANVAS_I18N_H__ */
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-
-/* Line/curve item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- */
-
-#include <config.h>
-#include <math.h>
-#include <string.h>
-#include "libart_lgpl/art_vpath.h"
-#include "libart_lgpl/art_svp.h"
-#include "libart_lgpl/art_svp_vpath.h"
-#include "libart_lgpl/art_svp_vpath_stroke.h"
-#include "libgnomecanvas.h"
-
-#define noVERBOSE
-
-#define DEFAULT_SPLINE_STEPS 12 /* this is what Tk uses */
-#define NUM_ARROW_POINTS 6 /* number of points in an arrowhead */
-#define NUM_STATIC_POINTS 256 /* number of static points to use to avoid allocating arrays */
-
-
-#define GROW_BOUNDS(bx1, by1, bx2, by2, x, y) { \
- if (x < bx1) \
- bx1 = x; \
- \
- if (x > bx2) \
- bx2 = x; \
- \
- if (y < by1) \
- by1 = y; \
- \
- if (y > by2) \
- by2 = y; \
-}
-
-
-enum {
- PROP_0,
- PROP_POINTS,
- PROP_FILL_COLOR,
- PROP_FILL_COLOR_GDK,
- PROP_FILL_COLOR_RGBA,
- PROP_FILL_STIPPLE,
- PROP_WIDTH_PIXELS,
- PROP_WIDTH_UNITS,
- PROP_CAP_STYLE,
- PROP_JOIN_STYLE,
- PROP_LINE_STYLE,
- PROP_FIRST_ARROWHEAD,
- PROP_LAST_ARROWHEAD,
- PROP_SMOOTH,
- PROP_SPLINE_STEPS,
- PROP_ARROW_SHAPE_A,
- PROP_ARROW_SHAPE_B,
- PROP_ARROW_SHAPE_C
-};
-
-
-static void gnome_canvas_line_class_init (GnomeCanvasLineClass *class);
-static void gnome_canvas_line_init (GnomeCanvasLine *line);
-static void gnome_canvas_line_destroy (GtkObject *object);
-static void gnome_canvas_line_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_line_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void gnome_canvas_line_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
-static void gnome_canvas_line_realize (GnomeCanvasItem *item);
-static void gnome_canvas_line_unrealize (GnomeCanvasItem *item);
-static void gnome_canvas_line_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-static double gnome_canvas_line_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy, GnomeCanvasItem **actual_item);
-static void gnome_canvas_line_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2);
-static void gnome_canvas_line_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
-
-
-static GnomeCanvasItemClass *parent_class;
-
-
-GType
-gnome_canvas_line_get_type (void)
-{
- static GType line_type;
-
- if (!line_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasLineClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_line_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasLine),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_line_init,
- NULL /* value_table */
- };
-
- line_type = g_type_register_static (GNOME_TYPE_CANVAS_ITEM, "GnomeCanvasLine",
- &object_info, 0);
- }
-
- return line_type;
-}
-
-static void
-gnome_canvas_line_class_init (GnomeCanvasLineClass *class)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- gobject_class = (GObjectClass *) class;
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- parent_class = g_type_class_peek_parent (class);
-
- gobject_class->set_property = gnome_canvas_line_set_property;
- gobject_class->get_property = gnome_canvas_line_get_property;
-
- g_object_class_install_property
- (gobject_class,
- PROP_POINTS,
- g_param_spec_boxed ("points", NULL, NULL,
- GNOME_TYPE_CANVAS_POINTS,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_FILL_COLOR,
- g_param_spec_string ("fill_color", NULL, NULL,
- NULL,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_FILL_COLOR_GDK,
- g_param_spec_boxed ("fill_color_gdk", NULL, NULL,
- GDK_TYPE_COLOR,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_FILL_COLOR_RGBA,
- g_param_spec_uint ("fill_color_rgba", NULL, NULL,
- 0, G_MAXUINT, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_FILL_STIPPLE,
- g_param_spec_object ("fill_stipple", NULL, NULL,
- GDK_TYPE_DRAWABLE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_WIDTH_PIXELS,
- g_param_spec_uint ("width_pixels", NULL, NULL,
- 0, G_MAXUINT, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_WIDTH_UNITS,
- g_param_spec_double ("width_units", NULL, NULL,
- 0.0, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_CAP_STYLE,
- g_param_spec_enum ("cap_style", NULL, NULL,
- GDK_TYPE_CAP_STYLE,
- GDK_CAP_BUTT,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_JOIN_STYLE,
- g_param_spec_enum ("join_style", NULL, NULL,
- GDK_TYPE_JOIN_STYLE,
- GDK_JOIN_MITER,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_LINE_STYLE,
- g_param_spec_enum ("line_style", NULL, NULL,
- GDK_TYPE_LINE_STYLE,
- GDK_LINE_SOLID,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_FIRST_ARROWHEAD,
- g_param_spec_boolean ("first_arrowhead", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_LAST_ARROWHEAD,
- g_param_spec_boolean ("last_arrowhead", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_SMOOTH,
- g_param_spec_boolean ("smooth", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_SPLINE_STEPS,
- g_param_spec_uint ("spline_steps", NULL, NULL,
- 0, G_MAXUINT, DEFAULT_SPLINE_STEPS,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_ARROW_SHAPE_A,
- g_param_spec_double ("arrow_shape_a", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_ARROW_SHAPE_B,
- g_param_spec_double ("arrow_shape_b", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_ARROW_SHAPE_C,
- g_param_spec_double ("arrow_shape_c", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- object_class->destroy = gnome_canvas_line_destroy;
-
- item_class->update = gnome_canvas_line_update;
- item_class->realize = gnome_canvas_line_realize;
- item_class->unrealize = gnome_canvas_line_unrealize;
- item_class->draw = gnome_canvas_line_draw;
- item_class->point = gnome_canvas_line_point;
- item_class->bounds = gnome_canvas_line_bounds;
-
- item_class->render = gnome_canvas_line_render;
-}
-
-static void
-gnome_canvas_line_init (GnomeCanvasLine *line)
-{
- line->width = 0.0;
- line->cap = GDK_CAP_BUTT;
- line->join = GDK_JOIN_MITER;
- line->line_style = GDK_LINE_SOLID;
- line->shape_a = 0.0;
- line->shape_b = 0.0;
- line->shape_c = 0.0;
- line->spline_steps = DEFAULT_SPLINE_STEPS;
-}
-
-static void
-gnome_canvas_line_destroy (GtkObject *object)
-{
- GnomeCanvasLine *line;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_LINE (object));
-
- line = GNOME_CANVAS_LINE (object);
-
- /* remember, destroy can be run multiple times! */
-
- if (line->coords)
- g_free (line->coords);
- line->coords = NULL;
-
- if (line->first_coords)
- g_free (line->first_coords);
- line->first_coords = NULL;
-
- if (line->last_coords)
- g_free (line->last_coords);
- line->last_coords = NULL;
-
- if (line->stipple)
- g_object_unref (line->stipple);
- line->stipple = NULL;
-
- if (line->fill_svp)
- art_svp_free (line->fill_svp);
- line->fill_svp = NULL;
-
- if (line->first_svp)
- art_svp_free (line->first_svp);
- line->first_svp = NULL;
-
- if (line->last_svp)
- art_svp_free (line->last_svp);
- line->last_svp = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-/* Computes the bounding box of the line, including its arrow points. Assumes that the number of
- * points in the line is not zero.
- */
-static void
-get_bounds (GnomeCanvasLine *line, double *bx1, double *by1, double *bx2, double *by2)
-{
- double *coords;
- double x1, y1, x2, y2;
- double width;
- int i;
-
- if (!line->coords) {
- *bx1 = *by1 = *bx2 = *by2 = 0.0;
- return;
- }
-
- /* Find bounding box of line's points */
-
- x1 = x2 = line->coords[0];
- y1 = y2 = line->coords[1];
-
- for (i = 1, coords = line->coords + 2; i < line->num_points; i++, coords += 2)
- GROW_BOUNDS (x1, y1, x2, y2, coords[0], coords[1]);
-
- /* Add possible over-estimate for wide lines */
-
- if (line->width_pixels)
- width = line->width / line->item.canvas->pixels_per_unit;
- else
- width = line->width;
-
- x1 -= width;
- y1 -= width;
- x2 += width;
- y2 += width;
-
- /* For mitered lines, make a second pass through all the points. Compute the location of
- * the two miter vertex points and add them to the bounding box.
- */
-
- if (line->join == GDK_JOIN_MITER)
- for (i = line->num_points, coords = line->coords; i >= 3; i--, coords += 2) {
- double mx1, my1, mx2, my2;
-
- if (gnome_canvas_get_miter_points (coords[0], coords[1],
- coords[2], coords[3],
- coords[4], coords[5],
- width,
- &mx1, &my1, &mx2, &my2)) {
- GROW_BOUNDS (x1, y1, x2, y2, mx1, my1);
- GROW_BOUNDS (x1, y1, x2, y2, mx2, my2);
- }
- }
-
- /* Add the arrow points, if any */
-
- if (line->first_arrow && line->first_coords)
- for (i = 0, coords = line->first_coords; i < NUM_ARROW_POINTS; i++, coords += 2)
- GROW_BOUNDS (x1, y1, x2, y2, coords[0], coords[1]);
-
- if (line->last_arrow && line->last_coords)
- for (i = 0, coords = line->last_coords; i < NUM_ARROW_POINTS; i++, coords += 2)
- GROW_BOUNDS (x1, y1, x2, y2, coords[0], coords[1]);
-
- /* Done */
-
- *bx1 = x1;
- *by1 = y1;
- *bx2 = x2;
- *by2 = y2;
-}
-
-/* Computes the bounding box of the line, in canvas coordinates. Assumes that the number of points in the polygon is
- * not zero. Affine is the i2c transformation.
- */
-static void
-get_bounds_canvas (GnomeCanvasLine *line, double *bx1, double *by1, double *bx2, double *by2, double affine[6])
-{
- /* It would be possible to tighten the bounds somewhat by transforming the individual points before
- aggregating them into the bbox. But it hardly seems worth it. */
- ArtDRect bbox_world;
- ArtDRect bbox_canvas;
-
- get_bounds (line, &bbox_world.x0, &bbox_world.y0, &bbox_world.x1, &bbox_world.y1);
-
- art_drect_affine_transform (&bbox_canvas, &bbox_world, affine);
- /* include 1 pixel of fudge */
- *bx1 = bbox_canvas.x0 - 1;
- *by1 = bbox_canvas.y0 - 1;
- *bx2 = bbox_canvas.x1 + 1;
- *by2 = bbox_canvas.y1 + 1;
-}
-
-/* Recalculates the arrow polygons for the line */
-static void
-reconfigure_arrows (GnomeCanvasLine *line)
-{
- double *poly, *coords;
- double dx, dy, length;
- double sin_theta, cos_theta, tmp;
- double frac_height; /* Line width as fraction of arrowhead width */
- double backup; /* Distance to backup end points so the line ends in the middle of the arrowhead */
- double vx, vy; /* Position of arrowhead vertex */
- double shape_a, shape_b, shape_c;
- double width;
- int i;
-
- if (line->num_points == 0)
- return;
-
- /* Set up things */
-
- if (line->first_arrow) {
- if (line->first_coords) {
- line->coords[0] = line->first_coords[0];
- line->coords[1] = line->first_coords[1];
- } else
- line->first_coords = g_new (double, 2 * NUM_ARROW_POINTS);
- } else if (line->first_coords) {
- line->coords[0] = line->first_coords[0];
- line->coords[1] = line->first_coords[1];
-
- g_free (line->first_coords);
- line->first_coords = NULL;
- }
-
- i = 2 * (line->num_points - 1);
-
- if (line->last_arrow) {
- if (line->last_coords) {
- line->coords[i] = line->last_coords[0];
- line->coords[i + 1] = line->last_coords[1];
- } else
- line->last_coords = g_new (double, 2 * NUM_ARROW_POINTS);
- } else if (line->last_coords) {
- line->coords[i] = line->last_coords[0];
- line->coords[i + 1] = line->last_coords[1];
-
- g_free (line->last_coords);
- line->last_coords = NULL;
- }
-
- if (!line->first_arrow && !line->last_arrow)
- return;
-
- if (line->width_pixels)
- width = line->width / line->item.canvas->pixels_per_unit;
- else
- width = line->width;
-
- /* Add fudge value for better-looking results */
-
- shape_a = line->shape_a;
- shape_b = line->shape_b;
- shape_c = line->shape_c + width / 2.0;
-
- if (line->width_pixels) {
- shape_a /= line->item.canvas->pixels_per_unit;
- shape_b /= line->item.canvas->pixels_per_unit;
- shape_c /= line->item.canvas->pixels_per_unit;
- }
-
- shape_a += 0.001;
- shape_b += 0.001;
- shape_c += 0.001;
-
- /* Compute the polygon for the first arrowhead and adjust the first point in the line so
- * that the line does not stick out past the leading edge of the arrowhead.
- */
-
- frac_height = (line->width / 2.0) / shape_c;
- backup = frac_height * shape_b + shape_a * (1.0 - frac_height) / 2.0;
-
- if (line->first_arrow) {
- poly = line->first_coords;
- poly[0] = poly[10] = line->coords[0];
- poly[1] = poly[11] = line->coords[1];
-
- dx = poly[0] - line->coords[2];
- dy = poly[1] - line->coords[3];
- length = sqrt (dx * dx + dy * dy);
- if (length < GNOME_CANVAS_EPSILON)
- sin_theta = cos_theta = 0.0;
- else {
- sin_theta = dy / length;
- cos_theta = dx / length;
- }
-
- vx = poly[0] - shape_a * cos_theta;
- vy = poly[1] - shape_a * sin_theta;
-
- tmp = shape_c * sin_theta;
-
- poly[2] = poly[0] - shape_b * cos_theta + tmp;
- poly[8] = poly[2] - 2.0 * tmp;
-
- tmp = shape_c * cos_theta;
-
- poly[3] = poly[1] - shape_b * sin_theta - tmp;
- poly[9] = poly[3] + 2.0 * tmp;
-
- poly[4] = poly[2] * frac_height + vx * (1.0 - frac_height);
- poly[5] = poly[3] * frac_height + vy * (1.0 - frac_height);
- poly[6] = poly[8] * frac_height + vx * (1.0 - frac_height);
- poly[7] = poly[9] * frac_height + vy * (1.0 - frac_height);
-
- /* Move the first point towards the second so that the corners at the end of the
- * line are inside the arrowhead.
- */
-
- line->coords[0] = poly[0] - backup * cos_theta;
- line->coords[1] = poly[1] - backup * sin_theta;
- }
-
- /* Same process for last arrowhead */
-
- if (line->last_arrow) {
- coords = line->coords + 2 * (line->num_points - 2);
- poly = line->last_coords;
- poly[0] = poly[10] = coords[2];
- poly[1] = poly[11] = coords[3];
-
- dx = poly[0] - coords[0];
- dy = poly[1] - coords[1];
- length = sqrt (dx * dx + dy * dy);
- if (length < GNOME_CANVAS_EPSILON)
- sin_theta = cos_theta = 0.0;
- else {
- sin_theta = dy / length;
- cos_theta = dx / length;
- }
-
- vx = poly[0] - shape_a * cos_theta;
- vy = poly[1] - shape_a * sin_theta;
-
- tmp = shape_c * sin_theta;
-
- poly[2] = poly[0] - shape_b * cos_theta + tmp;
- poly[8] = poly[2] - 2.0 * tmp;
-
- tmp = shape_c * cos_theta;
-
- poly[3] = poly[1] - shape_b * sin_theta - tmp;
- poly[9] = poly[3] + 2.0 * tmp;
-
- poly[4] = poly[2] * frac_height + vx * (1.0 - frac_height);
- poly[5] = poly[3] * frac_height + vy * (1.0 - frac_height);
- poly[6] = poly[8] * frac_height + vx * (1.0 - frac_height);
- poly[7] = poly[9] * frac_height + vy * (1.0 - frac_height);
-
- coords[2] = poly[0] - backup * cos_theta;
- coords[3] = poly[1] - backup * sin_theta;
- }
-}
-
-/* Convenience function to set the line's GC's foreground color */
-static void
-set_line_gc_foreground (GnomeCanvasLine *line)
-{
- GdkColor c;
-
- if (!line->gc)
- return;
-
- c.pixel = line->fill_pixel;
- gdk_gc_set_foreground (line->gc, &c);
-}
-
-/* Recalculate the line's width and set it in its GC */
-static void
-set_line_gc_width (GnomeCanvasLine *line)
-{
- int width;
-
- if (!line->gc)
- return;
-
- if (line->width_pixels)
- width = (int) line->width;
- else
- width = (int) (line->width * line->item.canvas->pixels_per_unit + 0.5);
-
- gdk_gc_set_line_attributes (line->gc,
- width,
- line->line_style,
- (line->first_arrow || line->last_arrow) ? GDK_CAP_BUTT : line->cap,
- line->join);
-}
-
-/* Sets the stipple pattern for the line */
-static void
-set_stipple (GnomeCanvasLine *line, GdkBitmap *stipple, int reconfigure)
-{
- if (line->stipple && !reconfigure)
- g_object_unref (line->stipple);
-
- line->stipple = stipple;
- if (stipple && !reconfigure)
- g_object_ref (stipple);
-
- if (line->gc) {
- if (stipple) {
- gdk_gc_set_stipple (line->gc, stipple);
- gdk_gc_set_fill (line->gc, GDK_STIPPLED);
- } else
- gdk_gc_set_fill (line->gc, GDK_SOLID);
- }
-}
-
-static void
-gnome_canvas_line_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- GnomeCanvasLine *line;
- GnomeCanvasPoints *points;
- GdkColor color = { 0, 0, 0, 0, };
- GdkColor *pcolor;
- gboolean color_changed;
- int have_pixel;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_LINE (object));
-
- item = GNOME_CANVAS_ITEM (object);
- line = GNOME_CANVAS_LINE (object);
-
- color_changed = FALSE;
- have_pixel = FALSE;
-
- switch (param_id) {
- case PROP_POINTS:
- points = g_value_get_boxed (value);
-
- if (line->coords) {
- g_free (line->coords);
- line->coords = NULL;
- }
-
- if (!points)
- line->num_points = 0;
- else {
- line->num_points = points->num_points;
- line->coords = g_new (double, 2 * line->num_points);
- memcpy (line->coords, points->coords, 2 * line->num_points * sizeof (double));
- }
-
- /* Drop the arrowhead polygons if they exist -- they will be regenerated */
-
- if (line->first_coords) {
- g_free (line->first_coords);
- line->first_coords = NULL;
- }
-
- if (line->last_coords) {
- g_free (line->last_coords);
- line->last_coords = NULL;
- }
-
- /* Since the line's points have changed, we need to re-generate arrowheads in
- * addition to recalculating the bounds.
- */
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_FILL_COLOR:
- if (g_value_get_string (value))
- gdk_color_parse (g_value_get_string (value), &color);
- line->fill_rgba = ((color.red & 0xff00) << 16 |
- (color.green & 0xff00) << 8 |
- (color.blue & 0xff00) |
- 0xff);
- color_changed = TRUE;
- break;
-
- case PROP_FILL_COLOR_GDK:
- pcolor = g_value_get_boxed (value);
- if (pcolor) {
- GdkColormap *colormap;
- color = *pcolor;
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (item->canvas));
- gdk_rgb_find_color (colormap, &color);
-
- have_pixel = TRUE;
- }
-
- line->fill_rgba = ((color.red & 0xff00) << 16 |
- (color.green & 0xff00) << 8 |
- (color.blue & 0xff00) |
- 0xff);
- color_changed = TRUE;
- break;
-
- case PROP_FILL_COLOR_RGBA:
- line->fill_rgba = g_value_get_uint (value);
- color_changed = TRUE;
- break;
-
- case PROP_FILL_STIPPLE:
- set_stipple (line, (GdkBitmap *) g_value_get_object (value), FALSE);
- gnome_canvas_item_request_redraw_svp (item, line->fill_svp);
- break;
-
- case PROP_WIDTH_PIXELS:
- line->width = g_value_get_uint (value);
- line->width_pixels = TRUE;
- set_line_gc_width (line);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_WIDTH_UNITS:
- line->width = fabs (g_value_get_double (value));
- line->width_pixels = FALSE;
- set_line_gc_width (line);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_CAP_STYLE:
- line->cap = g_value_get_enum (value);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_JOIN_STYLE:
- line->join = g_value_get_enum (value);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_LINE_STYLE:
- line->line_style = g_value_get_enum (value);
- set_line_gc_width (line);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_FIRST_ARROWHEAD:
- line->first_arrow = g_value_get_boolean (value);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_LAST_ARROWHEAD:
- line->last_arrow = g_value_get_boolean (value);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_SMOOTH:
- /* FIXME */
- break;
-
- case PROP_SPLINE_STEPS:
- /* FIXME */
- break;
-
- case PROP_ARROW_SHAPE_A:
- line->shape_a = fabs (g_value_get_double (value));
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_ARROW_SHAPE_B:
- line->shape_b = fabs (g_value_get_double (value));
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_ARROW_SHAPE_C:
- line->shape_c = fabs (g_value_get_double (value));
- gnome_canvas_item_request_update (item);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-
- if (color_changed) {
- if (have_pixel)
- line->fill_pixel = color.pixel;
- else
- line->fill_pixel = gnome_canvas_get_color_pixel (item->canvas,
- line->fill_rgba);
-
- if (!item->canvas->aa)
- set_line_gc_foreground (line);
-
- gnome_canvas_item_request_redraw_svp (item, line->fill_svp);
-
- if (line->first_svp)
- gnome_canvas_item_request_redraw_svp (item, line->first_svp);
-
- if (line->last_svp)
- gnome_canvas_item_request_redraw_svp (item, line->last_svp);
-
- }
-}
-
-/* Returns a copy of the line's points without the endpoint adjustments for
- * arrowheads.
- */
-static GnomeCanvasPoints *
-get_points (GnomeCanvasLine *line)
-{
- GnomeCanvasPoints *points;
- int start_ofs, end_ofs;
-
- if (line->num_points == 0)
- return NULL;
-
- start_ofs = end_ofs = 0;
-
- points = gnome_canvas_points_new (line->num_points);
-
- /* Invariant: if first_coords or last_coords exist, then the line's
- * endpoints have been adjusted.
- */
-
- if (line->first_coords) {
- start_ofs = 1;
-
- points->coords[0] = line->first_coords[0];
- points->coords[1] = line->first_coords[1];
- }
-
- if (line->last_coords) {
- end_ofs = 1;
-
- points->coords[2 * (line->num_points - 1)] = line->last_coords[0];
- points->coords[2 * (line->num_points - 1) + 1] = line->last_coords[1];
- }
-
- memcpy (points->coords + 2 * start_ofs,
- line->coords + 2 * start_ofs,
- 2 * (line->num_points - (start_ofs + end_ofs)) * sizeof (double));
-
- return points;
-}
-
-static void
-gnome_canvas_line_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasLine *line;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_LINE (object));
-
- line = GNOME_CANVAS_LINE (object);
-
- switch (param_id) {
- case PROP_POINTS:
- /* get_points returns a copy */
- g_value_set_boxed_take_ownership (value, get_points (line));
- break;
-
- case PROP_FILL_COLOR:
- g_value_take_string (value,
- g_strdup_printf ("#%02x%02x%02x",
- line->fill_rgba >> 24,
- (line->fill_rgba >> 16) & 0xff,
- (line->fill_rgba >> 8) & 0xff));
- break;
-
- case PROP_FILL_COLOR_GDK: {
- GnomeCanvas *canvas = GNOME_CANVAS_ITEM (line)->canvas;
- GdkColormap *colormap = gtk_widget_get_colormap (GTK_WIDGET (canvas));
- GdkColor color;
-
- gdk_colormap_query_color (colormap, line->fill_pixel, &color);
- g_value_set_boxed (value, &color);
- break;
- }
-
- case PROP_FILL_COLOR_RGBA:
- g_value_set_uint (value, line->fill_rgba);
- break;
-
- case PROP_FILL_STIPPLE:
- g_value_set_object (value, line->stipple);
- break;
-
- case PROP_WIDTH_PIXELS:
- g_value_set_uint (value, line->width);
- break;
-
- case PROP_WIDTH_UNITS:
- g_value_set_double (value, line->width);
- break;
-
- case PROP_CAP_STYLE:
- g_value_set_enum (value, line->cap);
- break;
-
- case PROP_JOIN_STYLE:
- g_value_set_enum (value, line->join);
- break;
-
- case PROP_LINE_STYLE:
- g_value_set_enum (value, line->line_style);
- break;
-
- case PROP_FIRST_ARROWHEAD:
- g_value_set_boolean (value, line->first_arrow);
- break;
-
- case PROP_LAST_ARROWHEAD:
- g_value_set_boolean (value, line->last_arrow);
- break;
-
- case PROP_SMOOTH:
- g_value_set_boolean (value, line->smooth);
- break;
-
- case PROP_SPLINE_STEPS:
- g_value_set_uint (value, line->spline_steps);
- break;
-
- case PROP_ARROW_SHAPE_A:
- g_value_set_double (value, line->shape_a);
- break;
-
- case PROP_ARROW_SHAPE_B:
- g_value_set_double (value, line->shape_b);
- break;
-
- case PROP_ARROW_SHAPE_C:
- g_value_set_double (value, line->shape_c);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-gnome_canvas_line_render (GnomeCanvasItem *item,
- GnomeCanvasBuf *buf)
-{
- GnomeCanvasLine *line;
-
- line = GNOME_CANVAS_LINE (item);
-
- if (line->fill_svp != NULL)
- gnome_canvas_render_svp (buf, line->fill_svp, line->fill_rgba);
-
- if (line->first_svp != NULL)
- gnome_canvas_render_svp (buf, line->first_svp, line->fill_rgba);
-
- if (line->last_svp != NULL)
- gnome_canvas_render_svp (buf, line->last_svp, line->fill_rgba);
-}
-
-
-static ArtSVP *
-svp_from_points (const double *item_coords, int num_points, const double affine[6])
-{
- ArtVpath *vpath;
- ArtSVP *svp;
- double x, y;
- int i;
-
- vpath = art_new (ArtVpath, num_points + 2);
-
- for (i = 0; i < num_points; i++) {
- vpath[i].code = i == 0 ? ART_MOVETO : ART_LINETO;
- x = item_coords[i * 2];
- y = item_coords[i * 2 + 1];
- vpath[i].x = x * affine[0] + y * affine[2] + affine[4];
- vpath[i].y = x * affine[1] + y * affine[3] + affine[5];
- }
-#if 0
- vpath[i].code = ART_LINETO;
- vpath[i].x = vpath[0].x;
- vpath[i].y = vpath[0].y;
- i++;
-#endif
- vpath[i].code = ART_END;
- vpath[i].x = 0;
- vpath[i].y = 0;
-
- svp = art_svp_from_vpath (vpath);
-
- art_free (vpath);
-
- return svp;
-}
-
-static void
-gnome_canvas_line_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- GnomeCanvasLine *line;
- int i;
- ArtVpath *vpath;
- ArtPoint pi, pc;
- double width;
- ArtSVP *svp;
- double x1, y1, x2, y2;
-
- line = GNOME_CANVAS_LINE (item);
-
- if (parent_class->update)
- (* parent_class->update) (item, affine, clip_path, flags);
-
- reconfigure_arrows (line);
-
- if (item->canvas->aa) {
- gnome_canvas_item_reset_bounds (item);
-
- vpath = art_new (ArtVpath, line->num_points + 2);
-
- for (i = 0; i < line->num_points; i++) {
- pi.x = line->coords[i * 2];
- pi.y = line->coords[i * 2 + 1];
- art_affine_point (&pc, &pi, affine);
- vpath[i].code = i == 0 ? ART_MOVETO : ART_LINETO;
- vpath[i].x = pc.x;
- vpath[i].y = pc.y;
- }
- vpath[i].code = ART_END;
- vpath[i].x = 0;
- vpath[i].y = 0;
-
- if (line->width_pixels)
- width = line->width;
- else
- width = line->width * art_affine_expansion (affine);
-
- if (width < 0.5)
- width = 0.5;
-
- svp = art_svp_vpath_stroke (vpath,
- gnome_canvas_join_gdk_to_art (line->join),
- gnome_canvas_cap_gdk_to_art (line->cap),
- width,
- 4,
- 0.25);
- art_free (vpath);
-
- gnome_canvas_item_update_svp_clip (item, &line->fill_svp, svp, clip_path);
-
- if (line->first_arrow && line->first_coords) {
- svp = svp_from_points (line->first_coords, NUM_ARROW_POINTS, affine);
- gnome_canvas_item_update_svp_clip (item,
- &line->first_svp, svp, clip_path);
- }
-
-
- if (line->last_arrow && line->last_coords) {
- svp = svp_from_points (line->last_coords, NUM_ARROW_POINTS, affine);
- gnome_canvas_item_update_svp_clip (item,
- &line->last_svp, svp, clip_path);
- }
-
-
- } else {
- set_line_gc_foreground (line);
- set_line_gc_width (line);
- set_stipple (line, line->stipple, TRUE);
-
- get_bounds_canvas (line, &x1, &y1, &x2, &y2, affine);
- gnome_canvas_update_bbox (item, x1, y1, x2, y2);
- }
-}
-
-static void
-gnome_canvas_line_realize (GnomeCanvasItem *item)
-{
- GnomeCanvasLine *line;
-
- line = GNOME_CANVAS_LINE (item);
-
- if (parent_class->realize)
- (* parent_class->realize) (item);
-
- line->gc = gdk_gc_new (item->canvas->layout.bin_window);
-
-#if 0
- (* GNOME_CANVAS_ITEM_CLASS (item->object.klass)->update) (item, NULL, NULL, 0);
-#endif
-}
-
-static void
-gnome_canvas_line_unrealize (GnomeCanvasItem *item)
-{
- GnomeCanvasLine *line;
-
- line = GNOME_CANVAS_LINE (item);
-
- g_object_unref (line->gc);
- line->gc = NULL;
-
- if (parent_class->unrealize)
- (* parent_class->unrealize) (item);
-}
-
-static void
-item_to_canvas (GnomeCanvas * canvas, double *item_coords, GdkPoint *canvas_coords, int num_points,
- int *num_drawn_points, double i2c[6], int x, int y)
-{
- int i;
- int old_cx, old_cy;
- int cx, cy;
- ArtPoint pi, pc;
-
-#ifdef VERBOSE
- {
- char str[128];
- art_affine_to_string (str, i2c);
- g_print ("line item_to_canvas %s\n", str);
- }
-#endif
-
- /* the first point is always drawn */
-
- pi.x = item_coords[0];
- pi.y = item_coords[1];
- art_affine_point (&pc, &pi, i2c);
- cx = floor (pc.x + 0.5);
- cy = floor (pc.y + 0.5);
- canvas_coords->x = cx - x;
- canvas_coords->y = cy - y;
- canvas_coords++;
- old_cx = cx;
- old_cy = cy;
- *num_drawn_points = 1;
-
- for (i = 1; i < num_points; i++) {
- pi.x = item_coords[i * 2];
- pi.y = item_coords[i * 2 + 1];
- art_affine_point (&pc, &pi, i2c);
- cx = floor (pc.x + 0.5);
- cy = floor (pc.y + 0.5);
- if (old_cx != cx || old_cy != cy) {
- canvas_coords->x = cx - x;
- canvas_coords->y = cy - y;
- old_cx = cx;
- old_cy = cy;
- canvas_coords++;
- (*num_drawn_points)++;
- }
- }
-}
-
-static void
-gnome_canvas_line_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- GnomeCanvasLine *line;
- GdkPoint static_points[NUM_STATIC_POINTS];
- GdkPoint *points;
- int actual_num_points_drawn;
- double i2c[6];
-
- line = GNOME_CANVAS_LINE (item);
-
- if (line->num_points == 0)
- return;
-
- /* Build array of canvas pixel coordinates */
-
- if (line->num_points <= NUM_STATIC_POINTS)
- points = static_points;
- else
- points = g_new (GdkPoint, line->num_points);
-
-
- gnome_canvas_item_i2c_affine (item, i2c);
-
- item_to_canvas (item->canvas, line->coords, points, line->num_points,
- &actual_num_points_drawn, i2c, x, y);
-
- if (line->stipple)
- gnome_canvas_set_stipple_origin (item->canvas, line->gc);
-
- gdk_draw_lines (drawable, line->gc, points, actual_num_points_drawn);
-
- if (points != static_points)
- g_free (points);
-
- /* Draw arrowheads */
-
- points = static_points;
-
- if (line->first_arrow) {
- item_to_canvas (item->canvas, line->first_coords, points, NUM_ARROW_POINTS,
- &actual_num_points_drawn, i2c, x, y);
- gdk_draw_polygon (drawable, line->gc, TRUE, points, actual_num_points_drawn );
- }
-
- if (line->last_arrow) {
- item_to_canvas (item->canvas, line->last_coords, points, NUM_ARROW_POINTS,
- &actual_num_points_drawn, i2c, x, y);
- gdk_draw_polygon (drawable, line->gc, TRUE, points, actual_num_points_drawn );
- }
-}
-
-static double
-gnome_canvas_line_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy, GnomeCanvasItem **actual_item)
-{
- GnomeCanvasLine *line;
- double *line_points = NULL, *coords;
- double static_points[2 * NUM_STATIC_POINTS];
- double poly[10];
- double best, dist;
- double dx, dy;
- double width;
- int num_points = 0, i;
- int changed_miter_to_bevel;
-
-#ifdef VERBOSE
- g_print ("gnome_canvas_line_point x, y = (%g, %g); cx, cy = (%d, %d)\n", x, y, cx, cy);
-#endif
-
- line = GNOME_CANVAS_LINE (item);
-
- *actual_item = item;
-
- best = 1.0e36;
-
- /* Handle smoothed lines by generating an expanded set ot points */
-
- if (line->smooth && (line->num_points > 2)) {
- /* FIXME */
- } else {
- num_points = line->num_points;
- line_points = line->coords;
- }
-
- /* Compute a polygon for each edge of the line and test the point against it. The effective
- * width of the line is adjusted so that it will be at least one pixel thick (so that zero
- * pixel-wide lines can be pickedup as well).
- */
-
- if (line->width_pixels)
- width = line->width / item->canvas->pixels_per_unit;
- else
- width = line->width;
-
- if (width < (1.0 / item->canvas->pixels_per_unit))
- width = 1.0 / item->canvas->pixels_per_unit;
-
- changed_miter_to_bevel = 0;
-
- for (i = num_points, coords = line_points; i >= 2; i--, coords += 2) {
- /* If rounding is done around the first point, then compute distance between the
- * point and the first point.
- */
-
- if (((line->cap == GDK_CAP_ROUND) && (i == num_points))
- || ((line->join == GDK_JOIN_ROUND) && (i != num_points))) {
- dx = coords[0] - x;
- dy = coords[1] - y;
- dist = sqrt (dx * dx + dy * dy) - width / 2.0;
- if (dist < GNOME_CANVAS_EPSILON) {
- best = 0.0;
- goto done;
- } else if (dist < best)
- best = dist;
- }
-
- /* Compute the polygonal shape corresponding to this edge, with two points for the
- * first point of the edge and two points for the last point of the edge.
- */
-
- if (i == num_points)
- gnome_canvas_get_butt_points (coords[2], coords[3], coords[0], coords[1],
- width, (line->cap == GDK_CAP_PROJECTING),
- poly, poly + 1, poly + 2, poly + 3);
- else if ((line->join == GDK_JOIN_MITER) && !changed_miter_to_bevel) {
- poly[0] = poly[6];
- poly[1] = poly[7];
- poly[2] = poly[4];
- poly[3] = poly[5];
- } else {
- gnome_canvas_get_butt_points (coords[2], coords[3], coords[0], coords[1],
- width, FALSE,
- poly, poly + 1, poly + 2, poly + 3);
-
- /* If this line uses beveled joints, then check the distance to a polygon
- * comprising the last two points of the previous polygon and the first two
- * from this polygon; this checks the wedges that fill the mitered point.
- */
-
- if ((line->join == GDK_JOIN_BEVEL) || changed_miter_to_bevel) {
- poly[8] = poly[0];
- poly[9] = poly[1];
-
- dist = gnome_canvas_polygon_to_point (poly, 5, x, y);
- if (dist < GNOME_CANVAS_EPSILON) {
- best = 0.0;
- goto done;
- } else if (dist < best)
- best = dist;
-
- changed_miter_to_bevel = FALSE;
- }
- }
-
- if (i == 2)
- gnome_canvas_get_butt_points (coords[0], coords[1], coords[2], coords[3],
- width, (line->cap == GDK_CAP_PROJECTING),
- poly + 4, poly + 5, poly + 6, poly + 7);
- else if (line->join == GDK_JOIN_MITER) {
- if (!gnome_canvas_get_miter_points (coords[0], coords[1],
- coords[2], coords[3],
- coords[4], coords[5],
- width,
- poly + 4, poly + 5, poly + 6, poly + 7)) {
- changed_miter_to_bevel = TRUE;
- gnome_canvas_get_butt_points (coords[0], coords[1], coords[2], coords[3],
- width, FALSE,
- poly + 4, poly + 5, poly + 6, poly + 7);
- }
- } else
- gnome_canvas_get_butt_points (coords[0], coords[1], coords[2], coords[3],
- width, FALSE,
- poly + 4, poly + 5, poly + 6, poly + 7);
-
- poly[8] = poly[0];
- poly[9] = poly[1];
-
- dist = gnome_canvas_polygon_to_point (poly, 5, x, y);
- if (dist < GNOME_CANVAS_EPSILON) {
- best = 0.0;
- goto done;
- } else if (dist < best)
- best = dist;
- }
-
- /* If caps are rounded, check the distance to the cap around the final end point of the line */
-
- if (line->cap == GDK_CAP_ROUND) {
- dx = coords[0] - x;
- dy = coords[1] - y;
- dist = sqrt (dx * dx + dy * dy) - width / 2.0;
- if (dist < GNOME_CANVAS_EPSILON) {
- best = 0.0;
- goto done;
- } else
- best = dist;
- }
-
- /* sometimes the GnomeCanvasItem::update signal will not have
- been processed between deleting the arrow points and a call
- to this routine -- this can cause a segfault here */
- if ((line->first_arrow && !line->first_coords) ||
- (line->last_arrow && !line->last_coords))
- reconfigure_arrows(line);
-
- /* If there are arrowheads, check the distance to them */
-
- if (line->first_arrow) {
- dist = gnome_canvas_polygon_to_point (line->first_coords, NUM_ARROW_POINTS, x, y);
- if (dist < GNOME_CANVAS_EPSILON) {
- best = 0.0;
- goto done;
- } else
- best = dist;
- }
-
- if (line->last_arrow) {
- dist = gnome_canvas_polygon_to_point (line->last_coords, NUM_ARROW_POINTS, x, y);
- if (dist < GNOME_CANVAS_EPSILON) {
- best = 0.0;
- goto done;
- } else
- best = dist;
- }
-
-done:
-
- if ((line_points != static_points) && (line_points != line->coords))
- g_free (line_points);
-
- return best;
-}
-
-static void
-gnome_canvas_line_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- GnomeCanvasLine *line;
-
- line = GNOME_CANVAS_LINE (item);
-
- if (line->num_points == 0) {
- *x1 = *y1 = *x2 = *y2 = 0.0;
- return;
- }
-
- get_bounds (line, x1, y1, x2, y2);
-}
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-
-/* Line/curve item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- */
-
-#ifndef GNOME_CANVAS_LINE_H
-#define GNOME_CANVAS_LINE_H
-
-
-#include <libgnomecanvas/gnome-canvas.h>
-
-
-G_BEGIN_DECLS
-
-
-/* Line item for the canvas. This is a polyline with configurable width, cap/join styles, and arrowheads.
- * If arrowheads are enabled, then three values are used to specify their shape:
- *
- * arrow_shape_a: Distance from tip of arrowhead to the center point.
- * arrow_shape_b: Distance from tip of arrowhead to trailing point, measured along the shaft.
- * arrow_shape_c: Distance of trailing point from outside edge of shaft.
- *
- * The following object arguments are available:
- *
- * name type read/write description
- * ------------------------------------------------------------------------------------------
- * points GnomeCanvasPoints* RW Pointer to a GnomeCanvasPoints structure.
- * This can be created by a call to
- * gnome_canvas_points_new() (in gnome-canvas-util.h).
- * X coordinates are in the even indices of the
- * points->coords array, Y coordinates are in
- * the odd indices.
- * fill_color string W X color specification for line
- * fill_color_gdk GdkColor* RW Pointer to an allocated GdkColor
- * fill_stipple GdkBitmap* RW Stipple pattern for the line
- * width_pixels uint R Width of the line in pixels. The line width
- * will not be scaled when the canvas zoom factor changes.
- * width_units double R Width of the line in canvas units. The line width
- * will be scaled when the canvas zoom factor changes.
- * cap_style GdkCapStyle RW Cap ("endpoint") style for the line.
- * join_style GdkJoinStyle RW Join ("vertex") style for the line.
- * line_style GdkLineStyle RW Line dash style
- * first_arrowhead boolean RW Specifies whether to draw an arrowhead on the
- * first point of the line.
- * last_arrowhead boolean RW Specifies whether to draw an arrowhead on the
- * last point of the line.
- * smooth boolean RW Specifies whether to smooth the line using
- * parabolic splines.
- * spline_steps uint RW Specifies the number of steps to use when rendering curves.
- * arrow_shape_a double RW First arrow shape specifier.
- * arrow_shape_b double RW Second arrow shape specifier.
- * arrow_shape_c double RW Third arrow shape specifier.
- */
-
-
-#define GNOME_TYPE_CANVAS_LINE (gnome_canvas_line_get_type ())
-#define GNOME_CANVAS_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_LINE, GnomeCanvasLine))
-#define GNOME_CANVAS_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_LINE, GnomeCanvasLineClass))
-#define GNOME_IS_CANVAS_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_LINE))
-#define GNOME_IS_CANVAS_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_LINE))
-#define GNOME_CANVAS_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_LINE, GnomeCanvasLineClass))
-
-
-typedef struct _GnomeCanvasLine GnomeCanvasLine;
-typedef struct _GnomeCanvasLineClass GnomeCanvasLineClass;
-
-struct _GnomeCanvasLine {
- GnomeCanvasItem item;
-
- double *coords; /* Array of coordinates for the line's points. X coords are in the
- * even indices, Y coords are in the odd indices. If the line has
- * arrowheads then the first and last points have been adjusted to
- * refer to the necks of the arrowheads rather than their tips. The
- * actual endpoints are stored in the first_arrow and last_arrow
- * arrays, if they exist.
- */
-
- double *first_coords; /* Array of points describing polygon for the first arrowhead */
- double *last_coords; /* Array of points describing polygon for the last arrowhead */
-
- GdkGC *gc; /* GC for drawing line */
-
- GdkBitmap *stipple; /* Stipple pattern */
-
- ArtSVP *fill_svp; /* The SVP for the outline shape */ /*AA*/
- ArtSVP *first_svp; /* The SVP for the first arrow */ /*AA*/
- ArtSVP *last_svp; /* The SVP for the last arrow */ /*AA*/
-
- double width; /* Width of the line */
-
- double shape_a; /* Distance from tip of arrowhead to center */
- double shape_b; /* Distance from tip of arrowhead to trailing point, measured along shaft */
- double shape_c; /* Distance of trailing points from outside edge of shaft */
-
- GdkCapStyle cap; /* Cap style for line */
- GdkJoinStyle join; /* Join style for line */
- GdkLineStyle line_style;/* Style for the line */
-
- gulong fill_pixel; /* Color for line */
-
- guint32 fill_rgba; /* RGBA color for outline */ /*AA*/
-
- int num_points; /* Number of points in the line */
- guint fill_color; /* Fill color, RGBA */
-
- int spline_steps; /* Number of steps in each spline segment */
-
- guint width_pixels : 1; /* Is the width specified in pixels or units? */
- guint first_arrow : 1; /* Draw first arrowhead? */
- guint last_arrow : 1; /* Draw last arrowhead? */
- guint smooth : 1; /* Smooth line (with parabolic splines)? */
-};
-
-struct _GnomeCanvasLineClass {
- GnomeCanvasItemClass parent_class;
-};
-
-
-/* Standard Gtk function */
-GType gnome_canvas_line_get_type (void) G_GNUC_CONST;
-
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-
-#include <glib-object.h>
-
-
-#ifdef G_ENABLE_DEBUG
-#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v)
-#define g_marshal_value_peek_char(v) g_value_get_char (v)
-#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v)
-#define g_marshal_value_peek_int(v) g_value_get_int (v)
-#define g_marshal_value_peek_uint(v) g_value_get_uint (v)
-#define g_marshal_value_peek_long(v) g_value_get_long (v)
-#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v)
-#define g_marshal_value_peek_int64(v) g_value_get_int64 (v)
-#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v)
-#define g_marshal_value_peek_enum(v) g_value_get_enum (v)
-#define g_marshal_value_peek_flags(v) g_value_get_flags (v)
-#define g_marshal_value_peek_float(v) g_value_get_float (v)
-#define g_marshal_value_peek_double(v) g_value_get_double (v)
-#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v)
-#define g_marshal_value_peek_param(v) g_value_get_param (v)
-#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)
-#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)
-#define g_marshal_value_peek_object(v) g_value_get_object (v)
-#else /* !G_ENABLE_DEBUG */
-/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
- * Do not access GValues directly in your code. Instead, use the
- * g_value_get_*() functions
- */
-#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int
-#define g_marshal_value_peek_char(v) (v)->data[0].v_int
-#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint
-#define g_marshal_value_peek_int(v) (v)->data[0].v_int
-#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint
-#define g_marshal_value_peek_long(v) (v)->data[0].v_long
-#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong
-#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64
-#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64
-#define g_marshal_value_peek_enum(v) (v)->data[0].v_long
-#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong
-#define g_marshal_value_peek_float(v) (v)->data[0].v_float
-#define g_marshal_value_peek_double(v) (v)->data[0].v_double
-#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer
-#endif /* !G_ENABLE_DEBUG */
-
-
-/* VOID:OBJECT,INT,INT,INT,INT (gnome-canvas-marshal.list:1) */
-void
-gnome_canvas_marshal_VOID__OBJECT_INT_INT_INT_INT (GClosure *closure,
- GValue *return_value G_GNUC_UNUSED,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint G_GNUC_UNUSED,
- gpointer marshal_data)
-{
- typedef void (*GMarshalFunc_VOID__OBJECT_INT_INT_INT_INT) (gpointer data1,
- gpointer arg_1,
- gint arg_2,
- gint arg_3,
- gint arg_4,
- gint arg_5,
- gpointer data2);
- register GMarshalFunc_VOID__OBJECT_INT_INT_INT_INT callback;
- register GCClosure *cc = (GCClosure*) closure;
- register gpointer data1, data2;
-
- g_return_if_fail (n_param_values == 6);
-
- if (G_CCLOSURE_SWAP_DATA (closure))
- {
- data1 = closure->data;
- data2 = g_value_peek_pointer (param_values + 0);
- }
- else
- {
- data1 = g_value_peek_pointer (param_values + 0);
- data2 = closure->data;
- }
- callback = (GMarshalFunc_VOID__OBJECT_INT_INT_INT_INT) (marshal_data ? marshal_data : cc->callback);
-
- callback (data1,
- g_marshal_value_peek_object (param_values + 1),
- g_marshal_value_peek_int (param_values + 2),
- g_marshal_value_peek_int (param_values + 3),
- g_marshal_value_peek_int (param_values + 4),
- g_marshal_value_peek_int (param_values + 5),
- data2);
-}
-
-/* BOOLEAN:BOXED (gnome-canvas-marshal.list:2) */
-void
-gnome_canvas_marshal_BOOLEAN__BOXED (GClosure *closure,
- GValue *return_value G_GNUC_UNUSED,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint G_GNUC_UNUSED,
- gpointer marshal_data)
-{
- typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED) (gpointer data1,
- gpointer arg_1,
- gpointer data2);
- register GMarshalFunc_BOOLEAN__BOXED callback;
- register GCClosure *cc = (GCClosure*) closure;
- register gpointer data1, data2;
- gboolean v_return;
-
- g_return_if_fail (return_value != NULL);
- g_return_if_fail (n_param_values == 2);
-
- if (G_CCLOSURE_SWAP_DATA (closure))
- {
- data1 = closure->data;
- data2 = g_value_peek_pointer (param_values + 0);
- }
- else
- {
- data1 = g_value_peek_pointer (param_values + 0);
- data2 = closure->data;
- }
- callback = (GMarshalFunc_BOOLEAN__BOXED) (marshal_data ? marshal_data : cc->callback);
-
- v_return = callback (data1,
- g_marshal_value_peek_boxed (param_values + 1),
- data2);
-
- g_value_set_boolean (return_value, v_return);
-}
-
+++ /dev/null
-
-#ifndef __gnome_canvas_marshal_MARSHAL_H__
-#define __gnome_canvas_marshal_MARSHAL_H__
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-/* VOID:OBJECT,INT,INT,INT,INT (gnome-canvas-marshal.list:1) */
-extern void gnome_canvas_marshal_VOID__OBJECT_INT_INT_INT_INT (GClosure *closure,
- GValue *return_value,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint,
- gpointer marshal_data);
-
-/* BOOLEAN:BOXED (gnome-canvas-marshal.list:2) */
-extern void gnome_canvas_marshal_BOOLEAN__BOXED (GClosure *closure,
- GValue *return_value,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint,
- gpointer marshal_data);
-
-G_END_DECLS
-
-#endif /* __gnome_canvas_marshal_MARSHAL_H__ */
-
+++ /dev/null
-#define GNOME_CANVAS_PATH_DEF_C
-
-/*
- * GnomeCanvasPathDef
- *
- * (C) 1999-2000 Lauris Kaplinski <lauris@ximian.com>
- * Released under LGPL
- *
- * Authors: Lauris Kaplinski <lauris@ximian.com>
- * Rusty Conover <rconover@bangtail.net>
- *
- * Copyright 1999-2001 Ximian Inc. and authors.
- */
-
-#include <string.h>
-#include <libart_lgpl/art_misc.h>
-#include "gnome-canvas-path-def.h"
-
-/* The number of points to allocate at once */
-#define GNOME_CANVAS_PATH_DEF_LENSTEP 32
-
-struct _GnomeCanvasPathDef {
- gint refcount;
- ArtBpath * bpath;
- gint end; /* ART_END position */
- gint length; /* Num allocated Bpaths */
- gint substart; /* subpath start */
- gdouble x, y; /* previous moveto position */
- guint sbpath : 1; /* Bpath is static */
- guint hascpt : 1; /* Currentpoint is defined */
- guint posset : 1; /* Previous was moveto */
- guint moving : 1; /* Bpath end is moving */
- guint allclosed : 1; /* All subpaths are closed */
- guint allopen : 1; /* All subpaths are open */
-};
-
-static gboolean sp_bpath_good (ArtBpath * bpath);
-static ArtBpath * sp_bpath_check_subpath (ArtBpath * bpath);
-static gint sp_bpath_length (const ArtBpath * bpath);
-static gboolean sp_bpath_all_closed (const ArtBpath * bpath);
-static gboolean sp_bpath_all_open (const ArtBpath * bpath);
-
-/* Boxed Type Support */
-
-static GnomeCanvasPathDef *
-path_def_boxed_copy (GnomeCanvasPathDef * path_def)
-{
- if (path_def)
- gnome_canvas_path_def_ref (path_def);
- return path_def;
-}
-
-GType
-gnome_canvas_path_def_get_type (void)
-{
- static GType t = 0;
- if (t == 0)
- t = g_boxed_type_register_static
- ("GnomeCanvasPathDef",
- (GBoxedCopyFunc)path_def_boxed_copy,
- (GBoxedFreeFunc)gnome_canvas_path_def_unref);
- return t;
-}
-
-/* Constructors */
-
-/**
- * gnome_canvas_path_def_new:
- *
- * This function creates a new empty #gnome_canvas_path_def.
- *
- * Returns: the new canvas path definition.
- */
-GnomeCanvasPathDef *
-gnome_canvas_path_def_new (void)
-{
- GnomeCanvasPathDef * path;
-
- path = gnome_canvas_path_def_new_sized (GNOME_CANVAS_PATH_DEF_LENSTEP);
-
- return path;
-}
-
-/**
- * gnome_canvas_path_def_new_sized:
- * @length: number of points to allocate for the path
- *
- * This function creates a new #gnome_canvas_path_def with @length
- * number of points allocated. It is useful, if you know the exact
- * number of points in path, so you can avoid automatic point
- * array reallocation.
- *
- * Returns: the new canvas path definition
- */
-GnomeCanvasPathDef *
-gnome_canvas_path_def_new_sized (gint length)
-{
- GnomeCanvasPathDef * path;
-
- g_return_val_if_fail (length > 0, NULL);
-
- path = g_new (GnomeCanvasPathDef, 1);
-
- path->refcount = 1;
- path->bpath = art_new (ArtBpath, length);
- path->end = 0;
- path->bpath[path->end].code = ART_END;
- path->length = length;
- path->sbpath = FALSE;
- path->hascpt = FALSE;
- path->posset = FALSE;
- path->moving = FALSE;
- path->allclosed = TRUE;
- path->allopen = TRUE;
-
- return path;
-}
-
-/**
- * gnome_canvas_path_def_new_from_bpath:
- * @bpath: libart bezier path
- *
- * This function constructs a new #gnome_canvas_path_def and uses the
- * passed @bpath as the contents. The passed bpath should not be
- * static as the path definition is editable when constructed with
- * this function. Also, passed bpath will be freed with art_free, if
- * path is destroyed, so use it with caution.
- * For constructing a #gnome_canvas_path_def
- * from (non-modifiable) bpath use
- * #gnome_canvas_path_def_new_from_static_bpath.
- *
- * Returns: the new canvas path definition that is populated with the
- * passed bezier path, if the @bpath is bad NULL is returned.
- */
-GnomeCanvasPathDef *
-gnome_canvas_path_def_new_from_bpath (ArtBpath * bpath)
-{
- GnomeCanvasPathDef * path;
-
- g_return_val_if_fail (sp_bpath_good (bpath), NULL);
-
- path = g_new (GnomeCanvasPathDef, 1);
-
- path->refcount = 1;
- path->bpath = bpath;
- path->length = sp_bpath_length (bpath);
- path->end = path->length - 1;
- path->sbpath = FALSE;
- path->hascpt = FALSE;
- path->posset = FALSE;
- path->moving = FALSE;
- path->allclosed = sp_bpath_all_closed (bpath);
- path->allopen = sp_bpath_all_open (bpath);
-
- return path;
-}
-
-/**
- * gnome_canvas_path_def_new_from_static_bpath:
- * @bpath: libart bezier path
- *
- * This function constructs a new #gnome_canvas_path_def and
- * references the passed @bpath as its contents. The
- * #gnome_canvas_path_def returned from this function is to be
- * considered static and non-editable (meaning you cannot change the
- * path from what you passed in @bpath). The bpath will not be freed,
- * if path will be destroyed, so use it with caution.
- *
- * Returns: the new canvas path definition that references the passed
- * @bpath, or if the path is bad NULL is returned.
- */
-GnomeCanvasPathDef *
-gnome_canvas_path_def_new_from_static_bpath (ArtBpath * bpath)
-{
- GnomeCanvasPathDef * path;
-
- g_return_val_if_fail (sp_bpath_good (bpath), NULL);
-
- path = g_new (GnomeCanvasPathDef, 1);
-
- path->refcount = 1;
- path->bpath = bpath;
- path->length = sp_bpath_length (bpath);
- path->end = path->length - 1;
- path->sbpath = TRUE;
- path->hascpt = FALSE;
- path->posset = FALSE;
- path->moving = FALSE;
- path->allclosed = sp_bpath_all_closed (bpath);
- path->allopen = sp_bpath_all_open (bpath);
-
- return path;
-}
-
-/**
- * gnome_canvas_path_def_new_from_foreign_bpath:
- * @bpath: libart bezier path
- *
- * This function constructs a new #gnome_canvas_path_def and
- * duplicates the contents of the passed @bpath in the definition.
- *
- * Returns: the newly created #gnome_canvas_path_def or NULL if the
- * path is invalid.
- */
-GnomeCanvasPathDef *
-gnome_canvas_path_def_new_from_foreign_bpath (ArtBpath * bpath)
-{
- GnomeCanvasPathDef * path;
- gint length;
-
- g_return_val_if_fail (sp_bpath_good (bpath), NULL);
-
- length = sp_bpath_length (bpath);
-
- path = gnome_canvas_path_def_new_sized (length);
- memcpy (path->bpath, bpath, sizeof (ArtBpath) * length);
- path->end = length - 1;
- path->allclosed = sp_bpath_all_closed (bpath);
- path->allopen = sp_bpath_all_open (bpath);
-
- return path;
-}
-
-/**
- * gnome_canvas_path_def_ref:
- * @path: a GnomeCanvasPathDef
- *
- * Increment the reference count of the GnomeCanvasPathDef.
- */
-void
-gnome_canvas_path_def_ref (GnomeCanvasPathDef * path)
-{
- g_return_if_fail (path != NULL);
-
- path->refcount++;
-}
-
-/**
- * gnome_canvas_path_def_finish:
- * @path: a GnomeCanvasPathDef
- *
- * Trims dynamic point array to exact length of path.
- */
-void
-gnome_canvas_path_def_finish (GnomeCanvasPathDef * path)
-{
- g_return_if_fail (path != NULL);
- g_return_if_fail (path->sbpath);
-
- if ((path->end + 1) < path->length) {
- path->bpath = art_renew (path->bpath, ArtBpath, path->end + 1);
- path->length = path->end + 1;
- }
-
- path->hascpt = FALSE;
- path->posset = FALSE;
- path->moving = FALSE;
-}
-/**
- * gnome_canvas_path_def_ensure_space:
- * @path: a GnomeCanvasPathDef
- * @space: number of points to guarantee are allocated at the end of
- * the path.
- *
- * This function ensures that enough space for @space points is
- * allocated at the end of the path.
- */
-void
-gnome_canvas_path_def_ensure_space (GnomeCanvasPathDef * path, gint space)
-{
- g_return_if_fail (path != NULL);
- g_return_if_fail (space > 0);
-
- if (path->end + space < path->length) return;
-
- if (space < GNOME_CANVAS_PATH_DEF_LENSTEP) space = GNOME_CANVAS_PATH_DEF_LENSTEP;
-
- path->bpath = art_renew (path->bpath, ArtBpath, path->length + space);
-
- path->length += space;
-}
-
-/**
- * gnome_canvas_path_def_copy:
- * @dst: a GnomeCanvasPathDef where the contents of @src will be stored.
- * @src: a GnomeCanvasPathDef whose contents will be copied it @src.
- *
- * This function copies the contents @src to @dest. The old @dest path
- * array is freed and @dest is marked as non-static (editable),
- * regardless of the status of @src.
- */
-void
-gnome_canvas_path_def_copy (GnomeCanvasPathDef * dst, const GnomeCanvasPathDef * src)
-{
- g_return_if_fail (dst != NULL);
- g_return_if_fail (src != NULL);
-
- if (!dst->sbpath) g_free (dst->bpath);
-
- memcpy (dst, src, sizeof (GnomeCanvasPathDef));
-
- dst->bpath = g_new (ArtBpath, src->end + 1);
- memcpy (dst->bpath, src->bpath, (src->end + 1) * sizeof (ArtBpath));
-
- dst->sbpath = FALSE;
-}
-
-
-/**
- * gnome_canvas_path_def_duplicate:
- * @path: a GnomeCanvasPathDef to duplicate
- *
- * This function duplicates the passed @path. The new path is
- * marked as non-static regardless of the state of original.
- *
- * Returns: a GnomeCanvasPathDef which is a duplicate of @path.
- */
-GnomeCanvasPathDef *
-gnome_canvas_path_def_duplicate (const GnomeCanvasPathDef * path)
-{
- GnomeCanvasPathDef * new;
-
- g_return_val_if_fail (path != NULL, NULL);
-
- new = gnome_canvas_path_def_new_from_foreign_bpath (path->bpath);
- new->x = path->x;
- new->y = path->y;
- new->hascpt = path->hascpt;
- new->posset = path->posset;
- new->moving = path->moving;
- new->allclosed = path->allclosed;
- new->allopen = path->allopen;
-
- return new;
-}
-
-/**
- * gnome_canvas_path_def_concat:
- * @list: a GSList of GnomeCanvasPathDefs to concatenate into one new
- * path.
- *
- * This function concatenates a list of GnomeCanvasPathDefs into one
- * newly created GnomeCanvasPathDef.
- *
- * Returns: a new GnomeCanvasPathDef
- */
-GnomeCanvasPathDef *
-gnome_canvas_path_def_concat (const GSList * list)
-{
- GnomeCanvasPathDef * c, * new;
- ArtBpath * bp;
- const GSList * l;
- gint length;
-
- g_return_val_if_fail (list != NULL, NULL);
-
- length = 1;
-
- for (l = list; l != NULL; l = l->next) {
- c = (GnomeCanvasPathDef *) l->data;
- length += c->end;
- }
-
- new = gnome_canvas_path_def_new_sized (length);
-
- bp = new->bpath;
-
- for (l = list; l != NULL; l = l->next) {
- c = (GnomeCanvasPathDef *) l->data;
- memcpy (bp, c->bpath, c->end * sizeof (ArtBpath));
- bp += c->end;
- }
-
- bp->code = ART_END;
-
- new->end = length - 1;
-
- new->allclosed = sp_bpath_all_closed (new->bpath);
- new->allopen = sp_bpath_all_open (new->bpath);
-
- return new;
-}
-
-/**
- * gnome_canvas_path_def_split:
- * @path: a GnomeCanvasPathDef
- *
- * This function splits the passed @path into a list of
- * GnomeCanvasPathDefs which represent each segment of the origional
- * path. The path is split when ever an ART_MOVETO or ART_MOVETO_OPEN
- * is encountered. The closedness of resulting paths is set accordingly
- * to closedness of corresponding segment.
- *
- * Returns: a list of GnomeCanvasPathDef(s).
- */
-GSList *
-gnome_canvas_path_def_split (const GnomeCanvasPathDef * path)
-{
- GnomeCanvasPathDef * new;
- GSList * l;
- gint p, i;
-
- g_return_val_if_fail (path != NULL, NULL);
-
- p = 0;
- l = NULL;
-
- while (p < path->end) {
- i = 1;
- while ((path->bpath[p + i].code == ART_LINETO) || (path->bpath[p + i].code == ART_CURVETO)) i++;
- new = gnome_canvas_path_def_new_sized (i + 1);
- memcpy (new->bpath, path->bpath + p, i * sizeof (ArtBpath));
- new->end = i;
- new->bpath[i].code = ART_END;
- new->allclosed = (new->bpath->code == ART_MOVETO);
- new->allopen = (new->bpath->code == ART_MOVETO_OPEN);
- l = g_slist_append (l, new);
- p += i;
- }
-
- return l;
-}
-
-/**
- * gnome_canvas_path_def_open_parts:
- * @path: a GnomeCanvasPathDef
- *
- * This function creates a new GnomeCanvasPathDef that contains all of
- * the open segments on the passed @path.
- *
- * Returns: a new GnomeCanvasPathDef that contains all of the open segemtns in @path.
- */
-GnomeCanvasPathDef *
-gnome_canvas_path_def_open_parts (const GnomeCanvasPathDef * path)
-{
- GnomeCanvasPathDef * new;
- ArtBpath * p, * d;
- gint len;
- gboolean closed;
-
- g_return_val_if_fail (path != NULL, NULL);
-
- closed = TRUE;
- len = 0;
-
- for (p = path->bpath; p->code != ART_END; p++) {
- switch (p->code) {
- case ART_MOVETO_OPEN:
- closed = FALSE;
- len++;
- break;
- case ART_MOVETO:
- closed = TRUE;
- break;
- case ART_LINETO:
- case ART_CURVETO:
- if (!closed) len++;
- break;
- default:
- g_assert_not_reached ();
- }
- }
-
- new = gnome_canvas_path_def_new_sized (len + 1);
-
- closed = TRUE;
- d = new->bpath;
-
- for (p = path->bpath; p->code != ART_END; p++) {
- switch (p->code) {
- case ART_MOVETO_OPEN:
- closed = FALSE;
- *d++ = *p;
- break;
- case ART_MOVETO:
- closed = TRUE;
- break;
- case ART_LINETO:
- case ART_CURVETO:
- if (!closed) *d++ = *p;
- break;
- default:
- g_assert_not_reached ();
- }
- }
-
- d->code = ART_END;
-
- new->end = len;
- new->allclosed = FALSE;
- new->allopen = TRUE;
-
- return new;
-}
-
-/**
- * gnome_canvas_path_def_closed_parts:
- * @path: a GnomeCanvasPathDef
- *
- * This function returns a new GnomeCanvasPathDef that contains the
- * all of close parts of passed @path.
- *
- * Returns: a new GnomeCanvasPathDef that contains all of the closed
- * parts of passed @path.
- */
-GnomeCanvasPathDef *
-gnome_canvas_path_def_closed_parts (const GnomeCanvasPathDef * path)
-{
- GnomeCanvasPathDef * new;
- ArtBpath * p, * d;
- gint len;
- gboolean closed;
-
- g_return_val_if_fail (path != NULL, NULL);
-
- closed = FALSE;
- len = 0;
-
- for (p = path->bpath; p->code != ART_END; p++) {
- switch (p->code) {
- case ART_MOVETO_OPEN:
- closed = FALSE;
- break;
- case ART_MOVETO:
- closed = TRUE;
- len++;
- break;
- case ART_LINETO:
- case ART_CURVETO:
- if (closed) len++;
- break;
- default:
- g_assert_not_reached ();
- }
- }
-
- new = gnome_canvas_path_def_new_sized (len + 1);
-
- closed = FALSE;
- d = new->bpath;
-
- for (p = path->bpath; p->code != ART_END; p++) {
- switch (p->code) {
- case ART_MOVETO_OPEN:
- closed = FALSE;
- break;
- case ART_MOVETO:
- closed = TRUE;
- *d++ = *p;
- break;
- case ART_LINETO:
- case ART_CURVETO:
- if (closed) *d++ = *p;
- break;
- default:
- g_assert_not_reached ();
- }
- }
-
- d->code = ART_END;
-
- new->end = len;
- new->allclosed = TRUE;
- new->allopen = FALSE;
-
- return new;
-}
-
-/**
- * gnome_canvas_path_def_close_all:
- * @path: a GnomeCanvasPathDef
- *
- * This function closes all of the open segments in the passed path
- * and returns a new GnomeCanvasPathDef.
- *
- * Returns: a GnomeCanvasPathDef that contains the contents of @path
- * but has modified the path is fully closed
- */
-GnomeCanvasPathDef *
-gnome_canvas_path_def_close_all (const GnomeCanvasPathDef * path)
-{
- GnomeCanvasPathDef * new;
- ArtBpath * p, * d, * start;
- gint len;
- gboolean closed;
-
- g_return_val_if_fail (path != NULL, NULL);
-
- if (path->allclosed) {
- new = gnome_canvas_path_def_duplicate (path);
- return new;
- }
-
- len = 1;
-
- /* Count MOVETO_OPEN */
-
- for (p = path->bpath; p->code != ART_END; p++) {
- len += 1;
- if (p->code == ART_MOVETO_OPEN) len += 2;
- }
-
- new = gnome_canvas_path_def_new_sized (len);
-
- d = start = new->bpath;
- closed = TRUE;
-
- for (p = path->bpath; p->code != ART_END; p++) {
- switch (p->code) {
- case ART_MOVETO_OPEN:
- start = p;
- closed = FALSE;
- case ART_MOVETO:
- if ((!closed) && ((start->x3 != p->x3) || (start->y3 != p->y3))) {
- d->code = ART_LINETO;
- d->x3 = start->x3;
- d->y3 = start->y3;
- d++;
- }
- if (p->code == ART_MOVETO) closed = TRUE;
- d->code = ART_MOVETO;
- d->x3 = p->x3;
- d->y3 = p->y3;
- d++;
- break;
- case ART_LINETO:
- case ART_CURVETO:
- *d++ = *p;
- break;
- default:
- g_assert_not_reached ();
- }
- }
-
- if ((!closed) && ((start->x3 != p->x3) || (start->y3 != p->y3))) {
- d->code = ART_LINETO;
- d->x3 = start->x3;
- d->y3 = start->y3;
- d++;
- }
-
- d->code = ART_END;
-
- new->end = d - new->bpath;
- new->allclosed = TRUE;
- new->allopen = FALSE;
-
- return new;
-}
-
-/* Destructor */
-
-/**
- * gnome_canvas_path_def_unref:
- * @path: a GnomeCanvasPathDef
- *
- * Decrease the reference count of the passed @path. If the reference
- * count is < 1 the path is deallocated.
- */
-void
-gnome_canvas_path_def_unref (GnomeCanvasPathDef * path)
-{
- g_return_if_fail (path != NULL);
-
- if (--path->refcount < 1) {
- if ((!path->sbpath) && (path->bpath)) art_free (path->bpath);
- g_free (path);
- }
-}
-
-
-/* Methods */
-/**
- * gnome_canvas_path_def_reset:
- * @path: a GnomeCanvasPathDef
- *
- * This function clears the contents of the passed @path.
- */
-void
-gnome_canvas_path_def_reset (GnomeCanvasPathDef * path)
-{
- g_return_if_fail (path != NULL);
- g_return_if_fail (!path->sbpath);
-
- path->bpath->code = ART_END;
- path->end = 0;
- path->hascpt = FALSE;
- path->posset = FALSE;
- path->moving = FALSE;
- path->allclosed = TRUE;
- path->allopen = TRUE;
-}
-
-/* Several consequtive movetos are ALLOWED */
-
-/**
- * gnome_canvas_path_def_moveto:
- * @path: a GnomeCanvasPathDef
- * @x: x coordinate
- * @y: y coordinate
- *
- * This function adds starts new subpath on @path, and sets its
- * starting point to @x and @y. If current subpath is empty, it
- * simply changes its starting coordinates to new values.
- */
-void
-gnome_canvas_path_def_moveto (GnomeCanvasPathDef * path, gdouble x, gdouble y)
-{
- g_return_if_fail (path != NULL);
- g_return_if_fail (!path->sbpath);
- g_return_if_fail (!path->moving);
-
- path->substart = path->end;
- path->hascpt = TRUE;
- path->posset = TRUE;
- path->x = x;
- path->y = y;
-
- path->allclosed = FALSE;
-}
-
-/**
- * gnome_canvas_path_def_lineto:
- * @path: a GnomeCanvasPathDef
- * @x: x coordinate
- * @y: y coordinate
- *
- * This function add a line segment to the passed @path with the
- * specified @x and @y coordinates.
- */
-void
-gnome_canvas_path_def_lineto (GnomeCanvasPathDef * path, gdouble x, gdouble y)
-{
- ArtBpath * bp;
-
- g_return_if_fail (path != NULL);
- g_return_if_fail (!path->sbpath);
- g_return_if_fail (path->hascpt);
-
- if (path->moving) {
- /* simply fix endpoint */
- g_return_if_fail (!path->posset);
- g_return_if_fail (path->end > 1);
- bp = path->bpath + path->end - 1;
- g_return_if_fail (bp->code == ART_LINETO);
- bp->x3 = x;
- bp->y3 = y;
- path->moving = FALSE;
- return;
- }
-
- if (path->posset) {
- /* start a new segment */
- gnome_canvas_path_def_ensure_space (path, 2);
- bp = path->bpath + path->end;
- bp->code = ART_MOVETO_OPEN;
- bp->x3 = path->x;
- bp->y3 = path->y;
- bp++;
- bp->code = ART_LINETO;
- bp->x3 = x;
- bp->y3 = y;
- bp++;
- bp->code = ART_END;
- path->end += 2;
- path->posset = FALSE;
- path->allclosed = FALSE;
- return;
- }
-
- /* Simply add line */
-
- g_return_if_fail (path->end > 1);
- gnome_canvas_path_def_ensure_space (path, 1);
- bp = path->bpath + path->end;
- bp->code = ART_LINETO;
- bp->x3 = x;
- bp->y3 = y;
- bp++;
- bp->code = ART_END;
- path->end++;
-}
-
-
-/**
- * gnome_canvas_path_def_lineto_moving:
- * @path: a GnomeCanvasPathDef
- * @x: x coordinate
- * @y: y coordinate
- *
- * This functions adds a new line segment with loose endpoint to the path, or
- * if endpoint is already loose, changes its coordinates to @x, @y. You
- * can change the coordinates of loose endpoint as many times as you want,
- * the last ones set will be fixed, if you continue line. This is useful
- * for handling drawing with mouse.
- */
-void
-gnome_canvas_path_def_lineto_moving (GnomeCanvasPathDef * path, gdouble x, gdouble y)
-{
- ArtBpath * bp;
-
- g_return_if_fail (path != NULL);
- g_return_if_fail (!path->sbpath);
- g_return_if_fail (path->hascpt);
-
- if (path->moving) {
- /* simply change endpoint */
- g_return_if_fail (!path->posset);
- g_return_if_fail (path->end > 1);
- bp = path->bpath + path->end - 1;
- g_return_if_fail (bp->code == ART_LINETO);
- bp->x3 = x;
- bp->y3 = y;
- return;
- }
-
- if (path->posset) {
- /* start a new segment */
- gnome_canvas_path_def_ensure_space (path, 2);
- bp = path->bpath + path->end;
- bp->code = ART_MOVETO_OPEN;
- bp->x3 = path->x;
- bp->y3 = path->y;
- bp++;
- bp->code = ART_LINETO;
- bp->x3 = x;
- bp->y3 = y;
- bp++;
- bp->code = ART_END;
- path->end += 2;
- path->posset = FALSE;
- path->moving = TRUE;
- path->allclosed = FALSE;
- return;
- }
-
- /* Simply add line */
-
- g_return_if_fail (path->end > 1);
- gnome_canvas_path_def_ensure_space (path, 1);
- bp = path->bpath + path->end;
- bp->code = ART_LINETO;
- bp->x3 = x;
- bp->y3 = y;
- bp++;
- bp->code = ART_END;
- path->end++;
- path->moving = TRUE;
-}
-
-/**
- * gnome_canvas_path_def_curveto:
- * @path: a GnomeCanvasPathDef
- * @x0: first control point x coordinate
- * @y0: first control point y coordinate
- * @x1: second control point x coordinate
- * @y1: second control point y coordinate
- * @x2: end of curve x coordinate
- * @y2: end of curve y coordinate
- *
- * This function adds a bezier curve segment to the path definition.
- */
-
-void
-gnome_canvas_path_def_curveto (GnomeCanvasPathDef * path, gdouble x0, gdouble y0, gdouble x1, gdouble y1, gdouble x2, gdouble y2)
-{
- ArtBpath * bp;
-
- g_return_if_fail (path != NULL);
- g_return_if_fail (!path->sbpath);
- g_return_if_fail (path->hascpt);
- g_return_if_fail (!path->moving);
-
- if (path->posset) {
- /* start a new segment */
- gnome_canvas_path_def_ensure_space (path, 2);
- bp = path->bpath + path->end;
- bp->code = ART_MOVETO_OPEN;
- bp->x3 = path->x;
- bp->y3 = path->y;
- bp++;
- bp->code = ART_CURVETO;
- bp->x1 = x0;
- bp->y1 = y0;
- bp->x2 = x1;
- bp->y2 = y1;
- bp->x3 = x2;
- bp->y3 = y2;
- bp++;
- bp->code = ART_END;
- path->end += 2;
- path->posset = FALSE;
- path->allclosed = FALSE;
- return;
- }
-
- /* Simply add path */
-
- g_return_if_fail (path->end > 1);
- gnome_canvas_path_def_ensure_space (path, 1);
- bp = path->bpath + path->end;
- bp->code = ART_CURVETO;
- bp->x1 = x0;
- bp->y1 = y0;
- bp->x2 = x1;
- bp->y2 = y1;
- bp->x3 = x2;
- bp->y3 = y2;
- bp++;
- bp->code = ART_END;
- path->end++;
-}
-
-/**
- * gnome_canvas_path_def_closepath:
- * @path: a GnomeCanvasPathDef
- *
- * This function closes the last subpath of @path, adding a ART_LINETO to
- * subpath starting point, if needed and changing starting pathcode to
- * ART_MOVETO
- */
-void
-gnome_canvas_path_def_closepath (GnomeCanvasPathDef * path)
-{
- ArtBpath * bs, * be;
-
- g_return_if_fail (path != NULL);
- g_return_if_fail (!path->sbpath);
- g_return_if_fail (path->hascpt);
- g_return_if_fail (!path->posset);
- g_return_if_fail (!path->moving);
- g_return_if_fail (!path->allclosed);
- /* We need at last M + L + L + E */
- g_return_if_fail (path->end - path->substart > 2);
-
- bs = path->bpath + path->substart;
- be = path->bpath + path->end - 1;
-
- if ((bs->x3 != be->x3) || (bs->y3 != be->y3)) {
- gnome_canvas_path_def_lineto (path, bs->x3, bs->y3);
- }
-
- bs = path->bpath + path->substart; /* NB. def_lineto can
- realloc bpath */
- bs->code = ART_MOVETO;
-
- path->allclosed = sp_bpath_all_closed (path->bpath);
- path->allopen = sp_bpath_all_open (path->bpath);
-
- path->hascpt = FALSE;
-}
-
-/**
- * gnome_canvas_path_def_closepath_current:
- * @path: a GnomeCanvasPathDef
- *
- * This function closes the last subpath by setting the coordinates of
- * the endpoint of the last segment (line or curve) to starting point.
- */
-void
-gnome_canvas_path_def_closepath_current (GnomeCanvasPathDef * path)
-{
- ArtBpath * bs, * be;
-
- g_return_if_fail (path != NULL);
- g_return_if_fail (!path->sbpath);
- g_return_if_fail (path->hascpt);
- g_return_if_fail (!path->posset);
- g_return_if_fail (!path->allclosed);
- /* We need at last M + L + L + E */
- g_return_if_fail (path->end - path->substart > 2);
-
- bs = path->bpath + path->substart;
- be = path->bpath + path->end - 1;
-
- be->x3 = bs->x3;
- be->y3 = bs->y3;
-
- bs->code = ART_MOVETO;
-
- path->allclosed = sp_bpath_all_closed (path->bpath);
- path->allopen = sp_bpath_all_open (path->bpath);
-
- path->hascpt = FALSE;
- path->moving = FALSE;
-}
-
-/**
- * gnome_canvas_path_def_bpath:
- * @path: a GnomeCanvasPathDef
- *
- * This function returns a ArtBpath that consists of the path
- * definition.
- *
- * Returns: ArtBpath
- */
-ArtBpath * gnome_canvas_path_def_bpath (const GnomeCanvasPathDef * path)
-{
- g_return_val_if_fail (path != NULL, NULL);
-
- return path->bpath;
-}
-
-/**
- * gnome_canvas_path_def_length:
- * @path: a GnomeCanvasPathDef
- *
- * This function returns the length of the path definition. Not
- * Euclidian length of the path but rather the number of points on the
- * path.
- *
- * Returns: integer, number of points on the path.
- */
-gint gnome_canvas_path_def_length (const GnomeCanvasPathDef * path)
-{
- g_return_val_if_fail (path != NULL, -1);
-
- return path->end + 1;
-}
-
-/**
- * gnome_canvas_path_def_is_empty:
- * @path: a GnomeCanvasPathDef
- *
- * This function is a boolean test to see if the path is empty,
- * meaning containing no line segments.
- *
- * Returns: boolean, indicating if the path is empty.
- */
-gboolean
-gnome_canvas_path_def_is_empty (const GnomeCanvasPathDef * path)
-{
- g_return_val_if_fail (path != NULL, TRUE);
-
- return (path->bpath->code == ART_END);
-}
-
-/**
- * gnome_canvas_path_def_has_currentpoint:
- * @path: a GnomeCanvasPathdef
- *
- * This function is a boolean test checking to see if the path has a
- * current point defined. Current point will be set by line operators,
- * and cleared by closing subpath.
- *
- * Returns: boolean, indicating if the path has a current point defined.
- */
-gboolean
-gnome_canvas_path_def_has_currentpoint (const GnomeCanvasPathDef * path)
-{
- g_return_val_if_fail (path != NULL, FALSE);
-
- return (path->hascpt);
-}
-
-/**
- * gnome_canvas_path_def_currentpoint:
- * @path: a GnomeCanvasPathDef
- * @p: a ArtPoint where to store the current point
- *
- * Stores the current point of the path definition in the passed ArtPoint @p.
- */
-void
-gnome_canvas_path_def_currentpoint (const GnomeCanvasPathDef * path, ArtPoint * p)
-{
- g_return_if_fail (path != NULL);
- g_return_if_fail (p != NULL);
- g_return_if_fail (path->hascpt);
-
- if (path->posset) {
- p->x = path->x;
- p->y = path->y;
- } else {
- p->x = (path->bpath + path->end - 1)->x3;
- p->y = (path->bpath + path->end - 1)->y3;
- }
-}
-
-/**
- * gnome_canvas_path_def_last_bpath:
- * @path: a GnomeCanvasPathDef
- *
- * This function returns pointer to the last ArtBpath segment in the path
- * definition.
- *
- * Returns: ArtBpath, being the last segment in the path definition or
- * null if no line segments have been defined.
- */
-ArtBpath *
-gnome_canvas_path_def_last_bpath (const GnomeCanvasPathDef * path)
-{
- g_return_val_if_fail (path != NULL, NULL);
-
- if (path->end == 0) return NULL;
-
- return path->bpath + path->end - 1;
-}
-
-/**
- * gnome_canvas_path_def_first_bpath:
- * @path: a GnomeCanvasPathDef
- *
- * This function returns the first ArtBpath point in the definition.
- *
- * Returns: ArtBpath being the first point in the path definition or
- * null if no points are defined
-*/
-ArtBpath *
-gnome_canvas_path_def_first_bpath (const GnomeCanvasPathDef * path)
-{
- g_return_val_if_fail (path != NULL, NULL);
-
- if (path->end == 0) return NULL;
-
- return path->bpath;
-}
-
-/**
- * gnome_canvas_path_def_any_open:
- * @path: a GnomeCanvasPathDef
- *
- * This function returns a boolean value indicating if the path has
- * any open segments.
- *
- * Returns: boolean, indicating if the path has any open segments.
- */
-gboolean
-gnome_canvas_path_def_any_open (const GnomeCanvasPathDef * path)
-{
- g_return_val_if_fail (path != NULL, FALSE);
-
- return (!path->allclosed);
-}
-
-/**
- * gnome_canvas_path_def_all_open:
- * @path: a GnomeCanvasPathDef
- *
- * This function returns a boolean value indicating if the path only
- * contains open segments.
- *
- * Returns: boolean, indicating if the path has all open segments.
- */
-gboolean
-gnome_canvas_path_def_all_open (const GnomeCanvasPathDef * path)
-{
- g_return_val_if_fail (path != NULL, FALSE);
-
- return (path->allopen);
-}
-
-/**
- * gnome_canvas_path_def_any_closed:
- * @path: a GnomeCanvasPathDef
- *
- * This function returns a boolean valid indicating if the path has
- * any closed segements.
- *
- * Returns: boolean, indicating if the path has any closed segments.
- */
-gboolean
-gnome_canvas_path_def_any_closed (const GnomeCanvasPathDef * path)
-{
- g_return_val_if_fail (path != NULL, FALSE);
-
- return (!path->allopen);
-}
-
-/**
- * gnome_canvas_path_def_all_closed:
- * @path: a GnomeCanvasPathDef
- *
- * This function returns a boolean value indicating if the path only
- * contains closed segments.
- *
- * Returns: boolean, indicating if the path has all closed segments.
- */
-gboolean
-gnome_canvas_path_def_all_closed (const GnomeCanvasPathDef * path)
-{
- g_return_val_if_fail (path != NULL, FALSE);
-
- return (path->allclosed);
-}
-
-/* Private methods */
-
-static
-gboolean sp_bpath_good (ArtBpath * bpath)
-{
- ArtBpath * bp;
-
- g_return_val_if_fail (bpath != NULL, FALSE);
-
- if (bpath->code == ART_END)
- return TRUE;
-
- bp = bpath;
-
- while (bp->code != ART_END) {
- bp = sp_bpath_check_subpath (bp);
- if (bp == NULL) return FALSE;
- }
-
- return TRUE;
-}
-
-static ArtBpath *
-sp_bpath_check_subpath (ArtBpath * bpath)
-{
- gint i, len;
- gboolean closed;
-
- g_return_val_if_fail (bpath != NULL, NULL);
-
- if (bpath->code == ART_MOVETO) {
- closed = TRUE;
- } else if (bpath->code == ART_MOVETO_OPEN) {
- closed = FALSE;
- } else {
- return NULL;
- }
-
- len = 0;
-
- for (i = 1; (bpath[i].code != ART_END) && (bpath[i].code != ART_MOVETO) && (bpath[i].code != ART_MOVETO_OPEN); i++) {
- switch (bpath[i].code) {
- case ART_LINETO:
- case ART_CURVETO:
- len++;
- break;
- default:
- return NULL;
- }
- }
-
- if (closed) {
- if (len < 2) return NULL;
- if ((bpath->x3 != bpath[i-1].x3) || (bpath->y3 != bpath[i-1].y3)) return NULL;
- } else {
- if (len < 1) return NULL;
- }
-
- return bpath + i;
-}
-
-static gint
-sp_bpath_length (const ArtBpath * bpath)
-{
- gint l;
-
- g_return_val_if_fail (bpath != NULL, FALSE);
-
- for (l = 0; bpath[l].code != ART_END; l++) ;
-
- l++;
-
- return l;
-}
-
-static gboolean
-sp_bpath_all_closed (const ArtBpath * bpath)
-{
- const ArtBpath * bp;
-
- g_return_val_if_fail (bpath != NULL, FALSE);
-
- for (bp = bpath; bp->code != ART_END; bp++)
- if (bp->code == ART_MOVETO_OPEN) return FALSE;
-
- return TRUE;
-}
-
-static gboolean
-sp_bpath_all_open (const ArtBpath * bpath)
-{
- const ArtBpath * bp;
-
- g_return_val_if_fail (bpath != NULL, FALSE);
-
- for (bp = bpath; bp->code != ART_END; bp++)
- if (bp->code == ART_MOVETO) return FALSE;
-
- return TRUE;
-}
-
-
+++ /dev/null
-#ifndef GNOME_CANVAS_PATH_DEF_H
-#define GNOME_CANVAS_PATH_DEF_H
-
-/*
- * GnomeCanvasPathDef
- *
- * (C) 1999-2000 Lauris Kaplinski <lauris@ximian.com>
- * Released under LGPL
- *
- * This is mostly like GnomeCanvasBpathDef, but with added functionality:
- * - can be constructed from scratch, from existing bpath of from static bpath
- * - Path is always terminated with ART_END
- * - Has closed flag
- * - has concat, split and copy methods
- *
- */
-
-#include <glib-object.h>
-#include <libart_lgpl/art_bpath.h>
-
-G_BEGIN_DECLS
-
-typedef struct _GnomeCanvasPathDef GnomeCanvasPathDef;
-
-#define GNOME_TYPE_CANVAS_PATH_DEF (gnome_canvas_path_def_get_type ())
-GType gnome_canvas_path_def_get_type (void) G_GNUC_CONST;
-
-/* Constructors */
-
-GnomeCanvasPathDef * gnome_canvas_path_def_new (void);
-GnomeCanvasPathDef * gnome_canvas_path_def_new_sized (gint length);
-GnomeCanvasPathDef * gnome_canvas_path_def_new_from_bpath (ArtBpath * bpath);
-GnomeCanvasPathDef * gnome_canvas_path_def_new_from_static_bpath (ArtBpath * bpath);
-GnomeCanvasPathDef * gnome_canvas_path_def_new_from_foreign_bpath (ArtBpath * bpath);
-
-void gnome_canvas_path_def_ref (GnomeCanvasPathDef * path);
-void gnome_canvas_path_def_finish (GnomeCanvasPathDef * path);
-void gnome_canvas_path_def_ensure_space (GnomeCanvasPathDef * path, gint space);
-
-/*
- * Misc constructors
- * All these return NEW path, not unrefing old
- * Also copy and duplicate force bpath to be private (otherwise you
- * would use ref :)
- */
-
-void gnome_canvas_path_def_copy (GnomeCanvasPathDef * dst, const GnomeCanvasPathDef * src);
-GnomeCanvasPathDef * gnome_canvas_path_def_duplicate (const GnomeCanvasPathDef * path);
-GnomeCanvasPathDef * gnome_canvas_path_def_concat (const GSList * list);
-GSList * gnome_canvas_path_def_split (const GnomeCanvasPathDef * path);
-GnomeCanvasPathDef * gnome_canvas_path_def_open_parts (const GnomeCanvasPathDef * path);
-GnomeCanvasPathDef * gnome_canvas_path_def_closed_parts (const GnomeCanvasPathDef * path);
-GnomeCanvasPathDef * gnome_canvas_path_def_close_all (const GnomeCanvasPathDef * path);
-
-/* Destructor */
-
-void gnome_canvas_path_def_unref (GnomeCanvasPathDef * path);
-
-/* Methods */
-
-/* Sets GnomeCanvasPathDef to zero length */
-
-void gnome_canvas_path_def_reset (GnomeCanvasPathDef * path);
-
-/* Drawing methods */
-
-void gnome_canvas_path_def_moveto (GnomeCanvasPathDef * path, gdouble x, gdouble y);
-void gnome_canvas_path_def_lineto (GnomeCanvasPathDef * path, gdouble x, gdouble y);
-
-/* Does not create new ArtBpath, but simply changes last lineto position */
-
-void gnome_canvas_path_def_lineto_moving (GnomeCanvasPathDef * path, gdouble x, gdouble y);
-void gnome_canvas_path_def_curveto (GnomeCanvasPathDef * path, gdouble x0, gdouble y0,gdouble x1, gdouble y1, gdouble x2, gdouble y2);
-void gnome_canvas_path_def_closepath (GnomeCanvasPathDef * path);
-
-/* Does not draw new line to startpoint, but moves last lineto */
-
-void gnome_canvas_path_def_closepath_current (GnomeCanvasPathDef * path);
-
-/* Various methods */
-
-ArtBpath * gnome_canvas_path_def_bpath (const GnomeCanvasPathDef * path);
-gint gnome_canvas_path_def_length (const GnomeCanvasPathDef * path);
-gboolean gnome_canvas_path_def_is_empty (const GnomeCanvasPathDef * path);
-gboolean gnome_canvas_path_def_has_currentpoint (const GnomeCanvasPathDef * path);
-void gnome_canvas_path_def_currentpoint (const GnomeCanvasPathDef * path, ArtPoint * p);
-ArtBpath * gnome_canvas_path_def_last_bpath (const GnomeCanvasPathDef * path);
-ArtBpath * gnome_canvas_path_def_first_bpath (const GnomeCanvasPathDef * path);
-gboolean gnome_canvas_path_def_any_open (const GnomeCanvasPathDef * path);
-gboolean gnome_canvas_path_def_all_open (const GnomeCanvasPathDef * path);
-gboolean gnome_canvas_path_def_any_closed (const GnomeCanvasPathDef * path);
-gboolean gnome_canvas_path_def_all_closed (const GnomeCanvasPathDef * path);
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/* GNOME libraries - GdkPixbuf item for the GNOME canvas
- *
- * Copyright (C) 1999 The Free Software Foundation
- *
- * Author: Federico Mena-Quintero <federico@gimp.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library 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.
- */
-
-#include <config.h>
-#include <math.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-util.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <libart_lgpl/art_rgb_affine.h>
-#include <libart_lgpl/art_rgb_rgba_affine.h>
-#include "gnome-canvas-pixbuf.h"
-
-/* Private part of the GnomeCanvasPixbuf structure */
-typedef struct {
- /* Our gdk-pixbuf */
- GdkPixbuf *pixbuf;
-
- /* Width value */
- double width;
-
- /* Height value */
- double height;
-
- /* X translation */
- double x;
-
- /* Y translation */
- double y;
-
- /* Whether dimensions are set and whether they are in pixels or units */
- guint width_set : 1;
- guint width_in_pixels : 1;
- guint height_set : 1;
- guint height_in_pixels : 1;
- guint x_in_pixels : 1;
- guint y_in_pixels : 1;
-
- /* Whether the pixbuf has changed */
- guint need_pixbuf_update : 1;
-
- /* Whether the transformation or size have changed */
- guint need_xform_update : 1;
-
- /* Anchor */
- GtkAnchorType anchor;
-} PixbufPrivate;
-
-/* Object argument IDs */
-enum {
- PROP_0,
- PROP_PIXBUF,
- PROP_WIDTH,
- PROP_WIDTH_SET,
- PROP_WIDTH_IN_PIXELS,
- PROP_HEIGHT,
- PROP_HEIGHT_SET,
- PROP_HEIGHT_IN_PIXELS,
- PROP_X,
- PROP_X_IN_PIXELS,
- PROP_Y,
- PROP_Y_IN_PIXELS,
- PROP_ANCHOR
-};
-
-static void gnome_canvas_pixbuf_class_init (GnomeCanvasPixbufClass *class);
-static void gnome_canvas_pixbuf_init (GnomeCanvasPixbuf *cpb);
-static void gnome_canvas_pixbuf_destroy (GtkObject *object);
-static void gnome_canvas_pixbuf_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_pixbuf_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void gnome_canvas_pixbuf_update (GnomeCanvasItem *item, double *affine,
- ArtSVP *clip_path, int flags);
-static void gnome_canvas_pixbuf_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-static void gnome_canvas_pixbuf_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
-static double gnome_canvas_pixbuf_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item);
-static void gnome_canvas_pixbuf_bounds (GnomeCanvasItem *item,
- double *x1, double *y1, double *x2, double *y2);
-
-static GnomeCanvasItemClass *parent_class;
-
-\f
-
-/**
- * gnome_canvas_pixbuf_get_type:
- * @void:
- *
- * Registers the #GnomeCanvasPixbuf class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #GnomeCanvasPixbuf class.
- **/
-GType
-gnome_canvas_pixbuf_get_type (void)
-{
- static GType pixbuf_type;
-
- if (!pixbuf_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasPixbufClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_pixbuf_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasPixbuf),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_pixbuf_init,
- NULL /* value_table */
- };
-
- pixbuf_type = g_type_register_static (GNOME_TYPE_CANVAS_ITEM, "GnomeCanvasPixbuf",
- &object_info, 0);
- }
-
- return pixbuf_type;
-}
-
-/* Class initialization function for the pixbuf canvas item */
-static void
-gnome_canvas_pixbuf_class_init (GnomeCanvasPixbufClass *class)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- gobject_class = (GObjectClass *) class;
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- parent_class = g_type_class_peek_parent (class);
-
- gobject_class->set_property = gnome_canvas_pixbuf_set_property;
- gobject_class->get_property = gnome_canvas_pixbuf_get_property;
-
- g_object_class_install_property
- (gobject_class,
- PROP_PIXBUF,
- g_param_spec_object ("pixbuf", NULL, NULL,
- GDK_TYPE_PIXBUF,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_WIDTH,
- g_param_spec_double ("width", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_WIDTH_SET,
- g_param_spec_boolean ("width_set", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_WIDTH_IN_PIXELS,
- g_param_spec_boolean ("width_in_pixels", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_HEIGHT,
- g_param_spec_double ("height", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_HEIGHT_SET,
- g_param_spec_boolean ("height_set", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_HEIGHT_IN_PIXELS,
- g_param_spec_boolean ("height_in_pixels", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_X,
- g_param_spec_double ("x", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_X_IN_PIXELS,
- g_param_spec_boolean ("x_in_pixels", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_Y,
- g_param_spec_double ("y", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_Y_IN_PIXELS,
- g_param_spec_boolean ("y_in_pixels", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_ANCHOR,
- g_param_spec_enum ("anchor", NULL, NULL,
- GTK_TYPE_ANCHOR_TYPE,
- GTK_ANCHOR_NW,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- object_class->destroy = gnome_canvas_pixbuf_destroy;
-
- item_class->update = gnome_canvas_pixbuf_update;
- item_class->draw = gnome_canvas_pixbuf_draw;
- item_class->render = gnome_canvas_pixbuf_render;
- item_class->point = gnome_canvas_pixbuf_point;
- item_class->bounds = gnome_canvas_pixbuf_bounds;
-}
-
-/* Object initialization function for the pixbuf canvas item */
-static void
-gnome_canvas_pixbuf_init (GnomeCanvasPixbuf *gcp)
-{
- PixbufPrivate *priv;
-
- priv = g_new0 (PixbufPrivate, 1);
- gcp->priv = priv;
-
- priv->width = 0.0;
- priv->height = 0.0;
- priv->x = 0.0;
- priv->y = 0.0;
- priv->anchor = GTK_ANCHOR_NW;
-}
-
-/* Destroy handler for the pixbuf canvas item */
-static void
-gnome_canvas_pixbuf_destroy (GtkObject *object)
-{
- GnomeCanvasItem *item;
- GnomeCanvasPixbuf *gcp;
- PixbufPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_PIXBUF (object));
-
- item = GNOME_CANVAS_ITEM (object);
- gcp = (GNOME_CANVAS_PIXBUF (object));
- priv = gcp->priv;
-
- /* remember, destroy can be run multiple times! */
-
- if (priv) {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
-
- if (priv->pixbuf)
- g_object_unref (priv->pixbuf);
-
- g_free (priv);
- gcp->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-\f
-
-/* Set_property handler for the pixbuf canvas item */
-static void
-gnome_canvas_pixbuf_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- GnomeCanvasPixbuf *gcp;
- PixbufPrivate *priv;
- GdkPixbuf *pixbuf;
- double val;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_PIXBUF (object));
-
- item = GNOME_CANVAS_ITEM (object);
- gcp = GNOME_CANVAS_PIXBUF (object);
- priv = gcp->priv;
-
- switch (param_id) {
- case PROP_PIXBUF:
- if (g_value_get_object (value))
- pixbuf = GDK_PIXBUF (g_value_get_object (value));
- else
- pixbuf = NULL;
- if (pixbuf != priv->pixbuf) {
- if (pixbuf) {
- g_return_if_fail
- (gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB);
- g_return_if_fail
- (gdk_pixbuf_get_n_channels (pixbuf) == 3
- || gdk_pixbuf_get_n_channels (pixbuf) == 4);
- g_return_if_fail
- (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8);
-
- g_object_ref (pixbuf);
- }
-
- if (priv->pixbuf)
- g_object_unref (priv->pixbuf);
-
- priv->pixbuf = pixbuf;
- }
-
- priv->need_pixbuf_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_WIDTH:
- val = g_value_get_double (value);
- g_return_if_fail (val >= 0.0);
- priv->width = val;
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_WIDTH_SET:
- priv->width_set = g_value_get_boolean (value);
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_WIDTH_IN_PIXELS:
- priv->width_in_pixels = g_value_get_boolean (value);
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_HEIGHT:
- val = g_value_get_double (value);
- g_return_if_fail (val >= 0.0);
- priv->height = val;
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_HEIGHT_SET:
- priv->height_set = g_value_get_boolean (value);
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_HEIGHT_IN_PIXELS:
- priv->height_in_pixels = g_value_get_boolean (value);
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_X:
- priv->x = g_value_get_double (value);
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_X_IN_PIXELS:
- priv->x_in_pixels = g_value_get_boolean (value);
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_Y:
- priv->y = g_value_get_double (value);
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_Y_IN_PIXELS:
- priv->y_in_pixels = g_value_get_boolean (value);
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_ANCHOR:
- priv->anchor = g_value_get_enum (value);
- priv->need_xform_update = TRUE;
- gnome_canvas_item_request_update (item);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-/* Get_property handler for the pixbuf canvasi item */
-static void
-gnome_canvas_pixbuf_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasPixbuf *gcp;
- PixbufPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_PIXBUF (object));
-
- gcp = GNOME_CANVAS_PIXBUF (object);
- priv = gcp->priv;
-
- switch (param_id) {
- case PROP_PIXBUF:
- g_value_set_object (value, G_OBJECT (priv->pixbuf));
- break;
-
- case PROP_WIDTH:
- g_value_set_double (value, priv->width);
- break;
-
- case PROP_WIDTH_SET:
- g_value_set_boolean (value, priv->width_set);
- break;
-
- case PROP_WIDTH_IN_PIXELS:
- g_value_set_boolean (value, priv->width_in_pixels);
- break;
-
- case PROP_HEIGHT:
- g_value_set_double (value, priv->height);
- break;
-
- case PROP_HEIGHT_SET:
- g_value_set_boolean (value, priv->height_set);
- break;
-
- case PROP_HEIGHT_IN_PIXELS:
- g_value_set_boolean (value, priv->height_in_pixels);
- break;
-
- case PROP_X:
- g_value_set_double (value, priv->x);
- break;
-
- case PROP_X_IN_PIXELS:
- g_value_set_boolean (value, priv->x_in_pixels);
- break;
-
- case PROP_Y:
- g_value_set_double (value, priv->y);
- break;
-
- case PROP_Y_IN_PIXELS:
- g_value_set_boolean (value, priv->y_in_pixels);
- break;
-
- case PROP_ANCHOR:
- g_value_set_enum (value, priv->anchor);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-\f
-
-/* Bounds and utilities */
-
-/* Computes the amount by which the unit horizontal and vertical vectors will be
- * scaled by an affine transformation.
- */
-static void
-compute_xform_scaling (double *affine, ArtPoint *i_c, ArtPoint *j_c)
-{
- ArtPoint orig, orig_c;
- ArtPoint i, j;
-
- /* Origin */
-
- orig.x = 0.0;
- orig.y = 0.0;
- art_affine_point (&orig_c, &orig, affine);
-
- /* Horizontal and vertical vectors */
-
- i.x = 1.0;
- i.y = 0.0;
- art_affine_point (i_c, &i, affine);
- i_c->x -= orig_c.x;
- i_c->y -= orig_c.y;
-
- j.x = 0.0;
- j.y = 1.0;
- art_affine_point (j_c, &j, affine);
- j_c->x -= orig_c.x;
- j_c->y -= orig_c.y;
-}
-
-/* computes the addtional resolution dependent affine needed to
- * fit the image within its viewport defined by x,y,width and height
- * args
- */
-static void
-compute_viewport_affine (GnomeCanvasPixbuf *gcp, double *viewport_affine, double *i2c)
-{
- PixbufPrivate *priv;
- ArtPoint i_c, j_c;
- double i_len, j_len;
- double si_len, sj_len;
- double ti_len, tj_len;
- double scale[6], translate[6];
- double w, h;
- double x, y;
-
- priv = gcp->priv;
-
- /* Compute scaling vectors and required width/height */
-
- compute_xform_scaling (i2c, &i_c, &j_c);
-
- i_len = sqrt (i_c.x * i_c.x + i_c.y * i_c.y);
- j_len = sqrt (j_c.x * j_c.x + j_c.y * j_c.y);
-
- if (priv->width_set)
- w = priv->width;
- else
- w = gdk_pixbuf_get_width (priv->pixbuf);
-
- if (priv->height_set)
- h = priv->height;
- else
- h = gdk_pixbuf_get_height (priv->pixbuf);
-
- x = priv->x;
- y = priv->y;
-
- /* Convert i_len and j_len into scaling factors */
-
- if (priv->width_in_pixels) {
- if (i_len > GNOME_CANVAS_EPSILON)
- si_len = 1.0 / i_len;
- else
- si_len = 0.0;
- } else
- si_len = 1.0;
-
- si_len *= w / gdk_pixbuf_get_width (priv->pixbuf);
-
- if (priv->height_in_pixels) {
- if (j_len > GNOME_CANVAS_EPSILON)
- sj_len = 1.0 / j_len;
- else
- sj_len = 0.0;
- } else
- sj_len = 1.0;
-
- sj_len *= h / gdk_pixbuf_get_height (priv->pixbuf);
-
- /* Calculate translation offsets */
-
- if (priv->x_in_pixels) {
- if (i_len > GNOME_CANVAS_EPSILON)
- ti_len = 1.0 / i_len;
- else
- ti_len = 0.0;
- } else
- ti_len = 1.0;
-
- switch (priv->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- ti_len *= x;
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- ti_len *= x - w * si_len / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- ti_len *= x - w * si_len;
- break;
-
- default:
- break;
- }
-
- if (priv->y_in_pixels) {
- if (j_len > GNOME_CANVAS_EPSILON)
- tj_len = 1.0 / j_len;
- else
- tj_len = 0.0;
- } else
- tj_len = 1.0;
-
- switch (priv->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- tj_len *= y;
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- tj_len *= y - h * sj_len / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- tj_len *= y - h * sj_len;
- break;
-
- default:
- break;
- }
-
- /* Compute the final affine */
-
- art_affine_scale (scale, si_len, sj_len);
- art_affine_translate (translate, ti_len, tj_len);
- art_affine_multiply (viewport_affine, scale, translate);
-}
-
-/* Computes the affine transformation with which the pixbuf needs to be
- * transformed to render it on the canvas. This is not the same as the
- * item_to_canvas transformation because we may need to scale the pixbuf
- * by some other amount.
- */
-static void
-compute_render_affine (GnomeCanvasPixbuf *gcp, double *ra, double *i2c)
-{
- double va[6];
-
- compute_viewport_affine (gcp, va, i2c);
-#ifdef GNOME_CANVAS_PIXBUF_VERBOSE
- g_print ("va %g %g %g %g %g %g\n", va[0], va[1], va[2], va[3], va[4], va[5]);
-#endif
- art_affine_multiply (ra, va, i2c);
-#ifdef GNOME_CANVAS_PIXBUF_VERBOSE
- g_print ("ra %g %g %g %g %g %g\n", ra[0], ra[1], ra[2], ra[3], ra[4], ra[5]);
-#endif
-}
-
-/* Recomputes the bounding box of a pixbuf canvas item. The horizontal and
- * vertical dimensions may be specified in units or pixels, separately, so we
- * have to compute the components individually for each dimension.
- */
-static void
-recompute_bounding_box (GnomeCanvasPixbuf *gcp, gdouble *i2c)
-{
- GnomeCanvasItem *item;
- PixbufPrivate *priv;
- double ra[6];
- ArtDRect rect;
-
- item = GNOME_CANVAS_ITEM (gcp);
- priv = gcp->priv;
-
- if (!priv->pixbuf) {
- item->x1 = item->y1 = item->x2 = item->y2 = 0.0;
- return;
- }
-
- rect.x0 = 0.0;
- rect.x1 = gdk_pixbuf_get_width (priv->pixbuf);
-
- rect.y0 = 0.0;
- rect.y1 = gdk_pixbuf_get_height (priv->pixbuf);
-
-#ifdef GNOME_CANVAS_PIXBUF_VERBOSE
- g_print ("i2c %g %g %g %g %g %g\n", i2c[0], i2c[1], i2c[2], i2c[3], i2c[4], i2c[5]);
-#endif
- gnome_canvas_item_i2c_affine (item, i2c);
-#ifdef GNOME_CANVAS_PIXBUF_VERBOSE
- g_print ("i2c %g %g %g %g %g %g\n", i2c[0], i2c[1], i2c[2], i2c[3], i2c[4], i2c[5]);
-#endif
- compute_render_affine (gcp, ra, i2c);
-#ifdef GNOME_CANVAS_PIXBUF_VERBOSE
- g_print ("ra %g %g %g %g %g %g\n", ra[0], ra[1], ra[2], ra[3], ra[4], ra[5]);
-#endif
- art_drect_affine_transform (&rect, &rect, ra);
-
- item->x1 = floor (rect.x0);
- item->y1 = floor (rect.y0);
- item->x2 = ceil (rect.x1);
- item->y2 = ceil (rect.y1);
-}
-
-\f
-
-/* Update sequence */
-
-/* Update handler for the pixbuf canvas item */
-static void
-gnome_canvas_pixbuf_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- GnomeCanvasPixbuf *gcp;
- PixbufPrivate *priv;
-
- gcp = GNOME_CANVAS_PIXBUF (item);
- priv = gcp->priv;
-
- if (parent_class->update)
- (* parent_class->update) (item, affine, clip_path, flags);
-
- /* the optimzations below cause rarely triggered redrawing bugs and
- * don't seem to actually save much performance. so it's probably
- * better to turn them off, than to chase subtle optimization bugs
- * throughgout all of gnome-canvas-pixbuf.c - TIMJ
- */
-#ifdef USE_BROKEN_OPTIMIZATIONS
- if (((flags & GNOME_CANVAS_UPDATE_VISIBILITY)
- && !(GTK_OBJECT_FLAGS (item) & GNOME_CANVAS_ITEM_VISIBLE))
- || (flags & GNOME_CANVAS_UPDATE_AFFINE)
- || priv->need_pixbuf_update
- || priv->need_xform_update) {
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- }
-
- /* If we need a pixbuf update, or if the item changed visibility to
- * shown, recompute the bounding box.
- */
- if (priv->need_pixbuf_update
- || priv->need_xform_update
- || ((flags & GNOME_CANVAS_UPDATE_VISIBILITY)
- && (GTK_OBJECT_FLAGS (gcp) & GNOME_CANVAS_ITEM_VISIBLE))
- || (flags & GNOME_CANVAS_UPDATE_AFFINE)) {
- recompute_bounding_box (gcp, affine);
-#ifdef GNOME_CANVAS_PIXBUF_VERBOSE
- g_print ("BBox is %g %g %g %g\n", item->x1, item->y1, item->x2, item->y2);
-#endif
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- priv->need_pixbuf_update = FALSE;
- priv->need_xform_update = FALSE;
- }
-#else /* ordinary update logic */
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- recompute_bounding_box (gcp, affine);
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- priv->need_pixbuf_update = FALSE;
- priv->need_xform_update = FALSE;
-#endif
-}
-
-\f
-
-/* Rendering */
-
-/* This is private to libart, but we need it. Sigh. */
-extern void art_rgb_affine_run (int *p_x0, int *p_x1, int y, int src_width, int src_height,
- const double affine[6]);
-
-/* Fills the specified buffer with the transformed version of a pixbuf */
-static void
-transform_pixbuf (guchar *dest, int x, int y, int width, int height, int rowstride,
- GdkPixbuf *pixbuf, double *affine)
-{
- int xx, yy;
- double inv[6];
- guchar *src, *d;
- ArtPoint src_p, dest_p;
- int run_x1, run_x2;
- int src_x, src_y;
- int i;
-
- art_affine_invert (inv, affine);
-
- for (yy = 0; yy < height; yy++) {
- dest_p.y = y + yy + 0.5;
-
- run_x1 = x;
- run_x2 = x + width;
- art_rgb_affine_run (&run_x1, &run_x2, yy + y,
- gdk_pixbuf_get_width (pixbuf),
- gdk_pixbuf_get_height (pixbuf),
- inv);
-
- d = dest + yy * rowstride + (run_x1 - x) * 4;
-
- for (xx = run_x1; xx < run_x2; xx++) {
- dest_p.x = xx + 0.5;
- art_affine_point (&src_p, &dest_p, inv);
- src_x = floor (src_p.x);
- src_y = floor (src_p.y);
-
- src =
- gdk_pixbuf_get_pixels (pixbuf) + src_y *
- gdk_pixbuf_get_rowstride (pixbuf) + src_x *
- gdk_pixbuf_get_n_channels (pixbuf);
-
- for (i = 0; i < gdk_pixbuf_get_n_channels (pixbuf); i++)
- *d++ = *src++;
-
- if (!gdk_pixbuf_get_has_alpha(pixbuf))
- *d++ = 255; /* opaque */
- }
- }
-}
-
-/* Draw handler for the pixbuf canvas item */
-static void
-gnome_canvas_pixbuf_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- GnomeCanvasPixbuf *gcp;
- PixbufPrivate *priv;
- double i2c[6], render_affine[6];
- guchar *buf;
- GdkPixbuf *pixbuf;
- ArtIRect p_rect, a_rect, d_rect;
- int w, h;
-
- gcp = GNOME_CANVAS_PIXBUF (item);
- priv = gcp->priv;
-
- if (!priv->pixbuf)
- return;
-
- gnome_canvas_item_i2c_affine (item, i2c);
- compute_render_affine (gcp, render_affine, i2c);
-
- /* Compute the area we need to repaint */
-
- p_rect.x0 = item->x1;
- p_rect.y0 = item->y1;
- p_rect.x1 = item->x2;
- p_rect.y1 = item->y2;
-
- a_rect.x0 = x;
- a_rect.y0 = y;
- a_rect.x1 = x + width;
- a_rect.y1 = y + height;
-
- art_irect_intersect (&d_rect, &p_rect, &a_rect);
- if (art_irect_empty (&d_rect))
- return;
-
- /* Create a temporary buffer and transform the pixbuf there */
-
- w = d_rect.x1 - d_rect.x0;
- h = d_rect.y1 - d_rect.y0;
-
- buf = g_new0 (guchar, w * h * 4);
- transform_pixbuf (buf,
- d_rect.x0, d_rect.y0,
- w, h,
- w * 4,
- priv->pixbuf, render_affine);
-
- pixbuf = gdk_pixbuf_new_from_data (buf, GDK_COLORSPACE_RGB,
- TRUE,
- 8, w, h,
- w * 4,
- NULL, NULL);
-
- gdk_draw_pixbuf (drawable, NULL, pixbuf,
- 0, 0,
- d_rect.x0 - x, d_rect.y0 - y,
- w, h,
- GDK_RGB_DITHER_MAX,
- d_rect.x0, d_rect.y0);
-
- g_object_unref (pixbuf);
- g_free (buf);
-}
-
-/* Render handler for the pixbuf canvas item */
-static void
-gnome_canvas_pixbuf_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
-{
- GnomeCanvasPixbuf *gcp;
- PixbufPrivate *priv;
- double i2c[6], render_affine[6];
-
- gcp = GNOME_CANVAS_PIXBUF (item);
- priv = gcp->priv;
-
- if (!priv->pixbuf)
- return;
-
- gnome_canvas_item_i2c_affine (item, i2c);
- compute_render_affine (gcp, render_affine, i2c);
- gnome_canvas_buf_ensure_buf (buf);
-
-
- if ((fabs (render_affine[1]) < GNOME_CANVAS_EPSILON) &&
- (fabs (render_affine[2]) < GNOME_CANVAS_EPSILON) &&
- render_affine[0] > 0.0 &&
- render_affine[3] > 0.0)
- {
- GdkPixbuf *dest_pixbuf;
- int x0, y0, x1, y1;
-
- dest_pixbuf = gdk_pixbuf_new_from_data (buf->buf,
- GDK_COLORSPACE_RGB,
- FALSE,
- 8,
- buf->rect.x1 - buf->rect.x0,
- buf->rect.y1 - buf->rect.y0,
- buf->buf_rowstride,
- NULL, NULL);
-
-
- x0 = floor (render_affine[4] - buf->rect.x0 + 0.5);
- y0 = floor (render_affine[5] - buf->rect.y0 + 0.5);
-
- x1 = x0 + floor (gdk_pixbuf_get_width (priv->pixbuf) * render_affine[0] + 0.5);
- y1 = y0 + floor (gdk_pixbuf_get_height (priv->pixbuf) * render_affine[3] + 0.5);
-
- x0 = MAX (x0, 0);
- x0 = MIN (x0, buf->rect.x1 - buf->rect.x0);
- y0 = MAX (y0, 0);
- y0 = MIN (y0, buf->rect.y1 - buf->rect.y0);
-
- x1 = MAX (x1, 0);
- x1 = MIN (x1, buf->rect.x1 - buf->rect.x0);
- y1 = MAX (y1, 0);
- y1 = MIN (y1, buf->rect.y1 - buf->rect.y0);
-
- gdk_pixbuf_composite (priv->pixbuf,
- dest_pixbuf,
- x0, y0,
- x1 - x0, y1 - y0,
- render_affine[4] - buf->rect.x0,
- render_affine[5] - buf->rect.y0,
- render_affine[0],
- render_affine[3],
- GDK_INTERP_BILINEAR,
- 255);
-
- g_object_unref (dest_pixbuf);
- }
- else if (gdk_pixbuf_get_has_alpha(priv->pixbuf))
- art_rgb_rgba_affine (buf->buf,
- buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1,
- buf->buf_rowstride,
- gdk_pixbuf_get_pixels(priv->pixbuf),
- gdk_pixbuf_get_width(priv->pixbuf),
- gdk_pixbuf_get_height(priv->pixbuf),
- gdk_pixbuf_get_rowstride(priv->pixbuf),
- render_affine,
- ART_FILTER_NEAREST,
- NULL);
- else
- art_rgb_affine (buf->buf,
- buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1,
- buf->buf_rowstride,
- gdk_pixbuf_get_pixels(priv->pixbuf),
- gdk_pixbuf_get_width(priv->pixbuf),
- gdk_pixbuf_get_height(priv->pixbuf),
- gdk_pixbuf_get_rowstride(priv->pixbuf),
- render_affine,
- ART_FILTER_NEAREST,
- NULL);
-
- buf->is_bg = 0;
-}
-
-\f
-
-/* Point handler for the pixbuf canvas item */
-static double
-gnome_canvas_pixbuf_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- GnomeCanvasPixbuf *gcp;
- PixbufPrivate *priv;
- double i2c[6], render_affine[6], inv[6];
- ArtPoint c, p;
- int px, py;
- double no_hit;
- guchar *src;
- GdkPixbuf *pixbuf;
-
- gcp = GNOME_CANVAS_PIXBUF (item);
- priv = gcp->priv;
- pixbuf = priv->pixbuf;
-
- *actual_item = item;
-
- no_hit = item->canvas->pixels_per_unit * 2 + 10;
-
- if (!priv->pixbuf)
- return no_hit;
-
- gnome_canvas_item_i2c_affine (item, i2c);
- compute_render_affine (gcp, render_affine, i2c);
- art_affine_invert (inv, render_affine);
-
- c.x = cx;
- c.y = cy;
- art_affine_point (&p, &c, inv);
- px = p.x;
- py = p.y;
-
- if (px < 0 || px >= gdk_pixbuf_get_width (pixbuf) ||
- py < 0 || py >= gdk_pixbuf_get_height (pixbuf))
- return no_hit;
-
- if (!gdk_pixbuf_get_has_alpha (pixbuf))
- return 0.0;
-
- src = gdk_pixbuf_get_pixels (pixbuf) +
- py * gdk_pixbuf_get_rowstride (pixbuf) +
- px * gdk_pixbuf_get_n_channels (pixbuf);
-
- if (src[3] < 128)
- return no_hit;
- else
- return 0.0;
-}
-
-\f
-
-/* Bounds handler for the pixbuf canvas item */
-static void
-gnome_canvas_pixbuf_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- GnomeCanvasPixbuf *gcp;
- PixbufPrivate *priv;
- double i2c[6], viewport_affine[6];
- ArtDRect rect;
-
- gcp = GNOME_CANVAS_PIXBUF (item);
- priv = gcp->priv;
-
- if (!priv->pixbuf) {
- *x1 = *y1 = *x2 = *y2 = 0.0;
- return;
- }
-
- rect.x0 = 0.0;
- rect.x1 = gdk_pixbuf_get_width (priv->pixbuf);
-
- rect.y0 = 0.0;
- rect.y1 = gdk_pixbuf_get_height (priv->pixbuf);
-
- gnome_canvas_item_i2c_affine (item, i2c);
- compute_viewport_affine (gcp, viewport_affine, i2c);
- art_drect_affine_transform (&rect, &rect, viewport_affine);
-
- *x1 = rect.x0;
- *y1 = rect.y0;
- *x2 = rect.x1;
- *y2 = rect.y1;
-}
+++ /dev/null
-/* GNOME libraries - GdkPixbuf item for the GNOME canvas
- *
- * Copyright (C) 1999 The Free Software Foundation
- *
- * Author: Federico Mena-Quintero <federico@gimp.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library 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.
- */
-
-#ifndef GNOME_CANVAS_PIXBUF_H
-#define GNOME_CANVAS_PIXBUF_H
-
-
-#include <libgnomecanvas/gnome-canvas.h>
-
-G_BEGIN_DECLS
-
-\f
-
-#define GNOME_TYPE_CANVAS_PIXBUF (gnome_canvas_pixbuf_get_type ())
-#define GNOME_CANVAS_PIXBUF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_PIXBUF, GnomeCanvasPixbuf))
-#define GNOME_CANVAS_PIXBUF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_PIXBUF, GnomeCanvasPixbufClass))
-#define GNOME_IS_CANVAS_PIXBUF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_PIXBUF))
-#define GNOME_IS_CANVAS_PIXBUF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_PIXBUF))
-#define GNOME_CANVAS_PIXBUF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_PIXBUF, GnomeCanvasPixbufClass))
-
-
-typedef struct _GnomeCanvasPixbuf GnomeCanvasPixbuf;
-typedef struct _GnomeCanvasPixbufClass GnomeCanvasPixbufClass;
-
-struct _GnomeCanvasPixbuf {
- GnomeCanvasItem item;
-
- /* Private data */
- gpointer priv;
-};
-
-struct _GnomeCanvasPixbufClass {
- GnomeCanvasItemClass parent_class;
-};
-
-
-GType gnome_canvas_pixbuf_get_type (void) G_GNUC_CONST;
-
-\f
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* Polygon item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- * Rusty Conover <rconover@bangtail.net>
- */
-
-#include <config.h>
-#include <math.h>
-#include <string.h>
-#include "libart_lgpl/art_vpath.h"
-#include "libart_lgpl/art_svp.h"
-#include "libart_lgpl/art_svp_vpath.h"
-#include "libart_lgpl/art_svp_vpath_stroke.h"
-#include "libgnomecanvas.h"
-
-#include "gnome-canvas-shape.h"
-
-#define NUM_STATIC_POINTS 256 /* Number of static points to use to avoid allocating arrays */
-
-enum {
- PROP_0,
- PROP_POINTS
-};
-
-static void gnome_canvas_polygon_class_init (GnomeCanvasPolygonClass *class);
-static void gnome_canvas_polygon_init (GnomeCanvasPolygon *poly);
-static void gnome_canvas_polygon_destroy (GtkObject *object);
-static void gnome_canvas_polygon_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_polygon_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void gnome_canvas_polygon_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
-
-static GnomeCanvasItemClass *parent_class;
-
-GType
-gnome_canvas_polygon_get_type (void)
-{
- static GType polygon_type;
-
- if (!polygon_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasPolygonClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_polygon_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasPolygon),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_polygon_init,
- NULL /* value_table */
- };
-
- polygon_type = g_type_register_static (GNOME_TYPE_CANVAS_SHAPE, "GnomeCanvasPolygon",
- &object_info, 0);
- }
-
- return polygon_type;
-}
-
-static void
-gnome_canvas_polygon_class_init (GnomeCanvasPolygonClass *class)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- gobject_class = (GObjectClass *) class;
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- parent_class = g_type_class_peek_parent (class);
-
- gobject_class->set_property = gnome_canvas_polygon_set_property;
- gobject_class->get_property = gnome_canvas_polygon_get_property;
-
- g_object_class_install_property
- (gobject_class,
- PROP_POINTS,
- g_param_spec_boxed ("points", NULL, NULL,
- GNOME_TYPE_CANVAS_POINTS,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- object_class->destroy = gnome_canvas_polygon_destroy;
-
- item_class->update = gnome_canvas_polygon_update;
-}
-
-static void
-gnome_canvas_polygon_init (GnomeCanvasPolygon *poly)
-{
- poly->path_def = NULL;
-}
-
-static void
-gnome_canvas_polygon_destroy (GtkObject *object)
-{
- GnomeCanvasPolygon *poly;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_POLYGON (object));
-
- poly = GNOME_CANVAS_POLYGON (object);
-
- /* remember, destroy can be run multiple times! */
-
- if(poly->path_def)
- gnome_canvas_path_def_unref(poly->path_def);
-
- poly->path_def = NULL;
-
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-static void
-set_points (GnomeCanvasPolygon *poly, GnomeCanvasPoints *points)
-{
- int i;
-
-
- if (poly->path_def)
- gnome_canvas_path_def_unref(poly->path_def);
-
- if (!points) {
- poly->path_def = gnome_canvas_path_def_new();
- gnome_canvas_shape_set_path_def (GNOME_CANVAS_SHAPE (poly), poly->path_def);
- return;
- }
-
-
- /* Optomize the path def to the number of points */
- poly->path_def = gnome_canvas_path_def_new_sized(points->num_points+1);
-
-#if 0
- /* No need for explicit duplicate, as closepaths does it for us (Lauris) */
- /* See if we need to duplicate the first point */
- duplicate = ((points->coords[0] != points->coords[2 * points->num_points - 2])
- || (points->coords[1] != points->coords[2 * points->num_points - 1]));
-#endif
-
-
- gnome_canvas_path_def_moveto (poly->path_def, points->coords[0], points->coords[1]);
-
- for (i = 1; i < points->num_points; i++) {
- gnome_canvas_path_def_lineto(poly->path_def, points->coords[i * 2], points->coords[(i * 2) + 1]);
- }
-
- gnome_canvas_path_def_closepath (poly->path_def);
-
- gnome_canvas_shape_set_path_def (GNOME_CANVAS_SHAPE (poly), poly->path_def);
-}
-
-
-static void
-gnome_canvas_polygon_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- GnomeCanvasPolygon *poly;
- GnomeCanvasPoints *points;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_POLYGON (object));
-
- item = GNOME_CANVAS_ITEM (object);
- poly = GNOME_CANVAS_POLYGON (object);
-
- switch (param_id) {
- case PROP_POINTS:
- points = g_value_get_boxed (value);
-
- set_points (poly, points);
-
- gnome_canvas_item_request_update (item);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-
-static void
-gnome_canvas_polygon_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_POLYGON (object));
-
- switch (param_id) {
- case PROP_POINTS:
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-
-static void
-gnome_canvas_polygon_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- /* Since the path has already been defined just pass the update up. */
-
- if (parent_class->update)
- (* parent_class->update) (item, affine, clip_path, flags);
-}
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* Polygon item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- * Rusty Conover <rconover@bangtail.net>
- */
-
-#ifndef GNOME_CANVAS_POLYGON_H
-#define GNOME_CANVAS_POLYGON_H
-
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-shape.h>
-#include <libgnomecanvas/gnome-canvas-path-def.h>
-
-G_BEGIN_DECLS
-
-
-/* Polygon item for the canvas. A polygon is a bit different from rectangles and ellipses in that
- * points inside it will always be considered "inside", even if the fill color is not set. If you
- * want to have a hollow polygon, use a line item instead.
- *
- * The following object arguments are available:
- *
- * name type read/write description
- * ------------------------------------------------------------------------------------------
- * points GnomeCanvasPoints* RW Pointer to a GnomeCanvasPoints structure.
- * This can be created by a call to
- * gnome_canvas_points_new() (in gnome-canvas-util.h).
- * X coordinates are in the even indices of the
- * points->coords array, Y coordinates are in
- * the odd indices.
- */
-
-#define GNOME_TYPE_CANVAS_POLYGON (gnome_canvas_polygon_get_type ())
-#define GNOME_CANVAS_POLYGON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_POLYGON, GnomeCanvasPolygon))
-#define GNOME_CANVAS_POLYGON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_POLYGON, GnomeCanvasPolygonClass))
-#define GNOME_IS_CANVAS_POLYGON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_POLYGON))
-#define GNOME_IS_CANVAS_POLYGON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_POLYGON))
-#define GNOME_CANVAS_POLYGON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_POLYGON, GnomeCanvasPolygonClass))
-
-
-typedef struct _GnomeCanvasPolygon GnomeCanvasPolygon;
-typedef struct _GnomeCanvasPolygonClass GnomeCanvasPolygonClass;
-
-struct _GnomeCanvasPolygon {
- GnomeCanvasShape item;
-
- GnomeCanvasPathDef *path_def;
-};
-
-struct _GnomeCanvasPolygonClass {
- GnomeCanvasShapeClass parent_class;
-};
-
-
-/* Standard Gtk function */
-GType gnome_canvas_polygon_get_type (void) G_GNUC_CONST;
-
-G_END_DECLS
-#endif
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* Rectangle and ellipse item types for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Authors: Federico Mena <federico@nuclecu.unam.mx>
- * Rusty Conover <rconover@bangtail.net>
- */
-
-#include <config.h>
-#include <math.h>
-#include "gnome-canvas-rect-ellipse.h"
-#include "gnome-canvas-util.h"
-#include "gnome-canvas-shape.h"
-
-
-#include "libart_lgpl/art_vpath.h"
-#include "libart_lgpl/art_svp.h"
-#include "libart_lgpl/art_svp_vpath.h"
-#include "libart_lgpl/art_rgb_svp.h"
-
-/* Base class for rectangle and ellipse item types */
-
-#define noVERBOSE
-
-enum {
- PROP_0,
- PROP_X1,
- PROP_Y1,
- PROP_X2,
- PROP_Y2
-};
-
-
-static void gnome_canvas_re_class_init (GnomeCanvasREClass *class);
-static void gnome_canvas_re_init (GnomeCanvasRE *re);
-static void gnome_canvas_re_destroy (GtkObject *object);
-static void gnome_canvas_re_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_re_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void gnome_canvas_rect_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
-static void gnome_canvas_ellipse_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
-
-static GnomeCanvasItemClass *re_parent_class;
-
-
-GType
-gnome_canvas_re_get_type (void)
-{
- static GType re_type;
-
- if (!re_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasREClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_re_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasRE),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_re_init,
- NULL /* value_table */
- };
-
- re_type = g_type_register_static (GNOME_TYPE_CANVAS_SHAPE, "GnomeCanvasRE",
- &object_info, 0);
- }
-
- return re_type;
-}
-
-static void
-gnome_canvas_re_class_init (GnomeCanvasREClass *class)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
-
- gobject_class = (GObjectClass *) class;
- object_class = (GtkObjectClass *) class;
-
- re_parent_class = g_type_class_peek_parent (class);
-
- gobject_class->set_property = gnome_canvas_re_set_property;
- gobject_class->get_property = gnome_canvas_re_get_property;
-
- g_object_class_install_property
- (gobject_class,
- PROP_X1,
- g_param_spec_double ("x1", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_Y1,
- g_param_spec_double ("y1", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_X2,
- g_param_spec_double ("x2", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_Y2,
- g_param_spec_double ("y2", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- object_class->destroy = gnome_canvas_re_destroy;
-}
-
-static void
-gnome_canvas_re_init (GnomeCanvasRE *re)
-{
- re->x1 = 0.0;
- re->y1 = 0.0;
- re->x2 = 0.0;
- re->y2 = 0.0;
- re->path_dirty = 0;
-}
-
-static void
-gnome_canvas_re_destroy (GtkObject *object)
-{
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_RE (object));
-
- if (GTK_OBJECT_CLASS (re_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (re_parent_class)->destroy) (object);
-}
-
-static void
-gnome_canvas_re_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- GnomeCanvasRE *re;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_RE (object));
-
- item = GNOME_CANVAS_ITEM (object);
- re = GNOME_CANVAS_RE (object);
-
- switch (param_id) {
- case PROP_X1:
- re->x1 = g_value_get_double (value);
- re->path_dirty = 1;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_Y1:
- re->y1 = g_value_get_double (value);
- re->path_dirty = 1;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_X2:
- re->x2 = g_value_get_double (value);
- re->path_dirty = 1;
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_Y2:
- re->y2 = g_value_get_double (value);
- re->path_dirty = 1;
- gnome_canvas_item_request_update (item);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-gnome_canvas_re_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasRE *re;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_RE (object));
-
- re = GNOME_CANVAS_RE (object);
-
- switch (param_id) {
- case PROP_X1:
- g_value_set_double (value, re->x1);
- break;
-
- case PROP_Y1:
- g_value_set_double (value, re->y1);
- break;
-
- case PROP_X2:
- g_value_set_double (value, re->x2);
- break;
-
- case PROP_Y2:
- g_value_set_double (value, re->y2);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-/* Rectangle item */
-static void gnome_canvas_rect_class_init (GnomeCanvasRectClass *class);
-
-
-
-GType
-gnome_canvas_rect_get_type (void)
-{
- static GType rect_type;
-
- if (!rect_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasRectClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_rect_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasRect),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL,
- NULL /* value_table */
- };
-
- rect_type = g_type_register_static (GNOME_TYPE_CANVAS_RE, "GnomeCanvasRect",
- &object_info, 0);
- }
-
- return rect_type;
-}
-
-static void
-gnome_canvas_rect_class_init (GnomeCanvasRectClass *class)
-{
- GnomeCanvasItemClass *item_class;
-
- item_class = (GnomeCanvasItemClass *) class;
-
- item_class->update = gnome_canvas_rect_update;
-}
-
-static void
-gnome_canvas_rect_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags)
-{ GnomeCanvasRE *re;
-
- GnomeCanvasPathDef *path_def;
-
- re = GNOME_CANVAS_RE(item);
-
- if (re->path_dirty) {
- path_def = gnome_canvas_path_def_new ();
-
- gnome_canvas_path_def_moveto(path_def, re->x1, re->y1);
- gnome_canvas_path_def_lineto(path_def, re->x2, re->y1);
- gnome_canvas_path_def_lineto(path_def, re->x2, re->y2);
- gnome_canvas_path_def_lineto(path_def, re->x1, re->y2);
- gnome_canvas_path_def_lineto(path_def, re->x1, re->y1);
- gnome_canvas_path_def_closepath_current(path_def);
- gnome_canvas_shape_set_path_def (GNOME_CANVAS_SHAPE (item), path_def);
- gnome_canvas_path_def_unref(path_def);
- re->path_dirty = 0;
- }
-
- if (re_parent_class->update)
- (* re_parent_class->update) (item, affine, clip_path, flags);
-}
-
-/* Ellipse item */
-
-
-static void gnome_canvas_ellipse_class_init (GnomeCanvasEllipseClass *class);
-
-
-GType
-gnome_canvas_ellipse_get_type (void)
-{
- static GType ellipse_type;
-
- if (!ellipse_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasEllipseClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_ellipse_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasEllipse),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL,
- NULL /* value_table */
- };
-
- ellipse_type = g_type_register_static (GNOME_TYPE_CANVAS_RE, "GnomeCanvasEllipse",
- &object_info, 0);
- }
-
- return ellipse_type;
-}
-
-static void
-gnome_canvas_ellipse_class_init (GnomeCanvasEllipseClass *class)
-{
- GnomeCanvasItemClass *item_class;
-
- item_class = (GnomeCanvasItemClass *) class;
-
- item_class->update = gnome_canvas_ellipse_update;
-}
-
-#define N_PTS 90
-
-static void
-gnome_canvas_ellipse_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags) {
- GnomeCanvasPathDef *path_def;
- GnomeCanvasRE *re;
-
- re = GNOME_CANVAS_RE(item);
-
- if (re->path_dirty) {
- gdouble cx, cy, rx, ry;
- gdouble beta = 0.26521648983954400922; /* 4*(1-cos(pi/8))/(3*sin(pi/8)) */
- gdouble sincosA = 0.70710678118654752440; /* sin (pi/4), cos (pi/4) */
- gdouble dx1, dy1, dx2, dy2;
- gdouble mx, my;
-
- path_def = gnome_canvas_path_def_new();
-
- cx = (re->x2 + re->x1) * 0.5;
- cy = (re->y2 + re->y1) * 0.5;
- rx = re->x2 - cx;
- ry = re->y2 - cy;
-
- dx1 = beta * rx;
- dy1 = beta * ry;
- dx2 = beta * rx * sincosA;
- dy2 = beta * ry * sincosA;
- mx = rx * sincosA;
- my = ry * sincosA;
-
- gnome_canvas_path_def_moveto (path_def, cx + rx, cy);
- gnome_canvas_path_def_curveto (path_def,
- cx + rx, cy - dy1,
- cx + mx + dx2, cy - my + dy2,
- cx + mx, cy - my);
- gnome_canvas_path_def_curveto (path_def,
- cx + mx - dx2, cy - my - dy2,
- cx + dx1, cy - ry,
- cx, cy - ry);
- gnome_canvas_path_def_curveto (path_def,
- cx - dx1, cy - ry,
- cx - mx + dx2, cy - my - dy2,
- cx - mx, cy - my);
- gnome_canvas_path_def_curveto (path_def,
- cx - mx - dx2, cy - my + dy2,
- cx - rx, cy - dy1,
- cx - rx, cy);
-
- gnome_canvas_path_def_curveto (path_def,
- cx - rx, cy + dy1,
- cx - mx - dx2, cy + my - dy2,
- cx - mx, cy + my);
- gnome_canvas_path_def_curveto (path_def,
- cx - mx + dx2, cy + my + dy2,
- cx - dx1, cy + ry,
- cx, cy + ry);
- gnome_canvas_path_def_curveto (path_def,
- cx + dx1, cy + ry,
- cx + mx - dx2, cy + my + dy2,
- cx + mx, cy + my);
- gnome_canvas_path_def_curveto (path_def,
- cx + mx + dx2, cy + my - dy2,
- cx + rx, cy + dy1,
- cx + rx, cy);
-
- gnome_canvas_path_def_closepath_current(path_def);
-
- gnome_canvas_shape_set_path_def (GNOME_CANVAS_SHAPE (item), path_def);
- gnome_canvas_path_def_unref(path_def);
- re->path_dirty = 0;
- }
-
- if (re_parent_class->update)
- (* re_parent_class->update) (item, affine, clip_path, flags);
-}
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* Rectangle and ellipse item types for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- */
-
-#ifndef GNOME_CANVAS_RECT_ELLIPSE_H
-#define GNOME_CANVAS_RECT_ELLIPSE_H
-
-
-#include <libgnomecanvas/gnome-canvas.h>
-
-#include <libgnomecanvas/gnome-canvas-shape.h>
-
-#include <libart_lgpl/art_svp.h>
-
-G_BEGIN_DECLS
-
-
-/* Base class for rectangle and ellipse item types. These are defined by their top-left and
- * bottom-right corners. Rectangles and ellipses share the following arguments:
- *
- * name type read/write description
- * ------------------------------------------------------------------------------------------
- * x1 double RW Leftmost coordinate of rectangle or ellipse
- * y1 double RW Topmost coordinate of rectangle or ellipse
- * x2 double RW Rightmost coordinate of rectangle or ellipse
- * y2 double RW Bottommost coordinate of rectangle or ellipse
- * fill_color string W X color specification for fill color,
- * or NULL pointer for no color (transparent)
- * fill_color_gdk GdkColor* RW Allocated GdkColor for fill
- * outline_color string W X color specification for outline color,
- * or NULL pointer for no color (transparent)
- * outline_color_gdk GdkColor* RW Allocated GdkColor for outline
- * fill_stipple GdkBitmap* RW Stipple pattern for fill
- * outline_stipple GdkBitmap* RW Stipple pattern for outline
- * width_pixels uint RW Width of the outline in pixels. The outline will
- * not be scaled when the canvas zoom factor is changed.
- * width_units double RW Width of the outline in canvas units. The outline
- * will be scaled when the canvas zoom factor is changed.
- */
-
-
-#define GNOME_TYPE_CANVAS_RE (gnome_canvas_re_get_type ())
-#define GNOME_CANVAS_RE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_RE, GnomeCanvasRE))
-#define GNOME_CANVAS_RE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_RE, GnomeCanvasREClass))
-#define GNOME_IS_CANVAS_RE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_RE))
-#define GNOME_IS_CANVAS_RE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_RE))
-#define GNOME_CANVAS_RE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_RE, GnomeCanvasREClass))
-
-
-typedef struct _GnomeCanvasRE GnomeCanvasRE;
-typedef struct _GnomeCanvasREClass GnomeCanvasREClass;
-
-struct _GnomeCanvasRE {
- GnomeCanvasShape item;
-
- double x1, y1, x2, y2; /* Corners of item */
-
- unsigned int path_dirty : 1;
-};
-
-struct _GnomeCanvasREClass {
- GnomeCanvasShapeClass parent_class;
-};
-
-
-/* Standard Gtk function */
-GType gnome_canvas_re_get_type (void) G_GNUC_CONST;
-
-
-/* Rectangle item. No configurable or queryable arguments are available (use those in
- * GnomeCanvasRE).
- */
-
-
-#define GNOME_TYPE_CANVAS_RECT (gnome_canvas_rect_get_type ())
-#define GNOME_CANVAS_RECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_RECT, GnomeCanvasRect))
-#define GNOME_CANVAS_RECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_RECT, GnomeCanvasRectClass))
-#define GNOME_IS_CANVAS_RECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_RECT))
-#define GNOME_IS_CANVAS_RECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_RECT))
-#define GNOME_CANVAS_RECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_RECT, GnomeCanvasRectClass))
-
-
-typedef struct _GnomeCanvasRect GnomeCanvasRect;
-typedef struct _GnomeCanvasRectClass GnomeCanvasRectClass;
-
-struct _GnomeCanvasRect {
- GnomeCanvasRE re;
-};
-
-struct _GnomeCanvasRectClass {
- GnomeCanvasREClass parent_class;
-};
-
-
-/* Standard Gtk function */
-GType gnome_canvas_rect_get_type (void) G_GNUC_CONST;
-
-
-/* Ellipse item. No configurable or queryable arguments are available (use those in
- * GnomeCanvasRE).
- */
-
-
-#define GNOME_TYPE_CANVAS_ELLIPSE (gnome_canvas_ellipse_get_type ())
-#define GNOME_CANVAS_ELLIPSE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_ELLIPSE, GnomeCanvasEllipse))
-#define GNOME_CANVAS_ELLIPSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_ELLIPSE, GnomeCanvasEllipseClass))
-#define GNOME_IS_CANVAS_ELLIPSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_ELLIPSE))
-#define GNOME_IS_CANVAS_ELLIPSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_ELLIPSE))
-#define GNOME_CANVAS_ELLIPSE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_ELLIPSE, GnomeCanvasEllipseClass))
-
-
-typedef struct _GnomeCanvasEllipse GnomeCanvasEllipse;
-typedef struct _GnomeCanvasEllipseClass GnomeCanvasEllipseClass;
-
-struct _GnomeCanvasEllipse {
- GnomeCanvasRE re;
-};
-
-struct _GnomeCanvasEllipseClass {
- GnomeCanvasREClass parent_class;
-};
-
-
-/* Standard Gtk function */
-GType gnome_canvas_ellipse_get_type (void) G_GNUC_CONST;
-
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/* Editable GnomeCanvas text item based on GtkTextLayout, borrowed heavily
- * from GtkTextView.
- *
- * Copyright (c) 2000 Red Hat, Inc.
- * Copyright (c) 2001 Joe Shaw
- *
- * 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.
- */
-
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-#define GTK_TEXT_USE_INTERNAL_UNSUPPORTED_API
-#include <gtk/gtktextdisplay.h>
-
-#include "gnome-canvas.h"
-#include "gnome-canvas-util.h"
-#include "gnome-canvas-rich-text.h"
-#include "gnome-canvas-i18n.h"
-
-struct _GnomeCanvasRichTextPrivate {
- GtkTextLayout *layout;
- GtkTextBuffer *buffer;
-
- char *text;
-
- /* Position at anchor */
- double x, y;
- /* Dimensions */
- double width, height;
- /* Top-left canvas coordinates for text */
- int cx, cy;
-
- gboolean cursor_visible;
- gboolean cursor_blink;
- gboolean editable;
- gboolean visible;
- gboolean grow_height;
- GtkWrapMode wrap_mode;
- GtkJustification justification;
- GtkTextDirection direction;
- GtkAnchorType anchor;
- int pixels_above_lines;
- int pixels_below_lines;
- int pixels_inside_wrap;
- int left_margin;
- int right_margin;
- int indent;
-
- guint preblink_timeout;
- guint blink_timeout;
-
- guint selection_drag_handler;
-
- gint drag_start_x;
- gint drag_start_y;
-
- gboolean just_selected_element;
-
- int clicks;
- guint click_timeout;
-};
-
-enum {
- PROP_0,
- PROP_TEXT,
- PROP_X,
- PROP_Y,
- PROP_WIDTH,
- PROP_HEIGHT,
- PROP_EDITABLE,
- PROP_VISIBLE,
- PROP_CURSOR_VISIBLE,
- PROP_CURSOR_BLINK,
- PROP_GROW_HEIGHT,
- PROP_WRAP_MODE,
- PROP_JUSTIFICATION,
- PROP_DIRECTION,
- PROP_ANCHOR,
- PROP_PIXELS_ABOVE_LINES,
- PROP_PIXELS_BELOW_LINES,
- PROP_PIXELS_INSIDE_WRAP,
- PROP_LEFT_MARGIN,
- PROP_RIGHT_MARGIN,
- PROP_INDENT
-};
-
-enum {
- TAG_CHANGED,
- LAST_SIGNAL
-};
-
-static GnomeCanvasItemClass *parent_class;
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static void gnome_canvas_rich_text_class_init(GnomeCanvasRichTextClass *klass);
-static void gnome_canvas_rich_text_init(GnomeCanvasRichText *text);
-static void gnome_canvas_rich_text_set_property(GObject *object, guint property_id,
- const GValue *value, GParamSpec *pspec);
-static void gnome_canvas_rich_text_get_property(GObject *object, guint property_id,
- GValue *value, GParamSpec *pspec);
-static void gnome_canvas_rich_text_update(GnomeCanvasItem *item, double *affine,
- ArtSVP *clip_path, int flags);
-static void gnome_canvas_rich_text_realize(GnomeCanvasItem *item);
-static void gnome_canvas_rich_text_unrealize(GnomeCanvasItem *item);
-static double gnome_canvas_rich_text_point(GnomeCanvasItem *item,
- double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item);
-static void gnome_canvas_rich_text_draw(GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x, int y, int width, int height);
-static void gnome_canvas_rich_text_render(GnomeCanvasItem *item,
- GnomeCanvasBuf *buf);
-static gint gnome_canvas_rich_text_event(GnomeCanvasItem *item,
- GdkEvent *event);
-static void gnome_canvas_rich_text_get_bounds(GnomeCanvasItem *text, double *px1, double *py1,
- double *px2, double *py2);
-
-static void gnome_canvas_rich_text_ensure_layout(GnomeCanvasRichText *text);
-static void gnome_canvas_rich_text_destroy_layout(GnomeCanvasRichText *text);
-static void gnome_canvas_rich_text_start_cursor_blink(GnomeCanvasRichText *text, gboolean delay);
-static void gnome_canvas_rich_text_stop_cursor_blink(GnomeCanvasRichText *text);
-static void gnome_canvas_rich_text_move_cursor(GnomeCanvasRichText *text,
- GtkMovementStep step,
- gint count,
- gboolean extend_selection);
-
-
-
-static GtkTextBuffer *get_buffer(GnomeCanvasRichText *text);
-static gint blink_cb(gpointer data);
-
-#define PREBLINK_TIME 300
-#define CURSOR_ON_TIME 800
-#define CURSOR_OFF_TIME 400
-
-GType
-gnome_canvas_rich_text_get_type(void)
-{
- static GType rich_text_type;
-
- if (!rich_text_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasRichTextClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_rich_text_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasRichText),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_rich_text_init,
- NULL /* value_table */
- };
-
- rich_text_type = g_type_register_static (GNOME_TYPE_CANVAS_ITEM, "GnomeCanvasRichText",
- &object_info, 0);
- }
-
- return rich_text_type;
-}
-
-static void
-gnome_canvas_rich_text_finalize(GObject *object)
-{
- GnomeCanvasRichText *text;
-
- text = GNOME_CANVAS_RICH_TEXT(object);
-
- g_free (text->_priv);
- text->_priv = NULL;
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-gnome_canvas_rich_text_class_init(GnomeCanvasRichTextClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
- GtkObjectClass *object_class = GTK_OBJECT_CLASS(klass);
- GnomeCanvasItemClass *item_class = GNOME_CANVAS_ITEM_CLASS(klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->set_property = gnome_canvas_rich_text_set_property;
- gobject_class->get_property = gnome_canvas_rich_text_get_property;
-
- g_object_class_install_property (
- gobject_class,
- PROP_TEXT,
- g_param_spec_string ("text",
- _("Text"),
- _("Text to display"),
- NULL,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_X,
- g_param_spec_double ("x",
- _("X"),
- _("X position"),
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_Y,
- g_param_spec_double ("y",
- _("Y"),
- _("Y position"),
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_WIDTH,
- g_param_spec_double ("width",
- _("Width"),
- _("Width for text box"),
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_HEIGHT,
- g_param_spec_double ("height",
- _("Height"),
- _("Height for text box"),
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- _("Editable"),
- _("Is this rich text item editable?"),
- TRUE,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_VISIBLE,
- g_param_spec_boolean ("visible",
- _("Visible"),
- _("Is this rich text item visible?"),
- TRUE,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_CURSOR_VISIBLE,
- g_param_spec_boolean ("cursor_visible",
- _("Cursor Visible"),
- _("Is the cursor visible in this rich text item?"),
- TRUE,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_CURSOR_BLINK,
- g_param_spec_boolean ("cursor_blink",
- _("Cursor Blink"),
- _("Does the cursor blink in this rich text item?"),
- TRUE,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_GROW_HEIGHT,
- g_param_spec_boolean ("grow_height",
- _("Grow Height"),
- _("Should the text box height grow if the text does not fit?"),
- FALSE,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_WRAP_MODE,
- g_param_spec_enum ("wrap_mode",
- _("Wrap Mode"),
- _("Wrap mode for multiline text"),
- GTK_TYPE_WRAP_MODE,
- GTK_WRAP_WORD,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_JUSTIFICATION,
- g_param_spec_enum ("justification",
- _("Justification"),
- _("Justification mode"),
- GTK_TYPE_JUSTIFICATION,
- GTK_JUSTIFY_LEFT,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_DIRECTION,
- g_param_spec_enum ("direction",
- _("Direction"),
- _("Text direction"),
- GTK_TYPE_DIRECTION_TYPE,
- gtk_widget_get_default_direction (),
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_ANCHOR,
- g_param_spec_enum ("anchor",
- _("Anchor"),
- _("Anchor point for text"),
- GTK_TYPE_ANCHOR_TYPE,
- GTK_ANCHOR_NW,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_PIXELS_ABOVE_LINES,
- g_param_spec_int ("pixels_above_lines",
- _("Pixels Above Lines"),
- _("Number of pixels to put above lines"),
- G_MININT, G_MAXINT,
- 0,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_PIXELS_BELOW_LINES,
- g_param_spec_int ("pixels_below_lines",
- _("Pixels Below Lines"),
- _("Number of pixels to put below lines"),
- G_MININT, G_MAXINT,
- 0,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_PIXELS_INSIDE_WRAP,
- g_param_spec_int ("pixels_inside_wrap",
- _("Pixels Inside Wrap"),
- _("Number of pixels to put inside the wrap"),
- G_MININT, G_MAXINT,
- 0,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_LEFT_MARGIN,
- g_param_spec_int ("left_margin",
- _("Left Margin"),
- _("Number of pixels in the left margin"),
- G_MININT, G_MAXINT,
- 0,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_RIGHT_MARGIN,
- g_param_spec_int ("right_margin",
- _("Right Margin"),
- _("Number of pixels in the right margin"),
- G_MININT, G_MAXINT,
- 0,
- G_PARAM_READWRITE));
- g_object_class_install_property (
- gobject_class,
- PROP_INDENT,
- g_param_spec_int ("indent",
- _("Indentation"),
- _("Number of pixels for indentation"),
- G_MININT, G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- /* Signals */
- signals[TAG_CHANGED] = g_signal_new(
- "tag_changed",
- G_TYPE_FROM_CLASS(object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET(GnomeCanvasRichTextClass, tag_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1,
- G_TYPE_OBJECT);
-
- gobject_class->finalize = gnome_canvas_rich_text_finalize;
-
- item_class->update = gnome_canvas_rich_text_update;
- item_class->realize = gnome_canvas_rich_text_realize;
- item_class->unrealize = gnome_canvas_rich_text_unrealize;
- item_class->draw = gnome_canvas_rich_text_draw;
- item_class->point = gnome_canvas_rich_text_point;
- item_class->render = gnome_canvas_rich_text_render;
- item_class->event = gnome_canvas_rich_text_event;
- item_class->bounds = gnome_canvas_rich_text_get_bounds;
-} /* gnome_canvas_rich_text_class_init */
-
-static void
-gnome_canvas_rich_text_init(GnomeCanvasRichText *text)
-{
-#if 0
- GtkObject *object = GTK_OBJECT(text);
-
- object->flags |= GNOME_CANVAS_ITEM_ALWAYS_REDRAW;
-#endif
- text->_priv = g_new0(GnomeCanvasRichTextPrivate, 1);
-
- /* Try to set some sane defaults */
- text->_priv->cursor_visible = TRUE;
- text->_priv->cursor_blink = TRUE;
- text->_priv->editable = TRUE;
- text->_priv->visible = TRUE;
- text->_priv->grow_height = FALSE;
- text->_priv->wrap_mode = GTK_WRAP_WORD;
- text->_priv->justification = GTK_JUSTIFY_LEFT;
- text->_priv->direction = gtk_widget_get_default_direction();
- text->_priv->anchor = GTK_ANCHOR_NW;
-
- text->_priv->blink_timeout = 0;
- text->_priv->preblink_timeout = 0;
-
- text->_priv->clicks = 0;
- text->_priv->click_timeout = 0;
-} /* gnome_canvas_rich_text_init */
-
-static void
-gnome_canvas_rich_text_set_property (GObject *object, guint property_id,
- const GValue *value, GParamSpec *pspec)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(object);
-
- switch (property_id) {
- case PROP_TEXT:
- if (text->_priv->text)
- g_free(text->_priv->text);
-
- text->_priv->text = g_value_dup_string (value);
-
- gtk_text_buffer_set_text(
- get_buffer(text), text->_priv->text, strlen(text->_priv->text));
-
- break;
- case PROP_X:
- text->_priv->x = g_value_get_double (value);
- break;
- case PROP_Y:
- text->_priv->y = g_value_get_double (value);
- break;
- case PROP_WIDTH:
- text->_priv->width = g_value_get_double (value);
- break;
- case PROP_HEIGHT:
- text->_priv->height = g_value_get_double (value);
- break;
- case PROP_EDITABLE:
- text->_priv->editable = g_value_get_boolean (value);
- if (text->_priv->layout) {
- text->_priv->layout->default_style->editable =
- text->_priv->editable;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
- case PROP_VISIBLE:
- text->_priv->visible = g_value_get_boolean (value);
- if (text->_priv->layout) {
- text->_priv->layout->default_style->invisible =
- !text->_priv->visible;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
- case PROP_CURSOR_VISIBLE:
- text->_priv->cursor_visible = g_value_get_boolean (value);
- if (text->_priv->layout) {
- gtk_text_layout_set_cursor_visible(
- text->_priv->layout, text->_priv->cursor_visible);
-
- if (text->_priv->cursor_visible && text->_priv->cursor_blink) {
- gnome_canvas_rich_text_start_cursor_blink(
- text, FALSE);
- }
- else
- gnome_canvas_rich_text_stop_cursor_blink(text);
- }
- break;
- case PROP_CURSOR_BLINK:
- text->_priv->cursor_blink = g_value_get_boolean (value);
- if (text->_priv->layout && text->_priv->cursor_visible) {
- if (text->_priv->cursor_blink && !text->_priv->blink_timeout) {
- gnome_canvas_rich_text_start_cursor_blink(
- text, FALSE);
- }
- else if (!text->_priv->cursor_blink && text->_priv->blink_timeout) {
- gnome_canvas_rich_text_stop_cursor_blink(text);
- gtk_text_layout_set_cursor_visible(
- text->_priv->layout, TRUE);
- }
- }
- break;
- case PROP_GROW_HEIGHT:
- text->_priv->grow_height = g_value_get_boolean (value);
- /* FIXME: Recalc here */
- break;
- case PROP_WRAP_MODE:
- text->_priv->wrap_mode = g_value_get_enum (value);
-
- if (text->_priv->layout) {
- text->_priv->layout->default_style->wrap_mode =
- text->_priv->wrap_mode;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
- case PROP_JUSTIFICATION:
- text->_priv->justification = g_value_get_enum (value);
-
- if (text->_priv->layout) {
- text->_priv->layout->default_style->justification =
- text->_priv->justification;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
- case PROP_DIRECTION:
- text->_priv->direction = g_value_get_enum (value);
-
- if (text->_priv->layout) {
- text->_priv->layout->default_style->direction =
- text->_priv->direction;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
- case PROP_ANCHOR:
- text->_priv->anchor = g_value_get_enum (value);
- break;
- case PROP_PIXELS_ABOVE_LINES:
- text->_priv->pixels_above_lines = g_value_get_int (value);
-
- if (text->_priv->layout) {
- text->_priv->layout->default_style->pixels_above_lines =
- text->_priv->pixels_above_lines;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
- case PROP_PIXELS_BELOW_LINES:
- text->_priv->pixels_below_lines = g_value_get_int (value);
-
- if (text->_priv->layout) {
- text->_priv->layout->default_style->pixels_below_lines =
- text->_priv->pixels_below_lines;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
- case PROP_PIXELS_INSIDE_WRAP:
- text->_priv->pixels_inside_wrap = g_value_get_int (value);
-
- if (text->_priv->layout) {
- text->_priv->layout->default_style->pixels_inside_wrap =
- text->_priv->pixels_inside_wrap;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
- case PROP_LEFT_MARGIN:
- text->_priv->left_margin = g_value_get_int (value);
-
- if (text->_priv->layout) {
- text->_priv->layout->default_style->left_margin =
- text->_priv->left_margin;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
- case PROP_RIGHT_MARGIN:
- text->_priv->right_margin = g_value_get_int (value);
-
- if (text->_priv->layout) {
- text->_priv->layout->default_style->right_margin =
- text->_priv->right_margin;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
- case PROP_INDENT:
- text->_priv->pixels_above_lines = g_value_get_int (value);
-
- if (text->_priv->layout) {
- text->_priv->layout->default_style->indent = text->_priv->indent;
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(text));
-}
-
-static void
-gnome_canvas_rich_text_get_property (GObject *object, guint property_id,
- GValue *value, GParamSpec *pspec)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(object);
-
- switch (property_id) {
- case PROP_TEXT:
- g_value_set_string (value, text->_priv->text);
- break;
- case PROP_X:
- g_value_set_double (value, text->_priv->x);
- break;
- case PROP_Y:
- g_value_set_double (value, text->_priv->y);
- break;
- case PROP_HEIGHT:
- g_value_set_double (value, text->_priv->height);
- break;
- case PROP_WIDTH:
- g_value_set_double (value, text->_priv->width);
- break;
- case PROP_EDITABLE:
- g_value_set_boolean (value, text->_priv->editable);
- break;
- case PROP_CURSOR_VISIBLE:
- g_value_set_boolean (value, text->_priv->cursor_visible);
- break;
- case PROP_CURSOR_BLINK:
- g_value_set_boolean (value, text->_priv->cursor_blink);
- break;
- case PROP_GROW_HEIGHT:
- g_value_set_boolean (value, text->_priv->grow_height);
- break;
- case PROP_WRAP_MODE:
- g_value_set_enum (value, text->_priv->wrap_mode);
- break;
- case PROP_JUSTIFICATION:
- g_value_set_enum (value, text->_priv->justification);
- break;
- case PROP_DIRECTION:
- g_value_set_enum (value, text->_priv->direction);
- break;
- case PROP_ANCHOR:
- g_value_set_enum (value, text->_priv->anchor);
- break;
- case PROP_PIXELS_ABOVE_LINES:
- g_value_set_enum (value, text->_priv->pixels_above_lines);
- break;
- case PROP_PIXELS_BELOW_LINES:
- g_value_set_int (value, text->_priv->pixels_below_lines);
- break;
- case PROP_PIXELS_INSIDE_WRAP:
- g_value_set_int (value, text->_priv->pixels_inside_wrap);
- break;
- case PROP_LEFT_MARGIN:
- g_value_set_int (value, text->_priv->left_margin);
- break;
- case PROP_RIGHT_MARGIN:
- g_value_set_int (value, text->_priv->right_margin);
- break;
- case PROP_INDENT:
- g_value_set_int (value, text->_priv->indent);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-gnome_canvas_rich_text_realize(GnomeCanvasItem *item)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
-
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize)(item);
-
- gnome_canvas_rich_text_ensure_layout(text);
-} /* gnome_canvas_rich_text_realize */
-
-static void
-gnome_canvas_rich_text_unrealize(GnomeCanvasItem *item)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
-
- gnome_canvas_rich_text_destroy_layout(text);
-
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize)(item);
-} /* gnome_canvas_rich_text_unrealize */
-
-static void
-gnome_canvas_rich_text_move_iter_by_lines(GnomeCanvasRichText *text,
- GtkTextIter *newplace, gint count)
-{
- while (count < 0) {
- gtk_text_layout_move_iter_to_previous_line(
- text->_priv->layout, newplace);
- count++;
- }
-
- while (count > 0) {
- gtk_text_layout_move_iter_to_next_line(
- text->_priv->layout, newplace);
- count--;
- }
-} /* gnome_canvas_rich_text_move_iter_by_lines */
-
-static gint
-gnome_canvas_rich_text_get_cursor_x_position(GnomeCanvasRichText *text)
-{
- GtkTextIter insert;
- GdkRectangle rect;
-
- gtk_text_buffer_get_iter_at_mark(
- get_buffer(text), &insert,
- gtk_text_buffer_get_mark(get_buffer(text), "insert"));
- gtk_text_layout_get_cursor_locations(
- text->_priv->layout, &insert, &rect, NULL);
-
- return rect.x;
-} /* gnome_canvas_rich_text_get_cursor_x_position */
-
-static void
-gnome_canvas_rich_text_move_cursor(GnomeCanvasRichText *text,
- GtkMovementStep step,
- gint count, gboolean extend_selection)
-{
- GtkTextIter insert, newplace;
-
- gtk_text_buffer_get_iter_at_mark(
- get_buffer(text), &insert,
- gtk_text_buffer_get_mark(get_buffer(text), "insert"));
-
- newplace = insert;
-
- switch (step) {
- case GTK_MOVEMENT_LOGICAL_POSITIONS:
- gtk_text_iter_forward_cursor_positions(&newplace, count);
- break;
- case GTK_MOVEMENT_VISUAL_POSITIONS:
- gtk_text_layout_move_iter_visually(
- text->_priv->layout, &newplace, count);
- break;
- case GTK_MOVEMENT_WORDS:
- if (count < 0)
- gtk_text_iter_backward_word_starts(&newplace, -count);
- else if (count > 0)
- gtk_text_iter_forward_word_ends(&newplace, count);
- break;
- case GTK_MOVEMENT_DISPLAY_LINES:
- gnome_canvas_rich_text_move_iter_by_lines(
- text, &newplace, count);
- gtk_text_layout_move_iter_to_x(
- text->_priv->layout, &newplace,
- gnome_canvas_rich_text_get_cursor_x_position(text));
- break;
- case GTK_MOVEMENT_DISPLAY_LINE_ENDS:
- if (count > 1) {
- gnome_canvas_rich_text_move_iter_by_lines(
- text, &newplace, --count);
- }
- else if (count < -1) {
- gnome_canvas_rich_text_move_iter_by_lines(
- text, &newplace, ++count);
- }
-
- if (count != 0) {
- gtk_text_layout_move_iter_to_line_end(
- text->_priv->layout, &newplace, count);
- }
- break;
- case GTK_MOVEMENT_PARAGRAPHS:
- /* FIXME: Busted in gtktextview.c too */
- break;
- case GTK_MOVEMENT_PARAGRAPH_ENDS:
- if (count > 0)
- gtk_text_iter_forward_to_line_end(&newplace);
- else if (count < 0)
- gtk_text_iter_set_line_offset(&newplace, 0);
- break;
- case GTK_MOVEMENT_BUFFER_ENDS:
- if (count > 0) {
- gtk_text_buffer_get_end_iter(
- get_buffer(text), &newplace);
- }
- else if (count < 0) {
- gtk_text_buffer_get_iter_at_offset(
- get_buffer(text), &newplace, 0);
- }
- break;
- default:
- break;
- }
-
- if (!gtk_text_iter_equal(&insert, &newplace)) {
- if (extend_selection) {
- gtk_text_buffer_move_mark(
- get_buffer(text),
- gtk_text_buffer_get_mark(
- get_buffer(text), "insert"),
- &newplace);
- }
- else {
- gtk_text_buffer_place_cursor(
- get_buffer(text), &newplace);
- }
- }
-
- gnome_canvas_rich_text_start_cursor_blink(text, TRUE);
-} /* gnome_canvas_rich_text_move_cursor */
-
-static gboolean
-whitespace(gunichar ch, gpointer ignored)
-{
- return (ch == ' ' || ch == '\t');
-} /* whitespace */
-
-static gboolean
-not_whitespace(gunichar ch, gpointer ignored)
-{
- return !whitespace(ch, ignored);
-} /* not_whitespace */
-
-static gboolean
-find_whitespace_region(const GtkTextIter *center,
- GtkTextIter *start, GtkTextIter *end)
-{
- *start = *center;
- *end = *center;
-
- if (gtk_text_iter_backward_find_char(start, not_whitespace, NULL, NULL))
- gtk_text_iter_forward_char(start);
- if (whitespace(gtk_text_iter_get_char(end), NULL))
- gtk_text_iter_forward_find_char(end, not_whitespace, NULL, NULL);
-
- return !gtk_text_iter_equal(start, end);
-} /* find_whitespace_region */
-
-static void
-gnome_canvas_rich_text_delete_from_cursor(GnomeCanvasRichText *text,
- GtkDeleteType type,
- gint count)
-{
- GtkTextIter insert, start, end;
-
- /* Special case: If the user wants to delete a character and there is
- a selection, then delete the selection and return */
- if (type == GTK_DELETE_CHARS) {
- if (gtk_text_buffer_delete_selection(get_buffer(text), TRUE,
- text->_priv->editable))
- return;
- }
-
- gtk_text_buffer_get_iter_at_mark(
- get_buffer(text), &insert,
- gtk_text_buffer_get_mark(get_buffer(text), "insert"));
-
- start = insert;
- end = insert;
-
- switch (type) {
- case GTK_DELETE_CHARS:
- gtk_text_iter_forward_cursor_positions(&end, count);
- break;
- case GTK_DELETE_WORD_ENDS:
- if (count > 0)
- gtk_text_iter_forward_word_ends(&end, count);
- else if (count < 0)
- gtk_text_iter_backward_word_starts(&start, -count);
- break;
- case GTK_DELETE_WORDS:
- break;
- case GTK_DELETE_DISPLAY_LINE_ENDS:
- break;
- case GTK_DELETE_PARAGRAPH_ENDS:
- if (gtk_text_iter_ends_line(&end)) {
- gtk_text_iter_forward_line(&end);
- --count;
- }
-
- while (count > 0) {
- if (!gtk_text_iter_forward_to_line_end(&end))
- break;
-
- --count;
- }
- break;
- case GTK_DELETE_PARAGRAPHS:
- if (count > 0) {
- gtk_text_iter_set_line_offset(&start, 0);
- gtk_text_iter_forward_to_line_end(&end);
-
- /* Do the lines beyond the first. */
- while (count > 1) {
- gtk_text_iter_forward_to_line_end(&end);
- --count;
- }
- }
- break;
- case GTK_DELETE_WHITESPACE:
- find_whitespace_region(&insert, &start, &end);
- break;
-
- default:
- break;
- }
-
- if (!gtk_text_iter_equal(&start, &end)) {
- gtk_text_buffer_begin_user_action(get_buffer(text));
- gtk_text_buffer_delete_interactive(
- get_buffer(text), &start, &end, text->_priv->editable);
- gtk_text_buffer_end_user_action(get_buffer(text));
- }
-} /* gnome_canvas_rich_text_delete_from_cursor */
-
-static gint
-selection_motion_event_handler(GnomeCanvasRichText *text, GdkEvent *event,
- gpointer ignored)
-{
- GtkTextIter newplace;
- GtkTextMark *mark;
- double newx, newy;
-
- /* We only want to handle motion events... */
- if (event->type != GDK_MOTION_NOTIFY)
- return FALSE;
-
- newx = (event->motion.x - text->_priv->x) *
- GNOME_CANVAS_ITEM(text)->canvas->pixels_per_unit;
- newy = (event->motion.y - text->_priv->y) *
- GNOME_CANVAS_ITEM(text)->canvas->pixels_per_unit;
-
- gtk_text_layout_get_iter_at_pixel(text->_priv->layout, &newplace, newx, newy);
- mark = gtk_text_buffer_get_mark(get_buffer(text), "insert");
- gtk_text_buffer_move_mark(get_buffer(text), mark, &newplace);
-
- return TRUE;
-} /* selection_motion_event_handler */
-
-static void
-gnome_canvas_rich_text_start_selection_drag(GnomeCanvasRichText *text,
- const GtkTextIter *iter,
- GdkEventButton * button)
-{
- GtkTextIter newplace;
-
- g_return_if_fail(text->_priv->selection_drag_handler == 0);
-
-#if 0
- gnome_canvas_item_grab_focus(GNOME_CANVAS_ITEM(text));
-#endif
-
- newplace = *iter;
-
- gtk_text_buffer_place_cursor(get_buffer(text), &newplace);
-
- text->_priv->selection_drag_handler = g_signal_connect(
- text, "event",
- G_CALLBACK (selection_motion_event_handler),
- NULL);
-} /* gnome_canvas_rich_text_start_selection_drag */
-
-static gboolean
-gnome_canvas_rich_text_end_selection_drag(GnomeCanvasRichText *text,
- GdkEventButton * event)
-{
- if (text->_priv->selection_drag_handler == 0)
- return FALSE;
-
- g_signal_handler_disconnect (text, text->_priv->selection_drag_handler);
- text->_priv->selection_drag_handler = 0;
-
-#if 0
- gnome_canvas_item_grab(NULL);
-#endif
-
- return TRUE;
-} /* gnome_canvas_rich_text_end_selection_drag */
-
-static void
-gnome_canvas_rich_text_emit_tag_changed(GnomeCanvasRichText *text,
- GtkTextTag *tag)
-{
- g_signal_emit(G_OBJECT(text), signals[TAG_CHANGED], 0, tag);
-} /* gnome_canvas_rich_text_emit_tag_changed */
-
-static gint
-gnome_canvas_rich_text_key_press_event(GnomeCanvasItem *item,
- GdkEventKey *event)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
- gboolean extend_selection = FALSE;
- gboolean handled = FALSE;
-
-#if 0
- printf("Key press event\n");
-#endif
-
- if (!text->_priv->layout || !text->_priv->buffer)
- return FALSE;
-
- if (event->state & GDK_SHIFT_MASK)
- extend_selection = TRUE;
-
- switch (event->keyval) {
- case GDK_Return:
- case GDK_KP_Enter:
- gtk_text_buffer_delete_selection(
- get_buffer(text), TRUE, text->_priv->editable);
- gtk_text_buffer_insert_interactive_at_cursor(
- get_buffer(text), "\n", 1, text->_priv->editable);
- handled = TRUE;
- break;
-
- case GDK_Tab:
- gtk_text_buffer_insert_interactive_at_cursor(
- get_buffer(text), "\t", 1, text->_priv->editable);
- handled = TRUE;
- break;
-
- /* MOVEMENT */
- case GDK_Right:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_WORDS, 1,
- extend_selection);
- handled = TRUE;
- }
- else {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_VISUAL_POSITIONS, 1,
- extend_selection);
- handled = TRUE;
- }
- break;
- case GDK_Left:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_WORDS, -1,
- extend_selection);
- handled = TRUE;
- }
- else {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_VISUAL_POSITIONS, -1,
- extend_selection);
- handled = TRUE;
- }
- break;
- case GDK_f:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_LOGICAL_POSITIONS, 1,
- extend_selection);
- handled = TRUE;
- }
- else if (event->state & GDK_MOD1_MASK) {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_WORDS, 1,
- extend_selection);
- handled = TRUE;
- }
- break;
- case GDK_b:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_LOGICAL_POSITIONS, -1,
- extend_selection);
- handled = TRUE;
- }
- else if (event->state & GDK_MOD1_MASK) {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_WORDS, -1,
- extend_selection);
- handled = TRUE;
- }
- break;
- case GDK_Up:
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_DISPLAY_LINES, -1,
- extend_selection);
- handled = TRUE;
- break;
- case GDK_Down:
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_DISPLAY_LINES, 1,
- extend_selection);
- handled = TRUE;
- break;
- case GDK_p:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_DISPLAY_LINES, -1,
- extend_selection);
- handled = TRUE;
- }
- break;
- case GDK_n:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_DISPLAY_LINES, 1,
- extend_selection);
- handled = TRUE;
- }
- break;
- case GDK_Home:
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_PARAGRAPH_ENDS, -1,
- extend_selection);
- handled = TRUE;
- break;
- case GDK_End:
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_PARAGRAPH_ENDS, 1,
- extend_selection);
- handled = TRUE;
- break;
- case GDK_a:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_PARAGRAPH_ENDS, -1,
- extend_selection);
- handled = TRUE;
- }
- break;
- case GDK_e:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_move_cursor(
- text, GTK_MOVEMENT_PARAGRAPH_ENDS, 1,
- extend_selection);
- handled = TRUE;
- }
- break;
-
- /* DELETING TEXT */
- case GDK_Delete:
- case GDK_KP_Delete:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_delete_from_cursor(
- text, GTK_DELETE_WORD_ENDS, 1);
- handled = TRUE;
- }
- else {
- gnome_canvas_rich_text_delete_from_cursor(
- text, GTK_DELETE_CHARS, 1);
- handled = TRUE;
- }
- break;
- case GDK_d:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_delete_from_cursor(
- text, GTK_DELETE_CHARS, 1);
- handled = TRUE;
- }
- else if (event->state & GDK_MOD1_MASK) {
- gnome_canvas_rich_text_delete_from_cursor(
- text, GTK_DELETE_WORD_ENDS, 1);
- handled = TRUE;
- }
- break;
- case GDK_BackSpace:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_delete_from_cursor(
- text, GTK_DELETE_WORD_ENDS, -1);
- handled = TRUE;
- }
- else {
- gnome_canvas_rich_text_delete_from_cursor(
- text, GTK_DELETE_CHARS, -1);
- }
- handled = TRUE;
- break;
- case GDK_k:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_delete_from_cursor(
- text, GTK_DELETE_PARAGRAPH_ENDS, 1);
- handled = TRUE;
- }
- break;
- case GDK_u:
- if (event->state & GDK_CONTROL_MASK) {
- gnome_canvas_rich_text_delete_from_cursor(
- text, GTK_DELETE_PARAGRAPHS, 1);
- handled = TRUE;
- }
- break;
- case GDK_space:
- if (event->state & GDK_MOD1_MASK) {
- gnome_canvas_rich_text_delete_from_cursor(
- text, GTK_DELETE_WHITESPACE, 1);
- handled = TRUE;
- }
- break;
- case GDK_backslash:
- if (event->state & GDK_MOD1_MASK) {
- gnome_canvas_rich_text_delete_from_cursor(
- text, GTK_DELETE_WHITESPACE, 1);
- handled = TRUE;
- }
- break;
- default:
- break;
- }
-
- /* An empty string, click just pressing "Alt" by itself or whatever. */
- if (!event->length)
- return FALSE;
-
- if (!handled) {
- gtk_text_buffer_delete_selection(
- get_buffer(text), TRUE, text->_priv->editable);
- gtk_text_buffer_insert_interactive_at_cursor(
- get_buffer(text), event->string, event->length,
- text->_priv->editable);
- }
-
- gnome_canvas_rich_text_start_cursor_blink(text, TRUE);
-
- return TRUE;
-} /* gnome_canvas_rich_text_key_press_event */
-
-static gint
-gnome_canvas_rich_text_key_release_event(GnomeCanvasItem * item,
- GdkEventKey *event)
-{
- return FALSE;
-} /* gnome_canvas_rich_text_key_release_event */
-
-static gboolean
-_click(gpointer data)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(data);
-
- text->_priv->clicks = 0;
- text->_priv->click_timeout = 0;
-
- return FALSE;
-} /* _click */
-
-static gint
-gnome_canvas_rich_text_button_press_event(GnomeCanvasItem *item,
- GdkEventButton *event)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
- GtkTextIter iter;
- GdkEventType event_type;
- double newx, newy;
-
- newx = (event->x - text->_priv->x) * item->canvas->pixels_per_unit;
- newy = (event->y - text->_priv->y) * item->canvas->pixels_per_unit;
-
- gtk_text_layout_get_iter_at_pixel(text->_priv->layout, &iter, newx, newy);
-
- /* The canvas doesn't give us double- or triple-click events, so
- we have to synthesize them ourselves. Yay. */
- event_type = event->type;
- if (event_type == GDK_BUTTON_PRESS) {
- text->_priv->clicks++;
- text->_priv->click_timeout = g_timeout_add(400, _click, text);
-
- if (text->_priv->clicks > 3)
- text->_priv->clicks = text->_priv->clicks % 3;
-
- if (text->_priv->clicks == 1)
- event_type = GDK_BUTTON_PRESS;
- else if (text->_priv->clicks == 2)
- event_type = GDK_2BUTTON_PRESS;
- else if (text->_priv->clicks == 3)
- event_type = GDK_3BUTTON_PRESS;
- else
- printf("ZERO CLICKS!\n");
- }
-
- if (event->button == 1 && event_type == GDK_BUTTON_PRESS) {
- GtkTextIter start, end;
-
- if (gtk_text_buffer_get_selection_bounds(
- get_buffer(text), &start, &end) &&
- gtk_text_iter_in_range(&iter, &start, &end)) {
- text->_priv->drag_start_x = event->x;
- text->_priv->drag_start_y = event->y;
- }
- else {
- gnome_canvas_rich_text_start_selection_drag(
- text, &iter, event);
- }
-
- return TRUE;
- }
- else if (event->button == 1 && event_type == GDK_2BUTTON_PRESS) {
- GtkTextIter start, end;
-
-#if 0
- printf("double-click\n");
-#endif
-
- gnome_canvas_rich_text_end_selection_drag(text, event);
-
- start = iter;
- end = start;
-
- if (gtk_text_iter_inside_word(&start)) {
- if (!gtk_text_iter_starts_word(&start))
- gtk_text_iter_backward_word_start(&start);
-
- if (!gtk_text_iter_ends_word(&end))
- gtk_text_iter_forward_word_end(&end);
- }
-
- gtk_text_buffer_move_mark(
- get_buffer(text),
- gtk_text_buffer_get_selection_bound(get_buffer(text)),
- &start);
- gtk_text_buffer_move_mark(
- get_buffer(text),
- gtk_text_buffer_get_insert(get_buffer(text)), &end);
-
- text->_priv->just_selected_element = TRUE;
-
- return TRUE;
- }
- else if (event->button == 1 && event_type == GDK_3BUTTON_PRESS) {
- GtkTextIter start, end;
-
-#if 0
- printf("triple-click\n");
-#endif
-
- gnome_canvas_rich_text_end_selection_drag(text, event);
-
- start = iter;
- end = start;
-
- if (gtk_text_layout_iter_starts_line(text->_priv->layout, &start)) {
- gtk_text_layout_move_iter_to_line_end(
- text->_priv->layout, &start, -1);
- }
- else {
- gtk_text_layout_move_iter_to_line_end(
- text->_priv->layout, &start, -1);
-
- if (!gtk_text_layout_iter_starts_line(
- text->_priv->layout, &end)) {
- gtk_text_layout_move_iter_to_line_end(
- text->_priv->layout, &end, 1);
- }
- }
-
- gtk_text_buffer_move_mark(
- get_buffer(text),
- gtk_text_buffer_get_selection_bound(get_buffer(text)),
- &start);
- gtk_text_buffer_move_mark(
- get_buffer(text),
- gtk_text_buffer_get_insert(get_buffer(text)), &end);
-
- text->_priv->just_selected_element = TRUE;
-
- return TRUE;
- }
- else if (event->button == 2 && event_type == GDK_BUTTON_PRESS) {
- gtk_text_buffer_paste_clipboard(
- get_buffer(text),
- gtk_clipboard_get (GDK_SELECTION_PRIMARY),
- &iter, text->_priv->editable);
- }
-
- return FALSE;
-} /* gnome_canvas_rich_text_button_press_event */
-
-static gint
-gnome_canvas_rich_text_button_release_event(GnomeCanvasItem *item,
- GdkEventButton *event)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
- double newx, newy;
-
- newx = (event->x - text->_priv->x) * item->canvas->pixels_per_unit;
- newy = (event->y - text->_priv->y) * item->canvas->pixels_per_unit;
-
- if (event->button == 1) {
- if (text->_priv->drag_start_x >= 0) {
- text->_priv->drag_start_x = -1;
- text->_priv->drag_start_y = -1;
- }
-
- if (gnome_canvas_rich_text_end_selection_drag(text, event))
- return TRUE;
- else if (text->_priv->just_selected_element) {
- text->_priv->just_selected_element = FALSE;
- return FALSE;
- }
- else {
- GtkTextIter iter;
-
- gtk_text_layout_get_iter_at_pixel(
- text->_priv->layout, &iter, newx, newy);
-
- gtk_text_buffer_place_cursor(get_buffer(text), &iter);
-
- return FALSE;
- }
- }
-
- return FALSE;
-} /* gnome_canvas_rich_text_button_release_event */
-
-static gint
-gnome_canvas_rich_text_focus_in_event(GnomeCanvasItem *item,
- GdkEventFocus * event)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
-
- if (text->_priv->cursor_visible && text->_priv->layout) {
- gtk_text_layout_set_cursor_visible(text->_priv->layout, TRUE);
- gnome_canvas_rich_text_start_cursor_blink(text, FALSE);
- }
-
- return FALSE;
-} /* gnome_canvas_rich_text_focus_in_event */
-
-static gint
-gnome_canvas_rich_text_focus_out_event(GnomeCanvasItem *item,
- GdkEventFocus * event)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
-
- if (text->_priv->cursor_visible && text->_priv->layout) {
- gtk_text_layout_set_cursor_visible(text->_priv->layout, FALSE);
- gnome_canvas_rich_text_stop_cursor_blink(text);
- }
-
- return FALSE;
-} /* gnome_canvas_rich_text_focus_out_event */
-
-static gboolean
-get_event_coordinates(GdkEvent *event, gint *x, gint *y)
-{
- g_return_val_if_fail(event, FALSE);
-
- switch (event->type) {
- case GDK_MOTION_NOTIFY:
- *x = event->motion.x;
- *y = event->motion.y;
- return TRUE;
- case GDK_BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- *x = event->button.x;
- *y = event->button.y;
- return TRUE;
-
- default:
- return FALSE;
- }
-} /* get_event_coordinates */
-
-static void
-emit_event_on_tags(GnomeCanvasRichText *text, GdkEvent *event,
- GtkTextIter *iter)
-{
- GSList *tags;
- GSList *i;
-
- tags = gtk_text_iter_get_tags(iter);
-
- i = tags;
- while (i) {
- GtkTextTag *tag = i->data;
-
- gtk_text_tag_event(tag, G_OBJECT(text), event, iter);
-
- /* The cursor has been moved to within this tag. Emit the
- tag_changed signal */
- if (event->type == GDK_BUTTON_RELEASE ||
- event->type == GDK_KEY_PRESS ||
- event->type == GDK_KEY_RELEASE) {
- gnome_canvas_rich_text_emit_tag_changed(
- text, tag);
- }
-
- i = g_slist_next(i);
- }
-
- g_slist_free(tags);
-} /* emit_event_on_tags */
-
-static gint
-gnome_canvas_rich_text_event(GnomeCanvasItem *item, GdkEvent *event)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
- int x, y;
-
- if (get_event_coordinates(event, &x, &y)) {
- GtkTextIter iter;
-
- x -= text->_priv->x;
- y -= text->_priv->y;
-
- gtk_text_layout_get_iter_at_pixel(text->_priv->layout, &iter, x, y);
- emit_event_on_tags(text, event, &iter);
- }
- else if (event->type == GDK_KEY_PRESS ||
- event->type == GDK_KEY_RELEASE) {
- GtkTextMark *insert;
- GtkTextIter iter;
-
- insert = gtk_text_buffer_get_mark(get_buffer(text), "insert");
- gtk_text_buffer_get_iter_at_mark(
- get_buffer(text), &iter, insert);
- emit_event_on_tags(text, event, &iter);
- }
-
- switch (event->type) {
- case GDK_KEY_PRESS:
- return gnome_canvas_rich_text_key_press_event(
- item, (GdkEventKey *) event);
- case GDK_KEY_RELEASE:
- return gnome_canvas_rich_text_key_release_event(
- item, (GdkEventKey *) event);
- case GDK_BUTTON_PRESS:
- return gnome_canvas_rich_text_button_press_event(
- item, (GdkEventButton *) event);
- case GDK_BUTTON_RELEASE:
- return gnome_canvas_rich_text_button_release_event(
- item, (GdkEventButton *) event);
- case GDK_FOCUS_CHANGE:
- if (((GdkEventFocus *) event)->window !=
- item->canvas->layout.bin_window)
- return FALSE;
-
- if (((GdkEventFocus *) event)->in)
- return gnome_canvas_rich_text_focus_in_event(
- item, (GdkEventFocus *) event);
- else
- return gnome_canvas_rich_text_focus_out_event(
- item, (GdkEventFocus *) event);
- default:
- return FALSE;
- }
-} /* gnome_canvas_rich_text_event */
-
-/* Cut/Copy/Paste */
-
-/**
- * gnome_canvas_rich_text_cut_clipboard:
- * @text: a #GnomeCanvasRichText.
- *
- * Copies the currently selected @text to clipboard, then deletes said text
- * if it's editable.
- **/
-void
-gnome_canvas_rich_text_cut_clipboard(GnomeCanvasRichText *text)
-{
- g_return_if_fail(text);
- g_return_if_fail(get_buffer(text));
-
- gtk_text_buffer_cut_clipboard(get_buffer(text),
- gtk_clipboard_get (GDK_SELECTION_PRIMARY),
- text->_priv->editable);
-} /* gnome_canvas_rich_text_cut_clipboard */
-
-
-/**
- * gnome_canvas_rich_text_copy_clipboard:
- * @text: a #GnomeCanvasRichText.
- *
- * Copies the currently selected @text to clipboard.
- **/
-void
-gnome_canvas_rich_text_copy_clipboard(GnomeCanvasRichText *text)
-{
- g_return_if_fail(text);
- g_return_if_fail(get_buffer(text));
-
- gtk_text_buffer_copy_clipboard(get_buffer(text),
- gtk_clipboard_get (GDK_SELECTION_PRIMARY));
-} /* gnome_canvas_rich_text_cut_clipboard */
-
-
-/**
- * gnome_canvas_rich_text_paste_clipboard:
- * @text: a #GnomeCanvasRichText.
- *
- * Pastes the contents of the clipboard at the insertion point.
- **/
-void
-gnome_canvas_rich_text_paste_clipboard(GnomeCanvasRichText *text)
-{
- g_return_if_fail(text);
- g_return_if_fail(get_buffer(text));
-
- gtk_text_buffer_paste_clipboard(get_buffer(text),
- gtk_clipboard_get (GDK_SELECTION_PRIMARY),
- NULL,
- text->_priv->editable);
-} /* gnome_canvas_rich_text_cut_clipboard */
-
-static gint
-preblink_cb(gpointer data)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(data);
-
- text->_priv->preblink_timeout = 0;
- gnome_canvas_rich_text_start_cursor_blink(text, FALSE);
-
- /* Remove ourselves */
- return FALSE;
-} /* preblink_cb */
-
-static gint
-blink_cb(gpointer data)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(data);
- gboolean visible;
-
- g_assert(text->_priv->layout);
- g_assert(text->_priv->cursor_visible);
-
- visible = gtk_text_layout_get_cursor_visible(text->_priv->layout);
- if (visible)
- text->_priv->blink_timeout = g_timeout_add(
- CURSOR_OFF_TIME, blink_cb, text);
- else
- text->_priv->blink_timeout = g_timeout_add(
- CURSOR_ON_TIME, blink_cb, text);
-
- gtk_text_layout_set_cursor_visible(text->_priv->layout, !visible);
-
- /* Remove ourself */
- return FALSE;
-} /* blink_cb */
-
-static void
-gnome_canvas_rich_text_start_cursor_blink(GnomeCanvasRichText *text,
- gboolean with_delay)
-{
- if (!text->_priv->layout)
- return;
-
- if (!text->_priv->cursor_visible || !text->_priv->cursor_blink)
- return;
-
- if (text->_priv->preblink_timeout != 0) {
- g_source_remove(text->_priv->preblink_timeout);
- text->_priv->preblink_timeout = 0;
- }
-
- if (with_delay) {
- if (text->_priv->blink_timeout != 0) {
- g_source_remove(text->_priv->blink_timeout);
- text->_priv->blink_timeout = 0;
- }
-
- gtk_text_layout_set_cursor_visible(text->_priv->layout, TRUE);
-
- text->_priv->preblink_timeout = g_timeout_add(
- PREBLINK_TIME, preblink_cb, text);
- }
- else {
- if (text->_priv->blink_timeout == 0) {
- gtk_text_layout_set_cursor_visible(text->_priv->layout, TRUE);
- text->_priv->blink_timeout = g_timeout_add(
- CURSOR_ON_TIME, blink_cb, text);
- }
- }
-} /* gnome_canvas_rich_text_start_cursor_blink */
-
-static void
-gnome_canvas_rich_text_stop_cursor_blink(GnomeCanvasRichText *text)
-{
- if (text->_priv->blink_timeout) {
- g_source_remove(text->_priv->blink_timeout);
- text->_priv->blink_timeout = 0;
- }
-} /* gnome_canvas_rich_text_stop_cursor_blink */
-
-/* We have to request updates this way because the update cycle is not
- re-entrant. This will fire off a request in an idle loop. */
-static gboolean
-request_update(gpointer data)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(data);
-
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(text));
-
- return FALSE;
-} /* request_update */
-
-static void
-invalidated_handler(GtkTextLayout * layout, gpointer data)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(data);
-
-#if 0
- printf("Text is being invalidated.\n");
-#endif
-
- gtk_text_layout_validate(text->_priv->layout, 2000);
-
- /* We are called from the update cycle; gotta put this in an idle
- loop. */
- g_idle_add(request_update, text);
-} /* invalidated_handler */
-
-static void
-scale_fonts(GtkTextTag *tag, gpointer data)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(data);
-
- if (!tag->values)
- return;
-
- g_object_set(
- G_OBJECT(tag), "scale",
- text->_priv->layout->default_style->font_scale, NULL);
-} /* scale_fonts */
-
-static void
-changed_handler(GtkTextLayout * layout, gint start_y,
- gint old_height, gint new_height, gpointer data)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(data);
-
-#if 0
- printf("Layout %p is being changed.\n", text->_priv->layout);
-#endif
-
- if (text->_priv->layout->default_style->font_scale !=
- GNOME_CANVAS_ITEM(text)->canvas->pixels_per_unit) {
- GtkTextTagTable *tag_table;
-
- text->_priv->layout->default_style->font_scale =
- GNOME_CANVAS_ITEM(text)->canvas->pixels_per_unit;
-
- tag_table = gtk_text_buffer_get_tag_table(get_buffer(text));
- gtk_text_tag_table_foreach(tag_table, scale_fonts, text);
-
- gtk_text_layout_default_style_changed(text->_priv->layout);
- }
-
- if (text->_priv->grow_height) {
- int width, height;
-
- gtk_text_layout_get_size(text->_priv->layout, &width, &height);
-
- if (height > text->_priv->height)
- text->_priv->height = height;
- }
-
- /* We are called from the update cycle; gotta put this in an idle
- loop. */
- g_idle_add(request_update, text);
-} /* changed_handler */
-
-
-/**
- * gnome_canvas_rich_text_set_buffer:
- * @text: a #GnomeCanvasRichText.
- * @buffer: a #GtkTextBuffer.
- *
- * Sets the buffer field of the @text to @buffer.
- **/
-void
-gnome_canvas_rich_text_set_buffer(GnomeCanvasRichText *text,
- GtkTextBuffer *buffer)
-{
- g_return_if_fail(GNOME_IS_CANVAS_RICH_TEXT(text));
- g_return_if_fail(buffer == NULL || GTK_IS_TEXT_BUFFER(buffer));
-
- if (text->_priv->buffer == buffer)
- return;
-
- if (text->_priv->buffer != NULL) {
- g_object_unref(G_OBJECT(text->_priv->buffer));
- }
-
- text->_priv->buffer = buffer;
-
- if (buffer) {
- g_object_ref(G_OBJECT(buffer));
-
- if (text->_priv->layout)
- gtk_text_layout_set_buffer(text->_priv->layout, buffer);
- }
-
- gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(text));
-} /* gnome_canvas_rich_text_set_buffer */
-
-static GtkTextBuffer *
-get_buffer(GnomeCanvasRichText *text)
-{
- if (!text->_priv->buffer) {
- GtkTextBuffer *b;
-
- b = gtk_text_buffer_new(NULL);
- gnome_canvas_rich_text_set_buffer(text, b);
- g_object_unref(G_OBJECT(b));
- }
-
- return text->_priv->buffer;
-} /* get_buffer */
-
-
-/**
- * gnome_canvas_rich_text_get_buffer:
- * @text: a #GnomeCanvasRichText.
- *
- * Returns a #GtkTextBuffer associated with the #GnomeCanvasRichText.
- * This function creates a new #GtkTextBuffer if the text buffer is NULL.
- *
- * Return value: the #GtkTextBuffer.
- **/
-GtkTextBuffer *
-gnome_canvas_rich_text_get_buffer(GnomeCanvasRichText *text)
-{
- g_return_val_if_fail(GNOME_IS_CANVAS_RICH_TEXT(text), NULL);
-
- return get_buffer(text);
-} /* gnome_canvas_rich_text_get_buffer */
-
-
-/**
- * gnome_canvas_rich_text_get_iter_location:
- * @text: a #GnomeCanvasRichText.
- * @iter: a #GtkTextIter.
- * @location: a #GdkRectangle containing the bounds of the character at @iter.
- *
- * Gets a rectangle which roughly contains the character at @iter.
- **/
-void
-gnome_canvas_rich_text_get_iter_location (GnomeCanvasRichText *text,
- const GtkTextIter *iter,
- GdkRectangle *location)
-{
- g_return_if_fail (GNOME_IS_CANVAS_RICH_TEXT (text));
- g_return_if_fail (gtk_text_iter_get_buffer (iter) == text->_priv->buffer);
-
- gtk_text_layout_get_iter_location (text->_priv->layout, iter, location);
-}
-
-
-/**
- * gnome_canvas_rich_text_get_iter_at_location:
- * @text: a #GnomeCanvasRichText.
- * @iter: a #GtkTextIter.
- * @x: x position, in buffer coordinates.
- * @y: y position, in buffer coordinates.
- *
- * Retrieves the iterator at the buffer coordinates x and y.
- **/
-void
-gnome_canvas_rich_text_get_iter_at_location (GnomeCanvasRichText *text,
- GtkTextIter *iter,
- gint x,
- gint y)
-{
- g_return_if_fail (GNOME_IS_CANVAS_RICH_TEXT (text));
- g_return_if_fail (iter != NULL);
- g_return_if_fail (text->_priv->layout != NULL);
-
- gtk_text_layout_get_iter_at_pixel (text->_priv->layout,
- iter,
- x,
- y);
-}
-
-
-static void
-gnome_canvas_rich_text_set_attributes_from_style(GnomeCanvasRichText * text,
- GtkTextAttributes *values,
- GtkStyle *style)
-{
- values->appearance.bg_color = style->base[GTK_STATE_NORMAL];
- values->appearance.fg_color = style->fg[GTK_STATE_NORMAL];
-
- if (values->font)
- pango_font_description_free (values->font);
-
- values->font = pango_font_description_copy (style->font_desc);
-
-} /* gnome_canvas_rich_text_set_attributes_from_style */
-
-static void
-gnome_canvas_rich_text_ensure_layout(GnomeCanvasRichText *text)
-{
- if (!text->_priv->layout) {
- GtkWidget *canvas;
- GtkTextAttributes *style;
- PangoContext *ltr_context, *rtl_context;
-
- text->_priv->layout = gtk_text_layout_new();
-
- gtk_text_layout_set_screen_width(text->_priv->layout, text->_priv->width);
-
- if (get_buffer(text)) {
- gtk_text_layout_set_buffer(
- text->_priv->layout, get_buffer(text));
- }
-
- /* Setup the cursor stuff */
- gtk_text_layout_set_cursor_visible(
- text->_priv->layout, text->_priv->cursor_visible);
- if (text->_priv->cursor_visible && text->_priv->cursor_blink)
- gnome_canvas_rich_text_start_cursor_blink(text, FALSE);
- else
- gnome_canvas_rich_text_stop_cursor_blink(text);
-
- canvas = GTK_WIDGET(GNOME_CANVAS_ITEM(text)->canvas);
-
- ltr_context = gtk_widget_create_pango_context(canvas);
- pango_context_set_base_dir(ltr_context, PANGO_DIRECTION_LTR);
- rtl_context = gtk_widget_create_pango_context(canvas);
- pango_context_set_base_dir(rtl_context, PANGO_DIRECTION_RTL);
-
- gtk_text_layout_set_contexts(
- text->_priv->layout, ltr_context, rtl_context);
-
- g_object_unref(G_OBJECT(ltr_context));
- g_object_unref(G_OBJECT(rtl_context));
-
- style = gtk_text_attributes_new();
-
- gnome_canvas_rich_text_set_attributes_from_style(
- text, style, canvas->style);
-
- style->pixels_above_lines = text->_priv->pixels_above_lines;
- style->pixels_below_lines = text->_priv->pixels_below_lines;
- style->pixels_inside_wrap = text->_priv->pixels_inside_wrap;
- style->left_margin = text->_priv->left_margin;
- style->right_margin = text->_priv->right_margin;
- style->indent = text->_priv->indent;
- style->tabs = NULL;
- style->wrap_mode = text->_priv->wrap_mode;
- style->justification = text->_priv->justification;
- style->direction = text->_priv->direction;
- style->editable = text->_priv->editable;
- style->invisible = !text->_priv->visible;
-
- gtk_text_layout_set_default_style(text->_priv->layout, style);
-
- gtk_text_attributes_unref(style);
-
- g_signal_connect(
- G_OBJECT(text->_priv->layout), "invalidated",
- G_CALLBACK (invalidated_handler), text);
-
- g_signal_connect(
- G_OBJECT(text->_priv->layout), "changed",
- G_CALLBACK (changed_handler), text);
- }
-} /* gnome_canvas_rich_text_ensure_layout */
-
-static void
-gnome_canvas_rich_text_destroy_layout(GnomeCanvasRichText *text)
-{
- if (text->_priv->layout) {
- g_signal_handlers_disconnect_by_func(
- G_OBJECT(text->_priv->layout), invalidated_handler, text);
- g_signal_handlers_disconnect_by_func(
- G_OBJECT(text->_priv->layout), changed_handler, text);
- g_object_unref(G_OBJECT(text->_priv->layout));
- text->_priv->layout = NULL;
- }
-} /* gnome_canvas_rich_text_destroy_layout */
-
-static void
-adjust_for_anchors(GnomeCanvasRichText *text, double *ax, double *ay)
-{
- double x, y;
-
- x = text->_priv->x;
- y = text->_priv->y;
-
- /* Anchor text */
- /* X coordinates */
- switch (text->_priv->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- x -= text->_priv->width / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- x -= text->_priv->width;
- break;
- default:
- break;
- }
-
- /* Y coordinates */
- switch (text->_priv->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- y -= text->_priv->height / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- y -= text->_priv->height;
- break;
- default:
- break;
- }
-
- if (ax)
- *ax = x;
- if (ay)
- *ay = y;
-} /* adjust_for_anchors */
-
-static void
-get_bounds(GnomeCanvasRichText *text, double *px1, double *py1,
- double *px2, double *py2)
-{
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM(text);
- double x, y;
- double x1, x2, y1, y2;
- int cx1, cx2, cy1, cy2;
-
- adjust_for_anchors(text, &x, &y);
-
- x1 = x;
- y1 = y;
- x2 = x + text->_priv->width;
- y2 = y + text->_priv->height;
-
- gnome_canvas_item_i2w(item, &x1, &y1);
- gnome_canvas_item_i2w(item, &x2, &y2);
- gnome_canvas_w2c(item->canvas, x1, y1, &cx1, &cy1);
- gnome_canvas_w2c(item->canvas, x2, y2, &cx2, &cy2);
-
- *px1 = cx1;
- *py1 = cy1;
- *px2 = cx2;
- *py2 = cy2;
-} /* get_bounds */
-
-static void gnome_canvas_rich_text_get_bounds(GnomeCanvasItem *item, double *px1, double *py1,
- double *px2, double *py2)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
- get_bounds (text, px1, py1, px2, py2);
-}
-
-static void
-gnome_canvas_rich_text_update(GnomeCanvasItem *item, double *affine,
- ArtSVP *clip_path, int flags)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
- double x1, y1, x2, y2;
- GtkTextIter start;
-
- (* GNOME_CANVAS_ITEM_CLASS(parent_class)->update)(
- item, affine, clip_path, flags);
-
- get_bounds(text, &x1, &y1, &x2, &y2);
-
- gtk_text_buffer_get_iter_at_offset(text->_priv->buffer, &start, 0);
- if (text->_priv->layout)
- gtk_text_layout_validate_yrange(
- text->_priv->layout, &start, 0, y2 - y1);
-
- gnome_canvas_update_bbox(item, x1, y1, x2, y2);
-} /* gnome_canvas_rich_text_update */
-
-static double
-gnome_canvas_rich_text_point(GnomeCanvasItem *item, double x, double y,
- int cx, int cy, GnomeCanvasItem **actual_item)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
- double ax, ay;
- double x1, x2, y1, y2;
- double dx, dy;
-
- *actual_item = item;
-
- /* This is a lame cop-out. Anywhere inside of the bounding box. */
-
- adjust_for_anchors(text, &ax, &ay);
-
- x1 = ax;
- y1 = ay;
- x2 = ax + text->_priv->width;
- y2 = ay + text->_priv->height;
-
- if ((x > x1) && (y > y1) && (x < x2) && (y < y2))
- return 0.0;
-
- if (x < x1)
- dx = x1 - x;
- else if (x > x2)
- dx = x - x2;
- else
- dx = 0.0;
-
- if (y < y1)
- dy = y1 - y;
- else if (y > y2)
- dy = y - y2;
- else
- dy = 0.0;
-
- return sqrt(dx * dx + dy * dy);
-} /* gnome_canvas_rich_text_point */
-
-static void
-gnome_canvas_rich_text_draw(GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT(item);
- double i2w[6], w2c[6], i2c[6];
- double ax, ay;
- int x1, y1, x2, y2;
- ArtPoint i1, i2;
- ArtPoint c1, c2;
-
- gnome_canvas_item_i2w_affine(item, i2w);
- gnome_canvas_w2c_affine(item->canvas, w2c);
- art_affine_multiply(i2c, i2w, w2c);
-
- adjust_for_anchors(text, &ax, &ay);
-
- i1.x = ax;
- i1.y = ay;
- i2.x = ax + text->_priv->width;
- i2.y = ay + text->_priv->height;
- art_affine_point(&c1, &i1, i2c);
- art_affine_point(&c2, &i2, i2c);
-
- x1 = c1.x;
- y1 = c1.y;
- x2 = c2.x;
- y2 = c2.y;
-
- gtk_text_layout_set_screen_width(text->_priv->layout, x2 - x1);
-
- /* FIXME: should last arg be NULL? */
- gtk_text_layout_draw(
- text->_priv->layout,
- GTK_WIDGET(item->canvas),
- drawable,
- GTK_WIDGET (item->canvas)->style->text_gc[GTK_STATE_NORMAL],
- x - x1, y - y1,
- 0, 0, (x2 - x1) - (x - x1), (y2 - y1) - (y - y1),
- NULL);
-} /* gnome_canvas_rich_text_draw */
-
-static void
-gnome_canvas_rich_text_render(GnomeCanvasItem *item, GnomeCanvasBuf *buf)
-{
- g_warning ("rich text item not implemented for anti-aliased canvas");
-} /* gnome_canvas_rich_text_render */
-
-#if 0
-static GtkTextTag *
-gnome_canvas_rich_text_add_tag(GnomeCanvasRichText *text, char *tag_name,
- int start_offset, int end_offset,
- const char *first_property_name, ...)
-{
- GtkTextTag *tag;
- GtkTextIter start, end;
- va_list var_args;
-
- g_return_val_if_fail(text, NULL);
- g_return_val_if_fail(start_offset >= 0, NULL);
- g_return_val_if_fail(end_offset >= 0, NULL);
-
- if (tag_name) {
- GtkTextTagTable *tag_table;
-
- tag_table = gtk_text_buffer_get_tag_table(get_buffer(text));
- g_return_val_if_fail(gtk_text_tag_table_lookup(tag_table, tag_name) == NULL, NULL);
- }
-
- tag = gtk_text_buffer_create_tag(
- get_buffer(text), tag_name, NULL);
-
- va_start(var_args, first_property_name);
- g_object_set_valist(G_OBJECT(tag), first_property_name, var_args);
- va_end(var_args);
-
- gtk_text_buffer_get_iter_at_offset(
- get_buffer(text), &start, start_offset);
- gtk_text_buffer_get_iter_at_offset(
- get_buffer(text), &end, end_offset);
- gtk_text_buffer_apply_tag(get_buffer(text), tag, &start, &end);
-
- return tag;
-} /* gnome_canvas_rich_text_add_tag */
-#endif
+++ /dev/null
-/* Editable GnomeCanvas text item based on GtkTextLayout, borrowed heavily
- * from GtkTextView.
- *
- * Copyright (c) 2000 Red Hat, Inc.
- * Copyright (c) 2001 Joe Shaw
- *
- * 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.
- */
-
-#ifndef GNOME_CANVAS_RICH_TEXT_H
-#define GNOME_CANVAS_RICH_TEXT_H
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GNOME_TYPE_CANVAS_RICH_TEXT (gnome_canvas_rich_text_get_type ())
-#define GNOME_CANVAS_RICH_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_RICH_TEXT, GnomeCanvasRichText))
-#define GNOME_CANVAS_RICH_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_RICH_TEXT, GnomeCanvasRichTextClass))
-#define GNOME_IS_CANVAS_RICH_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_RICH_TEXT))
-#define GNOME_IS_CANVAS_RICH_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_RICH_TEXT))
-#define GNOME_CANVAS_RICH_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_RICH_TEXT, GnomeCanvasRichTextClass))
-
-typedef struct _GnomeCanvasRichText GnomeCanvasRichText;
-typedef struct _GnomeCanvasRichTextPrivate GnomeCanvasRichTextPrivate;
-typedef struct _GnomeCanvasRichTextClass GnomeCanvasRichTextClass;
-
-struct _GnomeCanvasRichText {
- GnomeCanvasItem item;
-
- GnomeCanvasRichTextPrivate *_priv;
-};
-
-struct _GnomeCanvasRichTextClass {
- GnomeCanvasItemClass parent_class;
-
- void (* tag_changed)(GnomeCanvasRichText *text,
- GtkTextTag *tag);
-};
-
-GType gnome_canvas_rich_text_get_type(void) G_GNUC_CONST;
-
-void gnome_canvas_rich_text_cut_clipboard(GnomeCanvasRichText *text);
-
-void gnome_canvas_rich_text_copy_clipboard(GnomeCanvasRichText *text);
-
-void gnome_canvas_rich_text_paste_clipboard(GnomeCanvasRichText *text);
-
-void gnome_canvas_rich_text_set_buffer(GnomeCanvasRichText *text,
- GtkTextBuffer *buffer);
-
-GtkTextBuffer *gnome_canvas_rich_text_get_buffer(GnomeCanvasRichText *text);
-void
-gnome_canvas_rich_text_get_iter_location (GnomeCanvasRichText *text,
- const GtkTextIter *iter,
- GdkRectangle *location);
-void
-gnome_canvas_rich_text_get_iter_at_location (GnomeCanvasRichText *text,
- GtkTextIter *iter,
- gint x,
- gint y);
-
-G_END_DECLS
-
-#endif /* GNOME_CANVAS_RICH_TEXT_H */
+++ /dev/null
-#ifndef GNOME_CANVAS_SHAPE_PRIVATE_H
-#define GNOME_CANVAS_SHAPE_PRIVATE_H
-
-/* Bpath item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998,1999 The Free Software Foundation
- *
- * Authors: Federico Mena <federico@nuclecu.unam.mx>
- * Raph Levien <raph@acm.org>
- * Lauris Kaplinski <lauris@ariman.ee>
- */
-
-#include <gdk/gdk.h>
-#include <libart_lgpl/art_vpath.h>
-#include <libart_lgpl/art_svp.h>
-#include <libart_lgpl/art_vpath_dash.h>
-#include <libart_lgpl/art_svp_wind.h>
-#include <libgnomecanvas/gnome-canvas.h>
-
-#include <libgnomecanvas/gnome-canvas-path-def.h>
-
-G_BEGIN_DECLS
-
-typedef struct _GnomeCanvasShapePrivGdk GnomeCanvasShapePrivGdk;
-typedef struct _GCBPDrawCtx GCBPDrawCtx;
-
-/* Per canvas private structure, holding necessary data for rendering
- * temporary masks, which are needed for drawing multipart bpaths.
- * As canvas cannot multithread, we can be sure, that masks are used
- * serially, also one set of masks per canvas is sufficent to guarantee,
- * that masks are created on needed X server. Masks grow as needed.
- * Full structure is refcounted in Bpath implementation
- */
-
-struct _GCBPDrawCtx {
- gint refcount;
-
- GnomeCanvas * canvas;
-
- gint width;
- gint height;
-
- GdkBitmap * mask;
- GdkBitmap * clip;
-
- GdkGC * clear_gc;
- GdkGC * xor_gc;
-};
-
-/* Per Bpath private structure, holding Gdk specific data */
-
-struct _GnomeCanvasShapePrivGdk {
- gulong fill_pixel; /* Color for fill */
- gulong outline_pixel; /* Color for outline */
-
- GdkBitmap *fill_stipple; /* Stipple for fill */
- GdkBitmap *outline_stipple; /* Stipple for outline */
-
- GdkGC * fill_gc; /* GC for filling */
- GdkGC * outline_gc; /* GC for outline */
-
- gint len_points; /* Size of allocated points array */
- gint num_points; /* Gdk points in canvas coords */
- GdkPoint * points; /* Ivariant: closed paths are before open ones */
- GSList * closed_paths; /* List of lengths */
- GSList * open_paths; /* List of lengths */
-
- GCBPDrawCtx * ctx; /* Pointer to per-canvas drawing context */
-};
-
-struct _GnomeCanvasShapePriv {
- GnomeCanvasPathDef * path; /* Our bezier path representation */
-
- gdouble scale; /* CTM scaling (for pen) */
-
- guint fill_set : 1; /* Is fill color set? */
- guint outline_set : 1; /* Is outline color set? */
- guint width_pixels : 1; /* Is outline width specified in pixels or units? */
-
- double width; /* Width of outline, in user coords */
-
- guint32 fill_rgba; /* Fill color, RGBA */
- guint32 outline_rgba; /* Outline color, RGBA */
-
- GdkCapStyle cap; /* Cap style for line */
- GdkJoinStyle join; /* Join style for line */
- ArtWindRule wind; /* Winding rule */
- double miterlimit; /* Miter limit */
-
- ArtVpathDash dash; /* Dashing pattern */
-
- ArtSVP * fill_svp; /* The SVP for the filled shape */
- ArtSVP * outline_svp; /* The SVP for the outline shape */
-
- GnomeCanvasShapePrivGdk * gdk; /* Gdk specific things */
-};
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/* Generic bezier shape item for GnomeCanvasWidget. Most code taken
- * from gnome-canvas-bpath but made into a shape item.
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget. Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998,1999 The Free Software Foundation
- *
- * Authors: Federico Mena <federico@nuclecu.unam.mx>
- * Raph Levien <raph@acm.org>
- * Lauris Kaplinski <lauris@ximian.com>
- * Miguel de Icaza <miguel@kernel.org>
- * Cody Russell <bratsche@gnome.org>
- * Rusty Conover <rconover@bangtail.net>
- */
-
-/* These includes are set up for standalone compile. If/when this codebase
- is integrated into libgnomeui, the includes will need to change. */
-
-#include <math.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include "gnome-canvas.h"
-#include "gnome-canvas-util.h"
-
-#include "gnome-canvas-shape.h"
-#include "gnome-canvas-shape-private.h"
-#include "gnome-canvas-path-def.h"
-
-#include <libart_lgpl/art_rect.h>
-#include <libart_lgpl/art_vpath.h>
-#include <libart_lgpl/art_bpath.h>
-#include <libart_lgpl/art_vpath_bpath.h>
-#include <libart_lgpl/art_svp.h>
-#include <libart_lgpl/art_svp_point.h>
-#include <libart_lgpl/art_svp_vpath.h>
-#include <libart_lgpl/art_vpath_dash.h>
-#include <libart_lgpl/art_svp_wind.h>
-#include <libart_lgpl/art_svp_intersect.h>
-#include <libart_lgpl/art_rect_svp.h>
-
-enum {
- PROP_0,
- PROP_FILL_COLOR,
- PROP_FILL_COLOR_GDK,
- PROP_FILL_COLOR_RGBA,
- PROP_OUTLINE_COLOR,
- PROP_OUTLINE_COLOR_GDK,
- PROP_OUTLINE_COLOR_RGBA,
- PROP_FILL_STIPPLE,
- PROP_OUTLINE_STIPPLE,
- PROP_WIDTH_PIXELS,
- PROP_WIDTH_UNITS,
- PROP_CAP_STYLE,
- PROP_JOIN_STYLE,
- PROP_WIND,
- PROP_MITERLIMIT,
- PROP_DASH
-};
-
-static void gnome_canvas_shape_class_init (GnomeCanvasShapeClass *class);
-static void gnome_canvas_shape_init (GnomeCanvasShape *bpath);
-static void gnome_canvas_shape_destroy (GtkObject *object);
-static void gnome_canvas_shape_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_shape_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void gnome_canvas_shape_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
-static void gnome_canvas_shape_realize (GnomeCanvasItem *item);
-static void gnome_canvas_shape_unrealize (GnomeCanvasItem *item);
-static void gnome_canvas_shape_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-static double gnome_canvas_shape_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy, GnomeCanvasItem **actual_item);
-static void gnome_canvas_shape_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
-static void gnome_canvas_shape_bounds (GnomeCanvasItem *item,
- double *x1, double *y1, double *x2, double *y2);
-
-static gulong get_pixel_from_rgba (GnomeCanvasItem *item, guint32 rgba_color);
-static guint32 get_rgba_from_color (GdkColor * color);
-static void set_gc_foreground (GdkGC *gc, gulong pixel);
-static void gcbp_ensure_gdk (GnomeCanvasShape * bpath);
-static void gcbp_destroy_gdk (GnomeCanvasShape * bpath);
-static void set_stipple (GdkGC *gc, GdkBitmap **internal_stipple, GdkBitmap *stipple, int reconfigure);
-static void gcbp_ensure_mask (GnomeCanvasShape * bpath, gint width, gint height);
-static void gcbp_draw_ctx_unref (GCBPDrawCtx * ctx);
-
-static GnomeCanvasItemClass *parent_class;
-
-GType
-gnome_canvas_shape_get_type (void)
-{
- static GType shape_type;
-
- if (!shape_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasShapeClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_shape_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasShape),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_shape_init,
- NULL /* value_table */
- };
-
- shape_type = g_type_register_static (GNOME_TYPE_CANVAS_ITEM, "GnomeCanvasShape",
- &object_info, 0);
- }
-
- return shape_type;
-}
-
-static void
-gnome_canvas_shape_class_init (GnomeCanvasShapeClass *class)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- gobject_class = (GObjectClass *) class;
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- parent_class = g_type_class_peek_parent (class);
-
- /* when this gets checked into libgnomeui, change the
- GTK_TYPE_POINTER to GTK_TYPE_GNOME_CANVAS_SHAPE, and add an
- entry to gnome-boxed.defs */
-
- gobject_class->set_property = gnome_canvas_shape_set_property;
- gobject_class->get_property = gnome_canvas_shape_get_property;
-
-
-
- g_object_class_install_property (gobject_class,
- PROP_FILL_COLOR,
- g_param_spec_string ("fill_color", NULL, NULL,
- NULL,
- (G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_FILL_COLOR_GDK,
- g_param_spec_boxed ("fill_color_gdk", NULL, NULL,
- GDK_TYPE_COLOR,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_FILL_COLOR_RGBA,
- g_param_spec_uint ("fill_color_rgba", NULL, NULL,
- 0, G_MAXUINT, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_OUTLINE_COLOR,
- g_param_spec_string ("outline_color", NULL, NULL,
- NULL,
- (G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_OUTLINE_COLOR_GDK,
- g_param_spec_boxed ("outline_color_gdk", NULL, NULL,
- GDK_TYPE_COLOR,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_OUTLINE_COLOR_RGBA,
- g_param_spec_uint ("outline_color_rgba", NULL, NULL,
- 0, G_MAXUINT, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_FILL_STIPPLE,
- g_param_spec_object ("fill_stipple", NULL, NULL,
- GDK_TYPE_DRAWABLE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_OUTLINE_STIPPLE,
- g_param_spec_object ("outline_stipple", NULL, NULL,
- GDK_TYPE_DRAWABLE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_WIDTH_PIXELS,
- g_param_spec_uint ("width_pixels", NULL, NULL,
- 0, G_MAXUINT, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_WIDTH_UNITS,
- g_param_spec_double ("width_units", NULL, NULL,
- 0.0, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_CAP_STYLE,
- g_param_spec_enum ("cap_style", NULL, NULL,
- GDK_TYPE_CAP_STYLE,
- GDK_CAP_BUTT,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_JOIN_STYLE,
- g_param_spec_enum ("join_style", NULL, NULL,
- GDK_TYPE_JOIN_STYLE,
- GDK_JOIN_MITER,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_WIND,
- g_param_spec_uint ("wind", NULL, NULL,
- 0, G_MAXUINT, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_MITERLIMIT,
- g_param_spec_double ("miterlimit", NULL, NULL,
- 0.0, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property (gobject_class,
- PROP_DASH,
- g_param_spec_pointer ("dash", NULL, NULL,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- object_class->destroy = gnome_canvas_shape_destroy;
-
- item_class->update = gnome_canvas_shape_update;
- item_class->realize = gnome_canvas_shape_realize;
- item_class->unrealize = gnome_canvas_shape_unrealize;
- item_class->draw = gnome_canvas_shape_draw;
- item_class->point = gnome_canvas_shape_point;
- item_class->render = gnome_canvas_shape_render;
- item_class->bounds = gnome_canvas_shape_bounds;
-}
-
-static void
-gnome_canvas_shape_init (GnomeCanvasShape *shape)
-{
- shape->priv = g_new (GnomeCanvasShapePriv, 1);
-
- shape->priv->path = NULL;
-
- shape->priv->scale = 1.0;
-
- shape->priv->fill_set = FALSE;
- shape->priv->outline_set = FALSE;
- shape->priv->width_pixels = FALSE;
-
- shape->priv->width = 1.0;
-
- shape->priv->fill_rgba = 0x0000003f;
- shape->priv->outline_rgba = 0x0000007f;
-
- shape->priv->cap = GDK_CAP_BUTT;
- shape->priv->join = GDK_JOIN_MITER;
- shape->priv->wind = ART_WIND_RULE_ODDEVEN;
- shape->priv->miterlimit = 10.43; /* X11 default */
-
- shape->priv->dash.n_dash = 0;
- shape->priv->dash.dash = NULL;
-
- shape->priv->fill_svp = NULL;
- shape->priv->outline_svp = NULL;
-
- shape->priv->gdk = NULL;
-}
-
-static void
-gnome_canvas_shape_destroy (GtkObject *object)
-{
- GnomeCanvasShape *shape;
- GnomeCanvasShapePriv *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_SHAPE (object));
-
- shape = GNOME_CANVAS_SHAPE (object);
-
- if (shape->priv) {
- priv = shape->priv;
- if (priv->gdk) gcbp_destroy_gdk (shape);
-
- if (priv->path) gnome_canvas_path_def_unref (priv->path);
-
- if (priv->dash.dash) g_free (priv->dash.dash);
- if (priv->fill_svp) art_svp_free (priv->fill_svp);
- if (priv->outline_svp) art_svp_free (priv->outline_svp);
-
- g_free (shape->priv);
- shape->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-/**
- * gnome_canvas_shape_set_path_def:
- * @shape: a GnomeCanvasShape
- * @def: a GnomeCanvasPathDef
- *
- * This function sets the the GnomeCanvasPathDef used by the
- * GnomeCanvasShape. Notice, that it does not request updates, as
- * it is meant to be used from item implementations, from inside
- * update queue.
- */
-
-void
-gnome_canvas_shape_set_path_def (GnomeCanvasShape *shape, GnomeCanvasPathDef *def)
-{
- GnomeCanvasShapePriv *priv;
-
- g_return_if_fail (shape != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_SHAPE (shape));
-
- priv = shape->priv;
-
- if (priv->path) {
- gnome_canvas_path_def_unref (priv->path);
- priv->path = NULL;
- }
-
- if (def) {
- priv->path = gnome_canvas_path_def_duplicate (def);
- }
-}
-
-static void
-gnome_canvas_shape_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- GnomeCanvasShape *shape;
- GnomeCanvasShapePriv *priv;
- GnomeCanvasShapePrivGdk *gdk;
- GdkColor color;
- GdkColor *colorptr;
- ArtVpathDash *dash;
-
- item = GNOME_CANVAS_ITEM (object);
- shape = GNOME_CANVAS_SHAPE (object);
- priv = shape->priv;
-
- if (!item->canvas->aa) {
- gcbp_ensure_gdk (shape);
- gdk = priv->gdk;
- } else {
- gdk = NULL;
- }
-
- switch (param_id) {
- case PROP_FILL_COLOR:
- if (gnome_canvas_get_color (item->canvas, g_value_get_string (value), &color)) {
- priv->fill_set = TRUE;
- priv->fill_rgba = get_rgba_from_color (&color);
- if (gdk) gdk->fill_pixel = color.pixel;
- } else if (priv->fill_set)
- priv->fill_set = FALSE;
- else
- break;
-
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_FILL_COLOR_GDK:
- colorptr = g_value_get_boxed (value);
- if (colorptr != NULL) {
- priv->fill_set = TRUE;
- priv->fill_rgba = get_rgba_from_color (colorptr);
- if (gdk) {
- GdkColormap *colormap = gtk_widget_get_colormap (GTK_WIDGET (item->canvas));
- GdkColor tmp = *colorptr;
- gdk_rgb_find_color (colormap, &tmp);
- gdk->fill_pixel = tmp.pixel;
- }
- } else if (priv->fill_set)
- priv->fill_set = FALSE;
- else
- break;
-
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_FILL_COLOR_RGBA:
- priv->fill_set = TRUE;
- priv->fill_rgba = g_value_get_uint (value);
- if (gdk) gdk->fill_pixel = get_pixel_from_rgba (item, priv->fill_rgba);
-
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_OUTLINE_COLOR:
- if (gnome_canvas_get_color (item->canvas, g_value_get_string (value), &color)) {
- priv->outline_set = TRUE;
- priv->outline_rgba = get_rgba_from_color (&color);
- if (gdk) gdk->outline_pixel = color.pixel;
- } else if (priv->outline_set)
- priv->outline_set = FALSE;
- else
- break;
-
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_OUTLINE_COLOR_GDK:
- colorptr = g_value_get_boxed (value);
- if (colorptr != NULL) {
- priv->outline_set = TRUE;
- priv->outline_rgba = get_rgba_from_color (colorptr);
- if (gdk) {
- GdkColormap *colormap = gtk_widget_get_colormap (GTK_WIDGET (item->canvas));
- GdkColor tmp = *colorptr;
- gdk_rgb_find_color (colormap, &tmp);
- gdk->outline_pixel = tmp.pixel;
- }
- } else if (priv->outline_set)
- priv->outline_set = FALSE;
- else
- break;
-
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_OUTLINE_COLOR_RGBA:
- priv->outline_set = TRUE;
- priv->outline_rgba = g_value_get_uint (value);
- if (gdk) gdk->outline_pixel = get_pixel_from_rgba (item, priv->outline_rgba);
-
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_FILL_STIPPLE:
- if (gdk) {
- set_stipple (gdk->fill_gc, &gdk->fill_stipple, (GdkBitmap*) g_value_get_object (value), FALSE);
- gnome_canvas_item_request_update (item);
- }
- break;
-
- case PROP_OUTLINE_STIPPLE:
- if (gdk) {
- set_stipple (gdk->outline_gc, &gdk->outline_stipple, (GdkBitmap*) g_value_get_object (value), FALSE);
- gnome_canvas_item_request_update (item);
- }
- break;
-
- case PROP_WIDTH_PIXELS:
- priv->width = g_value_get_uint (value);
- priv->width_pixels = TRUE;
-
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_WIDTH_UNITS:
- priv->width = fabs (g_value_get_double (value));
- priv->width_pixels = FALSE;
-
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_WIND:
- priv->wind = g_value_get_uint (value);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_CAP_STYLE:
- priv->cap = g_value_get_enum (value);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_JOIN_STYLE:
- priv->join = g_value_get_enum (value);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_MITERLIMIT:
- priv->miterlimit = g_value_get_double (value);
- gnome_canvas_item_request_update (item);
- break;
-
- case PROP_DASH:
- dash = g_value_get_pointer (value);
- if (priv->dash.dash) g_free (priv->dash.dash);
- priv->dash.dash = NULL;
-
- if (dash) {
- priv->dash.offset = dash->offset;
- priv->dash.n_dash = dash->n_dash;
- if (dash->dash != NULL) {
- priv->dash.dash = g_new (double, dash->n_dash);
- memcpy (priv->dash.dash, dash->dash, dash->n_dash * sizeof (double));
- }
- }
- gnome_canvas_item_request_update (item);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-/* Allocates a GdkColor structure filled with the specified pixel, and
- * puts it into the specified value for returning it in the get_property
- * method.
- */
-
-static void
-get_color_value (GnomeCanvasShape *shape, gulong pixel, GValue *value)
-{
- GnomeCanvas *canvas = GNOME_CANVAS_ITEM (shape)->canvas;
- GdkColormap *colormap = gtk_widget_get_colormap (GTK_WIDGET (canvas));
- GdkColor color;
-
- gdk_colormap_query_color (colormap, pixel, &color);
- g_value_set_boxed (value, &color);
-}
-
-/**
- * gnome_canvas_shape_get_path_def:
- * @shape: a GnomeCanvasShape
- *
- * This function returns the #GnomeCanvasPathDef that the shape
- * currently uses. It adds a reference to the #GnomeCanvasPathDef and
- * returns it, if there is not a #GnomeCanvasPathDef set for the shape
- * it returns NULL.
- *
- * Returns: a #GnomeCanvasPathDef or NULL if none is set for the shape.
- */
-
-GnomeCanvasPathDef *
-gnome_canvas_shape_get_path_def (GnomeCanvasShape *shape)
-{
- GnomeCanvasShapePriv *priv;
-
- g_return_val_if_fail (shape != NULL, NULL);
- g_return_val_if_fail (GNOME_IS_CANVAS_SHAPE (shape), NULL);
-
- priv = shape->priv;
-
- if (priv->path) {
- gnome_canvas_path_def_ref (priv->path);
- return priv->path;
- }
-
- return NULL;
-}
-
-static void
-gnome_canvas_shape_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasItem *item = GNOME_CANVAS_ITEM (object);
- GnomeCanvasShape *shape = GNOME_CANVAS_SHAPE (object);
- GnomeCanvasShapePriv *priv = shape->priv;
- GnomeCanvasShapePrivGdk *gdk;
-
- if (!item->canvas->aa) {
- gcbp_ensure_gdk (shape);
- gdk = priv->gdk;
- }
- else {
- gdk = NULL;
- }
-
- switch (param_id) {
- case PROP_FILL_COLOR_GDK:
- if (gdk) {
- get_color_value (shape, gdk->fill_pixel, value);
- } else {
- get_color_value (shape, 0, value);
- }
- break;
-
- case PROP_OUTLINE_COLOR_GDK:
- if (gdk) {
- get_color_value (shape, gdk->outline_pixel, value);
- } else {
- get_color_value (shape, 0, value);
- }
- break;
-
- case PROP_FILL_COLOR_RGBA:
- g_value_set_uint (value, priv->fill_rgba);
- break;
-
- case PROP_OUTLINE_COLOR_RGBA:
- g_value_set_uint (value, priv->outline_rgba);
- break;
-
- case PROP_FILL_STIPPLE:
- if (gdk) {
- g_value_set_object (value, gdk->fill_stipple);
- } else {
- g_value_set_object (value, NULL);
- }
- break;
-
- case PROP_OUTLINE_STIPPLE:
- if (gdk) {
- g_value_set_object (value, gdk->outline_stipple);
- } else {
- g_value_set_object (value, NULL);
- }
- break;
-
- case PROP_WIND:
- g_value_set_uint (value, priv->wind);
- break;
-
- case PROP_CAP_STYLE:
- g_value_set_enum (value, priv->cap);
- break;
-
- case PROP_JOIN_STYLE:
- g_value_set_enum (value, priv->join);
- break;
-
- case PROP_WIDTH_PIXELS:
- g_value_set_uint (value, priv->width);
- break;
-
- case PROP_WIDTH_UNITS:
- g_value_set_double (value, priv->width);
- break;
-
- case PROP_MITERLIMIT:
- g_value_set_double (value, priv->miterlimit);
- break;
-
- case PROP_DASH:
- g_value_set_pointer (value, &priv->dash);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-gnome_canvas_shape_realize (GnomeCanvasItem *item)
-{
- GnomeCanvasShape *shape;
-
- shape = GNOME_CANVAS_SHAPE (item);
-
- if (parent_class->realize)
- (* parent_class->realize) (item);
-
- if (!item->canvas->aa) {
- gcbp_ensure_gdk (shape);
-
- g_assert(item->canvas->layout.bin_window != NULL);
-
- shape->priv->gdk->fill_gc = gdk_gc_new (item->canvas->layout.bin_window);
- shape->priv->gdk->outline_gc = gdk_gc_new (item->canvas->layout.bin_window);
- }
-}
-
-static void
-gnome_canvas_shape_unrealize (GnomeCanvasItem *item)
-{
- GnomeCanvasShape *shape;
-
- shape = GNOME_CANVAS_SHAPE (item);
-
- if (!item->canvas->aa) {
- g_assert (shape->priv->gdk != NULL);
-
- g_object_unref (shape->priv->gdk->fill_gc);
- shape->priv->gdk->fill_gc = NULL;
-
- g_object_unref (shape->priv->gdk->outline_gc);
- shape->priv->gdk->outline_gc = NULL;
- }
-
- if (parent_class->unrealize)
- (* parent_class->unrealize) (item);
-}
-
-static void
-gnome_canvas_shape_render (GnomeCanvasItem *item,
- GnomeCanvasBuf *buf)
-{
- GnomeCanvasShape *shape;
-
- shape = GNOME_CANVAS_SHAPE (item);
-
- if (shape->priv->fill_svp != NULL)
- gnome_canvas_render_svp (buf,
- shape->priv->fill_svp,
- shape->priv->fill_rgba);
-
- if (shape->priv->outline_svp != NULL)
- gnome_canvas_render_svp (buf,
- shape->priv->outline_svp,
- shape->priv->outline_rgba);
-}
-
-static void
-gnome_canvas_shape_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height)
-{
- static GdkPoint * dpoints = NULL;
- static gint num_dpoints = 0;
-
- GnomeCanvasShape * shape;
- GnomeCanvasShapePriv * priv;
- GnomeCanvasShapePrivGdk * gdk;
- gint i, pos, len;
- GSList * l;
-
- shape = GNOME_CANVAS_SHAPE (item);
- priv = shape->priv;
-
- /* We have to be realized, so gdk struct should exist! */
-
- gdk = shape->priv->gdk;
- g_assert (gdk != NULL);
-
- /* Build temporary point list, translated by -x, -y */
-
- if (dpoints == NULL) {
- dpoints = g_new (GdkPoint, gdk->num_points);
- num_dpoints = gdk->num_points;
- } else if (num_dpoints < gdk->num_points) {
- dpoints = g_renew (GdkPoint, dpoints, gdk->num_points);
- num_dpoints = gdk->num_points;
- }
-
- for (i = 0; i < gdk->num_points; i++) {
- dpoints[i].x = gdk->points[i].x - x;
- dpoints[i].y = gdk->points[i].y - y;
- }
-
- if (priv->fill_set) {
-
- /* Ensure, that we have mask and it is big enough */
-
- gcbp_ensure_mask (shape, width, height);
-
- /* Clear mask */
-
- gdk_draw_rectangle (gdk->ctx->mask,
- gdk->ctx->clear_gc,
- TRUE,
- 0, 0,
- width, height);
-
- /* Draw subpaths, using XOR gc */
-
- pos = 0;
-
- for (l = gdk->closed_paths; l != NULL; l = l->next) {
- len = GPOINTER_TO_INT (l->data);
-
- gdk_draw_polygon (gdk->ctx->mask,
- gdk->ctx->xor_gc,
- TRUE,
- &dpoints[pos],
- len);
-
- pos += len;
- }
-
- /* Set bitmap to clipping mask */
-
- gdk_gc_set_clip_mask (gdk->fill_gc, gdk->ctx->mask);
-
- /* Stipple offset */
-
- if (gdk->fill_stipple) gnome_canvas_set_stipple_origin (item->canvas, gdk->fill_gc);
-
- /* Draw clipped rect to drawable */
-
- gdk_draw_rectangle (drawable,
- gdk->fill_gc,
- TRUE,
- 0, 0,
- width, height);
- }
-
- if (priv->outline_set) {
-
- /* Stipple offset */
-
- if (gdk->outline_stipple) gnome_canvas_set_stipple_origin (item->canvas, gdk->outline_gc);
- /* Draw subpaths */
-
- pos = 0;
-
- for (l = gdk->closed_paths; l != NULL; l = l->next) {
- len = GPOINTER_TO_INT (l->data);
-
- gdk_draw_polygon (drawable,
- gdk->outline_gc,
- FALSE,
- &dpoints[pos],
- len);
-
- pos += len;
- }
-
- for (l = gdk->open_paths; l != NULL; l = l->next) {
- len = GPOINTER_TO_INT (l->data);
-
- gdk_draw_lines (drawable,
- gdk->outline_gc,
- &dpoints[pos],
- len);
-
- pos += len;
- }
- }
-}
-
-#define GDK_POINTS_BLOCK 32
-
-static void
-gnome_canvas_shape_ensure_gdk_points (GnomeCanvasShapePrivGdk *gdk, gint num)
-{
- if (gdk->len_points < gdk->num_points + num) {
- gdk->len_points = MAX (gdk->len_points + GDK_POINTS_BLOCK, gdk->len_points + num);
- gdk->points = g_renew (GdkPoint, gdk->points, gdk->len_points);
- }
-}
-
-static void
-gnome_canvas_shape_update_gdk (GnomeCanvasShape * shape, double * affine, ArtSVP * clip, int flags)
-{
- GnomeCanvasShapePriv * priv;
- GnomeCanvasShapePrivGdk * gdk;
- int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
- gboolean bbox_set = FALSE;
- gint width = 0; /* silence gcc */
-
- g_assert (!((GnomeCanvasItem *) shape)->canvas->aa);
-
- priv = shape->priv;
- gdk = priv->gdk;
- g_assert (gdk != NULL);
-
- if (priv->outline_set) {
- GdkLineStyle style;
-
- if (priv->width_pixels) {
- width = (int) floor (priv->width + 0.5);
- /* Never select 0 pixels unless the user asked for it,
- * since that is the X11 zero width lines are non-specified */
- if (priv->width_pixels != 0 && width == 0) {
- width = 1;
- }
- } else {
- width = (int) floor ((priv->width * priv->scale) + 0.5);
- /* Never select 0 pixels unless the user asked for it,
- * since that is the X11 zero width lines are non-speciifed */
- if (priv->width != 0 && width == 0) {
- width = 1;
- }
- }
-
- /* If dashed, set it in GdkGC */
-
- if ((shape->priv->dash.dash != NULL) && (shape->priv->dash.n_dash > 0)) {
- gint8 * dash_list;
- gint i;
-
- dash_list = g_new (gint8, shape->priv->dash.n_dash);
-
- for (i = 0; i < priv->dash.n_dash; i++) {
- dash_list[i] = (gint8) shape->priv->dash.dash[i];
- }
-
- gdk_gc_set_dashes (gdk->outline_gc,
- (gint) priv->dash.offset,
- dash_list,
- priv->dash.n_dash);
-
- g_free (dash_list);
-
- style = GDK_LINE_ON_OFF_DASH;
- } else {
- style = GDK_LINE_SOLID;
- }
-
- /* Set line width, cap, join */
- if(gdk->outline_gc) {
-
- gdk_gc_set_line_attributes (gdk->outline_gc,
- width,
- style,
- priv->cap,
- priv->join);
-
- /* Colors and stipples */
- set_gc_foreground (gdk->outline_gc, gdk->outline_pixel);
- set_stipple (gdk->outline_gc, &gdk->outline_stipple, gdk->outline_stipple, TRUE);
- }
- }
-
- if (priv->fill_set) {
-
- /* Colors and stipples */
- if(gdk->fill_gc) {
- set_gc_foreground (gdk->fill_gc, gdk->fill_pixel);
- set_stipple (gdk->fill_gc, &gdk->fill_stipple, gdk->fill_stipple, TRUE);
- }
- }
-
- /* Now the crazy part */
-
- /* Free existing GdkPoint array */
-
- if (gdk->points) {
- g_free (gdk->points);
- gdk->points = NULL;
- gdk->len_points = 0;
- gdk->num_points = 0;
- }
-
- /* Free subpath lists */
-
- while (gdk->closed_paths) gdk->closed_paths = g_slist_remove (gdk->closed_paths, gdk->closed_paths->data);
- while (gdk->open_paths) gdk->open_paths = g_slist_remove (gdk->open_paths, gdk->open_paths->data);
-
- /* Calcualte new GdkPoints array and subpath lists */
-
- if (priv->path) {
- GnomeCanvasPathDef * apath, * cpath, * opath;
- ArtBpath * abpath;
- GSList * clist, * olist;
- gint pos;
-
-#if 0
- /* Allocate array */
- gdk->num_points = gnome_canvas_path_def_length (priv->path) * 1000 - 1;
- gdk->points = g_new (GdkPoint, gdk->num_points);
- g_print ("Points %d\n", gdk->num_points);
- /* Transform path */
-#endif
-
- abpath = art_bpath_affine_transform (gnome_canvas_path_def_bpath (priv->path), affine);
- apath = gnome_canvas_path_def_new_from_bpath (abpath);
-
- /* Split path into open and closed parts */
-
- cpath = gnome_canvas_path_def_closed_parts (apath);
- opath = gnome_canvas_path_def_open_parts (apath);
- gnome_canvas_path_def_unref (apath);
-
- /* Split partial paths into subpaths */
-
- clist = gnome_canvas_path_def_split (cpath);
- gnome_canvas_path_def_unref (cpath);
- olist = gnome_canvas_path_def_split (opath);
- gnome_canvas_path_def_unref (opath);
-
- pos = 0;
-
- /* Fill GdkPoints and add subpaths to list: closed subpaths */
-
- while (clist) {
- GnomeCanvasPathDef * path;
- ArtBpath * bpath;
- ArtVpath * vpath;
- gint len, i;
-
- path = (GnomeCanvasPathDef *) clist->data;
- bpath = gnome_canvas_path_def_bpath (path);
- vpath = art_bez_path_to_vec (bpath, 0.1);
- for (len = 0; vpath[len].code != ART_END; len++) ;
-
- gnome_canvas_shape_ensure_gdk_points (gdk, len);
- for (i = 0; i < len; i++) {
- gdk->points[pos + i].x = (gint) floor (vpath[i].x + 0.5);
- gdk->points[pos + i].y = (gint) floor (vpath[i].y + 0.5);
-
- if (bbox_set) {
- x1 = MIN (x1, gdk->points[pos + i].x);
- x2 = MAX (x2, gdk->points[pos + i].x);
- y1 = MIN (y1, gdk->points[pos + i].y);
- y2 = MAX (y2, gdk->points[pos + i].y);
- } else {
- bbox_set = TRUE;
- x1 = x2 = gdk->points[pos + i].x;
- y1 = y2 = gdk->points[pos + i].y;
- }
- }
- gdk->num_points += len;
-
- art_free (vpath);
-
- if (len > 0) {
- pos += len;
- gdk->closed_paths = g_slist_append (gdk->closed_paths, GINT_TO_POINTER (len));
- }
-
- gnome_canvas_path_def_unref (path);
- clist = g_slist_remove (clist, clist->data);
- }
-
- /* Fill GdkPoints and add subpaths to list: open subpaths */
-
- while (olist) {
- GnomeCanvasPathDef * path;
- ArtBpath * bpath;
- ArtVpath * vpath;
- gint len, i;
-
- path = (GnomeCanvasPathDef *) olist->data;
- bpath = gnome_canvas_path_def_bpath (path);
- vpath = art_bez_path_to_vec (bpath, 0.1);
- for (len = 0; vpath[len].code != ART_END; len++) ;
-
- gnome_canvas_shape_ensure_gdk_points (gdk, len);
- for (i = 0; i < len; i++) {
- gdk->points[pos + i].x = (gint) floor (vpath[i].x + 0.5);
- gdk->points[pos + i].y = (gint) floor (vpath[i].y + 0.5);
-
- if (bbox_set) {
- x1 = MIN (x1, gdk->points[pos + i].x);
- x2 = MAX (x2, gdk->points[pos + i].x);
- y1 = MIN (y1, gdk->points[pos + i].y);
- y2 = MAX (y2, gdk->points[pos + i].y);
- } else {
- bbox_set = TRUE;
- x1 = x2 = gdk->points[pos + i].x;
- y1 = y2 = gdk->points[pos + i].y;
- }
- }
- gdk->num_points += len;
-
- art_free (vpath);
-
- if (len > 0) {
- pos += len;
- gdk->open_paths = g_slist_append (gdk->open_paths, GINT_TO_POINTER (len));
- }
-
- gnome_canvas_path_def_unref (path);
- olist = g_slist_remove (olist, olist->data);
- }
-
- }
-
- if (bbox_set) {
- if (priv->outline_set) {
- int stroke_border = (priv->join == GDK_JOIN_MITER)
- ? ceil (10.43*width/2) /* 10.43 is the miter limit for X11 */
- : ceil (width/2);
- x1 -= stroke_border;
- x2 += stroke_border;
- y1 -= stroke_border;
- y2 += stroke_border;
- }
-
- gnome_canvas_update_bbox (GNOME_CANVAS_ITEM (shape),
- x1, y1,
- x2 + 1, y2 + 1);
- }
-
-}
-
-static void
-gnome_canvas_shape_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- GnomeCanvasShape * shape;
- GnomeCanvasShapePriv * priv;
- ArtSVP * svp;
-
- shape = GNOME_CANVAS_SHAPE (item);
-
- priv = shape->priv;
-
- /* Common part */
- if (parent_class->update) {
- (* parent_class->update) (item, affine, clip_path, flags);
- }
-
- /* Outline width */
- shape->priv->scale = art_affine_expansion (affine);
-
- /* Reset bbox */
- if (item->canvas->aa) {
- gnome_canvas_item_reset_bounds (item);
- }
-
- /* Clipped fill SVP */
-
- if ((priv->fill_set) && (priv->path) && (gnome_canvas_path_def_any_closed (priv->path))) {
- GnomeCanvasPathDef * cpath;
- ArtSvpWriter *swr;
- ArtVpath *vpath;
- ArtBpath *abp;
- ArtSVP *svp2;
-
- /* Get closed part of path */
-
- cpath = gnome_canvas_path_def_closed_parts (shape->priv->path);
- abp = art_bpath_affine_transform (gnome_canvas_path_def_bpath (cpath), affine);
- gnome_canvas_path_def_unref (cpath);
-
- /* Render, until SVP */
-
- vpath = art_bez_path_to_vec (abp, 0.1);
- art_free (abp);
-
- svp = art_svp_from_vpath (vpath);
- art_free (vpath);
-
- swr = art_svp_writer_rewind_new (shape->priv->wind);
- art_svp_intersector (svp, swr);
-
- svp2 = art_svp_writer_rewind_reap (swr);
- art_svp_free (svp);
-
- if (item->canvas->aa) {
- /* Update clipped path */
- gnome_canvas_item_update_svp_clip (item,
- &shape->priv->fill_svp,
- svp2,
- clip_path);
- } else {
- if (priv->fill_svp) {
- art_svp_free (priv->fill_svp);
- priv->fill_svp = NULL;
- }
- /* No clipping */
- shape->priv->fill_svp = svp2;
- }
- }
-
- if (priv->outline_set && priv->path && !gnome_canvas_path_def_is_empty (priv->path)) {
- gdouble width;
- ArtBpath * abp;
- ArtVpath * vpath;
-
- /* Set linewidth */
-
- if (priv->width_pixels) {
- width = priv->width;
- } else {
- width = priv->width * priv->scale;
- }
-
- if (width < 0.5) width = 0.5;
-
- /* Render full path until vpath */
-
- abp = art_bpath_affine_transform (gnome_canvas_path_def_bpath (priv->path), affine);
-
- vpath = art_bez_path_to_vec (abp, 0.1);
- art_free (abp);
-
- /* If dashed, apply dash */
-
- if (priv->dash.dash != NULL)
- {
- ArtVpath *old = vpath;
-
- vpath = art_vpath_dash (old, &priv->dash);
- art_free (old);
- }
-
- /* Stroke vpath to SVP */
-
- svp = art_svp_vpath_stroke (vpath,
- gnome_canvas_join_gdk_to_art (priv->join),
- gnome_canvas_cap_gdk_to_art (priv->cap),
- width,
- priv->miterlimit,
- 0.25);
- art_free (vpath);
-
- if (item->canvas->aa) {
- /* Update clipped */
- gnome_canvas_item_update_svp_clip (item, &priv->outline_svp, svp, clip_path);
- } else {
- if (priv->outline_svp) {
- art_svp_free (priv->outline_svp);
- priv->outline_svp = NULL;
- }
- /* No clipping (yet) */
- shape->priv->outline_svp = svp;
- }
- }
-
- /* Gdk requires additional handling */
-
- if (!item->canvas->aa) {
- gnome_canvas_shape_update_gdk (shape, affine, clip_path, flags);
- }
-}
-
-static double
-gnome_canvas_shape_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy, GnomeCanvasItem **actual_item)
-{
- GnomeCanvasShape *shape;
- double dist;
- int wind;
-
-#if 0
- /* fixme: This is just for debugging, canvas should ensure that */
- /* fixme: IF YOU ARE SURE THAT IT IS CORRECT BEHAVIOUR, you can remove warning */
- /* fixme: and make it to return silently */
- g_return_val_if_fail (!item->canvas->need_update, 1e18);
-#endif
-
- shape = GNOME_CANVAS_SHAPE (item);
-
- /* todo: update? */
- if (shape->priv->fill_set && shape->priv->fill_svp) {
- wind = art_svp_point_wind (shape->priv->fill_svp, cx, cy);
- if ((shape->priv->wind == ART_WIND_RULE_NONZERO) && (wind != 0)) {
- *actual_item = item;
- return 0.0;
- }
- if ((shape->priv->wind == ART_WIND_RULE_ODDEVEN) && ((wind & 0x1) != 0)) {
- *actual_item = item;
- return 0.0;
- }
- }
-
- if (shape->priv->outline_set && shape->priv->outline_svp) {
- wind = art_svp_point_wind (shape->priv->outline_svp, cx, cy);
- if (wind) {
- *actual_item = item;
- return 0.0;
- }
- }
-
- if (shape->priv->outline_set && shape->priv->outline_svp) {
- dist = art_svp_point_dist (shape->priv->outline_svp, cx, cy);
- } else if (shape->priv->fill_set && shape->priv->outline_svp) {
- dist = art_svp_point_dist (shape->priv->fill_svp, cx, cy);
- } else {
- return 1e12;
- }
-
- *actual_item = item;
-
- return dist;
-}
-
-/* Helpers */
-
-/* Get 32bit rgba color from GdkColor */
-
-static guint32
-get_rgba_from_color (GdkColor * color)
-{
- return ((color->red & 0xff00) << 16) | ((color->green & 0xff00) << 8) | (color->blue & 0xff00) | 0xff;
-}
-
-/* Get Gdk pixel value from 32bit rgba color */
-
-static gulong
-get_pixel_from_rgba (GnomeCanvasItem *item, guint32 rgba_color)
-{
- return gnome_canvas_get_color_pixel (item->canvas, rgba_color);
-}
-
-/* Convenience function to set a GC's foreground color to the specified pixel value */
-
-static void
-set_gc_foreground (GdkGC *gc, gulong pixel)
-{
- GdkColor c;
-
- g_assert (gc != NULL);
-
- c.pixel = pixel;
-
- gdk_gc_set_foreground (gc, &c);
-}
-
-/* Sets the stipple pattern for the specified gc */
-
-static void
-set_stipple (GdkGC *gc, GdkBitmap **internal_stipple, GdkBitmap *stipple, int reconfigure)
-{
- if (*internal_stipple && !reconfigure)
- g_object_unref (*internal_stipple);
-
- *internal_stipple = stipple;
- if (stipple && !reconfigure)
- g_object_ref (stipple);
-
- if (gc) {
- if (stipple) {
- gdk_gc_set_stipple (gc, stipple);
- gdk_gc_set_fill (gc, GDK_STIPPLED);
- } else
- gdk_gc_set_fill (gc, GDK_SOLID);
- }
-}
-
-/* Creates private Gdk struct, if not present */
-/* We cannot do it during ::init, as we have to know canvas */
-
-static void
-gcbp_ensure_gdk (GnomeCanvasShape * shape)
-{
- g_assert (!((GnomeCanvasItem *) shape)->canvas->aa);
-
- if (!shape->priv->gdk) {
- GnomeCanvasShapePrivGdk * gdk;
-
- gdk = g_new (GnomeCanvasShapePrivGdk, 1);
-
- gdk->fill_pixel = get_pixel_from_rgba ((GnomeCanvasItem *) shape, shape->priv->fill_rgba);
- gdk->outline_pixel = get_pixel_from_rgba ((GnomeCanvasItem *) shape, shape->priv->outline_rgba);
-
- gdk->fill_stipple = NULL;
- gdk->outline_stipple = NULL;
-
- gdk->fill_gc = NULL;
- gdk->outline_gc = NULL;
-
- gdk->len_points = 0;
- gdk->num_points = 0;
- gdk->points = NULL;
- gdk->closed_paths = NULL;
- gdk->open_paths = NULL;
-
- gdk->ctx = NULL;
-
- shape->priv->gdk = gdk;
- }
-}
-
-/* Destroy private Gdk struct */
-/* It is here, to make ::destroy implementation shorter :) */
-
-static void
-gcbp_destroy_gdk (GnomeCanvasShape * shape)
-{
- GnomeCanvasShapePrivGdk * gdk;
-
- g_assert (!((GnomeCanvasItem *)shape)->canvas->aa);
-
- gdk = shape->priv->gdk;
-
- if (gdk) {
- g_assert (!gdk->fill_gc);
- g_assert (!gdk->outline_gc);
-
- if (gdk->fill_stipple)
- g_object_unref (gdk->fill_stipple);
-
- if (gdk->outline_stipple)
- g_object_unref (gdk->outline_stipple);
-
- if (gdk->points)
- g_free (gdk->points);
-
- while (gdk->closed_paths)
- gdk->closed_paths = g_slist_remove (gdk->closed_paths, gdk->closed_paths->data);
- while (gdk->open_paths)
- gdk->open_paths = g_slist_remove (gdk->open_paths, gdk->open_paths->data);
-
- if (gdk->ctx)
- gcbp_draw_ctx_unref (gdk->ctx);
-
- g_free (gdk);
-
- shape->priv->gdk = NULL;
- }
-}
-
-/*
- * Ensure, that per-canvas Ctx struct is present and bitmaps are
- * big enough, to mask full redraw area. Ctx is refcounted and
- * defined as "BpathDrawCtx" data member on parent canvas
- */
-
-static void
-gcbp_ensure_mask (GnomeCanvasShape * shape, gint width, gint height)
-{
- GnomeCanvasShapePrivGdk * gdk;
- GCBPDrawCtx * ctx;
-
- gdk = shape->priv->gdk;
- g_assert (gdk != NULL);
- ctx = gdk->ctx;
-
- if (!ctx) {
- /* Ctx is not yet defined for us */
-
- GnomeCanvas * canvas;
-
- canvas = GNOME_CANVAS_ITEM (shape)->canvas;
-
- ctx = g_object_get_data (G_OBJECT (canvas), "BpathDrawCtx");
-
- if (!ctx) {
- /* Ctx is not defined for parent canvas yet */
-
- ctx = g_new (GCBPDrawCtx, 1);
-
- ctx->refcount = 1;
- ctx->canvas = canvas;
- ctx->width = 0;
- ctx->height = 0;
-
- ctx->mask = NULL;
- ctx->clip = NULL;
-
- ctx->clear_gc = NULL;
- ctx->xor_gc = NULL;
-
- g_object_set_data (G_OBJECT (canvas), "BpathDrawCtx", ctx);
-
- } else {
- ctx->refcount++;
- }
-
- gdk->ctx = ctx;
-
- }
-
- /* Now we are sure, that ctx is present and properly refcounted */
-
- if ((width > ctx->width) || (height > ctx->height)) {
- /* Ctx is too small */
-
- GdkWindow * window;
-
- window = ((GtkWidget *) (((GnomeCanvasItem *) shape)->canvas))->window;
-
- if (ctx->clear_gc) g_object_unref (ctx->clear_gc);
- if (ctx->xor_gc) g_object_unref (ctx->xor_gc);
- if (ctx->mask) g_object_unref (ctx->mask);
- if (ctx->clip) g_object_unref (ctx->clip);
-
- ctx->mask = gdk_pixmap_new (window, width, height, 1);
- ctx->clip = NULL;
-
- ctx->clear_gc = gdk_gc_new (ctx->mask);
- gdk_gc_set_function (ctx->clear_gc, GDK_CLEAR);
-
- ctx->xor_gc = gdk_gc_new (ctx->mask);
- gdk_gc_set_function (ctx->xor_gc, GDK_INVERT);
- }
-}
-
-/* It is cleaner to have it here, not in parent function */
-
-static void
-gcbp_draw_ctx_unref (GCBPDrawCtx * ctx)
-{
- if (--ctx->refcount < 1) {
- if (ctx->clear_gc)
- g_object_unref (ctx->clear_gc);
- if (ctx->xor_gc)
- g_object_unref (ctx->xor_gc);
-
- if (ctx->mask)
- g_object_unref (ctx->mask);
- if (ctx->clip)
- g_object_unref (ctx->clip);
-
- g_object_set_data (G_OBJECT (ctx->canvas), "BpathDrawCtx", NULL);
- g_free (ctx);
- }
-}
-
-static void
-gnome_canvas_shape_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- GnomeCanvasShape * shape;
- GnomeCanvasShapePriv * priv;
- ArtDRect bbox;
- ArtSVP * svp;
-
- shape = GNOME_CANVAS_SHAPE (item);
-
- priv = shape->priv;
-
- bbox.x0 = *x1;
- bbox.y0 = *y1;
- bbox.x1 = *x2;
- bbox.y1 = *y2;
-
- if (priv->outline_set && priv->path && !gnome_canvas_path_def_is_empty (priv->path)) {
- gdouble width;
- ArtVpath * vpath;
-
- /* Set linewidth */
-
- if (priv->width_pixels) {
- width = priv->width;
- } else {
- width = priv->width * priv->scale;
- }
-
- if (width < 0.5) width = 0.5;
-
- /* Render full path until vpath */
-
- vpath = art_bez_path_to_vec (gnome_canvas_path_def_bpath (priv->path), 0.1);
-
- /* If dashed, apply dash */
-
- if (priv->dash.dash != NULL)
- {
- ArtVpath *old = vpath;
-
- vpath = art_vpath_dash (old, &priv->dash);
- art_free (old);
- }
-
- /* Stroke vpath to SVP */
-
- svp = art_svp_vpath_stroke (vpath,
- gnome_canvas_join_gdk_to_art (priv->join),
- gnome_canvas_cap_gdk_to_art (priv->cap),
- width,
- priv->miterlimit,
- 0.25);
- art_free (vpath);
- art_drect_svp (&bbox, svp);
- art_svp_free (svp);
- } else if ((priv->fill_set) && (priv->path) && (gnome_canvas_path_def_any_closed (priv->path))) {
- GnomeCanvasPathDef *cpath;
- ArtSvpWriter *swr;
- ArtVpath *vpath;
- ArtSVP *svp2;
-
- /* Get closed part of path */
- cpath = gnome_canvas_path_def_closed_parts (shape->priv->path);
- /* Render, until SVP */
- vpath = art_bez_path_to_vec (gnome_canvas_path_def_bpath (cpath), 0.1);
- gnome_canvas_path_def_unref (cpath);
-
- svp = art_svp_from_vpath (vpath);
- art_free (vpath);
-
- swr = art_svp_writer_rewind_new (shape->priv->wind);
- art_svp_intersector (svp, swr);
-
- svp2 = art_svp_writer_rewind_reap (swr);
- art_svp_free (svp);
-
- art_drect_svp (&bbox, svp2);
- art_svp_free (svp2);
- }
-
- *x1 = bbox.x0;
- *y1 = bbox.y0;
- *x2 = bbox.x1;
- *y2 = bbox.y1;
-}
+++ /dev/null
-/* Generic bezier shape item for GnomeCanvas
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998,1999 The Free Software Foundation
- *
- * Authors: Federico Mena <federico@nuclecu.unam.mx>
- * Raph Levien <raph@acm.org>
- * Lauris Kaplinski <lauris@ximian.com>
- * Rusty Conover <rconover@bangtail.net>
- */
-
-#ifndef GNOME_CANVAS_SHAPE_H
-#define GNOME_CANVAS_SHAPE_H
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-path-def.h>
-
-G_BEGIN_DECLS
-
-
-/* Shape item for the canvas.
- *
- * The following object arguments are available:
- *
- * name type read/write description
- * ------------------------------------------------------------------------------------------
- * fill_color string W X color specification for fill color,
- * or NULL pointer for no color (transparent).
- * fill_color_gdk GdkColor* RW Allocated GdkColor for fill.
- * outline_color string W X color specification for outline color,
- * or NULL pointer for no color (transparent).
- * outline_color_gdk GdkColor* RW Allocated GdkColor for outline.
- * fill_stipple GdkBitmap* RW Stipple pattern for fill
- * outline_stipple GdkBitmap* RW Stipple pattern for outline
- * width_pixels uint RW Width of the outline in pixels. The outline will
- * not be scaled when the canvas zoom factor is changed.
- * width_units double RW Width of the outline in canvas units. The outline
- * will be scaled when the canvas zoom factor is changed.
- * cap_style GdkCapStyle RW Cap ("endpoint") style for the bpath.
- * join_style GdkJoinStyle RW Join ("vertex") style for the bpath.
- * wind ArtWindRule RW Winding rule for the bpath.
- * dash ArtVpathDash RW Dashing pattern
- * miterlimit double RW Minimum angle between segments, where miter join
- * rule is applied.
- */
-
-#define GNOME_TYPE_CANVAS_SHAPE (gnome_canvas_shape_get_type ())
-#define GNOME_CANVAS_SHAPE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_SHAPE, GnomeCanvasShape))
-#define GNOME_CANVAS_SHAPE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_SHAPE, GnomeCanvasShapeClass))
-#define GNOME_IS_CANVAS_SHAPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_SHAPE))
-#define GNOME_IS_CANVAS_SHAPE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_SHAPE))
-
-
-typedef struct _GnomeCanvasShape GnomeCanvasShape;
-typedef struct _GnomeCanvasShapePriv GnomeCanvasShapePriv;
-typedef struct _GnomeCanvasShapeClass GnomeCanvasShapeClass;
-
-struct _GnomeCanvasShape {
- GnomeCanvasItem item;
-
- GnomeCanvasShapePriv *priv; /* Private data */
-};
-
-struct _GnomeCanvasShapeClass {
- GnomeCanvasItemClass parent_class;
-};
-
-
-/* WARNING! These are not usable from modifying shapes from user programs */
-/* These are meant, to set master shape from subclass ::update method */
-void gnome_canvas_shape_set_path_def (GnomeCanvasShape *shape, GnomeCanvasPathDef *def);
-GnomeCanvasPathDef *gnome_canvas_shape_get_path_def (GnomeCanvasShape *shape);
-
-/* Standard Gtk function */
-GType gnome_canvas_shape_get_type (void) G_GNUC_CONST;
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * $Id$
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas
- * widget. Tk is copyrighted by the Regents of the University of California,
- * Sun Microsystems, and other parties.
- *
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- * Port to Pango co-done by Gerg� �rdi <cactus@cactus.rulez.org>
- */
-
-#include <config.h>
-#include <math.h>
-#include <string.h>
-#include "gnome-canvas-text.h"
-#include <pango/pangoft2.h>
-
-#include "libart_lgpl/art_affine.h"
-#include "libart_lgpl/art_rgb_a_affine.h"
-#include "libart_lgpl/art_rgb.h"
-#include "libart_lgpl/art_rgb_bitmap_affine.h"
-#include "gnome-canvas-util.h"
-#include "gnome-canvas-i18n.h"
-
-\f
-
-/* Object argument IDs */
-enum {
- PROP_0,
-
- /* Text contents */
- PROP_TEXT,
- PROP_MARKUP,
-
- /* Position */
- PROP_X,
- PROP_Y,
-
- /* Font */
- PROP_FONT,
- PROP_FONT_DESC,
- PROP_FAMILY, PROP_FAMILY_SET,
-
- /* Style */
- PROP_ATTRIBUTES,
- PROP_STYLE, PROP_STYLE_SET,
- PROP_VARIANT, PROP_VARIANT_SET,
- PROP_WEIGHT, PROP_WEIGHT_SET,
- PROP_STRETCH, PROP_STRETCH_SET,
- PROP_SIZE, PROP_SIZE_SET,
- PROP_SIZE_POINTS,
- PROP_STRIKETHROUGH, PROP_STRIKETHROUGH_SET,
- PROP_UNDERLINE, PROP_UNDERLINE_SET,
- PROP_RISE, PROP_RISE_SET,
- PROP_SCALE, PROP_SCALE_SET,
-
- /* Clipping */
- PROP_ANCHOR,
- PROP_JUSTIFICATION,
- PROP_CLIP_WIDTH,
- PROP_CLIP_HEIGHT,
- PROP_CLIP,
- PROP_X_OFFSET,
- PROP_Y_OFFSET,
-
- /* Coloring */
- PROP_FILL_COLOR,
- PROP_FILL_COLOR_GDK,
- PROP_FILL_COLOR_RGBA,
- PROP_FILL_STIPPLE,
-
- /* Rendered size accessors */
- PROP_TEXT_WIDTH,
- PROP_TEXT_HEIGHT
-};
-
-struct _GnomeCanvasTextPrivate {
- guint render_dirty : 1;
- FT_Bitmap bitmap;
-};
-
-
-static void gnome_canvas_text_class_init (GnomeCanvasTextClass *class);
-static void gnome_canvas_text_init (GnomeCanvasText *text);
-static void gnome_canvas_text_destroy (GtkObject *object);
-static void gnome_canvas_text_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_text_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void gnome_canvas_text_update (GnomeCanvasItem *item, double *affine,
- ArtSVP *clip_path, int flags);
-static void gnome_canvas_text_realize (GnomeCanvasItem *item);
-static void gnome_canvas_text_unrealize (GnomeCanvasItem *item);
-static void gnome_canvas_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-static double gnome_canvas_text_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item);
-static void gnome_canvas_text_bounds (GnomeCanvasItem *item,
- double *x1, double *y1, double *x2, double *y2);
-static void gnome_canvas_text_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
-
-static void gnome_canvas_text_set_markup (GnomeCanvasText *textitem,
- const gchar *markup);
-
-static void gnome_canvas_text_set_font_desc (GnomeCanvasText *textitem,
- PangoFontDescription *font_desc);
-
-static void gnome_canvas_text_apply_font_desc (GnomeCanvasText *textitem);
-static void gnome_canvas_text_apply_attributes (GnomeCanvasText *textitem);
-
-static void add_attr (PangoAttrList *attr_list,
- PangoAttribute *attr);
-
-static GnomeCanvasItemClass *parent_class;
-
-\f
-
-/**
- * gnome_canvas_text_get_type:
- * @void:
- *
- * Registers the &GnomeCanvasText class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &GnomeCanvasText class.
- **/
-GType
-gnome_canvas_text_get_type (void)
-{
- static GType text_type;
-
- if (!text_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasTextClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_text_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasText),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_text_init,
- NULL /* value_table */
- };
-
- text_type = g_type_register_static (GNOME_TYPE_CANVAS_ITEM, "GnomeCanvasText",
- &object_info, 0);
- }
-
- return text_type;
-}
-
-/* Class initialization function for the text item */
-static void
-gnome_canvas_text_class_init (GnomeCanvasTextClass *class)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- gobject_class = (GObjectClass *) class;
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- parent_class = g_type_class_peek_parent (class);
-
- gobject_class->set_property = gnome_canvas_text_set_property;
- gobject_class->get_property = gnome_canvas_text_get_property;
-
- /* Text */
- g_object_class_install_property
- (gobject_class,
- PROP_TEXT,
- g_param_spec_string ("text",
- _("Text"),
- _("Text to render"),
- NULL,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- g_object_class_install_property
- (gobject_class,
- PROP_MARKUP,
- g_param_spec_string ("markup",
- _("Markup"),
- _("Marked up text to render"),
- NULL,
- (G_PARAM_WRITABLE)));
-
- /* Position */
- g_object_class_install_property
- (gobject_class,
- PROP_X,
- g_param_spec_double ("x", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- g_object_class_install_property
- (gobject_class,
- PROP_Y,
- g_param_spec_double ("y", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
-
- /* Font */
- g_object_class_install_property
- (gobject_class,
- PROP_FONT,
- g_param_spec_string ("font",
- _("Font"),
- _("Font description as a string"),
- NULL,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- g_object_class_install_property
- (gobject_class,
- PROP_FONT_DESC,
- g_param_spec_boxed ("font_desc",
- _("Font description"),
- _("Font description as a PangoFontDescription struct"),
- PANGO_TYPE_FONT_DESCRIPTION,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- g_object_class_install_property
- (gobject_class,
- PROP_FAMILY,
- g_param_spec_string ("family",
- _("Font family"),
- _("Name of the font family, e.g. Sans, Helvetica, Times, Monospace"),
- NULL,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- /* Style */
- g_object_class_install_property
- (gobject_class,
- PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", NULL, NULL,
- PANGO_TYPE_ATTR_LIST,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- g_object_class_install_property
- (gobject_class,
- PROP_STYLE,
- g_param_spec_enum ("style",
- _("Font style"),
- _("Font style"),
- PANGO_TYPE_STYLE,
- PANGO_STYLE_NORMAL,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property
- (gobject_class,
- PROP_VARIANT,
- g_param_spec_enum ("variant",
- _("Font variant"),
- _("Font variant"),
- PANGO_TYPE_VARIANT,
- PANGO_VARIANT_NORMAL,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property
- (gobject_class,
- PROP_WEIGHT,
- g_param_spec_int ("weight",
- _("Font weight"),
- _("Font weight"),
- 0,
- G_MAXINT,
- PANGO_WEIGHT_NORMAL,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
-
- g_object_class_install_property
- (gobject_class,
- PROP_STRETCH,
- g_param_spec_enum ("stretch",
- _("Font stretch"),
- _("Font stretch"),
- PANGO_TYPE_STRETCH,
- PANGO_STRETCH_NORMAL,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property
- (gobject_class,
- PROP_SIZE,
- g_param_spec_int ("size",
- _("Font size"),
- _("Font size (as a multiple of PANGO_SCALE, eg. 12*PANGO_SCALE for a 12pt font size)"),
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property
- (gobject_class,
- PROP_SIZE_POINTS,
- g_param_spec_double ("size_points",
- _("Font points"),
- _("Font size in points (eg. 12 for a 12pt font size)"),
- 0.0,
- G_MAXDOUBLE,
- 0.0,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property
- (gobject_class,
- PROP_RISE,
- g_param_spec_int ("rise",
- _("Rise"),
- _("Offset of text above the baseline (below the baseline if rise is negative)"),
- -G_MAXINT,
- G_MAXINT,
- 0,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property
- (gobject_class,
- PROP_STRIKETHROUGH,
- g_param_spec_boolean ("strikethrough",
- _("Strikethrough"),
- _("Whether to strike through the text"),
- FALSE,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property
- (gobject_class,
- PROP_UNDERLINE,
- g_param_spec_enum ("underline",
- _("Underline"),
- _("Style of underline for this text"),
- PANGO_TYPE_UNDERLINE,
- PANGO_UNDERLINE_NONE,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property
- (gobject_class,
- PROP_SCALE,
- g_param_spec_double ("scale",
- _("Scale"),
- _("Size of font, relative to default size"),
- 0.0,
- G_MAXDOUBLE,
- 1.0,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property
- (gobject_class,
- PROP_ANCHOR,
- g_param_spec_enum ("anchor", NULL, NULL,
- GTK_TYPE_ANCHOR_TYPE,
- GTK_ANCHOR_CENTER,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_JUSTIFICATION,
- g_param_spec_enum ("justification", NULL, NULL,
- GTK_TYPE_JUSTIFICATION,
- GTK_JUSTIFY_LEFT,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_CLIP_WIDTH,
- g_param_spec_double ("clip_width", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_CLIP_HEIGHT,
- g_param_spec_double ("clip_height", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_CLIP,
- g_param_spec_boolean ("clip", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_X_OFFSET,
- g_param_spec_double ("x_offset", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_Y_OFFSET,
- g_param_spec_double ("y_offset", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_FILL_COLOR,
- g_param_spec_string ("fill_color",
- _("Color"),
- _("Text color, as string"),
- NULL,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_FILL_COLOR_GDK,
- g_param_spec_boxed ("fill_color_gdk",
- _("Color"),
- _("Text color, as a GdkColor"),
- GDK_TYPE_COLOR,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_FILL_COLOR_RGBA,
- g_param_spec_uint ("fill_color_rgba",
- _("Color"),
- _("Text color, as an R/G/B/A combined integer"),
- 0, G_MAXUINT, 0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_FILL_STIPPLE,
- g_param_spec_object ("fill_stipple", NULL, NULL,
- GDK_TYPE_DRAWABLE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_TEXT_WIDTH,
- g_param_spec_double ("text_width",
- _("Text width"),
- _("Width of the rendered text"),
- 0.0, G_MAXDOUBLE, 0.0,
- G_PARAM_READABLE));
- g_object_class_install_property
- (gobject_class,
- PROP_TEXT_HEIGHT,
- g_param_spec_double ("text_height",
- _("Text height"),
- _("Height of the rendered text"),
- 0.0, G_MAXDOUBLE, 0.0,
- G_PARAM_READABLE));
-
- /* Style props are set (explicitly applied) or not */
-#define ADD_SET_PROP(propname, propval, nick, blurb) g_object_class_install_property (gobject_class, propval, g_param_spec_boolean (propname, nick, blurb, FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE))
-
- ADD_SET_PROP ("family_set", PROP_FAMILY_SET,
- _("Font family set"),
- _("Whether this tag affects the font family"));
-
- ADD_SET_PROP ("style_set", PROP_STYLE_SET,
- _("Font style set"),
- _("Whether this tag affects the font style"));
-
- ADD_SET_PROP ("variant_set", PROP_VARIANT_SET,
- _("Font variant set"),
- _("Whether this tag affects the font variant"));
-
- ADD_SET_PROP ("weight_set", PROP_WEIGHT_SET,
- _("Font weight set"),
- _("Whether this tag affects the font weight"));
-
- ADD_SET_PROP ("stretch_set", PROP_STRETCH_SET,
- _("Font stretch set"),
- _("Whether this tag affects the font stretch"));
-
- ADD_SET_PROP ("size_set", PROP_SIZE_SET,
- _("Font size set"),
- _("Whether this tag affects the font size"));
-
- ADD_SET_PROP ("rise_set", PROP_RISE_SET,
- _("Rise set"),
- _("Whether this tag affects the rise"));
-
- ADD_SET_PROP ("strikethrough_set", PROP_STRIKETHROUGH_SET,
- _("Strikethrough set"),
- _("Whether this tag affects strikethrough"));
-
- ADD_SET_PROP ("underline_set", PROP_UNDERLINE_SET,
- _("Underline set"),
- _("Whether this tag affects underlining"));
-
- ADD_SET_PROP ("scale_set", PROP_SCALE_SET,
- _("Scale set"),
- _("Whether this tag affects font scaling"));
-#undef ADD_SET_PROP
-
- object_class->destroy = gnome_canvas_text_destroy;
-
- item_class->update = gnome_canvas_text_update;
- item_class->realize = gnome_canvas_text_realize;
- item_class->unrealize = gnome_canvas_text_unrealize;
- item_class->draw = gnome_canvas_text_draw;
- item_class->point = gnome_canvas_text_point;
- item_class->bounds = gnome_canvas_text_bounds;
- item_class->render = gnome_canvas_text_render;
-}
-
-/* Object initialization function for the text item */
-static void
-gnome_canvas_text_init (GnomeCanvasText *text)
-{
- text->x = 0.0;
- text->y = 0.0;
- text->anchor = GTK_ANCHOR_CENTER;
- text->justification = GTK_JUSTIFY_LEFT;
- text->clip_width = 0.0;
- text->clip_height = 0.0;
- text->xofs = 0.0;
- text->yofs = 0.0;
- text->layout = NULL;
-
- text->font_desc = NULL;
-
- text->underline = PANGO_UNDERLINE_NONE;
- text->strikethrough = FALSE;
- text->rise = 0;
-
- text->underline_set = FALSE;
- text->strike_set = FALSE;
- text->rise_set = FALSE;
-
- text->priv = g_new (GnomeCanvasTextPrivate, 1);
- text->priv->bitmap.buffer = NULL;
- text->priv->render_dirty = 1;
-}
-
-/* Destroy handler for the text item */
-static void
-gnome_canvas_text_destroy (GtkObject *object)
-{
- GnomeCanvasText *text;
-
- g_return_if_fail (GNOME_IS_CANVAS_TEXT (object));
-
- text = GNOME_CANVAS_TEXT (object);
-
- /* remember, destroy can be run multiple times! */
-
- g_free (text->text);
- text->text = NULL;
-
- if (text->layout)
- g_object_unref (G_OBJECT (text->layout));
- text->layout = NULL;
-
- if (text->font_desc) {
- pango_font_description_free (text->font_desc);
- text->font_desc = NULL;
- }
-
- if (text->attr_list)
- pango_attr_list_unref (text->attr_list);
- text->attr_list = NULL;
-
- if (text->stipple)
- g_object_unref (text->stipple);
- text->stipple = NULL;
-
- if (text->priv && text->priv->bitmap.buffer) {
- g_free (text->priv->bitmap.buffer);
- }
- g_free (text->priv);
- text->priv = NULL;
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-static void
-get_bounds (GnomeCanvasText *text, double *px1, double *py1, double *px2, double *py2)
-{
- GnomeCanvasItem *item;
- double wx, wy;
-
- item = GNOME_CANVAS_ITEM (text);
-
- /* Get canvas pixel coordinates for text position */
-
-
- wx = text->x;
- wy = text->y;
- gnome_canvas_item_i2w (item, &wx, &wy);
- gnome_canvas_w2c (item->canvas, wx + text->xofs, wy + text->yofs, &text->cx, &text->cy);
-
- /* Get canvas pixel coordinates for clip rectangle position */
-
- gnome_canvas_w2c (item->canvas, wx, wy, &text->clip_cx, &text->clip_cy);
- text->clip_cwidth = text->clip_width * item->canvas->pixels_per_unit;
- text->clip_cheight = text->clip_height * item->canvas->pixels_per_unit;
-
- /* Anchor text */
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- text->cx -= text->max_width / 2;
- text->clip_cx -= text->clip_cwidth / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- text->cx -= text->max_width;
- text->clip_cx -= text->clip_cwidth;
- break;
-
- default:
- break;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- text->cy -= text->height / 2;
- text->clip_cy -= text->clip_cheight / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- text->cy -= text->height;
- text->clip_cy -= text->clip_cheight;
- break;
-
- default:
- break;
- }
-
- /* Bounds */
-
- if (text->clip) {
- *px1 = text->clip_cx;
- *py1 = text->clip_cy;
- *px2 = text->clip_cx + text->clip_cwidth;
- *py2 = text->clip_cy + text->clip_cheight;
- } else {
- *px1 = text->cx;
- *py1 = text->cy;
- *px2 = text->cx + text->max_width;
- *py2 = text->cy + text->height;
- }
-}
-
-/* Convenience function to set the text's GC's foreground color */
-static void
-set_text_gc_foreground (GnomeCanvasText *text)
-{
- GdkColor c;
-
- if (!text->gc)
- return;
-
- c.pixel = text->pixel;
- gdk_gc_set_foreground (text->gc, &c);
-}
-
-/* Sets the stipple pattern for the text */
-static void
-set_stipple (GnomeCanvasText *text, GdkBitmap *stipple, int reconfigure)
-{
- if (text->stipple && !reconfigure)
- g_object_unref (text->stipple);
-
- text->stipple = stipple;
- if (stipple && !reconfigure)
- g_object_ref (stipple);
-
- if (text->gc) {
- if (stipple) {
- gdk_gc_set_stipple (text->gc, stipple);
- gdk_gc_set_fill (text->gc, GDK_STIPPLED);
- } else
- gdk_gc_set_fill (text->gc, GDK_SOLID);
- }
-}
-
-static PangoFontMask
-get_property_font_set_mask (guint prop_id)
-{
- switch (prop_id)
- {
- case PROP_FAMILY_SET:
- return PANGO_FONT_MASK_FAMILY;
- case PROP_STYLE_SET:
- return PANGO_FONT_MASK_STYLE;
- case PROP_VARIANT_SET:
- return PANGO_FONT_MASK_VARIANT;
- case PROP_WEIGHT_SET:
- return PANGO_FONT_MASK_WEIGHT;
- case PROP_STRETCH_SET:
- return PANGO_FONT_MASK_STRETCH;
- case PROP_SIZE_SET:
- return PANGO_FONT_MASK_SIZE;
- }
-
- return 0;
-}
-
-static void
-ensure_font (GnomeCanvasText *text)
-{
- if (!text->font_desc)
- text->font_desc = pango_font_description_new ();
-}
-
-/* Set_arg handler for the text item */
-static void
-gnome_canvas_text_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- GnomeCanvasText *text;
- GdkColor color = { 0, 0, 0, 0, };
- GdkColor *pcolor;
- gboolean color_changed;
- int have_pixel;
- PangoAlignment align;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_TEXT (object));
-
- item = GNOME_CANVAS_ITEM (object);
- text = GNOME_CANVAS_TEXT (object);
-
- color_changed = FALSE;
- have_pixel = FALSE;
-
-
- if (!text->layout) {
-
- PangoContext *gtk_context, *context;
- gtk_context = gtk_widget_get_pango_context (GTK_WIDGET (item->canvas));
-
- if (item->canvas->aa) {
- PangoLanguage *language;
- gint pixels, mm;
- double dpi_x;
- double dpi_y;
-
- pixels = gdk_screen_width ();
- mm = gdk_screen_width_mm ();
- dpi_x = (((double) pixels * 25.4) / (double) mm);
-
- pixels = gdk_screen_height ();
- mm = gdk_screen_height_mm ();
- dpi_y = (((double) pixels * 25.4) / (double) mm);
-
- context = pango_ft2_get_context (dpi_x, dpi_y);
- language = pango_context_get_language (gtk_context);
- pango_context_set_language (context, language);
- pango_context_set_base_dir (context,
- pango_context_get_base_dir (gtk_context));
- pango_context_set_font_description (context,
- pango_context_get_font_description (gtk_context));
-
- } else
- context = gtk_context;
-
-
- text->layout = pango_layout_new (context);
-
- if (item->canvas->aa)
- g_object_unref (G_OBJECT (context));
- }
-
- switch (param_id) {
- case PROP_TEXT:
- g_free (text->text);
-
- text->text = g_value_dup_string (value);
- pango_layout_set_text (text->layout, text->text, -1);
-
- text->priv->render_dirty = 1;
- break;
-
- case PROP_MARKUP:
- gnome_canvas_text_set_markup (text,
- g_value_get_string (value));
- text->priv->render_dirty = 1;
- break;
-
- case PROP_X:
- text->x = g_value_get_double (value);
- break;
-
- case PROP_Y:
- text->y = g_value_get_double (value);
- break;
-
- case PROP_FONT: {
- const char *font_name;
- PangoFontDescription *font_desc;
-
- font_name = g_value_get_string (value);
- if (font_name)
- font_desc = pango_font_description_from_string (font_name);
- else
- font_desc = NULL;
-
- gnome_canvas_text_set_font_desc (text, font_desc);
- if (font_desc)
- pango_font_description_free (font_desc);
-
- break;
- }
-
- case PROP_FONT_DESC:
- gnome_canvas_text_set_font_desc (text, g_value_peek_pointer (value));
- break;
-
- case PROP_FAMILY:
- case PROP_STYLE:
- case PROP_VARIANT:
- case PROP_WEIGHT:
- case PROP_STRETCH:
- case PROP_SIZE:
- case PROP_SIZE_POINTS:
- ensure_font (text);
-
- switch (param_id) {
- case PROP_FAMILY:
- pango_font_description_set_family (text->font_desc,
- g_value_get_string (value));
- break;
- case PROP_STYLE:
- pango_font_description_set_style (text->font_desc,
- g_value_get_enum (value));
- break;
- case PROP_VARIANT:
- pango_font_description_set_variant (text->font_desc,
- g_value_get_enum (value));
- break;
- case PROP_WEIGHT:
- pango_font_description_set_weight (text->font_desc,
- g_value_get_int (value));
- break;
- case PROP_STRETCH:
- pango_font_description_set_stretch (text->font_desc,
- g_value_get_enum (value));
- break;
- case PROP_SIZE:
- /* FIXME: This is bogus! It should be pixels, not points/PANGO_SCALE! */
- pango_font_description_set_size (text->font_desc,
- g_value_get_int (value));
- break;
- case PROP_SIZE_POINTS:
- pango_font_description_set_size (text->font_desc,
- g_value_get_double (value) * PANGO_SCALE);
- break;
- }
-
- gnome_canvas_text_apply_font_desc (text);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_FAMILY_SET:
- case PROP_STYLE_SET:
- case PROP_VARIANT_SET:
- case PROP_WEIGHT_SET:
- case PROP_STRETCH_SET:
- case PROP_SIZE_SET:
- if (!g_value_get_boolean (value) && text->font_desc)
- pango_font_description_unset_fields (text->font_desc,
- get_property_font_set_mask (param_id));
- break;
-
- case PROP_SCALE:
- text->scale = g_value_get_double (value);
- text->scale_set = TRUE;
-
- gnome_canvas_text_apply_font_desc (text);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_SCALE_SET:
- text->scale_set = g_value_get_boolean (value);
-
- gnome_canvas_text_apply_font_desc (text);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_UNDERLINE:
- text->underline = g_value_get_enum (value);
- text->underline_set = TRUE;
-
- gnome_canvas_text_apply_attributes (text);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_UNDERLINE_SET:
- text->underline_set = g_value_get_boolean (value);
-
- gnome_canvas_text_apply_attributes (text);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_STRIKETHROUGH:
- text->strikethrough = g_value_get_boolean (value);
- text->strike_set = TRUE;
-
- gnome_canvas_text_apply_attributes (text);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_STRIKETHROUGH_SET:
- text->strike_set = g_value_get_boolean (value);
-
- gnome_canvas_text_apply_attributes (text);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_RISE:
- text->rise = g_value_get_int (value);
- text->rise_set = TRUE;
-
- gnome_canvas_text_apply_attributes (text);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_RISE_SET:
- text->rise_set = TRUE;
-
- gnome_canvas_text_apply_attributes (text);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_ATTRIBUTES:
- if (text->attr_list)
- pango_attr_list_unref (text->attr_list);
-
- text->attr_list = g_value_peek_pointer (value);
- pango_attr_list_ref (text->attr_list);
-
- gnome_canvas_text_apply_attributes (text);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_ANCHOR:
- text->anchor = g_value_get_enum (value);
- break;
-
- case PROP_JUSTIFICATION:
- text->justification = g_value_get_enum (value);
-
- switch (text->justification) {
- case GTK_JUSTIFY_LEFT:
- align = PANGO_ALIGN_LEFT;
- break;
- case GTK_JUSTIFY_CENTER:
- align = PANGO_ALIGN_CENTER;
- break;
- case GTK_JUSTIFY_RIGHT:
- align = PANGO_ALIGN_RIGHT;
- break;
- default:
- /* GTK_JUSTIFY_FILL isn't supported yet. */
- align = PANGO_ALIGN_LEFT;
- break;
- }
- pango_layout_set_alignment (text->layout, align);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_CLIP_WIDTH:
- text->clip_width = fabs (g_value_get_double (value));
- text->priv->render_dirty = 1;
- break;
-
- case PROP_CLIP_HEIGHT:
- text->clip_height = fabs (g_value_get_double (value));
- text->priv->render_dirty = 1;
- break;
-
- case PROP_CLIP:
- text->clip = g_value_get_boolean (value);
- text->priv->render_dirty = 1;
- break;
-
- case PROP_X_OFFSET:
- text->xofs = g_value_get_double (value);
- break;
-
- case PROP_Y_OFFSET:
- text->yofs = g_value_get_double (value);
- break;
-
- case PROP_FILL_COLOR: {
- const char *color_name;
-
- color_name = g_value_get_string (value);
- if (color_name) {
- gdk_color_parse (color_name, &color);
-
- text->rgba = ((color.red & 0xff00) << 16 |
- (color.green & 0xff00) << 8 |
- (color.blue & 0xff00) |
- 0xff);
- color_changed = TRUE;
- }
- text->priv->render_dirty = 1;
- break;
- }
-
- case PROP_FILL_COLOR_GDK:
- pcolor = g_value_get_boxed (value);
- if (pcolor) {
- GdkColormap *colormap;
-
- color = *pcolor;
- colormap = gtk_widget_get_colormap (GTK_WIDGET (item->canvas));
- gdk_rgb_find_color (colormap, &color);
- have_pixel = TRUE;
- }
-
- text->rgba = ((color.red & 0xff00) << 16 |
- (color.green & 0xff00) << 8|
- (color.blue & 0xff00) |
- 0xff);
- color_changed = TRUE;
- break;
-
- case PROP_FILL_COLOR_RGBA:
- text->rgba = g_value_get_uint (value);
- color_changed = TRUE;
- text->priv->render_dirty = 1;
- break;
-
- case PROP_FILL_STIPPLE:
- set_stipple (text, (GdkBitmap *)g_value_get_object (value), FALSE);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-
- if (color_changed) {
- if (have_pixel)
- text->pixel = color.pixel;
- else
- text->pixel = gnome_canvas_get_color_pixel (item->canvas, text->rgba);
-
- if (!item->canvas->aa)
- set_text_gc_foreground (text);
- }
-
- /* Calculate text dimensions */
-
- if (text->layout)
- pango_layout_get_pixel_size (text->layout,
- &text->max_width,
- &text->height);
- else {
- text->max_width = 0;
- text->height = 0;
- }
-
- gnome_canvas_item_request_update (item);
-}
-
-/* Get_arg handler for the text item */
-static void
-gnome_canvas_text_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasText *text;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_TEXT (object));
-
- text = GNOME_CANVAS_TEXT (object);
-
- switch (param_id) {
- case PROP_TEXT:
- g_value_set_string (value, text->text);
- break;
-
- case PROP_X:
- g_value_set_double (value, text->x);
- break;
-
- case PROP_Y:
- g_value_set_double (value, text->y);
- break;
-
- case PROP_FONT:
- case PROP_FONT_DESC:
- case PROP_FAMILY:
- case PROP_STYLE:
- case PROP_VARIANT:
- case PROP_WEIGHT:
- case PROP_STRETCH:
- case PROP_SIZE:
- case PROP_SIZE_POINTS:
- ensure_font (text);
-
- switch (param_id) {
- case PROP_FONT:
- {
- /* FIXME GValue imposes a totally gratuitous string copy
- * here, we could just hand off string ownership
- */
- gchar *str;
-
- str = pango_font_description_to_string (text->font_desc);
- g_value_set_string (value, str);
- g_free (str);
-
- break;
- }
-
- case PROP_FONT_DESC:
- g_value_set_boxed (value, text->font_desc);
- break;
-
- case PROP_FAMILY:
- g_value_set_string (value, pango_font_description_get_family (text->font_desc));
- break;
-
- case PROP_STYLE:
- g_value_set_enum (value, pango_font_description_get_style (text->font_desc));
- break;
-
- case PROP_VARIANT:
- g_value_set_enum (value, pango_font_description_get_variant (text->font_desc));
- break;
-
- case PROP_WEIGHT:
- g_value_set_int (value, pango_font_description_get_weight (text->font_desc));
- break;
-
- case PROP_STRETCH:
- g_value_set_enum (value, pango_font_description_get_stretch (text->font_desc));
- break;
-
- case PROP_SIZE:
- g_value_set_int (value, pango_font_description_get_size (text->font_desc));
- break;
-
- case PROP_SIZE_POINTS:
- g_value_set_double (value, ((double)pango_font_description_get_size (text->font_desc)) / (double)PANGO_SCALE);
- break;
- }
- break;
-
- case PROP_FAMILY_SET:
- case PROP_STYLE_SET:
- case PROP_VARIANT_SET:
- case PROP_WEIGHT_SET:
- case PROP_STRETCH_SET:
- case PROP_SIZE_SET:
- {
- PangoFontMask set_mask = text->font_desc ? pango_font_description_get_set_fields (text->font_desc) : 0;
- PangoFontMask test_mask = get_property_font_set_mask (param_id);
- g_value_set_boolean (value, (set_mask & test_mask) != 0);
-
- break;
- }
-
- case PROP_SCALE:
- g_value_set_double (value, text->scale);
- break;
- case PROP_SCALE_SET:
- g_value_set_boolean (value, text->scale_set);
- break;
-
- case PROP_UNDERLINE:
- g_value_set_enum (value, text->underline);
- break;
- case PROP_UNDERLINE_SET:
- g_value_set_boolean (value, text->underline_set);
- break;
-
- case PROP_STRIKETHROUGH:
- g_value_set_boolean (value, text->strikethrough);
- break;
- case PROP_STRIKETHROUGH_SET:
- g_value_set_boolean (value, text->strike_set);
- break;
-
- case PROP_RISE:
- g_value_set_int (value, text->rise);
- break;
- case PROP_RISE_SET:
- g_value_set_boolean (value, text->rise_set);
- break;
-
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, text->attr_list);
- break;
-
- case PROP_ANCHOR:
- g_value_set_enum (value, text->anchor);
- break;
-
- case PROP_JUSTIFICATION:
- g_value_set_enum (value, text->justification);
- break;
-
- case PROP_CLIP_WIDTH:
- g_value_set_double (value, text->clip_width);
- break;
-
- case PROP_CLIP_HEIGHT:
- g_value_set_double (value, text->clip_height);
- break;
-
- case PROP_CLIP:
- g_value_set_boolean (value, text->clip);
- break;
-
- case PROP_X_OFFSET:
- g_value_set_double (value, text->xofs);
- break;
-
- case PROP_Y_OFFSET:
- g_value_set_double (value, text->yofs);
- break;
-
- case PROP_FILL_COLOR:
- g_value_take_string (value,
- g_strdup_printf ("#%02x%02x%02x",
- text->rgba >> 24,
- (text->rgba >> 16) & 0xff,
- (text->rgba >> 8) & 0xff));
- break;
-
- case PROP_FILL_COLOR_GDK: {
- GnomeCanvas *canvas = GNOME_CANVAS_ITEM (text)->canvas;
- GdkColormap *colormap = gtk_widget_get_colormap (GTK_WIDGET (canvas));
- GdkColor color;
-
- gdk_colormap_query_color (colormap, text->pixel, &color);
- g_value_set_boxed (value, &color);
- break;
- }
- case PROP_FILL_COLOR_RGBA:
- g_value_set_uint (value, text->rgba);
- break;
-
- case PROP_FILL_STIPPLE:
- g_value_set_object (value, text->stipple);
- break;
-
- case PROP_TEXT_WIDTH:
- g_value_set_double (value, text->max_width / text->item.canvas->pixels_per_unit);
- break;
-
- case PROP_TEXT_HEIGHT:
- g_value_set_double (value, text->height / text->item.canvas->pixels_per_unit);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-/* */
-static void
-gnome_canvas_text_apply_font_desc (GnomeCanvasText *text)
-{
- PangoFontDescription *font_desc =
- pango_font_description_copy (
- GTK_WIDGET (GNOME_CANVAS_ITEM (text)->canvas)->style->font_desc);
-
- if (text->font_desc)
- pango_font_description_merge (font_desc, text->font_desc, TRUE);
-
- pango_layout_set_font_description (text->layout, font_desc);
- pango_font_description_free (font_desc);
-}
-
-static void
-add_attr (PangoAttrList *attr_list,
- PangoAttribute *attr)
-{
- attr->start_index = 0;
- attr->end_index = G_MAXINT;
-
- pango_attr_list_insert (attr_list, attr);
-}
-
-/* */
-static void
-gnome_canvas_text_apply_attributes (GnomeCanvasText *text)
-{
- PangoAttrList *attr_list;
-
- if (text->attr_list)
- attr_list = pango_attr_list_copy (text->attr_list);
- else
- attr_list = pango_attr_list_new ();
-
- if (text->underline_set)
- add_attr (attr_list, pango_attr_underline_new (text->underline));
- if (text->strike_set)
- add_attr (attr_list, pango_attr_strikethrough_new (text->strikethrough));
- if (text->rise_set)
- add_attr (attr_list, pango_attr_rise_new (text->rise));
-
- pango_layout_set_attributes (text->layout, attr_list);
- pango_attr_list_unref (attr_list);
-}
-
-static void
-gnome_canvas_text_set_font_desc (GnomeCanvasText *text,
- PangoFontDescription *font_desc)
-{
- if (text->font_desc)
- pango_font_description_free (text->font_desc);
-
- if (font_desc)
- text->font_desc = pango_font_description_copy (font_desc);
- else
- text->font_desc = NULL;
-
- gnome_canvas_text_apply_font_desc (text);
- text->priv->render_dirty = 1;
-}
-
-/* Setting the text from a Pango markup string */
-static void
-gnome_canvas_text_set_markup (GnomeCanvasText *textitem,
- const gchar *markup)
-{
- PangoAttrList *attr_list = NULL;
- gchar *text = NULL;
- GError *error = NULL;
-
- if (markup && !pango_parse_markup (markup, -1,
- 0,
- &attr_list, &text, NULL,
- &error))
- {
- g_warning ("Failed to set cell text from markup due to error parsing markup: %s",
- error->message);
- g_error_free (error);
- return;
- }
-
- g_free (textitem->text);
- if (textitem->attr_list)
- pango_attr_list_unref (textitem->attr_list);
-
- textitem->text = text;
- textitem->attr_list = attr_list;
-
- pango_layout_set_text (textitem->layout, text, -1);
-
- gnome_canvas_text_apply_attributes (textitem);
-}
-
-/* Update handler for the text item */
-static void
-gnome_canvas_text_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- GnomeCanvasText *text;
- double x1, y1, x2, y2;
-
- text = GNOME_CANVAS_TEXT (item);
-
- if (parent_class->update)
- (* parent_class->update) (item, affine, clip_path, flags);
-
- set_text_gc_foreground (text);
- set_stipple (text, text->stipple, TRUE);
- get_bounds (text, &x1, &y1, &x2, &y2);
-
- gnome_canvas_update_bbox (item,
- floor (x1), floor (y1),
- ceil (x2), ceil (y2));
-}
-
-/* Realize handler for the text item */
-static void
-gnome_canvas_text_realize (GnomeCanvasItem *item)
-{
- GnomeCanvasText *text;
-
- text = GNOME_CANVAS_TEXT (item);
-
- if (parent_class->realize)
- (* parent_class->realize) (item);
-
- text->gc = gdk_gc_new (item->canvas->layout.bin_window);
-}
-
-/* Unrealize handler for the text item */
-static void
-gnome_canvas_text_unrealize (GnomeCanvasItem *item)
-{
- GnomeCanvasText *text;
-
- text = GNOME_CANVAS_TEXT (item);
-
- g_object_unref (text->gc);
- text->gc = NULL;
-
- if (parent_class->unrealize)
- (* parent_class->unrealize) (item);
-}
-
-/* Draw handler for the text item */
-static void
-gnome_canvas_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- GnomeCanvasText *text;
- GdkRectangle rect;
-
- text = GNOME_CANVAS_TEXT (item);
-
- if (!text->text)
- return;
-
- if (text->clip) {
- rect.x = text->clip_cx - x;
- rect.y = text->clip_cy - y;
- rect.width = text->clip_cwidth;
- rect.height = text->clip_cheight;
-
- gdk_gc_set_clip_rectangle (text->gc, &rect);
- }
-
- if (text->stipple)
- gnome_canvas_set_stipple_origin (item->canvas, text->gc);
-
-
- gdk_draw_layout (drawable, text->gc, text->cx - x, text->cy - y, text->layout);
-
- if (text->clip)
- gdk_gc_set_clip_rectangle (text->gc, NULL);
-}
-
-
-/* Render handler for the text item */
-static void
-gnome_canvas_text_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
-{
- GnomeCanvasText *text;
- guint32 fg_color;
- int render_x = 0, render_y = 0; /* offsets for text rendering,
- * for clipping rectangles */
- int x, y;
- int w, h;
- guchar *dst, *src;
- int src_dx, src_dy;
- int i, alpha;
- int bm_rows, bm_width;
-
- text = GNOME_CANVAS_TEXT (item);
-
- if (!text->text)
- return;
-
- fg_color = text->rgba;
-
- gnome_canvas_buf_ensure_buf (buf);
-
- bm_rows = (text->clip) ? text->clip_cheight : text->height;
- bm_width = (text->clip) ? text->clip_cwidth : text->max_width;
- if(text->priv->render_dirty ||
- bm_rows != text->priv->bitmap.rows ||
- bm_width != text->priv->bitmap.width) {
- if(text->priv->bitmap.buffer) {
- g_free(text->priv->bitmap.buffer);
- }
- text->priv->bitmap.rows = bm_rows;
- text->priv->bitmap.width = bm_width;
- text->priv->bitmap.pitch = (text->priv->bitmap.width+3)&~3;
- text->priv->bitmap.buffer = g_malloc0 (text->priv->bitmap.rows * text->priv->bitmap.pitch);
- text->priv->bitmap.num_grays = 256;
- text->priv->bitmap.pixel_mode = ft_pixel_mode_grays;
-
- /* What this does is when a clipping rectangle is
- being used shift the rendering of the text by the
- correct amount so that the correct result is
- obtained as if all text was rendered, then clipped.
- In this sense we can use smaller buffers and less
- rendeirng since hopefully FreeType2 checks to see
- if the glyph falls in the bounding box before
- rasterizing it. */
-
- if(text->clip) {
- render_x = text->cx - text->clip_cx;
- render_y = text->cy - text->clip_cy;
- }
-
- pango_ft2_render_layout (&text->priv->bitmap, text->layout, render_x, render_y);
-
- text->priv->render_dirty = 0;
- }
-
- if (text->clip) {
- x = text->clip_cx - buf->rect.x0;
- y = text->clip_cy - buf->rect.y0;
- } else {
- x = text->cx - buf->rect.x0;
- y = text->cy - buf->rect.y0;
- }
-
- w = text->priv->bitmap.width;
- h = text->priv->bitmap.rows;
-
- src_dx = src_dy = 0;
-
- if (x + w > buf->rect.x1 - buf->rect.x0) {
- w = buf->rect.x1 - buf->rect.x0 - x;
- }
-
- if (y + h > buf->rect.y1 - buf->rect.y0) {
- h = buf->rect.y1 - buf->rect.y0 - y;
- }
-
- if (x < 0) {
- w -= - x;
- src_dx += - x;
- x = 0;
- }
-
- if (y < 0) {
- h -= -y;
- src_dy += - y;
- y = 0;
- }
-
- dst = buf->buf + y * buf->buf_rowstride + x * 3;
- src = text->priv->bitmap.buffer +
- src_dy * text->priv->bitmap.pitch + src_dx;
- while (h-- > 0) {
- i = w;
- while (i-- > 0) {
- /* FIXME: Do the libart thing instead of divide by 255 */
- alpha = ((fg_color & 0xff) * (*src)) / 255;
- dst[0] = (dst[0] * (255 - alpha) + ((fg_color >> 24) & 0xff) * alpha) / 255;
- dst[1] = (dst[1] * (255 - alpha) + ((fg_color >> 16) & 0xff) * alpha) / 255;
- dst[2] = (dst[2] * (255 - alpha) + ((fg_color >> 8) & 0xff) * alpha) / 255;
- dst += 3;
- src += 1;
- }
- dst += buf->buf_rowstride - w*3;
- src += text->priv->bitmap.pitch - w;
- }
-
- buf->is_bg = 0;
- return;
-}
-
-/* Point handler for the text item */
-static double
-gnome_canvas_text_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy, GnomeCanvasItem **actual_item)
-{
- GnomeCanvasText *text;
- PangoLayoutIter *iter;
- int x1, y1, x2, y2;
- int dx, dy;
- double dist, best;
-
- text = GNOME_CANVAS_TEXT (item);
-
- *actual_item = item;
-
- /* The idea is to build bounding rectangles for each of the lines of
- * text (clipped by the clipping rectangle, if it is activated) and see
- * whether the point is inside any of these. If it is, we are done.
- * Otherwise, calculate the distance to the nearest rectangle.
- */
-
- best = 1.0e36;
-
- iter = pango_layout_get_iter (text->layout);
- do {
- PangoRectangle log_rect;
-
- pango_layout_iter_get_line_extents (iter, NULL, &log_rect);
-
- x1 = text->cx + PANGO_PIXELS (log_rect.x);
- y1 = text->cy + PANGO_PIXELS (log_rect.y);
- x2 = x1 + PANGO_PIXELS (log_rect.width);
- y2 = y1 + PANGO_PIXELS (log_rect.height);
-
- if (text->clip) {
- if (x1 < text->clip_cx)
- x1 = text->clip_cx;
-
- if (y1 < text->clip_cy)
- y1 = text->clip_cy;
-
- if (x2 > (text->clip_cx + text->clip_width))
- x2 = text->clip_cx + text->clip_width;
-
- if (y2 > (text->clip_cy + text->clip_height))
- y2 = text->clip_cy + text->clip_height;
-
- if ((x1 >= x2) || (y1 >= y2))
- continue;
- }
-
- /* Calculate distance from point to rectangle */
-
- if (cx < x1)
- dx = x1 - cx;
- else if (cx >= x2)
- dx = cx - x2 + 1;
- else
- dx = 0;
-
- if (cy < y1)
- dy = y1 - cy;
- else if (cy >= y2)
- dy = cy - y2 + 1;
- else
- dy = 0;
-
- if ((dx == 0) && (dy == 0)) {
- pango_layout_iter_free(iter);
- return 0.0;
- }
-
- dist = sqrt (dx * dx + dy * dy);
- if (dist < best)
- best = dist;
-
- } while (pango_layout_iter_next_line(iter));
-
- pango_layout_iter_free(iter);
-
- return best / item->canvas->pixels_per_unit;
-}
-
-/* Bounds handler for the text item */
-static void
-gnome_canvas_text_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- GnomeCanvasText *text;
- double width, height;
-
- text = GNOME_CANVAS_TEXT (item);
-
- *x1 = text->x;
- *y1 = text->y;
-
- if (text->clip) {
- width = text->clip_width;
- height = text->clip_height;
- } else {
- width = text->max_width / item->canvas->pixels_per_unit;
- height = text->height / item->canvas->pixels_per_unit;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- *x1 -= width / 2.0;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- *x1 -= width;
- break;
-
- default:
- break;
- }
-
- switch (text->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- *y1 -= height / 2.0;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- *y1 -= height;
- break;
-
- default:
- break;
- }
-
- *x2 = *x1 + width;
- *y2 = *y1 + height;
-}
+++ /dev/null
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- * Port to Pango co-done by Gergõ Érdi <cactus@cactus.rulez.org>
- */
-
-#ifndef GNOME_CANVAS_TEXT_H
-#define GNOME_CANVAS_TEXT_H
-
-
-#include <libgnomecanvas/gnome-canvas.h>
-
-
-G_BEGIN_DECLS
-
-
-/* Text item for the canvas. Text items are positioned by an anchor point and an anchor direction.
- *
- * A clipping rectangle may be specified for the text. The rectangle is anchored at the text's anchor
- * point, and is specified by clipping width and height parameters. If the clipping rectangle is
- * enabled, it will clip the text.
- *
- * In addition, x and y offset values may be specified. These specify an offset from the anchor
- * position. If used in conjunction with the clipping rectangle, these could be used to implement
- * simple scrolling of the text within the clipping rectangle.
- *
- * Properties marked with [*] also have _set properties associated
- * with them, that determine if the specified value should be used
- * instead of the default (style-defined) values
- *
- * The following object arguments are available:
- *
- * name type read/write description
- * ------------------------------------------------------------------------------------------
- * text string RW The string of the text label
- * markup string W A Pango markup string for the text label
- *
- * x double RW X coordinate of anchor point
- * y double RW Y coordinate of anchor point
- *
- * font string W A string describing the font
- * font_desc PangoFontDescription* RW Pointer to a PangoFontDescriptor
- * attributes PangoAttrList* RW Pointer to a Pango attribute list
- * style PangoStyle RW Pango style of font to use [*]
- * variant PangoVariant RW Pango variant of font to use [*]
- * weight int RW Pango weight of font to use [*]
- * stretch PangoStretch RW Pango stretch of font to use [*]
- * size int RW Size (in pixels) of font [*]
- * size_points double RW Size (in points) of font
- * scale double RW Ratio to scale font [*]
- *
- * anchor GtkAnchorType RW Anchor side for the text
- * justification GtkJustification RW Justification for multiline text
- * clip_width double RW Width of clip rectangle
- * clip_height double RW Height of clip rectangle
- * clip boolean RW Use clipping rectangle?
- * x_offset double RW Horizontal offset distance from anchor position
- * y_offset double RW Vertical offset distance from anchor position
- *
- * text_width double R Used to query the width of the rendered text
- * text_height double R Used to query the rendered height of the text
- *
- * fill_color string W X color specification for text
- * fill_color_gdk GdkColor* RW Pointer to an allocated GdkColor
- * fill_color_rgba guint RW RGBA value used for AA color.
- * fill_stipple GdkBitmap* RW Stipple pattern for filling the text
- */
-
-#define GNOME_TYPE_CANVAS_TEXT (gnome_canvas_text_get_type ())
-#define GNOME_CANVAS_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_TEXT, GnomeCanvasText))
-#define GNOME_CANVAS_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_TEXT, GnomeCanvasTextClass))
-#define GNOME_IS_CANVAS_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_TEXT))
-#define GNOME_IS_CANVAS_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_TEXT))
-#define GNOME_CANVAS_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_TEXT, GnomeCanvasTextClass))
-
-
-typedef struct _GnomeCanvasText GnomeCanvasText;
-typedef struct _GnomeCanvasTextClass GnomeCanvasTextClass;
-
-typedef struct _GnomeCanvasTextPrivate GnomeCanvasTextPrivate;
-
-struct _GnomeCanvasText {
- GnomeCanvasItem item;
-
- PangoFontDescription *font_desc; /* Font description for text */
- PangoAttrList *attr_list; /* Attribute list of the text (caching) */
- PangoUnderline underline;
- gboolean strikethrough;
- int rise;
- double scale;
-
- char *text; /* Text to display */
- GdkBitmap *stipple; /* Stipple for text */
- GdkGC *gc; /* GC for drawing text */
- PangoLayout *layout; /* The PangoLayout containing the text */
-
- gulong pixel; /* Fill color */
-
- double x, y; /* Position at anchor */
-
- double clip_width; /* Width of optional clip rectangle */
- double clip_height; /* Height of optional clip rectangle */
-
- double xofs, yofs; /* Text offset distance from anchor position */
-
- double affine[6]; /* The item -> canvas affine */ /*AA*/
-
- GtkAnchorType anchor; /* Anchor side for text */
- GtkJustification justification; /* Justification for text */
-
- int cx, cy; /* Top-left canvas coordinates for text */
- int clip_cx, clip_cy; /* Top-left canvas coordinates for clip rectangle */
- int clip_cwidth, clip_cheight; /* Size of clip rectangle in pixels */
- int max_width; /* Maximum width of text lines */
- int height; /* Rendered text height in pixels */
-
- guint32 rgba; /* RGBA color for text */ /*AA*/
-
- guint clip : 1; /* Use clip rectangle? */
-
- guint underline_set : 1; /* Apply specified underline style? */
- guint strike_set : 1; /* Apply specified strikethrough style? */
- guint rise_set : 1; /* Apply specified ascension/descension? */
-
- guint scale_set : 1; /* Apply specified font scaling ratio? */
-
- GnomeCanvasTextPrivate *priv;
-};
-
-struct _GnomeCanvasTextClass {
- GnomeCanvasItemClass parent_class;
-};
-
-
-/* Standard Gtk function */
-GType gnome_canvas_text_get_type (void) G_GNUC_CONST;
-
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* Miscellaneous utility functions for the GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- */
-
-#include <config.h>
-
-/* needed for M_PI_2 under 'gcc -ansi -predantic' on GNU/Linux */
-#ifndef _BSD_SOURCE
-# define _BSD_SOURCE 1
-#endif
-#include <sys/types.h>
-
-#include <glib.h>
-#include <math.h>
-#include "gnome-canvas.h"
-#include "gnome-canvas-util.h"
-#include <libart_lgpl/art_uta.h>
-#include <libart_lgpl/art_svp.h>
-#include <libart_lgpl/art_svp_ops.h>
-#include <libart_lgpl/art_rgb.h>
-#include <libart_lgpl/art_rgb_svp.h>
-#include <libart_lgpl/art_uta_svp.h>
-#include <libart_lgpl/art_rect_svp.h>
-
-/**
- * gnome_canvas_points_new:
- * @num_points: The number of points to allocate space for in the array.
- *
- * Creates a structure that should be used to pass an array of points to
- * items.
- *
- * Return value: A newly-created array of points. It should be filled in
- * by the user.
- **/
-GnomeCanvasPoints *
-gnome_canvas_points_new (int num_points)
-{
- GnomeCanvasPoints *points;
-
- g_return_val_if_fail (num_points > 1, NULL);
-
- points = g_new (GnomeCanvasPoints, 1);
- points->num_points = num_points;
- points->coords = g_new (double, 2 * num_points);
- points->ref_count = 1;
-
- return points;
-}
-
-/**
- * gnome_canvas_points_ref:
- * @points: A canvas points structure.
- *
- * Increases the reference count of the specified points structure.
- *
- * Return value: The canvas points structure itself.
- **/
-GnomeCanvasPoints *
-gnome_canvas_points_ref (GnomeCanvasPoints *points)
-{
- g_return_val_if_fail (points != NULL, NULL);
-
- points->ref_count += 1;
- return points;
-}
-
-/**
- * gnome_canvas_points_free:
- * @points: A canvas points structure.
- *
- * Decreases the reference count of the specified points structure. If it
- * reaches zero, then the structure is freed.
- **/
-void
-gnome_canvas_points_free (GnomeCanvasPoints *points)
-{
- g_return_if_fail (points != NULL);
-
- points->ref_count -= 1;
- if (points->ref_count == 0) {
- g_free (points->coords);
- g_free (points);
- }
-}
-
-/**
- * gnome_canvas_get_miter_points:
- * @x1: X coordinate of the first point
- * @y1: Y coordinate of the first point
- * @x2: X coordinate of the second (angle) point
- * @y2: Y coordinate of the second (angle) point
- * @x3: X coordinate of the third point
- * @y3: Y coordinate of the third point
- * @width: Width of the line
- * @mx1: The X coordinate of the first miter point is returned here.
- * @my1: The Y coordinate of the first miter point is returned here.
- * @mx2: The X coordinate of the second miter point is returned here.
- * @my2: The Y coordinate of the second miter point is returned here.
- *
- * Given three points forming an angle, computes the coordinates of the inside
- * and outside points of the mitered corner formed by a line of a given width at
- * that angle.
- *
- * Return value: FALSE if the angle is less than 11 degrees (this is the same
- * threshold as X uses. If this occurs, the return points are not modified.
- * Otherwise, returns TRUE.
- **/
-int
-gnome_canvas_get_miter_points (double x1, double y1, double x2, double y2, double x3, double y3,
- double width,
- double *mx1, double *my1, double *mx2, double *my2)
-{
- double theta1; /* angle of segment p2-p1 */
- double theta2; /* angle of segment p2-p3 */
- double theta; /* angle between line segments */
- double theta3; /* angle that bisects theta1 and theta2 and points to p1 */
- double dist; /* distance of miter points from p2 */
- double dx, dy; /* x and y offsets corresponding to dist */
-
-#define ELEVEN_DEGREES (11.0 * G_PI / 180.0)
-
- if (y2 == y1)
- theta1 = (x2 < x1) ? 0.0 : G_PI;
- else if (x2 == x1)
- theta1 = (y2 < y1) ? G_PI_2 : -G_PI_2;
- else
- theta1 = atan2 (y1 - y2, x1 - x2);
-
- if (y3 == y2)
- theta2 = (x3 > x2) ? 0 : G_PI;
- else if (x3 == x2)
- theta2 = (y3 > y2) ? G_PI_2 : -G_PI_2;
- else
- theta2 = atan2 (y3 - y2, x3 - x2);
-
- theta = theta1 - theta2;
-
- if (theta > G_PI)
- theta -= 2.0 * G_PI;
- else if (theta < -G_PI)
- theta += 2.0 * G_PI;
-
- if ((theta < ELEVEN_DEGREES) && (theta > -ELEVEN_DEGREES))
- return FALSE;
-
- dist = 0.5 * width / sin (0.5 * theta);
- if (dist < 0.0)
- dist = -dist;
-
- theta3 = (theta1 + theta2) / 2.0;
- if (sin (theta3 - (theta1 + G_PI)) < 0.0)
- theta3 += G_PI;
-
- dx = dist * cos (theta3);
- dy = dist * sin (theta3);
-
- *mx1 = x2 + dx;
- *mx2 = x2 - dx;
- *my1 = y2 + dy;
- *my2 = y2 - dy;
-
- return TRUE;
-}
-
-/**
- * gnome_canvas_get_butt_points:
- * @x1: X coordinate of first point in the line
- * @y1: Y cooordinate of first point in the line
- * @x2: X coordinate of second point (endpoint) of the line
- * @y2: Y coordinate of second point (endpoint) of the line
- * @width: Width of the line
- * @project: Whether the butt points should project out by width/2 distance
- * @bx1: X coordinate of first butt point is returned here
- * @by1: Y coordinate of first butt point is returned here
- * @bx2: X coordinate of second butt point is returned here
- * @by2: Y coordinate of second butt point is returned here
- *
- * Computes the butt points of a line segment.
- **/
-void
-gnome_canvas_get_butt_points (double x1, double y1, double x2, double y2,
- double width, int project,
- double *bx1, double *by1, double *bx2, double *by2)
-{
- double length;
- double dx, dy;
-
- width *= 0.5;
- dx = x2 - x1;
- dy = y2 - y1;
- length = sqrt (dx * dx + dy * dy);
-
- if (length < GNOME_CANVAS_EPSILON) {
- *bx1 = *bx2 = x2;
- *by1 = *by2 = y2;
- } else {
- dx = -width * (y2 - y1) / length;
- dy = width * (x2 - x1) / length;
-
- *bx1 = x2 + dx;
- *bx2 = x2 - dx;
- *by1 = y2 + dy;
- *by2 = y2 - dy;
-
- if (project) {
- *bx1 += dy;
- *bx2 += dy;
- *by1 -= dx;
- *by2 -= dx;
- }
- }
-}
-
-/**
- * gnome_canvas_polygon_to_point:
- * @poly: Vertices of the polygon. X coordinates are in the even indices, and Y
- * coordinates are in the odd indices
- * @num_points: Number of points in the polygon
- * @x: X coordinate of the point
- * @y: Y coordinate of the point
- *
- * Computes the distance between a point and a polygon.
- *
- * Return value: The distance from the point to the polygon, or zero if the
- * point is inside the polygon.
- **/
-double
-gnome_canvas_polygon_to_point (double *poly, int num_points, double x, double y)
-{
- double best;
- int intersections;
- int i;
- double *p;
- double dx, dy;
-
- /* Iterate through all the edges in the polygon, updating best and intersections.
- *
- * When computing intersections, include left X coordinate of line within its range, but not
- * Y coordinate. Otherwise if the point lies exactly below a vertex we'll count it as two
- * intersections.
- */
-
- best = 1.0e36;
- intersections = 0;
-
- for (i = num_points, p = poly; i > 1; i--, p += 2) {
- double px, py, dist;
-
- /* Compute the point on the current edge closest to the point and update the
- * intersection count. This must be done separately for vertical edges, horizontal
- * edges, and others.
- */
-
- if (p[2] == p[0]) {
- /* Vertical edge */
-
- px = p[0];
-
- if (p[1] >= p[3]) {
- py = MIN (p[1], y);
- py = MAX (py, p[3]);
- } else {
- py = MIN (p[3], y);
- py = MAX (py, p[1]);
- }
- } else if (p[3] == p[1]) {
- /* Horizontal edge */
-
- py = p[1];
-
- if (p[0] >= p[2]) {
- px = MIN (p[0], x);
- px = MAX (px, p[2]);
-
- if ((y < py) && (x < p[0]) && (x >= p[2]))
- intersections++;
- } else {
- px = MIN (p[2], x);
- px = MAX (px, p[0]);
-
- if ((y < py) && (x < p[2]) && (x >= p[0]))
- intersections++;
- }
- } else {
- double m1, b1, m2, b2;
- int lower;
-
- /* Diagonal edge. Convert the edge to a line equation (y = m1*x + b1), then
- * compute a line perpendicular to this edge but passing through the point,
- * (y = m2*x + b2).
- */
-
- m1 = (p[3] - p[1]) / (p[2] - p[0]);
- b1 = p[1] - m1 * p[0];
-
- m2 = -1.0 / m1;
- b2 = y - m2 * x;
-
- px = (b2 - b1) / (m1 - m2);
- py = m1 * px + b1;
-
- if (p[0] > p[2]) {
- if (px > p[0]) {
- px = p[0];
- py = p[1];
- } else if (px < p[2]) {
- px = p[2];
- py = p[3];
- }
- } else {
- if (px > p[2]) {
- px = p[2];
- py = p[3];
- } else if (px < p[0]) {
- px = p[0];
- py = p[1];
- }
- }
-
- lower = (m1 * x + b1) > y;
-
- if (lower && (x >= MIN (p[0], p[2])) && (x < MAX (p[0], p[2])))
- intersections++;
- }
-
- /* Compute the distance to the closest point, and see if that is the best so far */
-
- dx = x - px;
- dy = y - py;
- dist = sqrt (dx * dx + dy * dy);
- if (dist < best)
- best = dist;
- }
-
- /* We've processed all the points. If the number of intersections is odd, the point is
- * inside the polygon.
- */
-
- if (intersections & 0x1)
- return 0.0;
- else
- return best;
-}
-
-/* Here are some helper functions for aa rendering: */
-
-/**
- * gnome_canvas_render_svp:
- * @buf: the canvas buffer to render over
- * @svp: the vector path to render
- * @rgba: the rgba color to render
- *
- * Render the svp over the buf.
- **/
-void
-gnome_canvas_render_svp (GnomeCanvasBuf *buf, ArtSVP *svp, guint32 rgba)
-{
- guint32 fg_color, bg_color;
- int alpha;
-
- if (buf->is_bg) {
- bg_color = buf->bg_color;
- alpha = rgba & 0xff;
- if (alpha == 0xff)
- fg_color = rgba >> 8;
- else {
- /* composite over background color */
- int bg_r, bg_g, bg_b;
- int fg_r, fg_g, fg_b;
- int tmp;
-
- bg_r = (bg_color >> 16) & 0xff;
- fg_r = (rgba >> 24) & 0xff;
- tmp = (fg_r - bg_r) * alpha;
- fg_r = bg_r + ((tmp + (tmp >> 8) + 0x80) >> 8);
-
- bg_g = (bg_color >> 8) & 0xff;
- fg_g = (rgba >> 16) & 0xff;
- tmp = (fg_g - bg_g) * alpha;
- fg_g = bg_g + ((tmp + (tmp >> 8) + 0x80) >> 8);
-
- bg_b = bg_color & 0xff;
- fg_b = (rgba >> 8) & 0xff;
- tmp = (fg_b - bg_b) * alpha;
- fg_b = bg_b + ((tmp + (tmp >> 8) + 0x80) >> 8);
-
- fg_color = (fg_r << 16) | (fg_g << 8) | fg_b;
- }
- art_rgb_svp_aa (svp,
- buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1,
- fg_color, bg_color,
- buf->buf, buf->buf_rowstride,
- NULL);
- buf->is_bg = 0;
- buf->is_buf = 1;
- } else {
- art_rgb_svp_alpha (svp,
- buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1,
- rgba,
- buf->buf, buf->buf_rowstride,
- NULL);
- }
-}
-
-/**
- * gnome_canvas_update_svp:
- * @canvas: the canvas containing the svp that needs updating.
- * @p_svp: a pointer to the existing svp
- * @new_svp: the new svp
- *
- * Sets the svp to the new value, requesting repaint on what's changed. This
- * function takes responsibility for freeing new_svp.
- **/
-void
-gnome_canvas_update_svp (GnomeCanvas *canvas, ArtSVP **p_svp, ArtSVP *new_svp)
-{
- ArtSVP *old_svp;
- ArtSVP *diff G_GNUC_UNUSED;
- ArtUta *repaint_uta;
-
- old_svp = *p_svp;
-
- if (old_svp != NULL) {
- ArtDRect bb;
- art_drect_svp (&bb, old_svp);
- if ((bb.x1 - bb.x0) * (bb.y1 - bb.y0) > (64 * 64)) {
- repaint_uta = art_uta_from_svp (old_svp);
- gnome_canvas_request_redraw_uta (canvas, repaint_uta);
- } else {
- ArtIRect ib;
- art_drect_to_irect (&ib, &bb);
- gnome_canvas_request_redraw (canvas, ib.x0, ib.y0, ib.x1, ib.y1);
- }
- art_svp_free (old_svp);
- }
-
- if (new_svp != NULL) {
- ArtDRect bb;
- art_drect_svp (&bb, new_svp);
- if ((bb.x1 - bb.x0) * (bb.y1 - bb.y0) > (64 * 64)) {
- repaint_uta = art_uta_from_svp (new_svp);
- gnome_canvas_request_redraw_uta (canvas, repaint_uta);
- } else {
- ArtIRect ib;
- art_drect_to_irect (&ib, &bb);
- gnome_canvas_request_redraw (canvas, ib.x0, ib.y0, ib.x1, ib.y1);
- }
- }
-
- *p_svp = new_svp;
-}
-
-/**
- * gnome_canvas_update_svp_clip:
- * @canvas: the canvas containing the svp that needs updating.
- * @p_svp: a pointer to the existing svp
- * @new_svp: the new svp
- * @clip_svp: a clip path, if non-null
- *
- * Sets the svp to the new value, clipping if necessary, and requesting repaint
- * on what's changed. This function takes responsibility for freeing new_svp.
- **/
-void
-gnome_canvas_update_svp_clip (GnomeCanvas *canvas, ArtSVP **p_svp, ArtSVP *new_svp, ArtSVP *clip_svp)
-{
- ArtSVP *clipped_svp;
-
- if (clip_svp != NULL) {
- clipped_svp = art_svp_intersect (new_svp, clip_svp);
- art_svp_free (new_svp);
- } else {
- clipped_svp = new_svp;
- }
- gnome_canvas_update_svp (canvas, p_svp, clipped_svp);
-}
-
-/**
- * gnome_canvas_item_reset_bounds:
- * @item: A canvas item
- *
- * Resets the bounding box of a canvas item to an empty rectangle.
- **/
-void
-gnome_canvas_item_reset_bounds (GnomeCanvasItem *item)
-{
- item->x1 = 0.0;
- item->y1 = 0.0;
- item->x2 = 0.0;
- item->y2 = 0.0;
-}
-
-/**
- * gnome_canvas_item_update_svp:
- * @item: the canvas item containing the svp that needs updating.
- * @p_svp: a pointer to the existing svp
- * @new_svp: the new svp
- *
- * Sets the svp to the new value, requesting repaint on what's changed. This
- * function takes responsibility for freeing new_svp. This routine also adds the
- * svp's bbox to the item's.
- **/
-void
-gnome_canvas_item_update_svp (GnomeCanvasItem *item, ArtSVP **p_svp, ArtSVP *new_svp)
-{
- ArtDRect bbox;
-
- gnome_canvas_update_svp (item->canvas, p_svp, new_svp);
- if (new_svp) {
- bbox.x0 = item->x1;
- bbox.y0 = item->y1;
- bbox.x1 = item->x2;
- bbox.y1 = item->y2;
- art_drect_svp_union (&bbox, new_svp);
- item->x1 = bbox.x0;
- item->y1 = bbox.y0;
- item->x2 = bbox.x1;
- item->y2 = bbox.y1;
- }
-}
-
-/**
- * gnome_canvas_item_update_svp_clip:
- * @item: the canvas item containing the svp that needs updating.
- * @p_svp: a pointer to the existing svp
- * @new_svp: the new svp
- * @clip_svp: a clip path, if non-null
- *
- * Sets the svp to the new value, clipping if necessary, and requesting repaint
- * on what's changed. This function takes responsibility for freeing new_svp.
- **/
-void
-gnome_canvas_item_update_svp_clip (GnomeCanvasItem *item, ArtSVP **p_svp, ArtSVP *new_svp,
- ArtSVP *clip_svp)
-{
- ArtSVP *clipped_svp;
-
- if (clip_svp != NULL) {
- clipped_svp = art_svp_intersect (new_svp, clip_svp);
- art_svp_free (new_svp);
- } else {
- clipped_svp = new_svp;
- }
-
- gnome_canvas_item_update_svp (item, p_svp, clipped_svp);
-}
-
-/**
- * gnome_canvas_item_request_redraw_svp
- * @item: the item containing the svp
- * @svp: the svp that needs to be redrawn
- *
- * Request redraw of the svp if in aa mode, or the entire item in in xlib mode.
- **/
-void
-gnome_canvas_item_request_redraw_svp (GnomeCanvasItem *item, const ArtSVP *svp)
-{
- GnomeCanvas *canvas;
- ArtUta *uta;
-
- canvas = item->canvas;
- if (canvas->aa) {
- if (svp != NULL) {
- uta = art_uta_from_svp (svp);
- gnome_canvas_request_redraw_uta (canvas, uta);
- }
- } else {
- gnome_canvas_request_redraw (canvas, item->x1, item->y1, item->x2, item->y2);
- }
-}
-
-/**
- * gnome_canvas_update_bbox:
- * @item: the canvas item needing update
- * @x1: Left coordinate of the new bounding box
- * @y1: Top coordinate of the new bounding box
- * @x2: Right coordinate of the new bounding box
- * @y2: Bottom coordinate of the new bounding box
- *
- * Sets the bbox to the new value, requesting full repaint.
- **/
-void
-gnome_canvas_update_bbox (GnomeCanvasItem *item, int x1, int y1, int x2, int y2)
-{
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
- item->x1 = x1;
- item->y1 = y1;
- item->x2 = x2;
- item->y2 = y2;
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
-}
-
-/**
- * gnome_canvas_buf_ensure_buf:
- * @buf: the buf that needs to be represened in RGB format
- *
- * Ensure that the buffer is in RGB format, suitable for compositing.
- **/
-void
-gnome_canvas_buf_ensure_buf (GnomeCanvasBuf *buf)
-{
- guchar *bufptr;
- int y;
-
- if (!buf->is_buf) {
- bufptr = buf->buf;
- for (y = buf->rect.y0; y < buf->rect.y1; y++) {
- art_rgb_fill_run (bufptr,
- buf->bg_color >> 16,
- (buf->bg_color >> 8) & 0xff,
- buf->bg_color & 0xff,
- buf->rect.x1 - buf->rect.x0);
- bufptr += buf->buf_rowstride;
- }
- buf->is_buf = 1;
- }
-}
-
-/**
- * gnome_canvas_join_gdk_to_art
- * @gdk_join: a join type, represented in GDK format
- *
- * Convert from GDK line join specifier to libart.
- *
- * Return value: The line join specifier in libart format.
- **/
-ArtPathStrokeJoinType
-gnome_canvas_join_gdk_to_art (GdkJoinStyle gdk_join)
-{
- switch (gdk_join) {
- case GDK_JOIN_MITER:
- return ART_PATH_STROKE_JOIN_MITER;
-
- case GDK_JOIN_ROUND:
- return ART_PATH_STROKE_JOIN_ROUND;
-
- case GDK_JOIN_BEVEL:
- return ART_PATH_STROKE_JOIN_BEVEL;
-
- default:
- g_assert_not_reached ();
- return ART_PATH_STROKE_JOIN_MITER; /* shut up the compiler */
- }
-}
-
-/**
- * gnome_canvas_cap_gdk_to_art
- * @gdk_cap: a cap type, represented in GDK format
- *
- * Convert from GDK line cap specifier to libart.
- *
- * Return value: The line cap specifier in libart format.
- **/
-ArtPathStrokeCapType
-gnome_canvas_cap_gdk_to_art (GdkCapStyle gdk_cap)
-{
- switch (gdk_cap) {
- case GDK_CAP_BUTT:
- case GDK_CAP_NOT_LAST:
- return ART_PATH_STROKE_CAP_BUTT;
-
- case GDK_CAP_ROUND:
- return ART_PATH_STROKE_CAP_ROUND;
-
- case GDK_CAP_PROJECTING:
- return ART_PATH_STROKE_CAP_SQUARE;
-
- default:
- g_assert_not_reached ();
- return ART_PATH_STROKE_CAP_BUTT; /* shut up the compiler */
- }
-}
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* Miscellaneous utility functions for the GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- */
-
-#ifndef GNOME_CANVAS_UTIL_H
-#define GNOME_CANVAS_UTIL_H
-
-#include <libgnomecanvas/gnome-canvas.h>
-
-#include <libart_lgpl/art_svp.h>
-#include <libart_lgpl/art_vpath.h>
-#include <libart_lgpl/art_svp_vpath_stroke.h>
-
-
-G_BEGIN_DECLS
-
-typedef struct _GnomeCanvasPoints GnomeCanvasPoints;
-
-/* This structure defines an array of points. X coordinates are stored in the even-numbered
- * indices, and Y coordinates are stored in the odd-numbered indices. num_points indicates the
- * number of points, so the array is 2*num_points elements big.
- */
-struct _GnomeCanvasPoints {
- double *coords;
- int num_points;
- int ref_count;
-};
-
-
-/* Allocate a new GnomeCanvasPoints structure with enough space for the specified number of points */
-GnomeCanvasPoints *gnome_canvas_points_new (int num_points);
-
-/* Increate ref count */
-GnomeCanvasPoints *gnome_canvas_points_ref (GnomeCanvasPoints *points);
-#define gnome_canvas_points_unref gnome_canvas_points_free
-
-/* Decrease ref count and free structure if it has reached zero */
-void gnome_canvas_points_free (GnomeCanvasPoints *points);
-
-/* Given three points forming an angle, compute the coordinates of the inside and outside points of
- * the mitered corner formed by a line of a given width at that angle.
- *
- * If the angle is less than 11 degrees, then FALSE is returned and the return points are not
- * modified. Otherwise, TRUE is returned.
- */
-int gnome_canvas_get_miter_points (double x1, double y1, double x2, double y2, double x3, double y3,
- double width,
- double *mx1, double *my1, double *mx2, double *my2);
-
-/* Compute the butt points of a line segment. If project is FALSE, then the results are as follows:
- *
- * -------------------* (bx1, by1)
- * |
- * (x1, y1) *------------------* (x2, y2)
- * |
- * -------------------* (bx2, by2)
- *
- * that is, the line is not projected beyond (x2, y2). If project is TRUE, then the results are as
- * follows:
- *
- * -------------------* (bx1, by1)
- * (x2, y2) |
- * (x1, y1) *-------------* |
- * |
- * -------------------* (bx2, by2)
- */
-void gnome_canvas_get_butt_points (double x1, double y1, double x2, double y2,
- double width, int project,
- double *bx1, double *by1, double *bx2, double *by2);
-
-/* Calculate the distance from a polygon to a point. The polygon's X coordinates are in the even
- * indices of the poly array, and the Y coordinates are in the odd indices.
- */
-double gnome_canvas_polygon_to_point (double *poly, int num_points, double x, double y);
-
-
-/* Render the svp over the buf. */
-void gnome_canvas_render_svp (GnomeCanvasBuf *buf, ArtSVP *svp, guint32 rgba);
-
-/* Sets the svp to the new value, requesting repaint on what's changed. This function takes responsibility for
- * freeing new_svp.
- */
-void gnome_canvas_update_svp (GnomeCanvas *canvas, ArtSVP **p_svp, ArtSVP *new_svp);
-
-/* Sets the svp to the new value, clipping if necessary, and requesting repaint
- * on what's changed. This function takes responsibility for freeing new_svp.
- */
-void gnome_canvas_update_svp_clip (GnomeCanvas *canvas, ArtSVP **p_svp, ArtSVP *new_svp,
- ArtSVP *clip_svp);
-
-/* Sets the svp to the new value, requesting repaint on what's changed. This
- * function takes responsibility for freeing new_svp. This routine also adds the
- * svp's bbox to the item's.
- */
-void gnome_canvas_item_reset_bounds (GnomeCanvasItem *item);
-
-/* Sets the svp to the new value, requesting repaint on what's changed. This function takes responsibility for
- * freeing new_svp. This routine also adds the svp's bbox to the item's.
- */
-void gnome_canvas_item_update_svp (GnomeCanvasItem *item, ArtSVP **p_svp, ArtSVP *new_svp);
-
-/* Sets the svp to the new value, clipping if necessary, and requesting repaint
- * on what's changed. This function takes responsibility for freeing new_svp.
- */
-void gnome_canvas_item_update_svp_clip (GnomeCanvasItem *item, ArtSVP **p_svp, ArtSVP *new_svp,
- ArtSVP *clip_svp);
-
-/* Request redraw of the svp if in aa mode, or the entire item in in xlib
- * mode.
- */
-void gnome_canvas_item_request_redraw_svp (GnomeCanvasItem *item, const ArtSVP *svp);
-
-/* Sets the bbox to the new value, requesting full repaint. */
-void gnome_canvas_update_bbox (GnomeCanvasItem *item, int x1, int y1, int x2, int y2);
-
-/* Ensure that the buffer is in RGB format, suitable for compositing. */
-void gnome_canvas_buf_ensure_buf (GnomeCanvasBuf *buf);
-
-/* Convert from GDK line join specifier to libart. */
-ArtPathStrokeJoinType gnome_canvas_join_gdk_to_art (GdkJoinStyle gdk_join);
-
-/* Convert from GDK line cap specifier to libart. */
-ArtPathStrokeCapType gnome_canvas_cap_gdk_to_art (GdkCapStyle gdk_cap);
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* Widget item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- */
-
-#include <config.h>
-#include <math.h>
-#include <gtk/gtksignal.h>
-#include "gnome-canvas-widget.h"
-
-enum {
- PROP_0,
- PROP_WIDGET,
- PROP_X,
- PROP_Y,
- PROP_WIDTH,
- PROP_HEIGHT,
- PROP_ANCHOR,
- PROP_SIZE_PIXELS
-};
-
-
-static void gnome_canvas_widget_class_init (GnomeCanvasWidgetClass *class);
-static void gnome_canvas_widget_init (GnomeCanvasWidget *witem);
-static void gnome_canvas_widget_destroy (GtkObject *object);
-static void gnome_canvas_widget_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_widget_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-
-static void gnome_canvas_widget_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
-static double gnome_canvas_widget_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy, GnomeCanvasItem **actual_item);
-static void gnome_canvas_widget_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2);
-
-static void gnome_canvas_widget_render (GnomeCanvasItem *item,
- GnomeCanvasBuf *buf);
-static void gnome_canvas_widget_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- int x, int y,
- int width, int height);
-
-static GnomeCanvasItemClass *parent_class;
-
-
-GType
-gnome_canvas_widget_get_type (void)
-{
- static GType widget_type;
-
- if (!widget_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasWidgetClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_widget_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasWidget),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_widget_init,
- NULL /* value_table */
- };
-
- widget_type = g_type_register_static (GNOME_TYPE_CANVAS_ITEM, "GnomeCanvasWidget",
- &object_info, 0);
- }
-
- return widget_type;
-}
-
-static void
-gnome_canvas_widget_class_init (GnomeCanvasWidgetClass *class)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- gobject_class = (GObjectClass *) class;
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- parent_class = g_type_class_peek_parent (class);
-
- gobject_class->set_property = gnome_canvas_widget_set_property;
- gobject_class->get_property = gnome_canvas_widget_get_property;
-
- g_object_class_install_property
- (gobject_class,
- PROP_WIDGET,
- g_param_spec_object ("widget", NULL, NULL,
- GTK_TYPE_WIDGET,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_X,
- g_param_spec_double ("x", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_Y,
- g_param_spec_double ("y", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_WIDTH,
- g_param_spec_double ("width", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_HEIGHT,
- g_param_spec_double ("height", NULL, NULL,
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_ANCHOR,
- g_param_spec_enum ("anchor", NULL, NULL,
- GTK_TYPE_ANCHOR_TYPE,
- GTK_ANCHOR_NW,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class,
- PROP_SIZE_PIXELS,
- g_param_spec_boolean ("size_pixels", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- object_class->destroy = gnome_canvas_widget_destroy;
-
- item_class->update = gnome_canvas_widget_update;
- item_class->point = gnome_canvas_widget_point;
- item_class->bounds = gnome_canvas_widget_bounds;
- item_class->render = gnome_canvas_widget_render;
- item_class->draw = gnome_canvas_widget_draw;
-}
-
-static void
-gnome_canvas_widget_init (GnomeCanvasWidget *witem)
-{
- witem->x = 0.0;
- witem->y = 0.0;
- witem->width = 0.0;
- witem->height = 0.0;
- witem->anchor = GTK_ANCHOR_NW;
- witem->size_pixels = FALSE;
-}
-
-static void
-gnome_canvas_widget_destroy (GtkObject *object)
-{
- GnomeCanvasWidget *witem;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_WIDGET (object));
-
- witem = GNOME_CANVAS_WIDGET (object);
-
- if (witem->widget && !witem->in_destroy) {
- g_signal_handler_disconnect (witem->widget, witem->destroy_id);
- gtk_widget_destroy (witem->widget);
- witem->widget = NULL;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-static void
-recalc_bounds (GnomeCanvasWidget *witem)
-{
- GnomeCanvasItem *item;
- double wx, wy;
-
- item = GNOME_CANVAS_ITEM (witem);
-
- /* Get world coordinates */
-
- wx = witem->x;
- wy = witem->y;
- gnome_canvas_item_i2w (item, &wx, &wy);
-
- /* Get canvas pixel coordinates */
-
- gnome_canvas_w2c (item->canvas, wx, wy, &witem->cx, &witem->cy);
-
- /* Anchor widget item */
-
- switch (witem->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- witem->cx -= witem->cwidth / 2;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- witem->cx -= witem->cwidth;
- break;
-
- default:
- break;
- }
-
- switch (witem->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- witem->cy -= witem->cheight / 2;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- witem->cy -= witem->cheight;
- break;
-
- default:
- break;
- }
-
- /* Bounds */
-
- item->x1 = witem->cx;
- item->y1 = witem->cy;
- item->x2 = witem->cx + witem->cwidth;
- item->y2 = witem->cy + witem->cheight;
-
- if (witem->widget)
- gtk_layout_move (GTK_LAYOUT (item->canvas), witem->widget,
- witem->cx + item->canvas->zoom_xofs,
- witem->cy + item->canvas->zoom_yofs);
-}
-
-static void
-do_destroy (GtkObject *object, gpointer data)
-{
- GnomeCanvasWidget *witem;
-
- witem = data;
-
- witem->in_destroy = TRUE;
-
- gtk_object_destroy (data);
-}
-
-static void
-gnome_canvas_widget_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- GnomeCanvasWidget *witem;
- GObject *obj;
- int update;
- int calc_bounds;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_WIDGET (object));
-
- item = GNOME_CANVAS_ITEM (object);
- witem = GNOME_CANVAS_WIDGET (object);
-
- update = FALSE;
- calc_bounds = FALSE;
-
- switch (param_id) {
- case PROP_WIDGET:
- if (witem->widget) {
- g_signal_handler_disconnect (witem->widget, witem->destroy_id);
- gtk_container_remove (GTK_CONTAINER (item->canvas), witem->widget);
- }
-
- obj = g_value_get_object (value);
- if (obj) {
- witem->widget = GTK_WIDGET (obj);
- witem->destroy_id = g_signal_connect (obj, "destroy",
- G_CALLBACK (do_destroy),
- witem);
- gtk_layout_put (GTK_LAYOUT (item->canvas), witem->widget,
- witem->cx + item->canvas->zoom_xofs,
- witem->cy + item->canvas->zoom_yofs);
- }
-
- update = TRUE;
- break;
-
- case PROP_X:
- if (witem->x != g_value_get_double (value))
- {
- witem->x = g_value_get_double (value);
- calc_bounds = TRUE;
- }
- break;
-
- case PROP_Y:
- if (witem->y != g_value_get_double (value))
- {
- witem->y = g_value_get_double (value);
- calc_bounds = TRUE;
- }
- break;
-
- case PROP_WIDTH:
- if (witem->width != fabs (g_value_get_double (value)))
- {
- witem->width = fabs (g_value_get_double (value));
- update = TRUE;
- }
- break;
-
- case PROP_HEIGHT:
- if (witem->height != fabs (g_value_get_double (value)))
- {
- witem->height = fabs (g_value_get_double (value));
- update = TRUE;
- }
- break;
-
- case PROP_ANCHOR:
- if (witem->anchor != (unsigned int) g_value_get_enum (value))
- {
- witem->anchor = g_value_get_enum (value);
- update = TRUE;
- }
- break;
-
- case PROP_SIZE_PIXELS:
- if (witem->size_pixels != g_value_get_boolean (value))
- {
- witem->size_pixels = g_value_get_boolean (value);
- update = TRUE;
- }
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-
- if (update)
- (* GNOME_CANVAS_ITEM_GET_CLASS (item)->update) (item, NULL, NULL, 0);
-
- if (calc_bounds)
- recalc_bounds (witem);
-}
-
-static void
-gnome_canvas_widget_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GnomeCanvasWidget *witem;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_WIDGET (object));
-
- witem = GNOME_CANVAS_WIDGET (object);
-
- switch (param_id) {
- case PROP_WIDGET:
- g_value_set_object (value, (GObject *) witem->widget);
- break;
-
- case PROP_X:
- g_value_set_double (value, witem->x);
- break;
-
- case PROP_Y:
- g_value_set_double (value, witem->y);
- break;
-
- case PROP_WIDTH:
- g_value_set_double (value, witem->width);
- break;
-
- case PROP_HEIGHT:
- g_value_set_double (value, witem->height);
- break;
-
- case PROP_ANCHOR:
- g_value_set_enum (value, witem->anchor);
- break;
-
- case PROP_SIZE_PIXELS:
- g_value_set_boolean (value, witem->size_pixels);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-gnome_canvas_widget_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- GnomeCanvasWidget *witem;
-
- witem = GNOME_CANVAS_WIDGET (item);
-
- if (parent_class->update)
- (* parent_class->update) (item, affine, clip_path, flags);
-
- if (witem->widget) {
- if (witem->size_pixels) {
- witem->cwidth = (int) (witem->width + 0.5);
- witem->cheight = (int) (witem->height + 0.5);
- } else {
- witem->cwidth = (int) (witem->width * item->canvas->pixels_per_unit + 0.5);
- witem->cheight = (int) (witem->height * item->canvas->pixels_per_unit + 0.5);
- }
-
- gtk_widget_set_size_request (witem->widget, witem->cwidth, witem->cheight);
- } else {
- witem->cwidth = 0.0;
- witem->cheight = 0.0;
- }
-
- recalc_bounds (witem);
-}
-
-static void
-gnome_canvas_widget_render (GnomeCanvasItem * item,
- GnomeCanvasBuf * buf)
-{
-#if 0
- GnomeCanvasWidget *witem;
-
- witem = GNOME_CANVAS_WIDGET (item);
-
- if (witem->widget)
- gtk_widget_queue_draw (witem->widget);
-#endif
-
-}
-
-static void
-gnome_canvas_widget_draw (GnomeCanvasItem * item,
- GdkDrawable * drawable,
- int x, int y,
- int width, int height)
-{
-#if 0
- GnomeCanvasWidget *witem;
-
- witem = GNOME_CANVAS_WIDGET (item);
-
- if (witem->widget)
- gtk_widget_queue_draw (witem->widget);
-#endif
-}
-
-static double
-gnome_canvas_widget_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy, GnomeCanvasItem **actual_item)
-{
- GnomeCanvasWidget *witem;
- double x1, y1, x2, y2;
- double dx, dy;
-
- witem = GNOME_CANVAS_WIDGET (item);
-
- *actual_item = item;
-
- gnome_canvas_c2w (item->canvas, witem->cx, witem->cy, &x1, &y1);
-
- x2 = x1 + (witem->cwidth - 1) / item->canvas->pixels_per_unit;
- y2 = y1 + (witem->cheight - 1) / item->canvas->pixels_per_unit;
-
- /* Is point inside widget bounds? */
-
- if ((x >= x1) && (y >= y1) && (x <= x2) && (y <= y2))
- return 0.0;
-
- /* Point is outside widget bounds */
-
- if (x < x1)
- dx = x1 - x;
- else if (x > x2)
- dx = x - x2;
- else
- dx = 0.0;
-
- if (y < y1)
- dy = y1 - y;
- else if (y > y2)
- dy = y - y2;
- else
- dy = 0.0;
-
- return sqrt (dx * dx + dy * dy);
-}
-
-static void
-gnome_canvas_widget_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- GnomeCanvasWidget *witem;
-
- witem = GNOME_CANVAS_WIDGET (item);
-
- *x1 = witem->x;
- *y1 = witem->y;
-
- switch (witem->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
- break;
-
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
- *x1 -= witem->width / 2.0;
- break;
-
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
- *x1 -= witem->width;
- break;
-
- default:
- break;
- }
-
- switch (witem->anchor) {
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
- break;
-
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
- *y1 -= witem->height / 2.0;
- break;
-
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
- *y1 -= witem->height;
- break;
-
- default:
- break;
- }
-
- *x2 = *x1 + witem->width;
- *y2 = *y1 + witem->height;
-}
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* Widget item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- */
-
-#ifndef GNOME_CANVAS_WIDGET_H
-#define GNOME_CANVAS_WIDGET_H
-
-
-#include <libgnomecanvas/gnome-canvas.h>
-
-
-G_BEGIN_DECLS
-
-
-/* Widget item for canvas. The widget is positioned with respect to an anchor point.
- * The following object arguments are available:
- *
- * name type read/write description
- * ------------------------------------------------------------------------------------------
- * widget GtkWidget* RW Pointer to the widget
- * x double RW X coordinate of anchor point
- * y double RW Y coordinate of anchor point
- * width double RW Width of widget (see below)
- * height double RW Height of widget (see below)
- * anchor GtkAnchorType RW Anchor side for widget
- * size_pixels boolean RW Specifies whether the widget size
- * is specified in pixels or canvas units.
- * If it is in pixels, then the widget will not
- * be scaled when the canvas zoom factor changes.
- * Otherwise, it will be scaled.
- */
-
-
-#define GNOME_TYPE_CANVAS_WIDGET (gnome_canvas_widget_get_type ())
-#define GNOME_CANVAS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_WIDGET, GnomeCanvasWidget))
-#define GNOME_CANVAS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_WIDGET, GnomeCanvasWidgetClass))
-#define GNOME_IS_CANVAS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_WIDGET))
-#define GNOME_IS_CANVAS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_WIDGET))
-#define GNOME_CANVAS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_WIDGET, GnomeCanvasWidgetClass))
-
-
-typedef struct _GnomeCanvasWidget GnomeCanvasWidget;
-typedef struct _GnomeCanvasWidgetClass GnomeCanvasWidgetClass;
-
-struct _GnomeCanvasWidget {
- GnomeCanvasItem item;
-
- GtkWidget *widget; /* The child widget */
-
- double x, y; /* Position at anchor */
- double width, height; /* Dimensions of widget */
- GtkAnchorType anchor; /* Anchor side for widget */
-
- int cx, cy; /* Top-left canvas coordinates for widget */
- int cwidth, cheight; /* Size of widget in pixels */
-
- guint destroy_id; /* Signal connection id for destruction of child widget */
-
- guint size_pixels : 1; /* Is size specified in (unchanging) pixels or units (get scaled)? */
- guint in_destroy : 1; /* Is child widget being destroyed? */
-};
-
-struct _GnomeCanvasWidgetClass {
- GnomeCanvasItemClass parent_class;
-};
-
-
-/* Standard Gtk function */
-GType gnome_canvas_widget_get_type (void) G_GNUC_CONST;
-
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: 8; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/*
- * GnomeCanvas widget - Tk-like canvas widget for Gnome
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
- * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
- *
- *
- * Authors: Federico Mena <federico@nuclecu.unam.mx>
- * Raph Levien <raph@gimp.org>
- */
-
-/*
- * TO-DO list for the canvas:
- *
- * - Allow to specify whether GnomeCanvasImage sizes are in units or pixels (scale or don't scale).
- *
- * - Implement a flag for gnome_canvas_item_reparent() that tells the function to keep the item
- * visually in the same place, that is, to keep it in the same place with respect to the canvas
- * origin.
- *
- * - GC put functions for items.
- *
- * - Widget item (finish it).
- *
- * - GList *gnome_canvas_gimme_all_items_contained_in_this_area (GnomeCanvas *canvas, Rectangle area);
- *
- * - Retrofit all the primitive items with microtile support.
- *
- * - Curve support for line item.
- *
- * - Arc item (Havoc has it; to be integrated in GnomeCanvasEllipse).
- *
- * - Sane font handling API.
- *
- * - Get_arg methods for items:
- * - How to fetch the outline width and know whether it is in pixels or units?
- */
-
-/*
- * Raph's TODO list for the antialiased canvas integration:
- *
- * - ::point() method for text item not accurate when affine transformed.
- *
- * - Clip rectangle not implemented in aa renderer for text item.
- *
- * - Clip paths only partially implemented.
- *
- * - Add more image loading techniques to work around imlib deficiencies.
- */
-
-#include <config.h>
-
-#include <math.h>
-#include <string.h>
-#include <stdio.h>
-#include <gdk/gdkprivate.h>
-#include <gtk/gtk.h>
-#include "gnome-canvas.h"
-#include "gnome-canvas-i18n.h"
-#include "libart_lgpl/art_rect.h"
-#include "libart_lgpl/art_rect_uta.h"
-#include "libart_lgpl/art_uta_rect.h"
-#include "libart_lgpl/art_uta_ops.h"
-
-#include "gnome-canvas-marshal.h"
-#include "gnome-canvas-marshal.c"
-
-
-/* We must run our idle update handler *before* GDK wants to redraw. */
-#define CANVAS_IDLE_PRIORITY (GDK_PRIORITY_REDRAW - 5)
-
-
-static void gnome_canvas_request_update (GnomeCanvas *canvas);
-static void group_add (GnomeCanvasGroup *group,
- GnomeCanvasItem *item);
-static void group_remove (GnomeCanvasGroup *group,
- GnomeCanvasItem *item);
-static void add_idle (GnomeCanvas *canvas);
-
-
-/*** GnomeCanvasItem ***/
-
-/* Some convenience stuff */
-#define GCI_UPDATE_MASK (GNOME_CANVAS_UPDATE_REQUESTED | GNOME_CANVAS_UPDATE_AFFINE | GNOME_CANVAS_UPDATE_CLIP | GNOME_CANVAS_UPDATE_VISIBILITY)
-#define GCI_EPSILON 1e-18
-#define GCI_PRINT_MATRIX(s,a) g_print ("%s %g %g %g %g %g %g\n", s, (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5])
-
-enum {
- ITEM_PROP_0,
- ITEM_PROP_PARENT
-};
-
-enum {
- ITEM_EVENT,
- ITEM_LAST_SIGNAL
-};
-
-static void gnome_canvas_item_class_init (GnomeCanvasItemClass *class);
-static void gnome_canvas_item_init (GnomeCanvasItem *item);
-static int emit_event (GnomeCanvas *canvas, GdkEvent *event);
-
-static guint item_signals[ITEM_LAST_SIGNAL];
-
-static GtkObjectClass *item_parent_class;
-
-
-/**
- * gnome_canvas_item_get_type:
- *
- * Registers the &GnomeCanvasItem class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &GnomeCanvasItem class.
- **/
-GType
-gnome_canvas_item_get_type (void)
-{
- static GType canvas_item_type;
-
- if (!canvas_item_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasItemClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_item_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasItem),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_item_init,
- NULL /* value_table */
- };
-
- canvas_item_type = g_type_register_static (GTK_TYPE_OBJECT, "GnomeCanvasItem",
- &object_info, 0);
- }
-
- return canvas_item_type;
-}
-
-/* Object initialization function for GnomeCanvasItem */
-static void
-gnome_canvas_item_init (GnomeCanvasItem *item)
-{
- item->object.flags |= GNOME_CANVAS_ITEM_VISIBLE;
-}
-
-/**
- * gnome_canvas_item_new:
- * @parent: The parent group for the new item.
- * @type: The object type of the item.
- * @first_arg_name: A list of object argument name/value pairs, NULL-terminated,
- * used to configure the item. For example, "fill_color", "black",
- * "width_units", 5.0, NULL.
- * @Varargs:
- *
- * Creates a new canvas item with @parent as its parent group. The item is
- * created at the top of its parent's stack, and starts up as visible. The item
- * is of the specified @type, for example, it can be
- * gnome_canvas_rect_get_type(). The list of object arguments/value pairs is
- * used to configure the item. If you need to pass construct time parameters, you
- * should use g_object_new() to pass the parameters and
- * gnome_canvas_item_construct() to set up the canvas item.
- *
- * Return value: The newly-created item.
- **/
-GnomeCanvasItem *
-gnome_canvas_item_new (GnomeCanvasGroup *parent, GType type, const gchar *first_arg_name, ...)
-{
- GnomeCanvasItem *item;
- va_list args;
-
- g_return_val_if_fail (GNOME_IS_CANVAS_GROUP (parent), NULL);
- g_return_val_if_fail (g_type_is_a (type, gnome_canvas_item_get_type ()), NULL);
-
- item = GNOME_CANVAS_ITEM (g_object_new (type, NULL));
-
- va_start (args, first_arg_name);
- gnome_canvas_item_construct (item, parent, first_arg_name, args);
- va_end (args);
-
- return item;
-}
-
-
-/* Performs post-creation operations on a canvas item (adding it to its parent
- * group, etc.)
- */
-static void
-item_post_create_setup (GnomeCanvasItem *item)
-{
- group_add (GNOME_CANVAS_GROUP (item->parent), item);
-
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2 + 1, item->y2 + 1);
- item->canvas->need_repick = TRUE;
-}
-
-/* Set_property handler for canvas items */
-static void
-gnome_canvas_item_set_property (GObject *gobject, guint param_id,
- const GValue *value, GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (gobject));
-
- item = GNOME_CANVAS_ITEM (gobject);
-
- switch (param_id) {
- case ITEM_PROP_PARENT:
- if (item->parent != NULL) {
- g_warning ("Cannot set `parent' argument after item has "
- "already been constructed.");
- } else if (g_value_get_object (value)) {
- item->parent = GNOME_CANVAS_ITEM (g_value_get_object (value));
- item->canvas = item->parent->canvas;
- item_post_create_setup (item);
- }
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, param_id, pspec);
- break;
- }
-}
-
-/* Get_property handler for canvas items */
-static void
-gnome_canvas_item_get_property (GObject *gobject, guint param_id,
- GValue *value, GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (gobject));
-
- item = GNOME_CANVAS_ITEM (gobject);
-
- switch (param_id) {
- case ITEM_PROP_PARENT:
- g_value_set_object (value, item->parent);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, param_id, pspec);
- break;
- }
-}
-
-/**
- * gnome_canvas_item_construct:
- * @item: An unconstructed canvas item.
- * @parent: The parent group for the item.
- * @first_arg_name: The name of the first argument for configuring the item.
- * @args: The list of arguments used to configure the item.
- *
- * Constructs a canvas item; meant for use only by item implementations.
- **/
-void
-gnome_canvas_item_construct (GnomeCanvasItem *item, GnomeCanvasGroup *parent,
- const gchar *first_arg_name, va_list args)
-{
- g_return_if_fail (GNOME_IS_CANVAS_GROUP (parent));
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- item->parent = GNOME_CANVAS_ITEM (parent);
- item->canvas = item->parent->canvas;
-
- g_object_set_valist (G_OBJECT (item), first_arg_name, args);
-
- item_post_create_setup (item);
-}
-
-
-/* If the item is visible, requests a redraw of it. */
-static void
-redraw_if_visible (GnomeCanvasItem *item)
-{
- if (item->object.flags & GNOME_CANVAS_ITEM_VISIBLE)
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2 + 1, item->y2 + 1);
-}
-
-/* Standard object dispose function for canvas items */
-static void
-gnome_canvas_item_dispose (GObject *object)
-{
- GnomeCanvasItem *item;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (object));
-
- item = GNOME_CANVAS_ITEM (object);
-
- if (item->canvas)
- redraw_if_visible (item);
-
- /* Make the canvas forget about us */
-
- if (item->canvas && item == item->canvas->current_item) {
- item->canvas->current_item = NULL;
- item->canvas->need_repick = TRUE;
- }
-
- if (item->canvas && item == item->canvas->new_current_item) {
- item->canvas->new_current_item = NULL;
- item->canvas->need_repick = TRUE;
- }
-
- if (item->canvas && item == item->canvas->grabbed_item) {
- item->canvas->grabbed_item = NULL;
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- }
-
- if (item->canvas && item == item->canvas->focused_item)
- item->canvas->focused_item = NULL;
-
- /* Normal destroy stuff */
-
- if (item->object.flags & GNOME_CANVAS_ITEM_MAPPED)
- (* GNOME_CANVAS_ITEM_GET_CLASS (item)->unmap) (item);
-
- if (item->object.flags & GNOME_CANVAS_ITEM_REALIZED)
- (* GNOME_CANVAS_ITEM_GET_CLASS (item)->unrealize) (item);
-
- if (item->parent)
- group_remove (GNOME_CANVAS_GROUP (item->parent), item);
-
- g_free (item->xform);
- item->xform = NULL;
-
- G_OBJECT_CLASS (item_parent_class)->dispose (object);
- /* items should remove any reference to item->canvas after the
- first ::destroy */
- item->canvas = NULL;
-}
-
-/* Realize handler for canvas items */
-static void
-gnome_canvas_item_realize (GnomeCanvasItem *item)
-{
- GTK_OBJECT_SET_FLAGS (item, GNOME_CANVAS_ITEM_REALIZED);
-
- gnome_canvas_item_request_update (item);
-}
-
-/* Unrealize handler for canvas items */
-static void
-gnome_canvas_item_unrealize (GnomeCanvasItem *item)
-{
- GTK_OBJECT_UNSET_FLAGS (item, GNOME_CANVAS_ITEM_REALIZED);
-}
-
-/* Map handler for canvas items */
-static void
-gnome_canvas_item_map (GnomeCanvasItem *item)
-{
- GTK_OBJECT_SET_FLAGS (item, GNOME_CANVAS_ITEM_MAPPED);
-}
-
-/* Unmap handler for canvas items */
-static void
-gnome_canvas_item_unmap (GnomeCanvasItem *item)
-{
- GTK_OBJECT_UNSET_FLAGS (item, GNOME_CANVAS_ITEM_MAPPED);
-}
-
-/* Update handler for canvas items */
-static void
-gnome_canvas_item_update (GnomeCanvasItem *item, double *affine, ArtSVP * clip_path, int flags)
-{
- GTK_OBJECT_UNSET_FLAGS (item, GNOME_CANVAS_ITEM_NEED_UPDATE);
- GTK_OBJECT_UNSET_FLAGS (item, GNOME_CANVAS_ITEM_NEED_AFFINE);
- GTK_OBJECT_UNSET_FLAGS (item, GNOME_CANVAS_ITEM_NEED_CLIP);
- GTK_OBJECT_UNSET_FLAGS (item, GNOME_CANVAS_ITEM_NEED_VIS);
-}
-
-#define noHACKISH_AFFINE
-
-/*
- * This routine invokes the update method of the item
- * Please notice, that we take parent to canvas pixel matrix as argument
- * unlike virtual method ::update, whose argument is item 2 canvas pixel
- * matrix
- *
- * I will try to force somewhat meaningful naming for affines (Lauris)
- * General naming rule is FROM2TO, where FROM and TO are abbreviations
- * So p2cpx is Parent2CanvasPixel and i2cpx is Item2CanvasPixel
- * I hope that this helps to keep track of what really happens
- *
- */
-
-static void
-gnome_canvas_item_invoke_update (GnomeCanvasItem *item, double *p2cpx, ArtSVP *clip_path, int flags)
-{
- int child_flags;
- gdouble i2cpx[6];
-
-#ifdef HACKISH_AFFINE
- double i2w[6], w2c[6], i2c[6];
-#endif
-
- child_flags = flags;
- if (!(item->object.flags & GNOME_CANVAS_ITEM_VISIBLE))
- child_flags &= ~GNOME_CANVAS_UPDATE_IS_VISIBLE;
-
- /* Calculate actual item transformation matrix */
-
- if (item->xform) {
- if (item->object.flags & GNOME_CANVAS_ITEM_AFFINE_FULL) {
- /* Item has full affine */
- art_affine_multiply (i2cpx, item->xform, p2cpx);
- } else {
- /* Item has only translation */
- memcpy (i2cpx, p2cpx, 4 * sizeof (gdouble));
- i2cpx[4] = item->xform[0] * p2cpx[0] + item->xform[1] * p2cpx[2] + p2cpx[4];
- i2cpx[5] = item->xform[0] * p2cpx[1] + item->xform[1] * p2cpx[3] + p2cpx[5];
- }
- } else {
- /* Item has no matrix (i.e. identity) */
- memcpy (i2cpx, p2cpx, 6 * sizeof (gdouble));
- }
-
-#ifdef HACKISH_AFFINE
- gnome_canvas_item_i2w_affine (item, i2w);
- gnome_canvas_w2c_affine (item->canvas, w2c);
- art_affine_multiply (i2c, i2w, w2c);
- /* invariant (doesn't hold now): child_affine == i2c */
- child_affine = i2c;
-#endif
-
- /* apply object flags to child flags */
-
- child_flags &= ~GNOME_CANVAS_UPDATE_REQUESTED;
-
- if (item->object.flags & GNOME_CANVAS_ITEM_NEED_UPDATE)
- child_flags |= GNOME_CANVAS_UPDATE_REQUESTED;
-
- if (item->object.flags & GNOME_CANVAS_ITEM_NEED_AFFINE)
- child_flags |= GNOME_CANVAS_UPDATE_AFFINE;
-
- if (item->object.flags & GNOME_CANVAS_ITEM_NEED_CLIP)
- child_flags |= GNOME_CANVAS_UPDATE_CLIP;
-
- if (item->object.flags & GNOME_CANVAS_ITEM_NEED_VIS)
- child_flags |= GNOME_CANVAS_UPDATE_VISIBILITY;
-
- if (child_flags & GCI_UPDATE_MASK) {
- if (GNOME_CANVAS_ITEM_GET_CLASS (item)->update)
- GNOME_CANVAS_ITEM_GET_CLASS (item)->update (item, i2cpx, clip_path, child_flags);
- }
-}
-
-/*
- * This routine invokes the point method of the item.
- * The arguments x, y should be in the parent item local coordinates.
- *
- * This is potentially evil, as we are relying on matrix inversion (Lauris)
- */
-
-static double
-gnome_canvas_item_invoke_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item)
-{
- /* Calculate x & y in item local coordinates */
-
- if (item->xform) {
- if (item->object.flags & GNOME_CANVAS_ITEM_AFFINE_FULL) {
- gdouble p2i[6], t;
- /* Item has full affine */
- art_affine_invert (p2i, item->xform);
- t = x * p2i[0] + y * p2i[2] + p2i[4];
- y = x * p2i[1] + y * p2i[3] + p2i[5];
- x = t;
- } else {
- /* Item has only translation */
- x -= item->xform[0];
- y -= item->xform[1];
- }
- }
-
-#ifdef HACKISH_AFFINE
- double i2w[6], w2c[6], i2c[6], c2i[6];
- ArtPoint c, i;
-#endif
-
-#ifdef HACKISH_AFFINE
- gnome_canvas_item_i2w_affine (item, i2w);
- gnome_canvas_w2c_affine (item->canvas, w2c);
- art_affine_multiply (i2c, i2w, w2c);
- art_affine_invert (c2i, i2c);
- c.x = cx;
- c.y = cy;
- art_affine_point (&i, &c, c2i);
- x = i.x;
- y = i.y;
-#endif
-
- if (GNOME_CANVAS_ITEM_GET_CLASS (item)->point)
- return GNOME_CANVAS_ITEM_GET_CLASS (item)->point (item, x, y, cx, cy, actual_item);
-
- return 1e18;
-}
-
-/**
- * gnome_canvas_item_set:
- * @item: A canvas item.
- * @first_arg_name: The list of object argument name/value pairs used to configure the item.
- * @Varargs:
- *
- * Configures a canvas item. The arguments in the item are set to the specified
- * values, and the item is repainted as appropriate.
- **/
-void
-gnome_canvas_item_set (GnomeCanvasItem *item, const gchar *first_arg_name, ...)
-{
- va_list args;
-
- va_start (args, first_arg_name);
- gnome_canvas_item_set_valist (item, first_arg_name, args);
- va_end (args);
-}
-
-
-/**
- * gnome_canvas_item_set_valist:
- * @item: A canvas item.
- * @first_arg_name: The name of the first argument used to configure the item.
- * @args: The list of object argument name/value pairs used to configure the item.
- *
- * Configures a canvas item. The arguments in the item are set to the specified
- * values, and the item is repainted as appropriate.
- **/
-void
-gnome_canvas_item_set_valist (GnomeCanvasItem *item, const gchar *first_arg_name, va_list args)
-{
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- g_object_set_valist (G_OBJECT (item), first_arg_name, args);
-
-#if 0
- /* I commented this out, because item implementations have to schedule update/redraw */
- redraw_if_visible (item);
-#endif
-
- item->canvas->need_repick = TRUE;
-}
-
-
-/**
- * gnome_canvas_item_affine_relative:
- * @item: A canvas item.
- * @affine: An affine transformation matrix.
- *
- * Combines the specified affine transformation matrix with the item's current
- * transformation. NULL affine is not allowed.
- **/
-#define GCIAR_EPSILON 1e-6
-void
-gnome_canvas_item_affine_relative (GnomeCanvasItem *item, const double affine[6])
-{
- gdouble i2p[6];
-
- g_return_if_fail (item != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
- g_return_if_fail (affine != NULL);
-
- /* Calculate actual item transformation matrix */
-
- if (item->xform) {
- if (item->object.flags & GNOME_CANVAS_ITEM_AFFINE_FULL) {
- /* Item has full affine */
- art_affine_multiply (i2p, affine, item->xform);
- } else {
- /* Item has only translation */
- memcpy (i2p, affine, 6 * sizeof (gdouble));
- i2p[4] += item->xform[0];
- i2p[5] += item->xform[1];
- }
- } else {
- /* Item has no matrix (i.e. identity) */
- memcpy (i2p, affine, 6 * sizeof (gdouble));
- }
-
- gnome_canvas_item_affine_absolute (item, i2p);
-}
-
-/**
- * gnome_canvas_item_affine_absolute:
- * @item: A canvas item.
- * @affine: An affine transformation matrix.
- *
- * Makes the item's affine transformation matrix be equal to the specified
- * matrix. NULL affine is treated as identity.
- **/
-void
-gnome_canvas_item_affine_absolute (GnomeCanvasItem *item, const double i2p[6])
-{
- g_return_if_fail (item != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- if (i2p &&
- (fabs (i2p[0] - 1.0) < GCI_EPSILON) &&
- (fabs (i2p[1] - 0.0) < GCI_EPSILON) &&
- (fabs (i2p[2] - 0.0) < GCI_EPSILON) &&
- (fabs (i2p[3] - 1.0) < GCI_EPSILON) &&
- (fabs (i2p[4] - 0.0) < GCI_EPSILON) &&
- (fabs (i2p[5] - 0.0) < GCI_EPSILON)) {
- /* We are identity */
- i2p = NULL;
- }
-
- if (i2p) {
- if (item->xform && !(item->object.flags & GNOME_CANVAS_ITEM_AFFINE_FULL)) {
- /* We do not want to deal with translation-only affines */
- g_free (item->xform);
- item->xform = NULL;
- }
- if (!item->xform) item->xform = g_new (gdouble, 6);
- memcpy (item->xform, i2p, 6 * sizeof (gdouble));
- item->object.flags |= GNOME_CANVAS_ITEM_AFFINE_FULL;
- } else {
- if (item->xform) {
- g_free (item->xform);
- item->xform = NULL;
- }
- }
-
- if (!(item->object.flags & GNOME_CANVAS_ITEM_NEED_AFFINE)) {
- /* Request update */
- item->object.flags |= GNOME_CANVAS_ITEM_NEED_AFFINE;
- gnome_canvas_item_request_update (item);
- }
-
- item->canvas->need_repick = TRUE;
-}
-
-
-/**
- * gnome_canvas_item_move:
- * @item: A canvas item.
- * @dx: Horizontal offset.
- * @dy: Vertical offset.
- *
- * Moves a canvas item by creating an affine transformation matrix for
- * translation by using the specified values. This happens in item
- * local coordinate system, so if you have nontrivial transform, it
- * most probably does not do, what you want.
- **/
-void
-gnome_canvas_item_move (GnomeCanvasItem *item, double dx, double dy)
-{
- double translate[6];
-
- g_return_if_fail (item != NULL);
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- art_affine_translate (translate, dx, dy);
-
- gnome_canvas_item_affine_relative (item, translate);
-}
-
-/* Convenience function to reorder items in a group's child list. This puts the
- * specified link after the "before" link. Returns TRUE if the list was changed.
- */
-static gboolean
-put_item_after (GList *link, GList *before)
-{
- GnomeCanvasGroup *parent;
- GList *old_before, *old_after;
- GList *after;
-
- parent = GNOME_CANVAS_GROUP (GNOME_CANVAS_ITEM (link->data)->parent);
-
- if (before)
- after = before->next;
- else
- after = parent->item_list;
-
- if (before == link || after == link)
- return FALSE;
-
- /* Unlink */
-
- old_before = link->prev;
- old_after = link->next;
-
- if (old_before)
- old_before->next = old_after;
- else
- parent->item_list = old_after;
-
- if (old_after)
- old_after->prev = old_before;
- else
- parent->item_list_end = old_before;
-
- /* Relink */
-
- link->prev = before;
- if (before)
- before->next = link;
- else
- parent->item_list = link;
-
- link->next = after;
- if (after)
- after->prev = link;
- else
- parent->item_list_end = link;
-
- return TRUE;
-}
-
-
-/**
- * gnome_canvas_item_raise:
- * @item: A canvas item.
- * @positions: Number of steps to raise the item.
- *
- * Raises the item in its parent's stack by the specified number of positions.
- * If the number of positions is greater than the distance to the top of the
- * stack, then the item is put at the top.
- **/
-void
-gnome_canvas_item_raise (GnomeCanvasItem *item, int positions)
-{
- GList *link, *before;
- GnomeCanvasGroup *parent;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
- g_return_if_fail (positions >= 0);
-
- if (!item->parent || positions == 0)
- return;
-
- parent = GNOME_CANVAS_GROUP (item->parent);
- link = g_list_find (parent->item_list, item);
- g_assert (link != NULL);
-
- for (before = link; positions && before; positions--)
- before = before->next;
-
- if (!before)
- before = parent->item_list_end;
-
- if (put_item_after (link, before)) {
- redraw_if_visible (item);
- item->canvas->need_repick = TRUE;
- }
-}
-
-
-/**
- * gnome_canvas_item_lower:
- * @item: A canvas item.
- * @positions: Number of steps to lower the item.
- *
- * Lowers the item in its parent's stack by the specified number of positions.
- * If the number of positions is greater than the distance to the bottom of the
- * stack, then the item is put at the bottom.
- **/
-void
-gnome_canvas_item_lower (GnomeCanvasItem *item, int positions)
-{
- GList *link, *before;
- GnomeCanvasGroup *parent;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
- g_return_if_fail (positions >= 1);
-
- if (!item->parent || positions == 0)
- return;
-
- parent = GNOME_CANVAS_GROUP (item->parent);
- link = g_list_find (parent->item_list, item);
- g_assert (link != NULL);
-
- if (link->prev)
- for (before = link->prev; positions && before; positions--)
- before = before->prev;
- else
- before = NULL;
-
- if (put_item_after (link, before)) {
- redraw_if_visible (item);
- item->canvas->need_repick = TRUE;
- }
-}
-
-
-/**
- * gnome_canvas_item_raise_to_top:
- * @item: A canvas item.
- *
- * Raises an item to the top of its parent's stack.
- **/
-void
-gnome_canvas_item_raise_to_top (GnomeCanvasItem *item)
-{
- GList *link;
- GnomeCanvasGroup *parent;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- if (!item->parent)
- return;
-
- parent = GNOME_CANVAS_GROUP (item->parent);
- link = g_list_find (parent->item_list, item);
- g_assert (link != NULL);
-
- if (put_item_after (link, parent->item_list_end)) {
- redraw_if_visible (item);
- item->canvas->need_repick = TRUE;
- }
-}
-
-
-/**
- * gnome_canvas_item_lower_to_bottom:
- * @item: A canvas item.
- *
- * Lowers an item to the bottom of its parent's stack.
- **/
-void
-gnome_canvas_item_lower_to_bottom (GnomeCanvasItem *item)
-{
- GList *link;
- GnomeCanvasGroup *parent;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- if (!item->parent)
- return;
-
- parent = GNOME_CANVAS_GROUP (item->parent);
- link = g_list_find (parent->item_list, item);
- g_assert (link != NULL);
-
- if (put_item_after (link, NULL)) {
- redraw_if_visible (item);
- item->canvas->need_repick = TRUE;
- }
-}
-
-
-/**
- * gnome_canvas_item_show:
- * @item: A canvas item.
- *
- * Shows a canvas item. If the item was already shown, then no action is taken.
- **/
-void
-gnome_canvas_item_show (GnomeCanvasItem *item)
-{
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- if (!(item->object.flags & GNOME_CANVAS_ITEM_VISIBLE)) {
- item->object.flags |= GNOME_CANVAS_ITEM_VISIBLE;
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2 + 1, item->y2 + 1);
- item->canvas->need_repick = TRUE;
- }
-}
-
-
-/**
- * gnome_canvas_item_hide:
- * @item: A canvas item.
- *
- * Hides a canvas item. If the item was already hidden, then no action is
- * taken.
- **/
-void
-gnome_canvas_item_hide (GnomeCanvasItem *item)
-{
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- if (item->object.flags & GNOME_CANVAS_ITEM_VISIBLE) {
- item->object.flags &= ~GNOME_CANVAS_ITEM_VISIBLE;
- gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2 + 1, item->y2 + 1);
- item->canvas->need_repick = TRUE;
- }
-}
-
-
-/**
- * gnome_canvas_item_grab:
- * @item: A canvas item.
- * @event_mask: Mask of events that will be sent to this item.
- * @cursor: If non-NULL, the cursor that will be used while the grab is active.
- * @etime: The timestamp required for grabbing the mouse, or GDK_CURRENT_TIME.
- *
- * Specifies that all events that match the specified event mask should be sent
- * to the specified item, and also grabs the mouse by calling
- * gdk_pointer_grab(). The event mask is also used when grabbing the pointer.
- * If @cursor is not NULL, then that cursor is used while the grab is active.
- * The @etime parameter is the timestamp required for grabbing the mouse.
- *
- * Return value: If an item was already grabbed, it returns %GDK_GRAB_ALREADY_GRABBED. If
- * the specified item was hidden by calling gnome_canvas_item_hide(), then it
- * returns %GDK_GRAB_NOT_VIEWABLE. Else, it returns the result of calling
- * gdk_pointer_grab().
- **/
-int
-gnome_canvas_item_grab (GnomeCanvasItem *item, guint event_mask, GdkCursor *cursor, guint32 etime)
-{
- int retval;
-
- g_return_val_if_fail (GNOME_IS_CANVAS_ITEM (item), GDK_GRAB_NOT_VIEWABLE);
- g_return_val_if_fail (GTK_WIDGET_MAPPED (item->canvas), GDK_GRAB_NOT_VIEWABLE);
-
- if (item->canvas->grabbed_item)
- return GDK_GRAB_ALREADY_GRABBED;
-
- if (!(item->object.flags & GNOME_CANVAS_ITEM_VISIBLE))
- return GDK_GRAB_NOT_VIEWABLE;
-
- retval = gdk_pointer_grab (item->canvas->layout.bin_window,
- FALSE,
- event_mask,
- NULL,
- cursor,
- etime);
-
- if (retval != GDK_GRAB_SUCCESS)
- return retval;
-
- item->canvas->grabbed_item = item;
- item->canvas->grabbed_event_mask = event_mask;
- item->canvas->current_item = item; /* So that events go to the grabbed item */
-
- return retval;
-}
-
-
-/**
- * gnome_canvas_item_ungrab:
- * @item: A canvas item that holds a grab.
- * @etime: The timestamp for ungrabbing the mouse.
- *
- * Ungrabs the item, which must have been grabbed in the canvas, and ungrabs the
- * mouse.
- **/
-void
-gnome_canvas_item_ungrab (GnomeCanvasItem *item, guint32 etime)
-{
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- if (item->canvas->grabbed_item != item)
- return;
-
- item->canvas->grabbed_item = NULL;
-
- gdk_pointer_ungrab (etime);
-}
-
-
-/**
- * gnome_canvas_item_i2w_affine:
- * @item: A canvas item
- * @affine: An affine transformation matrix (return value).
- *
- * Gets the affine transform that converts from the item's coordinate system to
- * world coordinates.
- **/
-void
-gnome_canvas_item_i2w_affine (GnomeCanvasItem *item, double affine[6])
-{
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
- g_return_if_fail (affine != NULL);
-
- art_affine_identity (affine);
-
- while (item) {
- if (item->xform != NULL) {
- if (item->object.flags & GNOME_CANVAS_ITEM_AFFINE_FULL) {
- art_affine_multiply (affine, affine, item->xform);
- } else {
- affine[4] += item->xform[0];
- affine[5] += item->xform[1];
- }
- }
-
- item = item->parent;
- }
-}
-
-/**
- * gnome_canvas_item_w2i:
- * @item: A canvas item.
- * @x: X coordinate to convert (input/output value).
- * @y: Y coordinate to convert (input/output value).
- *
- * Converts a coordinate pair from world coordinates to item-relative
- * coordinates.
- **/
-void
-gnome_canvas_item_w2i (GnomeCanvasItem *item, double *x, double *y)
-{
- double affine[6], inv[6];
- ArtPoint w, i;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
- g_return_if_fail (x != NULL);
- g_return_if_fail (y != NULL);
-
- gnome_canvas_item_i2w_affine (item, affine);
- art_affine_invert (inv, affine);
- w.x = *x;
- w.y = *y;
- art_affine_point (&i, &w, inv);
- *x = i.x;
- *y = i.y;
-}
-
-
-/**
- * gnome_canvas_item_i2w:
- * @item: A canvas item.
- * @x: X coordinate to convert (input/output value).
- * @y: Y coordinate to convert (input/output value).
- *
- * Converts a coordinate pair from item-relative coordinates to world
- * coordinates.
- **/
-void
-gnome_canvas_item_i2w (GnomeCanvasItem *item, double *x, double *y)
-{
- double affine[6];
- ArtPoint w, i;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
- g_return_if_fail (x != NULL);
- g_return_if_fail (y != NULL);
-
- gnome_canvas_item_i2w_affine (item, affine);
- i.x = *x;
- i.y = *y;
- art_affine_point (&w, &i, affine);
- *x = w.x;
- *y = w.y;
-}
-
-/**
- * gnome_canvas_item_i2c_affine:
- * @item: A canvas item.
- * @affine: An affine transformation matrix (return value).
- *
- * Gets the affine transform that converts from item-relative coordinates to
- * canvas pixel coordinates.
- **/
-void
-gnome_canvas_item_i2c_affine (GnomeCanvasItem *item, double affine[6])
-{
- double i2w[6], w2c[6];
-
- gnome_canvas_item_i2w_affine (item, i2w);
- gnome_canvas_w2c_affine (item->canvas, w2c);
- art_affine_multiply (affine, i2w, w2c);
-}
-
-/* Returns whether the item is an inferior of or is equal to the parent. */
-static int
-is_descendant (GnomeCanvasItem *item, GnomeCanvasItem *parent)
-{
- for (; item; item = item->parent)
- if (item == parent)
- return TRUE;
-
- return FALSE;
-}
-
-/**
- * gnome_canvas_item_reparent:
- * @item: A canvas item.
- * @new_group: A canvas group.
- *
- * Changes the parent of the specified item to be the new group. The item keeps
- * its group-relative coordinates as for its old parent, so the item may change
- * its absolute position within the canvas.
- **/
-void
-gnome_canvas_item_reparent (GnomeCanvasItem *item, GnomeCanvasGroup *new_group)
-{
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
- g_return_if_fail (GNOME_IS_CANVAS_GROUP (new_group));
-
- /* Both items need to be in the same canvas */
- g_return_if_fail (item->canvas == GNOME_CANVAS_ITEM (new_group)->canvas);
-
- /* The group cannot be an inferior of the item or be the item itself --
- * this also takes care of the case where the item is the root item of
- * the canvas. */
- g_return_if_fail (!is_descendant (GNOME_CANVAS_ITEM (new_group), item));
-
- /* Everything is ok, now actually reparent the item */
-
- g_object_ref (G_OBJECT (item)); /* protect it from the unref in group_remove */
-
- redraw_if_visible (item);
-
- group_remove (GNOME_CANVAS_GROUP (item->parent), item);
- item->parent = GNOME_CANVAS_ITEM (new_group);
- group_add (new_group, item);
-
- /* Redraw and repick */
-
- redraw_if_visible (item);
- item->canvas->need_repick = TRUE;
-
- g_object_unref (G_OBJECT (item));
-}
-
-/**
- * gnome_canvas_item_grab_focus:
- * @item: A canvas item.
- *
- * Makes the specified item take the keyboard focus, so all keyboard events will
- * be sent to it. If the canvas widget itself did not have the focus, it grabs
- * it as well.
- **/
-void
-gnome_canvas_item_grab_focus (GnomeCanvasItem *item)
-{
- GnomeCanvasItem *focused_item;
- GdkEvent ev;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
- g_return_if_fail (GTK_WIDGET_CAN_FOCUS (GTK_WIDGET (item->canvas)));
-
- focused_item = item->canvas->focused_item;
-
- if (focused_item) {
- ev.focus_change.type = GDK_FOCUS_CHANGE;
- ev.focus_change.window = GTK_LAYOUT (item->canvas)->bin_window;
- ev.focus_change.send_event = FALSE;
- ev.focus_change.in = FALSE;
-
- emit_event (item->canvas, &ev);
- }
-
- item->canvas->focused_item = item;
- gtk_widget_grab_focus (GTK_WIDGET (item->canvas));
-
- if (focused_item) {
- ev.focus_change.type = GDK_FOCUS_CHANGE;
- ev.focus_change.window = GTK_LAYOUT (item->canvas)->bin_window;
- ev.focus_change.send_event = FALSE;
- ev.focus_change.in = TRUE;
-
- emit_event (item->canvas, &ev);
- }
-}
-
-
-/**
- * gnome_canvas_item_get_bounds:
- * @item: A canvas item.
- * @x1: Leftmost edge of the bounding box (return value).
- * @y1: Upper edge of the bounding box (return value).
- * @x2: Rightmost edge of the bounding box (return value).
- * @y2: Lower edge of the bounding box (return value).
- *
- * Queries the bounding box of a canvas item. The bounds are returned in the
- * coordinate system of the item's parent.
- **/
-void
-gnome_canvas_item_get_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- double tx1, ty1, tx2, ty2;
- ArtPoint p1, p2, p3, p4;
- ArtPoint q1, q2, q3, q4;
- double min_x1, min_y1, min_x2, min_y2;
- double max_x1, max_y1, max_x2, max_y2;
-
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- tx1 = ty1 = tx2 = ty2 = 0.0;
-
- /* Get the item's bounds in its coordinate system */
-
- if (GNOME_CANVAS_ITEM_GET_CLASS (item)->bounds)
- (* GNOME_CANVAS_ITEM_GET_CLASS (item)->bounds) (item, &tx1, &ty1, &tx2, &ty2);
-
- /* Make the bounds relative to the item's parent coordinate system */
-
- if (item->xform && (item->object.flags & GNOME_CANVAS_ITEM_AFFINE_FULL)) {
- p1.x = p2.x = tx1;
- p1.y = p4.y = ty1;
- p3.x = p4.x = tx2;
- p2.y = p3.y = ty2;
-
- art_affine_point (&q1, &p1, item->xform);
- art_affine_point (&q2, &p2, item->xform);
- art_affine_point (&q3, &p3, item->xform);
- art_affine_point (&q4, &p4, item->xform);
-
- if (q1.x < q2.x) {
- min_x1 = q1.x;
- max_x1 = q2.x;
- } else {
- min_x1 = q2.x;
- max_x1 = q1.x;
- }
-
- if (q1.y < q2.y) {
- min_y1 = q1.y;
- max_y1 = q2.y;
- } else {
- min_y1 = q2.y;
- max_y1 = q1.y;
- }
-
- if (q3.x < q4.x) {
- min_x2 = q3.x;
- max_x2 = q4.x;
- } else {
- min_x2 = q4.x;
- max_x2 = q3.x;
- }
-
- if (q3.y < q4.y) {
- min_y2 = q3.y;
- max_y2 = q4.y;
- } else {
- min_y2 = q4.y;
- max_y2 = q3.y;
- }
-
- tx1 = MIN (min_x1, min_x2);
- ty1 = MIN (min_y1, min_y2);
- tx2 = MAX (max_x1, max_x2);
- ty2 = MAX (max_y1, max_y2);
- } else if (item->xform) {
- tx1 += item->xform[0];
- ty1 += item->xform[1];
- tx2 += item->xform[0];
- ty2 += item->xform[1];
- }
-
- /* Return the values */
-
- if (x1)
- *x1 = tx1;
-
- if (y1)
- *y1 = ty1;
-
- if (x2)
- *x2 = tx2;
-
- if (y2)
- *y2 = ty2;
-}
-
-
-/**
- * gnome_canvas_item_request_update
- * @item: A canvas item.
- *
- * To be used only by item implementations. Requests that the canvas queue an
- * update for the specified item.
- **/
-void
-gnome_canvas_item_request_update (GnomeCanvasItem *item)
-{
- if (item->object.flags & GNOME_CANVAS_ITEM_NEED_UPDATE)
- return;
-
- item->object.flags |= GNOME_CANVAS_ITEM_NEED_UPDATE;
-
- if (item->parent != NULL) {
- /* Recurse up the tree */
- gnome_canvas_item_request_update (item->parent);
- } else {
- /* Have reached the top of the tree, make sure the update call gets scheduled. */
- gnome_canvas_request_update (item->canvas);
- }
-}
-
-/*** GnomeCanvasGroup ***/
-
-
-enum {
- GROUP_PROP_0,
- GROUP_PROP_X,
- GROUP_PROP_Y
-};
-
-
-static void gnome_canvas_group_class_init (GnomeCanvasGroupClass *class);
-static void gnome_canvas_group_init (GnomeCanvasGroup *group);
-static void gnome_canvas_group_set_property(GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gnome_canvas_group_get_property(GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void gnome_canvas_group_destroy (GtkObject *object);
-
-static void gnome_canvas_group_update (GnomeCanvasItem *item, double *affine,
- ArtSVP *clip_path, int flags);
-static void gnome_canvas_group_realize (GnomeCanvasItem *item);
-static void gnome_canvas_group_unrealize (GnomeCanvasItem *item);
-static void gnome_canvas_group_map (GnomeCanvasItem *item);
-static void gnome_canvas_group_unmap (GnomeCanvasItem *item);
-static void gnome_canvas_group_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-static double gnome_canvas_group_point (GnomeCanvasItem *item, double x, double y,
- int cx, int cy,
- GnomeCanvasItem **actual_item);
-static void gnome_canvas_group_bounds (GnomeCanvasItem *item, double *x1, double *y1,
- double *x2, double *y2);
-static void gnome_canvas_group_render (GnomeCanvasItem *item,
- GnomeCanvasBuf *buf);
-
-
-static GnomeCanvasItemClass *group_parent_class;
-
-
-/**
- * gnome_canvas_group_get_type:
- *
- * Registers the &GnomeCanvasGroup class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &GnomeCanvasGroup class.
- **/
-GType
-gnome_canvas_group_get_type (void)
-{
- static GType canvas_group_type;
-
- if (!canvas_group_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasGroupClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_group_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvasGroup),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_group_init,
- NULL /* value_table */
- };
-
- canvas_group_type = g_type_register_static (GNOME_TYPE_CANVAS_ITEM, "GnomeCanvasGroup",
- &object_info, 0);
- }
-
- return canvas_group_type;
-}
-
-/* Class initialization function for GnomeCanvasGroupClass */
-static void
-gnome_canvas_group_class_init (GnomeCanvasGroupClass *class)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
-
- gobject_class = (GObjectClass *) class;
- object_class = (GtkObjectClass *) class;
- item_class = (GnomeCanvasItemClass *) class;
-
- group_parent_class = g_type_class_peek_parent (class);
-
- gobject_class->set_property = gnome_canvas_group_set_property;
- gobject_class->get_property = gnome_canvas_group_get_property;
-
- g_object_class_install_property
- (gobject_class, GROUP_PROP_X,
- g_param_spec_double ("x",
- _("X"),
- _("X"),
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
- g_object_class_install_property
- (gobject_class, GROUP_PROP_Y,
- g_param_spec_double ("y",
- _("Y"),
- _("Y"),
- -G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- object_class->destroy = gnome_canvas_group_destroy;
-
- item_class->update = gnome_canvas_group_update;
- item_class->realize = gnome_canvas_group_realize;
- item_class->unrealize = gnome_canvas_group_unrealize;
- item_class->map = gnome_canvas_group_map;
- item_class->unmap = gnome_canvas_group_unmap;
- item_class->draw = gnome_canvas_group_draw;
- item_class->render = gnome_canvas_group_render;
- item_class->point = gnome_canvas_group_point;
- item_class->bounds = gnome_canvas_group_bounds;
-}
-
-/* Object initialization function for GnomeCanvasGroup */
-static void
-gnome_canvas_group_init (GnomeCanvasGroup * group)
-{
-#if 0
- group->xpos = 0.0;
- group->ypos = 0.0;
-#endif
-}
-
-/* Translate handler for canvas groups */
-static double *
-gnome_canvas_ensure_translate (GnomeCanvasItem *item)
-{
- if (item->xform == NULL) {
- GTK_OBJECT_UNSET_FLAGS (item, GNOME_CANVAS_ITEM_AFFINE_FULL);
- item->xform = g_new (double, 2);
- item->xform[0] = 0.0;
- item->xform[1] = 0.0;
- return item->xform;
- } else if (item->object.flags & GNOME_CANVAS_ITEM_AFFINE_FULL) {
- return item->xform + 4;
- } else {
- return item->xform;
- }
-}
-
-/* Set_property handler for canvas groups */
-static void
-gnome_canvas_group_set_property (GObject *gobject, guint param_id,
- const GValue *value, GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
- double *xlat;
-
- g_return_if_fail (GNOME_IS_CANVAS_GROUP (gobject));
-
- item = GNOME_CANVAS_ITEM (gobject);
-
- switch (param_id) {
- case GROUP_PROP_X:
- xlat = gnome_canvas_ensure_translate (item);
- xlat[0] = g_value_get_double (value);
- break;
-
- case GROUP_PROP_Y:
- xlat = gnome_canvas_ensure_translate (item);
- xlat[1] = g_value_get_double (value);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, param_id, pspec);
- break;
- }
-}
-
-/* Get_property handler for canvas groups */
-static void
-gnome_canvas_group_get_property (GObject *gobject, guint param_id,
- GValue *value, GParamSpec *pspec)
-{
- GnomeCanvasItem *item;
-
- g_return_if_fail (GNOME_IS_CANVAS_GROUP (gobject));
-
- item = GNOME_CANVAS_ITEM (gobject);
-
- switch (param_id) {
- case GROUP_PROP_X:
- if (item->xform == NULL)
- g_value_set_double (value, 0);
- else if (GTK_OBJECT (gobject)->flags & GNOME_CANVAS_ITEM_AFFINE_FULL)
- g_value_set_double (value, item->xform[4]);
- else
- g_value_set_double (value, item->xform[0]);
- break;
-
- case GROUP_PROP_Y:
- if (item->xform == NULL)
- g_value_set_double (value, 0);
- else if (GTK_OBJECT (gobject)->flags & GNOME_CANVAS_ITEM_AFFINE_FULL)
- g_value_set_double (value, item->xform[5]);
- else
- g_value_set_double (value, item->xform[1]);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, param_id, pspec);
- break;
- }
-}
-
-/* Destroy handler for canvas groups */
-static void
-gnome_canvas_group_destroy (GtkObject *object)
-{
- GnomeCanvasGroup *group;
-
- g_return_if_fail (GNOME_IS_CANVAS_GROUP (object));
-
- group = GNOME_CANVAS_GROUP (object);
-
- while (group->item_list) {
- // child is unref'ed by the child's group_remove().
- gtk_object_destroy (GTK_OBJECT (group->item_list->data));
- }
-
- if (GTK_OBJECT_CLASS (group_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (group_parent_class)->destroy) (object);
-}
-
-/* Update handler for canvas groups */
-static void
-gnome_canvas_group_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
- GnomeCanvasGroup *group;
- GList *list;
- GnomeCanvasItem *i;
- ArtDRect bbox, child_bbox;
-
- group = GNOME_CANVAS_GROUP (item);
-
- (* group_parent_class->update) (item, affine, clip_path, flags);
-
- bbox.x0 = 0;
- bbox.y0 = 0;
- bbox.x1 = 0;
- bbox.y1 = 0;
-
- for (list = group->item_list; list; list = list->next) {
- i = list->data;
-
- gnome_canvas_item_invoke_update (i, affine, clip_path, flags);
-
- child_bbox.x0 = i->x1;
- child_bbox.y0 = i->y1;
- child_bbox.x1 = i->x2;
- child_bbox.y1 = i->y2;
- art_drect_union (&bbox, &bbox, &child_bbox);
- }
- item->x1 = bbox.x0;
- item->y1 = bbox.y0;
- item->x2 = bbox.x1;
- item->y2 = bbox.y1;
-}
-
-/* Realize handler for canvas groups */
-static void
-gnome_canvas_group_realize (GnomeCanvasItem *item)
-{
- GnomeCanvasGroup *group;
- GList *list;
- GnomeCanvasItem *i;
-
- group = GNOME_CANVAS_GROUP (item);
-
- for (list = group->item_list; list; list = list->next) {
- i = list->data;
-
- if (!(i->object.flags & GNOME_CANVAS_ITEM_REALIZED))
- (* GNOME_CANVAS_ITEM_GET_CLASS (i)->realize) (i);
- }
-
- (* group_parent_class->realize) (item);
-}
-
-/* Unrealize handler for canvas groups */
-static void
-gnome_canvas_group_unrealize (GnomeCanvasItem *item)
-{
- GnomeCanvasGroup *group;
- GList *list;
- GnomeCanvasItem *i;
-
- group = GNOME_CANVAS_GROUP (item);
-
- for (list = group->item_list; list; list = list->next) {
- i = list->data;
-
- if (i->object.flags & GNOME_CANVAS_ITEM_REALIZED)
- (* GNOME_CANVAS_ITEM_GET_CLASS (i)->unrealize) (i);
- }
-
- (* group_parent_class->unrealize) (item);
-}
-
-/* Map handler for canvas groups */
-static void
-gnome_canvas_group_map (GnomeCanvasItem *item)
-{
- GnomeCanvasGroup *group;
- GList *list;
- GnomeCanvasItem *i;
-
- group = GNOME_CANVAS_GROUP (item);
-
- for (list = group->item_list; list; list = list->next) {
- i = list->data;
-
- if (!(i->object.flags & GNOME_CANVAS_ITEM_MAPPED))
- (* GNOME_CANVAS_ITEM_GET_CLASS (i)->map) (i);
- }
-
- (* group_parent_class->map) (item);
-}
-
-/* Unmap handler for canvas groups */
-static void
-gnome_canvas_group_unmap (GnomeCanvasItem *item)
-{
- GnomeCanvasGroup *group;
- GList *list;
- GnomeCanvasItem *i;
-
- group = GNOME_CANVAS_GROUP (item);
-
- for (list = group->item_list; list; list = list->next) {
- i = list->data;
-
- if (i->object.flags & GNOME_CANVAS_ITEM_MAPPED)
- (* GNOME_CANVAS_ITEM_GET_CLASS (i)->unmap) (i);
- }
-
- (* group_parent_class->unmap) (item);
-}
-
-/* Draw handler for canvas groups */
-static void
-gnome_canvas_group_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- GnomeCanvasGroup *group;
- GList *list;
- GnomeCanvasItem *child = NULL;
-
- group = GNOME_CANVAS_GROUP (item);
-
- for (list = group->item_list; list; list = list->next) {
- child = list->data;
-
- if (((child->object.flags & GNOME_CANVAS_ITEM_VISIBLE)
- && ((child->x1 < (x + width))
- && (child->y1 < (y + height))
- && (child->x2 > x)
- && (child->y2 > y)))
- || ((GTK_OBJECT_FLAGS (child) & GNOME_CANVAS_ITEM_ALWAYS_REDRAW)
- && (child->x1 < child->canvas->redraw_x2)
- && (child->y1 < child->canvas->redraw_y2)
- && (child->x2 > child->canvas->redraw_x1)
- && (child->y2 > child->canvas->redraw_y2)))
- if (GNOME_CANVAS_ITEM_GET_CLASS (child)->draw)
- (* GNOME_CANVAS_ITEM_GET_CLASS (child)->draw) (
- child, drawable, x, y, width, height);
- }
-}
-
-/* Point handler for canvas groups */
-static double
-gnome_canvas_group_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item)
-{
- GnomeCanvasGroup *group;
- GList *list;
- GnomeCanvasItem *child, *point_item;
- int x1, y1, x2, y2;
- double gx, gy;
- double dist, best;
- int has_point;
-
- group = GNOME_CANVAS_GROUP (item);
-
- x1 = cx - item->canvas->close_enough;
- y1 = cy - item->canvas->close_enough;
- x2 = cx + item->canvas->close_enough;
- y2 = cy + item->canvas->close_enough;
-
- best = 0.0;
- *actual_item = NULL;
-
- gx = x;
- gy = y;
-
- dist = 0.0; /* keep gcc happy */
-
- for (list = group->item_list; list; list = list->next) {
- child = list->data;
-
- if ((child->x1 > x2) || (child->y1 > y2) || (child->x2 < x1) || (child->y2 < y1))
- continue;
-
- point_item = NULL; /* cater for incomplete item implementations */
-
- if ((child->object.flags & GNOME_CANVAS_ITEM_VISIBLE)
- && GNOME_CANVAS_ITEM_GET_CLASS (child)->point) {
- dist = gnome_canvas_item_invoke_point (child, gx, gy, cx, cy, &point_item);
- has_point = TRUE;
- } else
- has_point = FALSE;
-
- if (has_point
- && point_item
- && ((int) (dist * item->canvas->pixels_per_unit + 0.5)
- <= item->canvas->close_enough)) {
- best = dist;
- *actual_item = point_item;
- }
- }
-
- return best;
-}
-
-/* Bounds handler for canvas groups */
-static void
-gnome_canvas_group_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
- GnomeCanvasGroup *group;
- GnomeCanvasItem *child;
- GList *list;
- double tx1, ty1, tx2, ty2;
- double minx, miny, maxx, maxy;
- int set;
-
- group = GNOME_CANVAS_GROUP (item);
-
- /* Get the bounds of the first visible item */
-
- child = NULL; /* Unnecessary but eliminates a warning. */
-
- set = FALSE;
-
- for (list = group->item_list; list; list = list->next) {
- child = list->data;
-
- if (child->object.flags & GNOME_CANVAS_ITEM_VISIBLE) {
- set = TRUE;
- gnome_canvas_item_get_bounds (child, &minx, &miny, &maxx, &maxy);
- break;
- }
- }
-
- /* If there were no visible items, return an empty bounding box */
-
- if (!set) {
- *x1 = *y1 = *x2 = *y2 = 0.0;
- return;
- }
-
- /* Now we can grow the bounds using the rest of the items */
-
- list = list->next;
-
- for (; list; list = list->next) {
- child = list->data;
-
- if (!(child->object.flags & GNOME_CANVAS_ITEM_VISIBLE))
- continue;
-
- gnome_canvas_item_get_bounds (child, &tx1, &ty1, &tx2, &ty2);
-
- if (tx1 < minx)
- minx = tx1;
-
- if (ty1 < miny)
- miny = ty1;
-
- if (tx2 > maxx)
- maxx = tx2;
-
- if (ty2 > maxy)
- maxy = ty2;
- }
-
- *x1 = minx;
- *y1 = miny;
- *x2 = maxx;
- *y2 = maxy;
-}
-
-/* Render handler for canvas groups */
-static void
-gnome_canvas_group_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
-{
- GnomeCanvasGroup *group;
- GnomeCanvasItem *child;
- GList *list;
-
- group = GNOME_CANVAS_GROUP (item);
-
- for (list = group->item_list; list; list = list->next) {
- child = list->data;
-
- if (((child->object.flags & GNOME_CANVAS_ITEM_VISIBLE)
- && ((child->x1 < buf->rect.x1)
- && (child->y1 < buf->rect.y1)
- && (child->x2 > buf->rect.x0)
- && (child->y2 > buf->rect.y0)))
- || ((GTK_OBJECT_FLAGS (child) & GNOME_CANVAS_ITEM_ALWAYS_REDRAW)
- && (child->x1 < child->canvas->redraw_x2)
- && (child->y1 < child->canvas->redraw_y2)
- && (child->x2 > child->canvas->redraw_x1)
- && (child->y2 > child->canvas->redraw_y2)))
- if (GNOME_CANVAS_ITEM_GET_CLASS (child)->render)
- (* GNOME_CANVAS_ITEM_GET_CLASS (child)->render) (
- child, buf);
- }
-}
-
-/* Adds an item to a group */
-static void
-group_add (GnomeCanvasGroup *group, GnomeCanvasItem *item)
-{
- g_object_ref_sink (G_OBJECT (item));
-
- if (!group->item_list) {
- group->item_list = g_list_append (group->item_list, item);
- group->item_list_end = group->item_list;
- } else
- group->item_list_end = g_list_append (group->item_list_end, item)->next;
-
- if (group->item.object.flags & GNOME_CANVAS_ITEM_REALIZED)
- (* GNOME_CANVAS_ITEM_GET_CLASS (item)->realize) (item);
-
- if (group->item.object.flags & GNOME_CANVAS_ITEM_MAPPED)
- (* GNOME_CANVAS_ITEM_GET_CLASS (item)->map) (item);
-
- g_object_notify (G_OBJECT (item), "parent");
-}
-
-/* Removes an item from a group */
-static void
-group_remove (GnomeCanvasGroup *group, GnomeCanvasItem *item)
-{
- GList *children;
-
- g_return_if_fail (GNOME_IS_CANVAS_GROUP (group));
- g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
-
- for (children = group->item_list; children; children = children->next)
- if (children->data == item) {
- if (item->object.flags & GNOME_CANVAS_ITEM_MAPPED)
- (* GNOME_CANVAS_ITEM_GET_CLASS (item)->unmap) (item);
-
- if (item->object.flags & GNOME_CANVAS_ITEM_REALIZED)
- (* GNOME_CANVAS_ITEM_GET_CLASS (item)->unrealize) (item);
-
- /* Unparent the child */
-
- item->parent = NULL;
- g_object_unref (G_OBJECT (item));
-
- /* Remove it from the list */
-
- if (children == group->item_list_end)
- group->item_list_end = children->prev;
-
- group->item_list = g_list_remove_link (group->item_list, children);
- g_list_free (children);
- break;
- }
-}
-
-
-/*** GnomeCanvas ***/
-
-
-enum {
- DRAW_BACKGROUND,
- RENDER_BACKGROUND,
- LAST_SIGNAL
-};
-
-static void gnome_canvas_class_init (GnomeCanvasClass *class);
-static void gnome_canvas_init (GnomeCanvas *canvas);
-static void gnome_canvas_destroy (GtkObject *object);
-static void gnome_canvas_map (GtkWidget *widget);
-static void gnome_canvas_unmap (GtkWidget *widget);
-static void gnome_canvas_realize (GtkWidget *widget);
-static void gnome_canvas_unrealize (GtkWidget *widget);
-static void gnome_canvas_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static gint gnome_canvas_button (GtkWidget *widget,
- GdkEventButton *event);
-static gint gnome_canvas_motion (GtkWidget *widget,
- GdkEventMotion *event);
-static gint gnome_canvas_expose (GtkWidget *widget,
- GdkEventExpose *event);
-static gboolean gnome_canvas_key (GtkWidget *widget,
- GdkEventKey *event);
-static gboolean gnome_canvas_scroll (GtkWidget *widget,
- GdkEventScroll *event);
-static gint gnome_canvas_crossing (GtkWidget *widget,
- GdkEventCrossing *event);
-static gint gnome_canvas_focus_in (GtkWidget *widget,
- GdkEventFocus *event);
-static gint gnome_canvas_focus_out (GtkWidget *widget,
- GdkEventFocus *event);
-static void gnome_canvas_request_update_real (GnomeCanvas *canvas);
-static void gnome_canvas_draw_background (GnomeCanvas *canvas,
- GdkDrawable *drawable,
- int x,
- int y,
- int width,
- int height);
-
-
-static GtkLayoutClass *canvas_parent_class;
-
-static guint canvas_signals[LAST_SIGNAL];
-
-enum {
- PROP_AA = 1,
- PROP_FOCUSED_ITEM
-};
-
-/**
- * gnome_canvas_get_type:
- *
- * Registers the &GnomeCanvas class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the &GnomeCanvas class.
- **/
-GType
-gnome_canvas_get_type (void)
-{
- static GType canvas_type;
-
- if (!canvas_type) {
- const GTypeInfo object_info = {
- sizeof (GnomeCanvasClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gnome_canvas_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (GnomeCanvas),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gnome_canvas_init,
- NULL /* value_table */
- };
-
- canvas_type = g_type_register_static (GTK_TYPE_LAYOUT, "GnomeCanvas",
- &object_info, 0);
- }
-
- return canvas_type;
-}
-
-static void
-gnome_canvas_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- switch (prop_id) {
- case PROP_AA:
- g_value_set_boolean (value, GNOME_CANVAS (object)->aa);
- break;
- case PROP_FOCUSED_ITEM:
- g_value_set_object (value, GNOME_CANVAS (object)->focused_item);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gnome_canvas_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- switch (prop_id) {
- case PROP_AA:
- GNOME_CANVAS (object)->aa = g_value_get_boolean (value);
- break;
- case PROP_FOCUSED_ITEM:
- GNOME_CANVAS (object)->focused_item = g_value_get_object (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-/* Class initialization function for GnomeCanvasClass */
-static void
-gnome_canvas_class_init (GnomeCanvasClass *klass)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- gobject_class = (GObjectClass *)klass;
- object_class = (GtkObjectClass *) klass;
- widget_class = (GtkWidgetClass *) klass;
-
- canvas_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->set_property = gnome_canvas_set_property;
- gobject_class->get_property = gnome_canvas_get_property;
-
- object_class->destroy = gnome_canvas_destroy;
-
- widget_class->map = gnome_canvas_map;
- widget_class->unmap = gnome_canvas_unmap;
- widget_class->realize = gnome_canvas_realize;
- widget_class->unrealize = gnome_canvas_unrealize;
- widget_class->size_allocate = gnome_canvas_size_allocate;
- widget_class->button_press_event = gnome_canvas_button;
- widget_class->button_release_event = gnome_canvas_button;
- widget_class->motion_notify_event = gnome_canvas_motion;
- widget_class->expose_event = gnome_canvas_expose;
- widget_class->key_press_event = gnome_canvas_key;
- widget_class->key_release_event = gnome_canvas_key;
- widget_class->enter_notify_event = gnome_canvas_crossing;
- widget_class->leave_notify_event = gnome_canvas_crossing;
- widget_class->focus_in_event = gnome_canvas_focus_in;
- widget_class->focus_out_event = gnome_canvas_focus_out;
- widget_class->scroll_event = gnome_canvas_scroll;
-
- klass->draw_background = gnome_canvas_draw_background;
- klass->render_background = NULL;
- klass->request_update = gnome_canvas_request_update_real;
-
- g_object_class_install_property (G_OBJECT_CLASS (object_class),
- PROP_AA,
- g_param_spec_boolean ("aa",
- _("Antialiased"),
- _("The antialiasing mode of the canvas."),
- FALSE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-
- g_object_class_install_property (gobject_class, PROP_FOCUSED_ITEM,
- g_param_spec_object ("focused_item", NULL, NULL,
- GNOME_TYPE_CANVAS_ITEM,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- canvas_signals[DRAW_BACKGROUND] =
- g_signal_new ("draw_background",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GnomeCanvasClass, draw_background),
- NULL, NULL,
- gnome_canvas_marshal_VOID__OBJECT_INT_INT_INT_INT,
- G_TYPE_NONE, 5, GDK_TYPE_DRAWABLE,
- G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
- canvas_signals[RENDER_BACKGROUND] =
- g_signal_new ("render_background",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GnomeCanvasClass, render_background),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
-
-}
-
-/* Callback used when the root item of a canvas is destroyed. The user should
- * never ever do this, so we panic if this happens.
- */
-static void
-panic_root_destroyed (GtkObject *object, gpointer data)
-{
- g_error ("Eeeek, root item %p of canvas %p was destroyed!", (void*) object, data);
-}
-
-/* Object initialization function for GnomeCanvas */
-static void
-gnome_canvas_init (GnomeCanvas *canvas)
-{
- GTK_WIDGET_SET_FLAGS (canvas, GTK_CAN_FOCUS);
-
- canvas->need_update = FALSE;
- canvas->need_redraw = FALSE;
- canvas->redraw_area = NULL;
- canvas->idle_id = 0;
-
- canvas->scroll_x1 = 0.0;
- canvas->scroll_y1 = 0.0;
- canvas->scroll_x2 = canvas->layout.width;
- canvas->scroll_y2 = canvas->layout.height;
-
- canvas->pixels_per_unit = 1.0;
-
- canvas->pick_event.type = GDK_LEAVE_NOTIFY;
- canvas->pick_event.crossing.x = 0;
- canvas->pick_event.crossing.y = 0;
-
- canvas->dither = GDK_RGB_DITHER_MAX;
-
- /* This may not be what people want, but it is set to be turned on by
- * default to have the same initial behavior as the canvas in GNOME 1.4.
- */
- canvas->center_scroll_region = TRUE;
-
- gtk_layout_set_hadjustment (GTK_LAYOUT (canvas), NULL);
- gtk_layout_set_vadjustment (GTK_LAYOUT (canvas), NULL);
-
- /* Disable the gtk+ double buffering since the canvas uses it's own. */
- gtk_widget_set_double_buffered (GTK_WIDGET (canvas), FALSE);
-
- /* Create the root item as a special case */
-
- canvas->root = GNOME_CANVAS_ITEM (g_object_new (gnome_canvas_group_get_type (), NULL));
- canvas->root->canvas = canvas;
-
- g_object_ref_sink (canvas->root);
-
- canvas->root_destroy_id = g_signal_connect (canvas->root, "destroy",
- G_CALLBACK (panic_root_destroyed),
- canvas);
-
- canvas->need_repick = TRUE;
-}
-
-/* Convenience function to remove the idle handler of a canvas */
-static void
-remove_idle (GnomeCanvas *canvas)
-{
- if (canvas->idle_id == 0)
- return;
-
- g_source_remove (canvas->idle_id);
- canvas->idle_id = 0;
-}
-
-/* Removes the transient state of the canvas (idle handler, grabs). */
-static void
-shutdown_transients (GnomeCanvas *canvas)
-{
- /* We turn off the need_redraw flag, since if the canvas is mapped again
- * it will request a redraw anyways. We do not turn off the need_update
- * flag, though, because updates are not queued when the canvas remaps
- * itself.
- */
- if (canvas->need_redraw) {
- canvas->need_redraw = FALSE;
- art_uta_free (canvas->redraw_area);
- canvas->redraw_area = NULL;
- canvas->redraw_x1 = 0;
- canvas->redraw_y1 = 0;
- canvas->redraw_x2 = 0;
- canvas->redraw_y2 = 0;
- }
-
- if (canvas->grabbed_item) {
- canvas->grabbed_item = NULL;
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- }
-
- remove_idle (canvas);
-}
-
-/* Destroy handler for GnomeCanvas */
-static void
-gnome_canvas_destroy (GtkObject *object)
-{
- GnomeCanvas *canvas;
-
- g_return_if_fail (GNOME_IS_CANVAS (object));
-
- /* remember, destroy can be run multiple times! */
-
- canvas = GNOME_CANVAS (object);
-
- if (canvas->root_destroy_id) {
- g_signal_handler_disconnect (canvas->root, canvas->root_destroy_id);
- canvas->root_destroy_id = 0;
- }
- if (canvas->root) {
- gtk_object_destroy (GTK_OBJECT (canvas->root));
- g_object_unref (G_OBJECT (canvas->root));
- canvas->root = NULL;
- }
-
- shutdown_transients (canvas);
-
- if (GTK_OBJECT_CLASS (canvas_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (canvas_parent_class)->destroy) (object);
-}
-
-/**
- * gnome_canvas_new:
- *
- * Creates a new empty canvas in non-antialiased mode.
- *
- * Return value: A newly-created canvas.
- **/
-GtkWidget *
-gnome_canvas_new (void)
-{
- return GTK_WIDGET (g_object_new (gnome_canvas_get_type (), NULL));
-}
-
-/**
- * gnome_canvas_new_aa:
- *
- * Creates a new empty canvas in antialiased mode.
- *
- * Return value: A newly-created antialiased canvas.
- **/
-GtkWidget *
-gnome_canvas_new_aa (void)
-{
- return GTK_WIDGET (g_object_new (GNOME_TYPE_CANVAS,
- "aa", TRUE,
- NULL));
-}
-
-/* Map handler for the canvas */
-static void
-gnome_canvas_map (GtkWidget *widget)
-{
- GnomeCanvas *canvas;
-
- g_return_if_fail (GNOME_IS_CANVAS (widget));
-
- /* Normal widget mapping stuff */
-
- if (GTK_WIDGET_CLASS (canvas_parent_class)->map)
- (* GTK_WIDGET_CLASS (canvas_parent_class)->map) (widget);
-
- canvas = GNOME_CANVAS (widget);
-
- if (canvas->need_update)
- add_idle (canvas);
-
- /* Map items */
-
- if (GNOME_CANVAS_ITEM_GET_CLASS (canvas->root)->map)
- (* GNOME_CANVAS_ITEM_GET_CLASS (canvas->root)->map) (canvas->root);
-}
-
-/* Unmap handler for the canvas */
-static void
-gnome_canvas_unmap (GtkWidget *widget)
-{
- GnomeCanvas *canvas;
-
- g_return_if_fail (GNOME_IS_CANVAS (widget));
-
- canvas = GNOME_CANVAS (widget);
-
- shutdown_transients (canvas);
-
- /* Unmap items */
-
- if (GNOME_CANVAS_ITEM_GET_CLASS (canvas->root)->unmap)
- (* GNOME_CANVAS_ITEM_GET_CLASS (canvas->root)->unmap) (canvas->root);
-
- /* Normal widget unmapping stuff */
-
- if (GTK_WIDGET_CLASS (canvas_parent_class)->unmap)
- (* GTK_WIDGET_CLASS (canvas_parent_class)->unmap) (widget);
-}
-
-/* Realize handler for the canvas */
-static void
-gnome_canvas_realize (GtkWidget *widget)
-{
- GnomeCanvas *canvas;
-
- g_return_if_fail (GNOME_IS_CANVAS (widget));
-
- /* Normal widget realization stuff */
-
- if (GTK_WIDGET_CLASS (canvas_parent_class)->realize)
- (* GTK_WIDGET_CLASS (canvas_parent_class)->realize) (widget);
-
- canvas = GNOME_CANVAS (widget);
-
- gdk_window_set_events (canvas->layout.bin_window,
- (gdk_window_get_events (canvas->layout.bin_window)
- | GDK_EXPOSURE_MASK
- | GDK_BUTTON_PRESS_MASK
- | GDK_BUTTON_RELEASE_MASK
- | GDK_POINTER_MOTION_MASK
- | GDK_KEY_PRESS_MASK
- | GDK_KEY_RELEASE_MASK
- | GDK_ENTER_NOTIFY_MASK
- | GDK_LEAVE_NOTIFY_MASK
- | GDK_FOCUS_CHANGE_MASK));
-
- /* Create our own temporary pixmap gc and realize all the items */
-
- canvas->pixmap_gc = gdk_gc_new (canvas->layout.bin_window);
-
- (* GNOME_CANVAS_ITEM_GET_CLASS (canvas->root)->realize) (canvas->root);
-}
-
-/* Unrealize handler for the canvas */
-static void
-gnome_canvas_unrealize (GtkWidget *widget)
-{
- GnomeCanvas *canvas;
-
- g_return_if_fail (GNOME_IS_CANVAS (widget));
-
- canvas = GNOME_CANVAS (widget);
-
- shutdown_transients (canvas);
-
- /* Unrealize items and parent widget */
-
- (* GNOME_CANVAS_ITEM_GET_CLASS (canvas->root)->unrealize) (canvas->root);
-
- g_object_unref (canvas->pixmap_gc);
- canvas->pixmap_gc = NULL;
-
- if (GTK_WIDGET_CLASS (canvas_parent_class)->unrealize)
- (* GTK_WIDGET_CLASS (canvas_parent_class)->unrealize) (widget);
-}
-
-/* Handles scrolling of the canvas. Adjusts the scrolling and zooming offset to
- * keep as much as possible of the canvas scrolling region in view.
- */
-static void
-scroll_to (GnomeCanvas *canvas, int cx, int cy)
-{
- int scroll_width, scroll_height;
- int right_limit, bottom_limit;
- int old_zoom_xofs, old_zoom_yofs;
- int changed_x = FALSE, changed_y = FALSE;
- int canvas_width, canvas_height;
-
- canvas_width = GTK_WIDGET (canvas)->allocation.width;
- canvas_height = GTK_WIDGET (canvas)->allocation.height;
-
- scroll_width = floor ((canvas->scroll_x2 - canvas->scroll_x1) * canvas->pixels_per_unit
- + 0.5);
- scroll_height = floor ((canvas->scroll_y2 - canvas->scroll_y1) * canvas->pixels_per_unit
- + 0.5);
-
- right_limit = scroll_width - canvas_width;
- bottom_limit = scroll_height - canvas_height;
-
- old_zoom_xofs = canvas->zoom_xofs;
- old_zoom_yofs = canvas->zoom_yofs;
-
- if (right_limit < 0) {
- cx = 0;
-
- if (canvas->center_scroll_region) {
- canvas->zoom_xofs = (canvas_width - scroll_width) / 2;
- scroll_width = canvas_width;
- } else
- canvas->zoom_xofs = 0;
- } else if (cx < 0) {
- cx = 0;
- canvas->zoom_xofs = 0;
- } else if (cx > right_limit) {
- cx = right_limit;
- canvas->zoom_xofs = 0;
- } else
- canvas->zoom_xofs = 0;
-
- if (bottom_limit < 0) {
- cy = 0;
-
- if (canvas->center_scroll_region) {
- canvas->zoom_yofs = (canvas_height - scroll_height) / 2;
- scroll_height = canvas_height;
- } else
- canvas->zoom_yofs = 0;
- } else if (cy < 0) {
- cy = 0;
- canvas->zoom_yofs = 0;
- } else if (cy > bottom_limit) {
- cy = bottom_limit;
- canvas->zoom_yofs = 0;
- } else
- canvas->zoom_yofs = 0;
-
- if ((canvas->zoom_xofs != old_zoom_xofs) || (canvas->zoom_yofs != old_zoom_yofs)) {
- /* This can only occur, if either canvas size or widget size changes */
- /* So I think we can request full redraw here */
- /* The reason is, that coverage UTA will be invalidated by offset change */
- /* fixme: Strictly this is not correct - we have to remove our own idle (Lauris) */
- /* More stuff - we have to mark root as needing fresh affine (Lauris) */
- if (!(canvas->root->object.flags & GNOME_CANVAS_ITEM_NEED_AFFINE)) {
- canvas->root->object.flags |= GNOME_CANVAS_ITEM_NEED_AFFINE;
- gnome_canvas_request_update (canvas);
- }
- gtk_widget_queue_draw (GTK_WIDGET (canvas));
- }
-
- if (canvas->layout.hadjustment && ((int) canvas->layout.hadjustment->value) != cx) {
- canvas->layout.hadjustment->value = cx;
- changed_x = TRUE;
- }
-
- if (canvas->layout.vadjustment && ((int) canvas->layout.vadjustment->value) != cy) {
- canvas->layout.vadjustment->value = cy;
- changed_y = TRUE;
- }
-
- if ((scroll_width != (int) canvas->layout.width)
- || (scroll_height != (int) canvas->layout.height))
- gtk_layout_set_size (GTK_LAYOUT (canvas), scroll_width, scroll_height);
-
- /* Signal GtkLayout that it should do a redraw. */
-
- if (changed_x)
- g_signal_emit_by_name (canvas->layout.hadjustment, "value_changed");
-
- if (changed_y)
- g_signal_emit_by_name (canvas->layout.vadjustment, "value_changed");
-}
-
-/* Size allocation handler for the canvas */
-static void
-gnome_canvas_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
-{
- GnomeCanvas *canvas;
-
- g_return_if_fail (GNOME_IS_CANVAS (widget));
- g_return_if_fail (allocation != NULL);
-
- if (GTK_WIDGET_CLASS (canvas_parent_class)->size_allocate)
- (* GTK_WIDGET_CLASS (canvas_parent_class)->size_allocate) (widget, allocation);
-
- canvas = GNOME_CANVAS (widget);
-
- /* Recenter the view, if appropriate */
-
- canvas->layout.hadjustment->page_size = allocation->width;
- canvas->layout.hadjustment->page_increment = allocation->width / 2;
-
- canvas->layout.vadjustment->page_size = allocation->height;
- canvas->layout.vadjustment->page_increment = allocation->height / 2;
-
- scroll_to (canvas,
- canvas->layout.hadjustment->value,
- canvas->layout.vadjustment->value);
-
- g_signal_emit_by_name (canvas->layout.hadjustment, "changed");
- g_signal_emit_by_name (canvas->layout.vadjustment, "changed");
-}
-
-/* Emits an event for an item in the canvas, be it the current item, grabbed
- * item, or focused item, as appropriate.
- */
-
-static int
-emit_event (GnomeCanvas *canvas, GdkEvent *event)
-{
- GdkEvent *ev;
- gint finished;
- GnomeCanvasItem *item;
- GnomeCanvasItem *parent;
- guint mask;
-
- /* Perform checks for grabbed items */
-
- if (canvas->grabbed_item &&
- !is_descendant (canvas->current_item, canvas->grabbed_item)) {
- /* I think this warning is annoying and I don't know what it's for
- * so I'll disable it for now.
- */
-/* g_warning ("emit_event() returning FALSE!\n");*/
- return FALSE;
- }
-
- if (canvas->grabbed_item) {
- switch (event->type) {
- case GDK_ENTER_NOTIFY:
- mask = GDK_ENTER_NOTIFY_MASK;
- break;
-
- case GDK_LEAVE_NOTIFY:
- mask = GDK_LEAVE_NOTIFY_MASK;
- break;
-
- case GDK_MOTION_NOTIFY:
- mask = GDK_POINTER_MOTION_MASK;
- break;
-
- case GDK_BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- mask = GDK_BUTTON_PRESS_MASK;
- break;
-
- case GDK_BUTTON_RELEASE:
- mask = GDK_BUTTON_RELEASE_MASK;
- break;
-
- case GDK_KEY_PRESS:
- mask = GDK_KEY_PRESS_MASK;
- break;
-
- case GDK_KEY_RELEASE:
- mask = GDK_KEY_RELEASE_MASK;
- break;
-
- case GDK_SCROLL:
- mask = GDK_SCROLL_MASK;
- break;
-
- default:
- mask = 0;
- break;
- }
-
- if (!(mask & canvas->grabbed_event_mask))
- return FALSE;
- }
-
- /* Convert to world coordinates -- we have two cases because of diferent
- * offsets of the fields in the event structures.
- */
-
- ev = gdk_event_copy (event);
-
- switch (ev->type)
- {
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- gnome_canvas_window_to_world (canvas,
- ev->crossing.x, ev->crossing.y,
- &ev->crossing.x, &ev->crossing.y);
- break;
-
- case GDK_MOTION_NOTIFY:
- case GDK_BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- gnome_canvas_window_to_world (canvas,
- ev->motion.x, ev->motion.y,
- &ev->motion.x, &ev->motion.y);
- break;
-
- default:
- break;
- }
-
- /* Choose where we send the event */
-
- item = canvas->current_item;
-
- if (canvas->focused_item
- && ((event->type == GDK_KEY_PRESS) ||
- (event->type == GDK_KEY_RELEASE) ||
- (event->type == GDK_FOCUS_CHANGE)))
- item = canvas->focused_item;
-
- /* The event is propagated up the hierarchy (for if someone connected to
- * a group instead of a leaf event), and emission is stopped if a
- * handler returns TRUE, just like for GtkWidget events.
- */
-
- finished = FALSE;
-
- while (item && !finished) {
- g_object_ref (G_OBJECT (item));
-
- g_signal_emit (item, item_signals[ITEM_EVENT], 0,
- ev, &finished);
-
- parent = item->parent;
- g_object_unref (G_OBJECT (item));
-
- item = parent;
- }
-
- gdk_event_free (ev);
-
- return finished;
-}
-
-/* Re-picks the current item in the canvas, based on the event's coordinates.
- * Also emits enter/leave events for items as appropriate.
- */
-static int
-pick_current_item (GnomeCanvas *canvas, GdkEvent *event)
-{
- int button_down;
- double x, y;
- int cx, cy;
- int retval;
-
- retval = FALSE;
-
- /* If a button is down, we'll perform enter and leave events on the
- * current item, but not enter on any other item. This is more or less
- * like X pointer grabbing for canvas items.
- */
- button_down = canvas->state & (GDK_BUTTON1_MASK
- | GDK_BUTTON2_MASK
- | GDK_BUTTON3_MASK
- | GDK_BUTTON4_MASK
- | GDK_BUTTON5_MASK);
- if (!button_down)
- canvas->left_grabbed_item = FALSE;
-
- /* Save the event in the canvas. This is used to synthesize enter and
- * leave events in case the current item changes. It is also used to
- * re-pick the current item if the current one gets deleted. Also,
- * synthesize an enter event.
- */
- if (event != &canvas->pick_event) {
- if ((event->type == GDK_MOTION_NOTIFY) || (event->type == GDK_BUTTON_RELEASE)) {
- /* these fields have the same offsets in both types of events */
-
- canvas->pick_event.crossing.type = GDK_ENTER_NOTIFY;
- canvas->pick_event.crossing.window = event->motion.window;
- canvas->pick_event.crossing.send_event = event->motion.send_event;
- canvas->pick_event.crossing.subwindow = NULL;
- canvas->pick_event.crossing.x = event->motion.x;
- canvas->pick_event.crossing.y = event->motion.y;
- canvas->pick_event.crossing.mode = GDK_CROSSING_NORMAL;
- canvas->pick_event.crossing.detail = GDK_NOTIFY_NONLINEAR;
- canvas->pick_event.crossing.focus = FALSE;
- canvas->pick_event.crossing.state = event->motion.state;
-
- /* these fields don't have the same offsets in both types of events */
-
- if (event->type == GDK_MOTION_NOTIFY) {
- canvas->pick_event.crossing.x_root = event->motion.x_root;
- canvas->pick_event.crossing.y_root = event->motion.y_root;
- } else {
- canvas->pick_event.crossing.x_root = event->button.x_root;
- canvas->pick_event.crossing.y_root = event->button.y_root;
- }
- } else
- canvas->pick_event = *event;
- }
-
- /* Don't do anything else if this is a recursive call */
-
- if (canvas->in_repick)
- return retval;
-
- /* LeaveNotify means that there is no current item, so we don't look for one */
-
- if (canvas->pick_event.type != GDK_LEAVE_NOTIFY) {
- /* these fields don't have the same offsets in both types of events */
-
- if (canvas->pick_event.type == GDK_ENTER_NOTIFY) {
- x = canvas->pick_event.crossing.x - canvas->zoom_xofs;
- y = canvas->pick_event.crossing.y - canvas->zoom_yofs;
- } else {
- x = canvas->pick_event.motion.x - canvas->zoom_xofs;
- y = canvas->pick_event.motion.y - canvas->zoom_yofs;
- }
-
- /* canvas pixel coords */
-
- cx = (int) (x + 0.5);
- cy = (int) (y + 0.5);
-
- /* world coords */
-
- x = canvas->scroll_x1 + x / canvas->pixels_per_unit;
- y = canvas->scroll_y1 + y / canvas->pixels_per_unit;
-
- /* find the closest item */
-
- if (canvas->root->object.flags & GNOME_CANVAS_ITEM_VISIBLE)
- gnome_canvas_item_invoke_point (canvas->root, x, y, cx, cy,
- &canvas->new_current_item);
- else
- canvas->new_current_item = NULL;
- } else
- canvas->new_current_item = NULL;
-
- if ((canvas->new_current_item == canvas->current_item) && !canvas->left_grabbed_item)
- return retval; /* current item did not change */
-
- /* Synthesize events for old and new current items */
-
- if ((canvas->new_current_item != canvas->current_item)
- && (canvas->current_item != NULL)
- && !canvas->left_grabbed_item) {
- GdkEvent new_event;
-
- new_event = canvas->pick_event;
- new_event.type = GDK_LEAVE_NOTIFY;
-
- new_event.crossing.detail = GDK_NOTIFY_ANCESTOR;
- new_event.crossing.subwindow = NULL;
- canvas->in_repick = TRUE;
- retval = emit_event (canvas, &new_event);
- canvas->in_repick = FALSE;
- }
-
- /* new_current_item may have been set to NULL during the call to emit_event() above */
-
- if ((canvas->new_current_item != canvas->current_item) && button_down) {
- canvas->left_grabbed_item = TRUE;
- return retval;
- }
-
- /* Handle the rest of cases */
-
- canvas->left_grabbed_item = FALSE;
- canvas->current_item = canvas->new_current_item;
-
- if (canvas->current_item != NULL) {
- GdkEvent new_event;
-
- new_event = canvas->pick_event;
- new_event.type = GDK_ENTER_NOTIFY;
- new_event.crossing.detail = GDK_NOTIFY_ANCESTOR;
- new_event.crossing.subwindow = NULL;
- retval = emit_event (canvas, &new_event);
- }
-
- return retval;
-}
-
-/* Button event handler for the canvas */
-static gint
-gnome_canvas_button (GtkWidget *widget, GdkEventButton *event)
-{
- GnomeCanvas *canvas;
- int mask;
- int retval;
-
- g_return_val_if_fail (GNOME_IS_CANVAS (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- retval = FALSE;
-
- canvas = GNOME_CANVAS (widget);
-
- /*
- * dispatch normally regardless of the event's window if an item has
- * has a pointer grab in effect
- */
- if (!canvas->grabbed_item && event->window != canvas->layout.bin_window)
- return retval;
-
- switch (event->button) {
- case 1:
- mask = GDK_BUTTON1_MASK;
- break;
- case 2:
- mask = GDK_BUTTON2_MASK;
- break;
- case 3:
- mask = GDK_BUTTON3_MASK;
- break;
- case 4:
- mask = GDK_BUTTON4_MASK;
- break;
- case 5:
- mask = GDK_BUTTON5_MASK;
- break;
- default:
- mask = 0;
- }
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- case GDK_3BUTTON_PRESS:
- /* Pick the current item as if the button were not pressed, and
- * then process the event.
- */
- canvas->state = event->state;
- pick_current_item (canvas, (GdkEvent *) event);
- canvas->state ^= mask;
- retval = emit_event (canvas, (GdkEvent *) event);
- break;
-
- case GDK_BUTTON_RELEASE:
- /* Process the event as if the button were pressed, then repick
- * after the button has been released
- */
- canvas->state = event->state;
- retval = emit_event (canvas, (GdkEvent *) event);
- event->state ^= mask;
- canvas->state = event->state;
- pick_current_item (canvas, (GdkEvent *) event);
- event->state ^= mask;
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- return retval;
-}
-
-/* Motion event handler for the canvas */
-static gint
-gnome_canvas_motion (GtkWidget *widget, GdkEventMotion *event)
-{
- GnomeCanvas *canvas;
-
- g_return_val_if_fail (GNOME_IS_CANVAS (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- canvas = GNOME_CANVAS (widget);
-
- if (event->window != canvas->layout.bin_window)
- return FALSE;
-
- canvas->state = event->state;
- pick_current_item (canvas, (GdkEvent *) event);
- return emit_event (canvas, (GdkEvent *) event);
-}
-
-static gboolean
-gnome_canvas_scroll (GtkWidget *widget, GdkEventScroll *event)
-{
- GnomeCanvas *canvas;
-
- g_return_val_if_fail (GNOME_IS_CANVAS (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- canvas = GNOME_CANVAS (widget);
-
- if (event->window != canvas->layout.bin_window)
- return FALSE;
-
- canvas->state = event->state;
- pick_current_item (canvas, (GdkEvent *) event);
- return emit_event (canvas, (GdkEvent *) event);
-}
-
-/* Key event handler for the canvas */
-static gboolean
-gnome_canvas_key (GtkWidget *widget, GdkEventKey *event)
-{
- GnomeCanvas *canvas;
-
- g_return_val_if_fail (GNOME_IS_CANVAS (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- canvas = GNOME_CANVAS (widget);
-
- if (!emit_event (canvas, (GdkEvent *) event)) {
- GtkWidgetClass *widget_class;
-
- widget_class = GTK_WIDGET_CLASS (canvas_parent_class);
-
- if (event->type == GDK_KEY_PRESS) {
- if (widget_class->key_press_event)
- return (* widget_class->key_press_event) (widget, event);
- } else if (event->type == GDK_KEY_RELEASE) {
- if (widget_class->key_release_event)
- return (* widget_class->key_release_event) (widget, event);
- } else
- g_assert_not_reached ();
-
- return FALSE;
- } else
- return TRUE;
-}
-
-
-/* Crossing event handler for the canvas */
-static gint
-gnome_canvas_crossing (GtkWidget *widget, GdkEventCrossing *event)
-{
- GnomeCanvas *canvas;
-
- g_return_val_if_fail (GNOME_IS_CANVAS (widget), FALSE);
- g_return_val_if_fail (event != NULL, FALSE);
-
- canvas = GNOME_CANVAS (widget);
-
- if (event->window != canvas->layout.bin_window)
- return FALSE;
-
- canvas->state = event->state;
- return pick_current_item (canvas, (GdkEvent *) event);
-}
-
-/* Focus in handler for the canvas */
-static gint
-gnome_canvas_focus_in (GtkWidget *widget, GdkEventFocus *event)
-{
- GnomeCanvas *canvas;
-
- GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
-
- canvas = GNOME_CANVAS (widget);
-
- if (canvas->focused_item)
- return emit_event (canvas, (GdkEvent *) event);
- else
- return FALSE;
-}
-
-/* Focus out handler for the canvas */
-static gint
-gnome_canvas_focus_out (GtkWidget *widget, GdkEventFocus *event)
-{
- GnomeCanvas *canvas;
-
- GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
-
- canvas = GNOME_CANVAS (widget);
-
- if (canvas->focused_item)
- return emit_event (canvas, (GdkEvent *) event);
- else
- return FALSE;
-}
-
-#define REDRAW_QUANTUM_SIZE 512
-
-static void
-gnome_canvas_paint_rect (GnomeCanvas *canvas, gint x0, gint y0, gint x1, gint y1)
-{
- GtkWidget *widget;
- gint draw_x1, draw_y1;
- gint draw_x2, draw_y2;
- gint draw_width, draw_height;
-
- g_return_if_fail (!canvas->need_update);
-
- widget = GTK_WIDGET (canvas);
-
- draw_x1 = MAX (x0, canvas->layout.hadjustment->value - canvas->zoom_xofs);
- draw_y1 = MAX (y0, canvas->layout.vadjustment->value - canvas->zoom_yofs);
- draw_x2 = MIN (draw_x1 + GTK_WIDGET (canvas)->allocation.width, x1);
- draw_y2 = MIN (draw_y1 + GTK_WIDGET (canvas)->allocation.height, y1);
-
- draw_width = draw_x2 - draw_x1;
- draw_height = draw_y2 - draw_y1;
-
- if (draw_width < 1 || draw_height < 1)
- return;
-
- canvas->redraw_x1 = draw_x1;
- canvas->redraw_y1 = draw_y1;
- canvas->redraw_x2 = draw_x2;
- canvas->redraw_y2 = draw_y2;
- canvas->draw_xofs = draw_x1;
- canvas->draw_yofs = draw_y1;
-
- if (canvas->aa) {
- GnomeCanvasBuf buf;
- guchar *px;
- GdkColor *color;
-
- px = g_new (guchar, draw_width * 3 * draw_height);
-
- buf.buf = px;
- buf.buf_rowstride = draw_width * 3;
- buf.rect.x0 = draw_x1;
- buf.rect.y0 = draw_y1;
- buf.rect.x1 = draw_x2;
- buf.rect.y1 = draw_y2;
- color = &widget->style->bg[GTK_STATE_NORMAL];
- buf.bg_color = (((color->red & 0xff00) << 8) | (color->green & 0xff00) | (color->blue >> 8));
- buf.is_bg = 1;
- buf.is_buf = 0;
-
- g_signal_emit (G_OBJECT (canvas), canvas_signals[RENDER_BACKGROUND], 0, &buf);
-
- if (canvas->root->object.flags & GNOME_CANVAS_ITEM_VISIBLE)
- (* GNOME_CANVAS_ITEM_GET_CLASS (canvas->root)->render) (canvas->root, &buf);
-
- if (buf.is_bg) {
- gdk_gc_set_rgb_fg_color (canvas->pixmap_gc, color);
- gdk_draw_rectangle (canvas->layout.bin_window,
- canvas->pixmap_gc,
- TRUE,
- (draw_x1 + canvas->zoom_xofs),
- (draw_y1 + canvas->zoom_yofs),
- draw_width, draw_height);
- } else {
- gdk_draw_rgb_image_dithalign (canvas->layout.bin_window,
- canvas->pixmap_gc,
- (draw_x1 + canvas->zoom_xofs),
- (draw_y1 + canvas->zoom_yofs),
- draw_width, draw_height,
- canvas->dither,
- buf.buf,
- buf.buf_rowstride,
- draw_x1, draw_y1);
- }
-
- g_free (px);
- } else {
- GdkPixmap *pixmap;
-
- pixmap = gdk_pixmap_new (canvas->layout.bin_window,
- draw_width, draw_height,
- gtk_widget_get_visual (widget)->depth);
-
- g_signal_emit (G_OBJECT (canvas), canvas_signals[DRAW_BACKGROUND], 0, pixmap,
- draw_x1, draw_y1, draw_width, draw_height);
-
- if (canvas->root->object.flags & GNOME_CANVAS_ITEM_VISIBLE)
- (* GNOME_CANVAS_ITEM_GET_CLASS (canvas->root)->draw) (
- canvas->root, pixmap,
- draw_x1, draw_y1,
- draw_width, draw_height);
-
- /* Copy the pixmap to the window and clean up */
-
- gdk_draw_drawable (canvas->layout.bin_window,
- canvas->pixmap_gc,
- pixmap,
- 0, 0,
- draw_x1 + canvas->zoom_xofs,
- draw_y1 + canvas->zoom_yofs,
- draw_width, draw_height);
-
- g_object_unref (pixmap);
- }
-}
-
-/* Expose handler for the canvas */
-static gint
-gnome_canvas_expose (GtkWidget *widget, GdkEventExpose *event)
-{
- GnomeCanvas *canvas;
- GdkRectangle *rects;
- gint n_rects;
- int i;
-
- canvas = GNOME_CANVAS (widget);
-
- if (!GTK_WIDGET_DRAWABLE (widget) || (event->window != canvas->layout.bin_window))
- return FALSE;
-
-#ifdef VERBOSE
- g_print ("Expose\n");
-#endif
-
- gdk_region_get_rectangles (event->region, &rects, &n_rects);
-
- for (i = 0; i < n_rects; i++) {
- ArtIRect rect;
-
- rect.x0 = rects[i].x - canvas->zoom_xofs;
- rect.y0 = rects[i].y - canvas->zoom_yofs;
- rect.x1 = rects[i].x + rects[i].width - canvas->zoom_xofs;
- rect.y1 = rects[i].y + rects[i].height - canvas->zoom_yofs;
-
- if (canvas->need_update || canvas->need_redraw) {
- ArtUta *uta;
-
- /* Update or drawing is scheduled, so just mark exposed area as dirty */
- uta = art_uta_from_irect (&rect);
- gnome_canvas_request_redraw_uta (canvas, uta);
- } else {
- /* No pending updates, draw exposed area immediately */
- gnome_canvas_paint_rect (canvas, rect.x0, rect.y0, rect.x1, rect.y1);
-
- /* And call expose on parent container class */
- if (GTK_WIDGET_CLASS (canvas_parent_class)->expose_event)
- (* GTK_WIDGET_CLASS (canvas_parent_class)->expose_event) (
- widget, event);
- }
- }
-
- g_free (rects);
-
- return FALSE;
-}
-
-/* Repaints the areas in the canvas that need it */
-static void
-paint (GnomeCanvas *canvas)
-{
- ArtIRect *rects;
- gint n_rects, i;
- ArtIRect visible_rect;
- GdkRegion *region;
-
- /* Extract big rectangles from the microtile array */
-
- rects = art_rect_list_from_uta (canvas->redraw_area,
- REDRAW_QUANTUM_SIZE, REDRAW_QUANTUM_SIZE,
- &n_rects);
-
- art_uta_free (canvas->redraw_area);
- canvas->redraw_area = NULL;
- canvas->need_redraw = FALSE;
-
- /* Turn those rectangles into a GdkRegion for exposing */
-
- visible_rect.x0 = canvas->layout.hadjustment->value - canvas->zoom_xofs;
- visible_rect.y0 = canvas->layout.vadjustment->value - canvas->zoom_yofs;
- visible_rect.x1 = visible_rect.x0 + GTK_WIDGET (canvas)->allocation.width;
- visible_rect.y1 = visible_rect.y0 + GTK_WIDGET (canvas)->allocation.height;
-
- region = gdk_region_new ();
-
- for (i = 0; i < n_rects; i++) {
- ArtIRect clipped;
-
- art_irect_intersect (&clipped, &visible_rect, rects + i);
- if (!art_irect_empty (&clipped)) {
- GdkRectangle gdkrect;
-
- gdkrect.x = clipped.x0 + canvas->zoom_xofs;
- gdkrect.y = clipped.y0 + canvas->zoom_yofs;
- gdkrect.width = clipped.x1 - clipped.x0;
- gdkrect.height = clipped.y1 - clipped.y0;
-
- region = gdk_region_rectangle (&gdkrect);
- gdk_window_invalidate_region (canvas->layout.bin_window, region, FALSE);
- gdk_region_destroy (region);
- }
- }
-
- art_free (rects);
-
- canvas->redraw_x1 = 0;
- canvas->redraw_y1 = 0;
- canvas->redraw_x2 = 0;
- canvas->redraw_y2 = 0;
-}
-
-static void
-gnome_canvas_draw_background (GnomeCanvas *canvas, GdkDrawable *drawable,
- int x, int y, int width, int height)
-{
- /* By default, we use the style background. */
- gdk_gc_set_foreground (canvas->pixmap_gc,
- >K_WIDGET (canvas)->style->bg[GTK_STATE_NORMAL]);
- gdk_draw_rectangle (drawable,
- canvas->pixmap_gc,
- TRUE,
- 0, 0,
- width, height);
-}
-
-static void
-do_update (GnomeCanvas *canvas)
-{
- /* Cause the update if necessary */
-
-update_again:
- if (canvas->need_update) {
- gdouble w2cpx[6];
-
- /* We start updating root with w2cpx affine */
- w2cpx[0] = canvas->pixels_per_unit;
- w2cpx[1] = 0.0;
- w2cpx[2] = 0.0;
- w2cpx[3] = canvas->pixels_per_unit;
- w2cpx[4] = -canvas->scroll_x1 * canvas->pixels_per_unit;
- w2cpx[5] = -canvas->scroll_y1 * canvas->pixels_per_unit;
-
- gnome_canvas_item_invoke_update (canvas->root, w2cpx, NULL, 0);
-
- canvas->need_update = FALSE;
- }
-
- /* Pick new current item */
-
- while (canvas->need_repick) {
- canvas->need_repick = FALSE;
- pick_current_item (canvas, &canvas->pick_event);
- }
-
- /* it is possible that during picking we emitted an event in which
- the user then called some function which then requested update
- of something. Without this we'd be left in a state where
- need_update would have been left TRUE and the canvas would have
- been left unpainted. */
- if (canvas->need_update) {
- goto update_again;
- }
-
- /* Paint if able to */
-
- if (GTK_WIDGET_DRAWABLE (canvas) && canvas->need_redraw)
- paint (canvas);
-}
-
-/* Idle handler for the canvas. It deals with pending updates and redraws. */
-static gboolean
-idle_handler (gpointer data)
-{
- GnomeCanvas *canvas;
-
- GDK_THREADS_ENTER ();
-
- canvas = GNOME_CANVAS (data);
-
- do_update (canvas);
-
- /* Reset idle id */
- canvas->idle_id = 0;
-
- GDK_THREADS_LEAVE ();
-
- return FALSE;
-}
-
-/* Convenience function to add an idle handler to a canvas */
-static void
-add_idle (GnomeCanvas *canvas)
-{
- g_assert (canvas->need_update || canvas->need_redraw);
-
- if (!canvas->idle_id)
- canvas->idle_id = g_idle_add_full (CANVAS_IDLE_PRIORITY,
- idle_handler,
- canvas,
- NULL);
-
-/* canvas->idle_id = gtk_idle_add (idle_handler, canvas); */
-}
-
-/**
- * gnome_canvas_root:
- * @canvas: A canvas.
- *
- * Queries the root group of a canvas.
- *
- * Return value: The root group of the specified canvas.
- **/
-GnomeCanvasGroup *
-gnome_canvas_root (GnomeCanvas *canvas)
-{
- g_return_val_if_fail (GNOME_IS_CANVAS (canvas), NULL);
-
- return GNOME_CANVAS_GROUP (canvas->root);
-}
-
-
-/**
- * gnome_canvas_set_scroll_region:
- * @canvas: A canvas.
- * @x1: Leftmost limit of the scrolling region.
- * @y1: Upper limit of the scrolling region.
- * @x2: Rightmost limit of the scrolling region.
- * @y2: Lower limit of the scrolling region.
- *
- * Sets the scrolling region of a canvas to the specified rectangle. The canvas
- * will then be able to scroll only within this region. The view of the canvas
- * is adjusted as appropriate to display as much of the new region as possible.
- **/
-void
-gnome_canvas_set_scroll_region (GnomeCanvas *canvas, double x1, double y1, double x2, double y2)
-{
- double wxofs, wyofs;
- int xofs, yofs;
-
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- /*
- * Set the new scrolling region. If possible, do not move the visible contents of the
- * canvas.
- */
-
- gnome_canvas_c2w (canvas,
- GTK_LAYOUT (canvas)->hadjustment->value + canvas->zoom_xofs,
- GTK_LAYOUT (canvas)->vadjustment->value + canvas->zoom_yofs,
- /*canvas->zoom_xofs,
- canvas->zoom_yofs,*/
- &wxofs, &wyofs);
-
- canvas->scroll_x1 = x1;
- canvas->scroll_y1 = y1;
- canvas->scroll_x2 = x2;
- canvas->scroll_y2 = y2;
-
- gnome_canvas_w2c (canvas, wxofs, wyofs, &xofs, &yofs);
-
- scroll_to (canvas, xofs, yofs);
-
- canvas->need_repick = TRUE;
-#if 0
- /* todo: should be requesting update */
- (* GNOME_CANVAS_ITEM_CLASS (canvas->root->object.klass)->update) (
- canvas->root, NULL, NULL, 0);
-#endif
-}
-
-
-/**
- * gnome_canvas_get_scroll_region:
- * @canvas: A canvas.
- * @x1: Leftmost limit of the scrolling region (return value).
- * @y1: Upper limit of the scrolling region (return value).
- * @x2: Rightmost limit of the scrolling region (return value).
- * @y2: Lower limit of the scrolling region (return value).
- *
- * Queries the scrolling region of a canvas.
- **/
-void
-gnome_canvas_get_scroll_region (GnomeCanvas *canvas, double *x1, double *y1, double *x2, double *y2)
-{
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- if (x1)
- *x1 = canvas->scroll_x1;
-
- if (y1)
- *y1 = canvas->scroll_y1;
-
- if (x2)
- *x2 = canvas->scroll_x2;
-
- if (y2)
- *y2 = canvas->scroll_y2;
-}
-
-/**
- * gnome_canvas_set_center_scroll_region:
- * @canvas: A canvas.
- * @center_scroll_region: Whether to center the scrolling region in the canvas
- * window when it is smaller than the canvas' allocation.
- *
- * When the scrolling region of the canvas is smaller than the canvas window,
- * e.g. the allocation of the canvas, it can be either centered on the window
- * or simply made to be on the upper-left corner on the window. This function
- * lets you configure this property.
- **/
-void
-gnome_canvas_set_center_scroll_region (GnomeCanvas *canvas, gboolean center_scroll_region)
-{
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- canvas->center_scroll_region = center_scroll_region != 0;
-
- scroll_to (canvas,
- canvas->layout.hadjustment->value,
- canvas->layout.vadjustment->value);
-}
-
-/**
- * gnome_canvas_get_center_scroll_region:
- * @canvas: A canvas.
- *
- * Returns whether the canvas is set to center the scrolling region in the window
- * if the former is smaller than the canvas' allocation.
- *
- * Return value: Whether the scroll region is being centered in the canvas window.
- **/
-gboolean
-gnome_canvas_get_center_scroll_region (GnomeCanvas *canvas)
-{
- g_return_val_if_fail (GNOME_IS_CANVAS (canvas), FALSE);
-
- return canvas->center_scroll_region ? TRUE : FALSE;
-}
-
-/**
- * gnome_canvas_set_pixels_per_unit:
- * @canvas: A canvas.
- * @n: The number of pixels that correspond to one canvas unit.
- *
- * Sets the zooming factor of a canvas by specifying the number of pixels that
- * correspond to one canvas unit.
- *
- * The anchor point for zooming, i.e. the point that stays fixed and all others
- * zoom inwards or outwards from it, depends on whether the canvas is set to
- * center the scrolling region or not. You can control this using the
- * gnome_canvas_set_center_scroll_region() function. If the canvas is set to
- * center the scroll region, then the center of the canvas window is used as the
- * anchor point for zooming. Otherwise, the upper-left corner of the canvas
- * window is used as the anchor point.
- **/
-void
-gnome_canvas_set_pixels_per_unit (GnomeCanvas *canvas, double n)
-{
- double ax, ay;
- int x1, y1;
- int anchor_x, anchor_y;
-
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
- g_return_if_fail (n > GNOME_CANVAS_EPSILON);
-
- if (canvas->center_scroll_region) {
- anchor_x = GTK_WIDGET (canvas)->allocation.width / 2;
- anchor_y = GTK_WIDGET (canvas)->allocation.height / 2;
- } else
- anchor_x = anchor_y = 0;
-
- /* Find the coordinates of the anchor point in units. */
- if(canvas->layout.hadjustment) {
- ax = (canvas->layout.hadjustment->value + anchor_x) / canvas->pixels_per_unit + canvas->scroll_x1 + canvas->zoom_xofs;
- } else {
- ax = (0.0 + anchor_x) / canvas->pixels_per_unit + canvas->scroll_x1 + canvas->zoom_xofs;
- }
- if(canvas->layout.hadjustment) {
- ay = (canvas->layout.vadjustment->value + anchor_y) / canvas->pixels_per_unit + canvas->scroll_y1 + canvas->zoom_yofs;
- } else {
- ay = (0.0 + anchor_y) / canvas->pixels_per_unit + canvas->scroll_y1 + canvas->zoom_yofs;
- }
-
- /* Now calculate the new offset of the upper left corner. */
- x1 = ((ax - canvas->scroll_x1) * n) - anchor_x;
- y1 = ((ay - canvas->scroll_y1) * n) - anchor_y;
-
- canvas->pixels_per_unit = n;
-
- scroll_to (canvas, x1, y1);
-
- if (!(canvas->root->object.flags & GNOME_CANVAS_ITEM_NEED_AFFINE)) {
- canvas->root->object.flags |= GNOME_CANVAS_ITEM_NEED_AFFINE;
- gnome_canvas_request_update (canvas);
- }
-
- canvas->need_repick = TRUE;
-}
-
-/**
- * gnome_canvas_scroll_to:
- * @canvas: A canvas.
- * @cx: Horizontal scrolling offset in canvas pixel units.
- * @cy: Vertical scrolling offset in canvas pixel units.
- *
- * Makes a canvas scroll to the specified offsets, given in canvas pixel units.
- * The canvas will adjust the view so that it is not outside the scrolling
- * region. This function is typically not used, as it is better to hook
- * scrollbars to the canvas layout's scrolling adjusments.
- **/
-void
-gnome_canvas_scroll_to (GnomeCanvas *canvas, int cx, int cy)
-{
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- scroll_to (canvas, cx, cy);
-}
-
-/**
- * gnome_canvas_get_scroll_offsets:
- * @canvas: A canvas.
- * @cx: Horizontal scrolling offset (return value).
- * @cy: Vertical scrolling offset (return value).
- *
- * Queries the scrolling offsets of a canvas. The values are returned in canvas
- * pixel units.
- **/
-void
-gnome_canvas_get_scroll_offsets (GnomeCanvas *canvas, int *cx, int *cy)
-{
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- if (cx)
- *cx = canvas->layout.hadjustment->value;
-
- if (cy)
- *cy = canvas->layout.vadjustment->value;
-}
-
-/**
- * gnome_canvas_update_now:
- * @canvas: A canvas.
- *
- * Forces an immediate update and redraw of a canvas. If the canvas does not
- * have any pending update or redraw requests, then no action is taken. This is
- * typically only used by applications that need explicit control of when the
- * display is updated, like games. It is not needed by normal applications.
- */
-void
-gnome_canvas_update_now (GnomeCanvas *canvas)
-{
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- if (!(canvas->need_update || canvas->need_redraw)) {
- g_assert (canvas->idle_id == 0);
- g_assert (canvas->redraw_area == NULL);
- return;
- }
-
- remove_idle (canvas);
- do_update (canvas);
-}
-
-/**
- * gnome_canvas_get_item_at:
- * @canvas: A canvas.
- * @x: X position in world coordinates.
- * @y: Y position in world coordinates.
- *
- * Looks for the item that is under the specified position, which must be
- * specified in world coordinates.
- *
- * Return value: The sought item, or NULL if no item is at the specified
- * coordinates.
- **/
-GnomeCanvasItem *
-gnome_canvas_get_item_at (GnomeCanvas *canvas, double x, double y)
-{
- GnomeCanvasItem *item;
- double dist;
- int cx, cy;
-
- g_return_val_if_fail (GNOME_IS_CANVAS (canvas), NULL);
-
- gnome_canvas_w2c (canvas, x, y, &cx, &cy);
-
- dist = gnome_canvas_item_invoke_point (canvas->root, x, y, cx, cy, &item);
- if ((int) (dist * canvas->pixels_per_unit + 0.5) <= canvas->close_enough)
- return item;
- else
- return NULL;
-}
-
-/* Queues an update of the canvas */
-static void
-gnome_canvas_request_update (GnomeCanvas *canvas)
-{
- GNOME_CANVAS_GET_CLASS (canvas)->request_update (canvas);
-}
-
-static void
-gnome_canvas_request_update_real (GnomeCanvas *canvas)
-{
- if (canvas->need_update)
- return;
-
- canvas->need_update = TRUE;
- if (GTK_WIDGET_MAPPED ((GtkWidget *) canvas))
- add_idle (canvas);
-}
-
-/* Computes the union of two microtile arrays while clipping the result to the
- * specified rectangle. Any of the specified utas can be NULL, in which case it
- * is taken to be an empty region.
- */
-static ArtUta *
-uta_union_clip (ArtUta *uta1, ArtUta *uta2, ArtIRect *clip)
-{
- ArtUta *uta;
- ArtUtaBbox *utiles;
- int clip_x1, clip_y1, clip_x2, clip_y2;
- int union_x1, union_y1, union_x2, union_y2;
- int new_x1, new_y1, new_x2, new_y2;
- int x, y;
- int ofs, ofs1, ofs2;
-
- g_assert (clip != NULL);
-
- /* Compute the tile indices for the clipping rectangle */
-
- clip_x1 = clip->x0 >> ART_UTILE_SHIFT;
- clip_y1 = clip->y0 >> ART_UTILE_SHIFT;
- clip_x2 = (clip->x1 >> ART_UTILE_SHIFT) + 1;
- clip_y2 = (clip->y1 >> ART_UTILE_SHIFT) + 1;
-
- /* Get the union of the bounds of both utas */
-
- if (!uta1) {
- if (!uta2)
- return art_uta_new (clip_x1, clip_y1, clip_x1 + 1, clip_y1 + 1);
-
- union_x1 = uta2->x0;
- union_y1 = uta2->y0;
- union_x2 = uta2->x0 + uta2->width;
- union_y2 = uta2->y0 + uta2->height;
- } else {
- if (!uta2) {
- union_x1 = uta1->x0;
- union_y1 = uta1->y0;
- union_x2 = uta1->x0 + uta1->width;
- union_y2 = uta1->y0 + uta1->height;
- } else {
- union_x1 = MIN (uta1->x0, uta2->x0);
- union_y1 = MIN (uta1->y0, uta2->y0);
- union_x2 = MAX (uta1->x0 + uta1->width, uta2->x0 + uta2->width);
- union_y2 = MAX (uta1->y0 + uta1->height, uta2->y0 + uta2->height);
- }
- }
-
- /* Clip the union of the bounds */
-
- new_x1 = MAX (clip_x1, union_x1);
- new_y1 = MAX (clip_y1, union_y1);
- new_x2 = MIN (clip_x2, union_x2);
- new_y2 = MIN (clip_y2, union_y2);
-
- if (new_x1 >= new_x2 || new_y1 >= new_y2)
- return art_uta_new (clip_x1, clip_y1, clip_x1 + 1, clip_y1 + 1);
-
- /* Make the new clipped union */
-
- uta = art_new (ArtUta, 1);
- uta->x0 = new_x1;
- uta->y0 = new_y1;
- uta->width = new_x2 - new_x1;
- uta->height = new_y2 - new_y1;
- uta->utiles = utiles = art_new (ArtUtaBbox, uta->width * uta->height);
-
- ofs = 0;
- ofs1 = ofs2 = 0;
-
- for (y = new_y1; y < new_y2; y++) {
- if (uta1)
- ofs1 = (y - uta1->y0) * uta1->width + new_x1 - uta1->x0;
-
- if (uta2)
- ofs2 = (y - uta2->y0) * uta2->width + new_x1 - uta2->x0;
-
- for (x = new_x1; x < new_x2; x++) {
- ArtUtaBbox bb1, bb2, bb;
-
- if (!uta1
- || x < uta1->x0 || y < uta1->y0
- || x >= uta1->x0 + uta1->width || y >= uta1->y0 + uta1->height)
- bb1 = 0;
- else
- bb1 = uta1->utiles[ofs1];
-
- if (!uta2
- || x < uta2->x0 || y < uta2->y0
- || x >= uta2->x0 + uta2->width || y >= uta2->y0 + uta2->height)
- bb2 = 0;
- else
- bb2 = uta2->utiles[ofs2];
-
- if (bb1 == 0)
- bb = bb2;
- else if (bb2 == 0)
- bb = bb1;
- else
- bb = ART_UTA_BBOX_CONS (MIN (ART_UTA_BBOX_X0 (bb1),
- ART_UTA_BBOX_X0 (bb2)),
- MIN (ART_UTA_BBOX_Y0 (bb1),
- ART_UTA_BBOX_Y0 (bb2)),
- MAX (ART_UTA_BBOX_X1 (bb1),
- ART_UTA_BBOX_X1 (bb2)),
- MAX (ART_UTA_BBOX_Y1 (bb1),
- ART_UTA_BBOX_Y1 (bb2)));
-
- utiles[ofs] = bb;
-
- ofs++;
- ofs1++;
- ofs2++;
- }
- }
-
- return uta;
-}
-
-static inline void
-get_visible_region (GnomeCanvas *canvas, ArtIRect *visible)
-{
- visible->x0 = canvas->layout.hadjustment->value - canvas->zoom_xofs;
- visible->y0 = canvas->layout.vadjustment->value - canvas->zoom_yofs;
- visible->x1 = visible->x0 + GTK_WIDGET (canvas)->allocation.width;
- visible->y1 = visible->y0 + GTK_WIDGET (canvas)->allocation.height;
-}
-
-/**
- * gnome_canvas_request_redraw_uta:
- * @canvas: A canvas.
- * @uta: Microtile array that specifies the area to be redrawn. It will
- * be freed by this function, so the argument you pass will be invalid
- * after you call this function.
- *
- * Informs a canvas that the specified area, given as a microtile array, needs
- * to be repainted. To be used only by item implementations.
- **/
-void
-gnome_canvas_request_redraw_uta (GnomeCanvas *canvas,
- ArtUta *uta)
-{
- ArtIRect visible;
-
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
- g_return_if_fail (uta != NULL);
-
- if (!GTK_WIDGET_DRAWABLE (canvas)) {
- art_uta_free (uta);
- return;
- }
-
- get_visible_region (canvas, &visible);
-
- if (canvas->need_redraw) {
- ArtUta *new_uta;
-
- g_assert (canvas->redraw_area != NULL);
- /* ALEX: This can fail if e.g. redraw_uta is called by an item
- update function and we're called from update_now -> do_update
- because update_now sets idle_id == 0. There is also some way
- to get it from the expose handler (see bug #102811).
- g_assert (canvas->idle_id != 0); */
-
- new_uta = uta_union_clip (canvas->redraw_area, uta, &visible);
- art_uta_free (canvas->redraw_area);
- art_uta_free (uta);
- canvas->redraw_area = new_uta;
- if (canvas->idle_id == 0)
- add_idle (canvas);
- } else {
- ArtUta *new_uta;
-
- g_assert (canvas->redraw_area == NULL);
-
- new_uta = uta_union_clip (uta, NULL, &visible);
- art_uta_free (uta);
- canvas->redraw_area = new_uta;
-
- canvas->need_redraw = TRUE;
- add_idle (canvas);
- }
-}
-
-
-/**
- * gnome_canvas_request_redraw:
- * @canvas: A canvas.
- * @x1: Leftmost coordinate of the rectangle to be redrawn.
- * @y1: Upper coordinate of the rectangle to be redrawn.
- * @x2: Rightmost coordinate of the rectangle to be redrawn, plus 1.
- * @y2: Lower coordinate of the rectangle to be redrawn, plus 1.
- *
- * Convenience function that informs a canvas that the specified rectangle needs
- * to be repainted. This function converts the rectangle to a microtile array
- * and feeds it to gnome_canvas_request_redraw_uta(). The rectangle includes
- * @x1 and @y1, but not @x2 and @y2. To be used only by item implementations.
- **/
-void
-gnome_canvas_request_redraw (GnomeCanvas *canvas, int x1, int y1, int x2, int y2)
-{
- ArtUta *uta;
- ArtIRect bbox;
- ArtIRect visible;
- ArtIRect clip;
-
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- if (!GTK_WIDGET_DRAWABLE (canvas) || (x1 >= x2) || (y1 >= y2))
- return;
-
- bbox.x0 = x1;
- bbox.y0 = y1;
- bbox.x1 = x2;
- bbox.y1 = y2;
-
- get_visible_region (canvas, &visible);
-
- art_irect_intersect (&clip, &bbox, &visible);
-
- if (!art_irect_empty (&clip)) {
- uta = art_uta_from_irect (&clip);
- gnome_canvas_request_redraw_uta (canvas, uta);
- }
-}
-
-
-/**
- * gnome_canvas_w2c_affine:
- * @canvas: A canvas.
- * @affine: An affine transformation matrix (return value).
- *
- * Gets the affine transform that converts from world coordinates to canvas
- * pixel coordinates.
- **/
-void
-gnome_canvas_w2c_affine (GnomeCanvas *canvas, double affine[6])
-{
- double zooom;
-
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
- g_return_if_fail (affine != NULL);
-
- zooom = canvas->pixels_per_unit;
-
- affine[0] = zooom;
- affine[1] = 0;
- affine[2] = 0;
- affine[3] = zooom;
- affine[4] = -canvas->scroll_x1 * zooom;
- affine[5] = -canvas->scroll_y1 * zooom;
-}
-
-/**
- * gnome_canvas_w2c:
- * @canvas: A canvas.
- * @wx: World X coordinate.
- * @wy: World Y coordinate.
- * @cx: X pixel coordinate (return value).
- * @cy: Y pixel coordinate (return value).
- *
- * Converts world coordinates into canvas pixel coordinates.
- **/
-void
-gnome_canvas_w2c (GnomeCanvas *canvas, double wx, double wy, int *cx, int *cy)
-{
- double affine[6];
- ArtPoint w, c;
-
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- gnome_canvas_w2c_affine (canvas, affine);
- w.x = wx;
- w.y = wy;
- art_affine_point (&c, &w, affine);
- if (cx)
- *cx = floor (c.x + 0.5);
- if (cy)
- *cy = floor (c.y + 0.5);
-}
-
-/**
- * gnome_canvas_w2c_d:
- * @canvas: A canvas.
- * @wx: World X coordinate.
- * @wy: World Y coordinate.
- * @cx: X pixel coordinate (return value).
- * @cy: Y pixel coordinate (return value).
- *
- * Converts world coordinates into canvas pixel coordinates. This
- * version returns coordinates in floating point coordinates, for
- * greater precision.
- **/
-void
-gnome_canvas_w2c_d (GnomeCanvas *canvas, double wx, double wy, double *cx, double *cy)
-{
- double affine[6];
- ArtPoint w, c;
-
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- gnome_canvas_w2c_affine (canvas, affine);
- w.x = wx;
- w.y = wy;
- art_affine_point (&c, &w, affine);
- if (cx)
- *cx = c.x;
- if (cy)
- *cy = c.y;
-}
-
-
-/**
- * gnome_canvas_c2w:
- * @canvas: A canvas.
- * @cx: Canvas pixel X coordinate.
- * @cy: Canvas pixel Y coordinate.
- * @wx: X world coordinate (return value).
- * @wy: Y world coordinate (return value).
- *
- * Converts canvas pixel coordinates to world coordinates.
- **/
-void
-gnome_canvas_c2w (GnomeCanvas *canvas, int cx, int cy, double *wx, double *wy)
-{
- double affine[6], inv[6];
- ArtPoint w, c;
-
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- gnome_canvas_w2c_affine (canvas, affine);
- art_affine_invert (inv, affine);
- c.x = cx;
- c.y = cy;
- art_affine_point (&w, &c, inv);
- if (wx)
- *wx = w.x;
- if (wy)
- *wy = w.y;
-}
-
-
-/**
- * gnome_canvas_window_to_world:
- * @canvas: A canvas.
- * @winx: Window-relative X coordinate.
- * @winy: Window-relative Y coordinate.
- * @worldx: X world coordinate (return value).
- * @worldy: Y world coordinate (return value).
- *
- * Converts window-relative coordinates into world coordinates. You can use
- * this when you need to convert mouse coordinates into world coordinates, for
- * example.
- **/
-void
-gnome_canvas_window_to_world (GnomeCanvas *canvas, double winx, double winy,
- double *worldx, double *worldy)
-{
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- if (worldx)
- *worldx = canvas->scroll_x1 + ((winx - canvas->zoom_xofs)
- / canvas->pixels_per_unit);
-
- if (worldy)
- *worldy = canvas->scroll_y1 + ((winy - canvas->zoom_yofs)
- / canvas->pixels_per_unit);
-}
-
-
-/**
- * gnome_canvas_world_to_window:
- * @canvas: A canvas.
- * @worldx: World X coordinate.
- * @worldy: World Y coordinate.
- * @winx: X window-relative coordinate.
- * @winy: Y window-relative coordinate.
- *
- * Converts world coordinates into window-relative coordinates.
- **/
-void
-gnome_canvas_world_to_window (GnomeCanvas *canvas, double worldx, double worldy,
- double *winx, double *winy)
-{
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- if (winx)
- *winx = (canvas->pixels_per_unit)*(worldx - canvas->scroll_x1) + canvas->zoom_xofs;
-
- if (winy)
- *winy = (canvas->pixels_per_unit)*(worldy - canvas->scroll_y1) + canvas->zoom_yofs;
-}
-
-
-
-/**
- * gnome_canvas_get_color:
- * @canvas: A canvas.
- * @spec: X color specification, or NULL for "transparent".
- * @color: Returns the allocated color.
- *
- * Allocates a color based on the specified X color specification. As a
- * convenience to item implementations, it returns TRUE if the color was
- * allocated, or FALSE if the specification was NULL. A NULL color
- * specification is considered as "transparent" by the canvas.
- *
- * Return value: TRUE if @spec is non-NULL and the color is allocated. If @spec
- * is NULL, then returns FALSE.
- **/
-int
-gnome_canvas_get_color (GnomeCanvas *canvas, const char *spec, GdkColor *color)
-{
- GdkColormap *colormap;
-
- g_return_val_if_fail (GNOME_IS_CANVAS (canvas), FALSE);
- g_return_val_if_fail (color != NULL, FALSE);
-
- if (!spec) {
- color->pixel = 0;
- color->red = 0;
- color->green = 0;
- color->blue = 0;
- return FALSE;
- }
-
- gdk_color_parse (spec, color);
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (canvas));
-
- gdk_rgb_find_color (colormap, color);
-
- return TRUE;
-}
-
-/**
- * gnome_canvas_get_color_pixel:
- * @canvas: A canvas.
- * @rgba: RGBA color specification.
- *
- * Allocates a color from the RGBA value passed into this function. The alpha
- * opacity value is discarded, since normal X colors do not support it.
- *
- * Return value: Allocated pixel value corresponding to the specified color.
- **/
-gulong
-gnome_canvas_get_color_pixel (GnomeCanvas *canvas, guint rgba)
-{
- GdkColormap *colormap;
- GdkColor color;
-
- g_return_val_if_fail (GNOME_IS_CANVAS (canvas), 0);
-
- color.red = ((rgba & 0xff000000) >> 16) + ((rgba & 0xff000000) >> 24);
- color.green = ((rgba & 0x00ff0000) >> 8) + ((rgba & 0x00ff0000) >> 16);
- color.blue = (rgba & 0x0000ff00) + ((rgba & 0x0000ff00) >> 8);
- color.pixel = 0;
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (canvas));
-
- gdk_rgb_find_color (colormap, &color);
-
- return color.pixel;
-}
-
-
-/**
- * gnome_canvas_set_stipple_origin:
- * @canvas: A canvas.
- * @gc: GC on which to set the stipple origin.
- *
- * Sets the stipple origin of the specified GC as is appropriate for the canvas,
- * so that it will be aligned with other stipple patterns used by canvas items.
- * This is typically only needed by item implementations.
- **/
-void
-gnome_canvas_set_stipple_origin (GnomeCanvas *canvas, GdkGC *gc)
-{
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
- g_return_if_fail (GDK_IS_GC (gc));
-
- gdk_gc_set_ts_origin (gc, -canvas->draw_xofs, -canvas->draw_yofs);
-}
-
-/**
- * gnome_canvas_set_dither:
- * @canvas: A canvas.
- * @dither: Type of dithering used to render an antialiased canvas.
- *
- * Controls dithered rendering for antialiased canvases. The value of
- * dither should be #GDK_RGB_DITHER_NONE, #GDK_RGB_DITHER_NORMAL, or
- * #GDK_RGB_DITHER_MAX. The default canvas setting is
- * #GDK_RGB_DITHER_NORMAL.
- **/
-void
-gnome_canvas_set_dither (GnomeCanvas *canvas, GdkRgbDither dither)
-{
- g_return_if_fail (GNOME_IS_CANVAS (canvas));
-
- canvas->dither = dither;
-}
-
-/**
- * gnome_canvas_get_dither:
- * @canvas: A canvas.
- *
- * Returns the type of dithering used to render an antialiased canvas.
- *
- * Return value: The dither setting.
- **/
-GdkRgbDither
-gnome_canvas_get_dither (GnomeCanvas *canvas)
-{
- g_return_val_if_fail (GNOME_IS_CANVAS (canvas), GDK_RGB_DITHER_NONE);
-
- return canvas->dither;
-}
-
-static gboolean
-boolean_handled_accumulator (GSignalInvocationHint *ihint,
- GValue *return_accu,
- const GValue *handler_return,
- gpointer dummy)
-{
- gboolean continue_emission;
- gboolean signal_handled;
-
- signal_handled = g_value_get_boolean (handler_return);
- g_value_set_boolean (return_accu, signal_handled);
- continue_emission = !signal_handled;
-
- return continue_emission;
-}
-
-/* Class initialization function for GnomeCanvasItemClass */
-static void
-gnome_canvas_item_class_init (GnomeCanvasItemClass *class)
-{
- GObjectClass *gobject_class;
-
- gobject_class = (GObjectClass *) class;
-
- item_parent_class = g_type_class_peek_parent (class);
-
- gobject_class->set_property = gnome_canvas_item_set_property;
- gobject_class->get_property = gnome_canvas_item_get_property;
-
- g_object_class_install_property
- (gobject_class, ITEM_PROP_PARENT,
- g_param_spec_object ("parent", NULL, NULL,
- GNOME_TYPE_CANVAS_ITEM,
- (G_PARAM_READABLE | G_PARAM_WRITABLE)));
-
- item_signals[ITEM_EVENT] =
- g_signal_new ("event",
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GnomeCanvasItemClass, event),
- boolean_handled_accumulator, NULL,
- gnome_canvas_marshal_BOOLEAN__BOXED,
- G_TYPE_BOOLEAN, 1,
- GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
-
- gobject_class->dispose = gnome_canvas_item_dispose;
-
- class->realize = gnome_canvas_item_realize;
- class->unrealize = gnome_canvas_item_unrealize;
- class->map = gnome_canvas_item_map;
- class->unmap = gnome_canvas_item_unmap;
- class->update = gnome_canvas_item_update;
-}
+++ /dev/null
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: 8; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-/* GnomeCanvas widget - Tk-like canvas widget for Gnome
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas
- * widget. Tk is copyrighted by the Regents of the University of California,
- * Sun Microsystems, and other parties.
- *
- *
- * Authors: Federico Mena <federico@nuclecu.unam.mx>
- * Raph Levien <raph@gimp.org>
- */
-
-#ifndef GNOME_CANVAS_H
-#define GNOME_CANVAS_H
-
-#include <gtk/gtk.h>
-#include <stdarg.h>
-#include <libart_lgpl/art_misc.h>
-#include <libart_lgpl/art_rect.h>
-#include <libart_lgpl/art_svp.h>
-#include <libart_lgpl/art_uta.h>
-#include <libart_lgpl/art_affine.h>
-
-G_BEGIN_DECLS
-
-
-/* "Small" value used by canvas stuff */
-#define GNOME_CANVAS_EPSILON 1e-10
-
-
-/* Macros for building colors that fit in a 32-bit integer. The values are in
- * [0, 255].
- */
-
-#define GNOME_CANVAS_COLOR(r, g, b) ((((unsigned int) (r) & 0xff) << 24) \
- | (((unsigned int) (g) & 0xff) << 16) \
- | (((unsigned int) (b) & 0xff) << 8) \
- | 0xff)
-
-#define GNOME_CANVAS_COLOR_A(r, g, b, a) ((((unsigned int) (r) & 0xff) << 24) \
- | (((unsigned int) (g) & 0xff) << 16) \
- | (((unsigned int) (b) & 0xff) << 8) \
- | ((unsigned int) (a) & 0xff))
-
-
-typedef struct _GnomeCanvas GnomeCanvas;
-typedef struct _GnomeCanvasClass GnomeCanvasClass;
-typedef struct _GnomeCanvasItem GnomeCanvasItem;
-typedef struct _GnomeCanvasItemClass GnomeCanvasItemClass;
-typedef struct _GnomeCanvasGroup GnomeCanvasGroup;
-typedef struct _GnomeCanvasGroupClass GnomeCanvasGroupClass;
-
-
-/* GnomeCanvasItem - base item class for canvas items
- *
- * All canvas items are derived from GnomeCanvasItem. The only information a
- * GnomeCanvasItem contains is its parent canvas, its parent canvas item group,
- * its bounding box in world coordinates, and its current affine transformation.
- *
- * Items inside a canvas are organized in a tree of GnomeCanvasItemGroup nodes
- * and GnomeCanvasItem leaves. Each canvas has a single root group, which can
- * be obtained with the gnome_canvas_get_root() function.
- *
- * The abstract GnomeCanvasItem class does not have any configurable or
- * queryable attributes.
- */
-
-/* Object flags for items */
-enum {
- GNOME_CANVAS_ITEM_REALIZED = 1 << 4,
- GNOME_CANVAS_ITEM_MAPPED = 1 << 5,
- GNOME_CANVAS_ITEM_ALWAYS_REDRAW = 1 << 6,
- GNOME_CANVAS_ITEM_VISIBLE = 1 << 7,
- GNOME_CANVAS_ITEM_NEED_UPDATE = 1 << 8,
- GNOME_CANVAS_ITEM_NEED_AFFINE = 1 << 9,
- GNOME_CANVAS_ITEM_NEED_CLIP = 1 << 10,
- GNOME_CANVAS_ITEM_NEED_VIS = 1 << 11,
- GNOME_CANVAS_ITEM_AFFINE_FULL = 1 << 12
-};
-
-/* Update flags for items */
-enum {
- GNOME_CANVAS_UPDATE_REQUESTED = 1 << 0,
- GNOME_CANVAS_UPDATE_AFFINE = 1 << 1,
- GNOME_CANVAS_UPDATE_CLIP = 1 << 2,
- GNOME_CANVAS_UPDATE_VISIBILITY = 1 << 3,
- GNOME_CANVAS_UPDATE_IS_VISIBLE = 1 << 4 /* Deprecated. FIXME: remove this */
-};
-
-/* Data for rendering in antialiased mode */
-typedef struct {
- /* 24-bit RGB buffer for rendering */
- guchar *buf;
-
- /* Rectangle describing the rendering area */
- ArtIRect rect;
-
- /* Rowstride for the buffer */
- int buf_rowstride;
-
- /* Background color, given as 0xrrggbb */
- guint32 bg_color;
-
- /* Invariant: at least one of the following flags is true. */
-
- /* Set when the render rectangle area is the solid color bg_color */
- unsigned int is_bg : 1;
-
- /* Set when the render rectangle area is represented by the buf */
- unsigned int is_buf : 1;
-} GnomeCanvasBuf;
-
-
-#define GNOME_TYPE_CANVAS_ITEM (gnome_canvas_item_get_type ())
-#define GNOME_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_ITEM, GnomeCanvasItem))
-#define GNOME_CANVAS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_ITEM, GnomeCanvasItemClass))
-#define GNOME_IS_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_ITEM))
-#define GNOME_IS_CANVAS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_ITEM))
-#define GNOME_CANVAS_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_ITEM, GnomeCanvasItemClass))
-
-
-struct _GnomeCanvasItem {
- GtkObject object;
-
- /* Parent canvas for this item */
- GnomeCanvas *canvas;
-
- /* Parent canvas group for this item (a GnomeCanvasGroup) */
- GnomeCanvasItem *parent;
-
- /* If NULL, assumed to be the identity tranform. If flags does not have
- * AFFINE_FULL, then a two-element array containing a translation. If
- * flags contains AFFINE_FULL, a six-element array containing an affine
- * transformation.
- */
- double *xform;
-
- /* Bounding box for this item (in canvas coordinates) */
- double x1, y1, x2, y2;
-};
-
-struct _GnomeCanvasItemClass {
- GtkObjectClass parent_class;
-
- /* Tell the item to update itself. The flags are from the update flags
- * defined above. The item should update its internal state from its
- * queued state, and recompute and request its repaint area. The
- * affine, if used, is a pointer to a 6-element array of doubles. The
- * update method also recomputes the bounding box of the item.
- */
- void (* update) (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
-
- /* Realize an item -- create GCs, etc. */
- void (* realize) (GnomeCanvasItem *item);
-
- /* Unrealize an item */
- void (* unrealize) (GnomeCanvasItem *item);
-
- /* Map an item - normally only need by items with their own GdkWindows */
- void (* map) (GnomeCanvasItem *item);
-
- /* Unmap an item */
- void (* unmap) (GnomeCanvasItem *item);
-
- /* Return the microtile coverage of the item */
- ArtUta *(* coverage) (GnomeCanvasItem *item);
-
- /* Draw an item of this type. (x, y) are the upper-left canvas pixel
- * coordinates of the drawable, a temporary pixmap, where things get
- * drawn. (width, height) are the dimensions of the drawable.
- */
- void (* draw) (GnomeCanvasItem *item, GdkDrawable *drawable,
- int x, int y, int width, int height);
-
- /* Render the item over the buffer given. The buf data structure
- * contains both a pointer to a packed 24-bit RGB array, and the
- * coordinates. This method is only used for antialiased canvases.
- *
- * TODO: figure out where clip paths fit into the rendering framework.
- */
- void (* render) (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
-
- /* Calculate the distance from an item to the specified point. It also
- * returns a canvas item which is the item itself in the case of the
- * object being an actual leaf item, or a child in case of the object
- * being a canvas group. (cx, cy) are the canvas pixel coordinates that
- * correspond to the item-relative coordinates (x, y).
- */
- double (* point) (GnomeCanvasItem *item, double x, double y, int cx, int cy,
- GnomeCanvasItem **actual_item);
-
- /* Fetch the item's bounding box (need not be exactly tight). This
- * should be in item-relative coordinates.
- */
- void (* bounds) (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2);
-
- /* Signal: an event occurred for an item of this type. The (x, y)
- * coordinates are in the canvas world coordinate system.
- */
- gboolean (* event) (GnomeCanvasItem *item, GdkEvent *event);
-
- /* Reserved for future expansion */
- gpointer spare_vmethods [4];
-};
-
-
-GType gnome_canvas_item_get_type (void) G_GNUC_CONST;
-
-/* Create a canvas item using the standard Gtk argument mechanism. The item is
- * automatically inserted at the top of the specified canvas group. The last
- * argument must be a NULL pointer.
- */
-GnomeCanvasItem *gnome_canvas_item_new (GnomeCanvasGroup *parent, GType type,
- const gchar *first_arg_name, ...);
-
-/* Constructors for use in derived classes and language wrappers */
-void gnome_canvas_item_construct (GnomeCanvasItem *item, GnomeCanvasGroup *parent,
- const gchar *first_arg_name, va_list args);
-
-/* Configure an item using the standard Gtk argument mechanism. The last
- * argument must be a NULL pointer.
- */
-void gnome_canvas_item_set (GnomeCanvasItem *item, const gchar *first_arg_name, ...);
-
-/* Used only for language wrappers and the like */
-void gnome_canvas_item_set_valist (GnomeCanvasItem *item,
- const gchar *first_arg_name, va_list args);
-
-/* Move an item by the specified amount */
-void gnome_canvas_item_move (GnomeCanvasItem *item, double dx, double dy);
-
-/* Apply a relative affine transformation to the item. */
-void gnome_canvas_item_affine_relative (GnomeCanvasItem *item, const double affine[6]);
-
-/* Apply an absolute affine transformation to the item. */
-void gnome_canvas_item_affine_absolute (GnomeCanvasItem *item, const double affine[6]);
-
-/* Raise an item in the z-order of its parent group by the specified number of
- * positions.
- */
-void gnome_canvas_item_raise (GnomeCanvasItem *item, int positions);
-
-/* Lower an item in the z-order of its parent group by the specified number of
- * positions.
- */
-void gnome_canvas_item_lower (GnomeCanvasItem *item, int positions);
-
-/* Raise an item to the top of its parent group's z-order. */
-void gnome_canvas_item_raise_to_top (GnomeCanvasItem *item);
-
-/* Lower an item to the bottom of its parent group's z-order */
-void gnome_canvas_item_lower_to_bottom (GnomeCanvasItem *item);
-
-/* Show an item (make it visible). If the item is already shown, it has no
- * effect.
- */
-void gnome_canvas_item_show (GnomeCanvasItem *item);
-
-/* Hide an item (make it invisible). If the item is already invisible, it has
- * no effect.
- */
-void gnome_canvas_item_hide (GnomeCanvasItem *item);
-
-/* Grab the mouse for the specified item. Only the events in event_mask will be
- * reported. If cursor is non-NULL, it will be used during the duration of the
- * grab. Time is a proper X event time parameter. Returns the same values as
- * XGrabPointer().
- */
-int gnome_canvas_item_grab (GnomeCanvasItem *item, unsigned int event_mask,
- GdkCursor *cursor, guint32 etime);
-
-/* Ungrabs the mouse -- the specified item must be the same that was passed to
- * gnome_canvas_item_grab(). Time is a proper X event time parameter.
- */
-void gnome_canvas_item_ungrab (GnomeCanvasItem *item, guint32 etime);
-
-/* These functions convert from a coordinate system to another. "w" is world
- * coordinates and "i" is item coordinates.
- */
-void gnome_canvas_item_w2i (GnomeCanvasItem *item, double *x, double *y);
-void gnome_canvas_item_i2w (GnomeCanvasItem *item, double *x, double *y);
-
-/* Gets the affine transform that converts from item-relative coordinates to
- * world coordinates.
- */
-void gnome_canvas_item_i2w_affine (GnomeCanvasItem *item, double affine[6]);
-
-/* Gets the affine transform that converts from item-relative coordinates to
- * canvas pixel coordinates.
- */
-void gnome_canvas_item_i2c_affine (GnomeCanvasItem *item, double affine[6]);
-
-/* Remove the item from its parent group and make the new group its parent. The
- * item will be put on top of all the items in the new group. The item's
- * coordinates relative to its new parent to *not* change -- this means that the
- * item could potentially move on the screen.
- *
- * The item and the group must be in the same canvas. An item cannot be
- * reparented to a group that is the item itself or that is an inferior of the
- * item.
- */
-void gnome_canvas_item_reparent (GnomeCanvasItem *item, GnomeCanvasGroup *new_group);
-
-/* Used to send all of the keystroke events to a specific item as well as
- * GDK_FOCUS_CHANGE events.
- */
-void gnome_canvas_item_grab_focus (GnomeCanvasItem *item);
-
-/* Fetch the bounding box of the item. The bounding box may not be exactly
- * tight, but the canvas items will do the best they can. The returned bounding
- * box is in the coordinate system of the item's parent.
- */
-void gnome_canvas_item_get_bounds (GnomeCanvasItem *item,
- double *x1, double *y1, double *x2, double *y2);
-
-/* Request that the update method eventually get called. This should be used
- * only by item implementations.
- */
-void gnome_canvas_item_request_update (GnomeCanvasItem *item);
-
-
-/* GnomeCanvasGroup - a group of canvas items
- *
- * A group is a node in the hierarchical tree of groups/items inside a canvas.
- * Groups serve to give a logical structure to the items.
- *
- * Consider a circuit editor application that uses the canvas for its schematic
- * display. Hierarchically, there would be canvas groups that contain all the
- * components needed for an "adder", for example -- this includes some logic
- * gates as well as wires. You can move stuff around in a convenient way by
- * doing a gnome_canvas_item_move() of the hierarchical groups -- to move an
- * adder, simply move the group that represents the adder.
- *
- * The following arguments are available:
- *
- * name type read/write description
- * --------------------------------------------------------------------------------
- * x double RW X coordinate of group's origin
- * y double RW Y coordinate of group's origin
- */
-
-
-#define GNOME_TYPE_CANVAS_GROUP (gnome_canvas_group_get_type ())
-#define GNOME_CANVAS_GROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_GROUP, GnomeCanvasGroup))
-#define GNOME_CANVAS_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_GROUP, GnomeCanvasGroupClass))
-#define GNOME_IS_CANVAS_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS_GROUP))
-#define GNOME_IS_CANVAS_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS_GROUP))
-#define GNOME_CANVAS_GROUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS_GROUP, GnomeCanvasGroupClass))
-
-
-struct _GnomeCanvasGroup {
- GnomeCanvasItem item;
-
- /* Children of the group */
- GList *item_list;
- GList *item_list_end;
-};
-
-struct _GnomeCanvasGroupClass {
- GnomeCanvasItemClass parent_class;
-};
-
-
-GType gnome_canvas_group_get_type (void) G_GNUC_CONST;
-
-
-/*** GnomeCanvas ***/
-
-
-#define GNOME_TYPE_CANVAS (gnome_canvas_get_type ())
-#define GNOME_CANVAS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS, GnomeCanvas))
-#define GNOME_CANVAS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS, GnomeCanvasClass))
-#define GNOME_IS_CANVAS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_CANVAS))
-#define GNOME_IS_CANVAS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_CANVAS))
-#define GNOME_CANVAS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_CANVAS, GnomeCanvasClass))
-
-
-struct _GnomeCanvas {
- GtkLayout layout;
-
- /* Root canvas group */
- GnomeCanvasItem *root;
-
- /* Area that needs redrawing, stored as a microtile array */
- ArtUta *redraw_area;
-
- /* The item containing the mouse pointer, or NULL if none */
- GnomeCanvasItem *current_item;
-
- /* Item that is about to become current (used to track deletions and such) */
- GnomeCanvasItem *new_current_item;
-
- /* Item that holds a pointer grab, or NULL if none */
- GnomeCanvasItem *grabbed_item;
-
- /* If non-NULL, the currently focused item */
- GnomeCanvasItem *focused_item;
-
- /* GC for temporary draw pixmap */
- GdkGC *pixmap_gc;
-
- /* Event on which selection of current item is based */
- GdkEvent pick_event;
-
- /* Scrolling region */
- double scroll_x1, scroll_y1;
- double scroll_x2, scroll_y2;
-
- /* Scaling factor to be used for display */
- double pixels_per_unit;
-
- /* Idle handler ID */
- guint idle_id;
-
- /* Signal handler ID for destruction of the root item */
- guint root_destroy_id;
-
- /* Area that is being redrawn. Contains (x1, y1) but not (x2, y2).
- * Specified in canvas pixel coordinates.
- */
- int redraw_x1, redraw_y1;
- int redraw_x2, redraw_y2;
-
- /* Offsets of the temprary drawing pixmap */
- int draw_xofs, draw_yofs;
-
- /* Internal pixel offsets when zoomed out */
- int zoom_xofs, zoom_yofs;
-
- /* Last known modifier state, for deferred repick when a button is down */
- int state;
-
- /* Event mask specified when grabbing an item */
- guint grabbed_event_mask;
-
- /* Tolerance distance for picking items */
- int close_enough;
-
- /* Whether the canvas should center the scroll region in the middle of
- * the window if the scroll region is smaller than the window.
- */
- unsigned int center_scroll_region : 1;
-
- /* Whether items need update at next idle loop iteration */
- unsigned int need_update : 1;
-
- /* Whether the canvas needs redrawing at the next idle loop iteration */
- unsigned int need_redraw : 1;
-
- /* Whether current item will be repicked at next idle loop iteration */
- unsigned int need_repick : 1;
-
- /* For use by internal pick_current_item() function */
- unsigned int left_grabbed_item : 1;
-
- /* For use by internal pick_current_item() function */
- unsigned int in_repick : 1;
-
- /* Whether the canvas is in antialiased mode or not */
- unsigned int aa : 1;
-
- /* Which dither mode to use for antialiased mode drawing */
- GdkRgbDither dither;
-};
-
-struct _GnomeCanvasClass {
- GtkLayoutClass parent_class;
-
- /* Draw the background for the area given. This method is only used
- * for non-antialiased canvases.
- */
- void (* draw_background) (GnomeCanvas *canvas, GdkDrawable *drawable,
- int x, int y, int width, int height);
-
- /* Render the background for the buffer given. The buf data structure
- * contains both a pointer to a packed 24-bit RGB array, and the
- * coordinates. This method is only used for antialiased canvases.
- */
- void (* render_background) (GnomeCanvas *canvas, GnomeCanvasBuf *buf);
-
- /* Private Virtual methods for groping the canvas inside bonobo */
- void (* request_update) (GnomeCanvas *canvas);
-
- /* Reserved for future expansion */
- gpointer spare_vmethods [4];
-};
-
-
-GType gnome_canvas_get_type (void) G_GNUC_CONST;
-
-/* Creates a new canvas. You should check that the canvas is created with the
- * proper visual and colormap. Any visual will do unless you intend to insert
- * gdk_imlib images into it, in which case you should use the gdk_imlib visual.
- *
- * You should call gnome_canvas_set_scroll_region() soon after calling this
- * function to set the desired scrolling limits for the canvas.
- */
-GtkWidget *gnome_canvas_new (void);
-
-/* Creates a new antialiased empty canvas. You should push the GdkRgb colormap
- * and visual for this.
- */
-#ifndef GNOME_EXCLUDE_EXPERIMENTAL
-GtkWidget *gnome_canvas_new_aa (void);
-#endif
-
-/* Returns the root canvas item group of the canvas */
-GnomeCanvasGroup *gnome_canvas_root (GnomeCanvas *canvas);
-
-/* Sets the limits of the scrolling region, in world coordinates */
-void gnome_canvas_set_scroll_region (GnomeCanvas *canvas,
- double x1, double y1, double x2, double y2);
-
-/* Gets the limits of the scrolling region, in world coordinates */
-void gnome_canvas_get_scroll_region (GnomeCanvas *canvas,
- double *x1, double *y1, double *x2, double *y2);
-
-/* Whether the canvas centers the scroll region if it is smaller than the window */
-void gnome_canvas_set_center_scroll_region (GnomeCanvas *canvas, gboolean center_scroll_region);
-
-/* Returns whether the canvas is set to center the scroll region if it is smaller than the window */
-gboolean gnome_canvas_get_center_scroll_region (GnomeCanvas *canvas);
-
-/* Sets the number of pixels that correspond to one unit in world coordinates */
-void gnome_canvas_set_pixels_per_unit (GnomeCanvas *canvas, double n);
-
-/* Scrolls the canvas to the specified offsets, given in canvas pixel coordinates */
-void gnome_canvas_scroll_to (GnomeCanvas *canvas, int cx, int cy);
-
-/* Returns the scroll offsets of the canvas in canvas pixel coordinates. You
- * can specify NULL for any of the values, in which case that value will not be
- * queried.
- */
-void gnome_canvas_get_scroll_offsets (GnomeCanvas *canvas, int *cx, int *cy);
-
-/* Requests that the canvas be repainted immediately instead of in the idle
- * loop.
- */
-void gnome_canvas_update_now (GnomeCanvas *canvas);
-
-/* Returns the item that is at the specified position in world coordinates, or
- * NULL if no item is there.
- */
-GnomeCanvasItem *gnome_canvas_get_item_at (GnomeCanvas *canvas, double x, double y);
-
-/* For use only by item type implementations. Request that the canvas eventually
- * redraw the specified region. The region is specified as a microtile
- * array. This function takes over responsibility for freeing the uta argument.
- */
-void gnome_canvas_request_redraw_uta (GnomeCanvas *canvas, ArtUta *uta);
-
-/* For use only by item type implementations. Request that the canvas
- * eventually redraw the specified region, specified in canvas pixel
- * coordinates. The region contains (x1, y1) but not (x2, y2).
- */
-void gnome_canvas_request_redraw (GnomeCanvas *canvas, int x1, int y1, int x2, int y2);
-
-/* Gets the affine transform that converts world coordinates into canvas pixel
- * coordinates.
- */
-void gnome_canvas_w2c_affine (GnomeCanvas *canvas, double affine[6]);
-
-/* These functions convert from a coordinate system to another. "w" is world
- * coordinates, "c" is canvas pixel coordinates (pixel coordinates that are
- * (0,0) for the upper-left scrolling limit and something else for the
- * lower-left scrolling limit).
- */
-void gnome_canvas_w2c (GnomeCanvas *canvas, double wx, double wy, int *cx, int *cy);
-void gnome_canvas_w2c_d (GnomeCanvas *canvas, double wx, double wy, double *cx, double *cy);
-void gnome_canvas_c2w (GnomeCanvas *canvas, int cx, int cy, double *wx, double *wy);
-
-/* This function takes in coordinates relative to the GTK_LAYOUT
- * (canvas)->bin_window and converts them to world coordinates.
- */
-void gnome_canvas_window_to_world (GnomeCanvas *canvas,
- double winx, double winy, double *worldx, double *worldy);
-
-/* This is the inverse of gnome_canvas_window_to_world() */
-void gnome_canvas_world_to_window (GnomeCanvas *canvas,
- double worldx, double worldy, double *winx, double *winy);
-
-/* Takes a string specification for a color and allocates it into the specified
- * GdkColor. If the string is null, then it returns FALSE. Otherwise, it
- * returns TRUE.
- */
-int gnome_canvas_get_color (GnomeCanvas *canvas, const char *spec, GdkColor *color);
-
-/* Allocates a color from the RGB value passed into this function. */
-gulong gnome_canvas_get_color_pixel (GnomeCanvas *canvas,
- guint rgba);
-
-
-/* Sets the stipple origin of the specified gc so that it will be aligned with
- * all the stipples used in the specified canvas. This is intended for use only
- * by canvas item implementations.
- */
-void gnome_canvas_set_stipple_origin (GnomeCanvas *canvas, GdkGC *gc);
-
-/* Controls the dithering used when the canvas renders.
- * Only applicable to antialiased canvases - ignored by non-antialiased canvases.
- */
-void gnome_canvas_set_dither (GnomeCanvas *canvas, GdkRgbDither dither);
-
-/* Returns the dither mode of an antialiased canvas.
- * Only applicable to antialiased canvases - ignored by non-antialiased canvases.
- */
-GdkRgbDither gnome_canvas_get_dither (GnomeCanvas *canvas);
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/*
- * Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-
-#ifndef LIBGNOMECANVAS_H
-#define LIBGNOMECANVAS_H
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-line.h>
-#include <libgnomecanvas/gnome-canvas-text.h>
-#include <libgnomecanvas/gnome-canvas-rich-text.h>
-#include <libgnomecanvas/gnome-canvas-polygon.h>
-#include <libgnomecanvas/gnome-canvas-pixbuf.h>
-#include <libgnomecanvas/gnome-canvas-widget.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <libgnomecanvas/gnome-canvas-bpath.h>
-#include <libgnomecanvas/gnome-canvas-util.h>
-#include <libgnomecanvas/gnome-canvas-clipgroup.h>
-
-G_BEGIN_DECLS
-
-GType gnome_canvas_points_get_type (void);
-#define GNOME_TYPE_CANVAS_POINTS gnome_canvas_points_get_type()
-
-G_END_DECLS
-
-#endif /* LIBGNOMECANVAS_H */
+++ /dev/null
-/*
- * Copyright (C) 1999, 2000 Red Hat, Inc.
- * All rights reserved.
- *
- * This file is part of the Gnome Library.
- *
- * The Gnome Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * The Gnome 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with the Gnome Library; see the file COPYING.LIB. If not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-/*
- @NOTATION@
- */
-
-#include <config.h>
-#include <glib-object.h>
-
-#include <libgnomecanvas/libgnomecanvas.h>
-
-GType
-gnome_canvas_points_get_type (void)
-{
- static GType type_canvas_points = 0;
-
- if (!type_canvas_points)
- type_canvas_points = g_boxed_type_register_static
- ("GnomeCanvasPoints",
- (GBoxedCopyFunc) gnome_canvas_points_ref,
- (GBoxedFreeFunc) gnome_canvas_points_unref);
-
- return type_canvas_points;
-}
+++ /dev/null
-#!/usr/bin/env python
-from waflib.extras import autowaf as autowaf
-import os
-
-# Version of this package (even if built as a child)
-MAJOR = '2'
-MINOR = '30'
-MICRO = '1'
-LIBGNOMECANVAS_VERSION = "%s.%s.%s" % (MAJOR, MINOR, MICRO)
-
-# Library version (UNIX style major, minor, micro)
-# major increment <=> incompatible changes
-# minor increment <=> compatible changes (additions)
-# micro increment <=> no interface changes
-LIBGNOMECANVAS_LIB_VERSION = '0.0.0'
-
-# Variables for 'waf dist'
-APPNAME = 'libgnomecanvas'
-VERSION = LIBGNOMECANVAS_VERSION
-
-# Mandatory variables
-top = '.'
-out = 'build'
-
-path_prefix = 'libs/gnomecanvas/'
-
-libgnomecanvas_sources = [
- 'libgnomecanvas/gnome-canvas-bpath.c',
- 'libgnomecanvas/gnome-canvas.c',
- 'libgnomecanvas/gnome-canvas-clipgroup.c',
- 'libgnomecanvas/gnome-canvas-line.c',
- 'libgnomecanvas/gnome-canvas-path-def.c',
- 'libgnomecanvas/gnome-canvas-pixbuf.c',
- 'libgnomecanvas/gnome-canvas-polygon.c',
- 'libgnomecanvas/gnome-canvas-rect-ellipse.c',
- 'libgnomecanvas/gnome-canvas-rich-text.c',
- 'libgnomecanvas/gnome-canvas-shape.c',
- 'libgnomecanvas/gnome-canvas-text.c',
- 'libgnomecanvas/gnome-canvas-util.c',
- 'libgnomecanvas/gnome-canvas-widget.c',
- 'libgnomecanvas/libgnomecanvastypes.c'
- ]
-
-def options(opt):
- autowaf.set_options(opt)
-
-def configure(conf):
- conf.load('compiler_c')
- autowaf.configure(conf)
- autowaf.check_pkg(conf, 'gtk+-2.0', uselib_store='GTK', atleast_version='2.18')
- autowaf.check_pkg(conf, 'libart-2.0', uselib_store='LIBART', atleast_version='2.3')
- autowaf.check_pkg(conf, 'pango', uselib_store='PANGO', atleast_version='1.28')
- autowaf.check_pkg(conf, 'pangoft2', uselib_store='PANGOFT2', atleast_version='1.28')
-
-def build(bld):
- # Library
- obj = bld(features = 'c cshlib')
- obj.source = libgnomecanvas_sources
- obj.export_includes = ['.']
- obj.includes = ['.']
- obj.name = 'libgnomecanvas-2'
- obj.target = 'gnomecanvas-2'
- obj.uselib = 'GLIB GTK LIBART PANGO PANGOFT2'
- obj.vnum = LIBGNOMECANVAS_LIB_VERSION
- obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
-
-def shutdown():
- autowaf.shutdown()