/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
#include <config.h>

#include <bonobo/Bonobo.h>
#include <bonobo.h>

#define gray50_width 2
#define gray50_height 2
static char gray50_bits[] = {
  0x02, 0x01, };

#define SCALE 15.0

static GnomeCanvasItem *
make_hilbert (GnomeCanvasGroup *root)
{
	char hilbert[] = "urdrrulurulldluuruluurdrurddldrrruluurdrurddldrddlulldrdldrrurd";
	char *c;
	double *pp, *p;
	GnomeCanvasPoints *points;
	GdkBitmap *stipple;
	GnomeCanvasItem *item;

	points = gnome_canvas_points_new (strlen (hilbert) + 1);
	points->coords [0] = SCALE * 4;
	points->coords [1] = SCALE * 4;

	pp = points->coords;
	for (c = hilbert, p = points->coords + 2; *c; c++, p += 2, pp += 2)
		switch (*c) {
		case 'u':
			p[0] = pp[0];
			p[1] = pp[1] - SCALE;
			break;

		case 'd':
			p[0] = pp[0];
			p[1] = pp[1] + SCALE;
			break;

		case 'l':
			p[0] = pp[0] - SCALE;
			p[1] = pp[1];
			break;

		case 'r':
			p[0] = pp[0] + SCALE;
			p[1] = pp[1];
			break;
		}

	if (root->item.canvas->aa) {
		item = gnome_canvas_item_new (root,
					      gnome_canvas_line_get_type (),
					      "points", points,
					      "fill_color_rgba", 0x00ff0080,
					      "width_units", 8.0,
					      "cap_style", GDK_CAP_PROJECTING,
					      "join_style", GDK_JOIN_MITER,
					      NULL);
	} else {
		stipple = gdk_bitmap_create_from_data (NULL, gray50_bits, gray50_width, gray50_height);
		item = gnome_canvas_item_new (root,
					      gnome_canvas_line_get_type (),
					      "points", points,
					      "fill_color", "green",
					      "fill_stipple", stipple,
					      "width_units", 8.0,
					      "cap_style", GDK_CAP_PROJECTING,
					      "join_style", GDK_JOIN_MITER,
					      NULL);
		gdk_bitmap_unref (stipple);
	}
	
	gnome_canvas_points_free (points);

	return item;
}

static BonoboCanvasComponent *
item_factory (BonoboEmbeddable *bonobo_object, GnomeCanvas *canvas, void *data)
{
	GnomeCanvasItem *item;
	GnomeCanvasItem *group;
	
        group = gnome_canvas_item_new (
		GNOME_CANVAS_GROUP (gnome_canvas_root (canvas)),
		gnome_canvas_group_get_type (),
		"x1", 0.0,
		"y1", 0.0,
		NULL);

	item = make_hilbert (GNOME_CANVAS_GROUP (group));

/*        item = gnome_canvas_item_new (
		GNOME_CANVAS_GROUP (group),
		gnome_canvas_rect_get_type (),
		"x1", 0.0,
		"y1", 0.0,
		"x2", 40.0,
		"y2", 40.0,
		"outline_color", "red",
		"fill_color", "blue",
		NULL);*/

	return bonobo_canvas_component_new (group);
}

static BonoboObject *
bonobo_item_factory (BonoboGenericFactory *factory, void *closure)
{
	BonoboEmbeddable *server;

	server = bonobo_embeddable_new_canvas_item (item_factory, NULL);
	if (!server)
		g_error ("Can not create bonobo_embeddable");

	return (BonoboObject*) server;
}

BONOBO_OAF_FACTORY ("OAFIID:Bonobo_Sample_CanvasItem_Factory",
		    "bonobo-sample-canvas-item", VERSION, 
		    bonobo_item_factory,
		    NULL)


syntax highlighted by Code2HTML, v. 0.9.1