3 #include <libgnomecanvas/libgnomecanvas.h>
5 #include "canvas-ruler.h"
6 #include "rgb_macros.h"
20 static void gnome_canvas_ruler_class_init (GnomeCanvasRulerClass *class);
21 static void gnome_canvas_ruler_init (GnomeCanvasRuler *ruler);
22 static void gnome_canvas_ruler_set_arg (GtkObject *object,
25 static void gnome_canvas_ruler_get_arg (GtkObject *object,
29 static void gnome_canvas_ruler_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
30 static void gnome_canvas_ruler_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2);
31 static double gnome_canvas_ruler_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item);
32 static void gnome_canvas_ruler_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
33 static void gnome_canvas_ruler_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int w, int h);
35 static GnomeCanvasItemClass *parent_class;
39 gnome_canvas_ruler_get_type (void)
41 static GtkType ruler_type = 0;
44 GtkTypeInfo ruler_info = {
46 sizeof (GnomeCanvasRuler),
47 sizeof (GnomeCanvasRulerClass),
48 (GtkClassInitFunc) gnome_canvas_ruler_class_init,
49 (GtkObjectInitFunc) gnome_canvas_ruler_init,
50 NULL, /* reserved_1 */
51 NULL, /* reserved_2 */
52 (GtkClassInitFunc) NULL
55 ruler_type = gtk_type_unique (gnome_canvas_item_get_type (), &ruler_info);
62 gnome_canvas_ruler_class_init (GnomeCanvasRulerClass *class)
64 GtkObjectClass *object_class;
65 GnomeCanvasItemClass *item_class;
67 object_class = (GtkObjectClass *) class;
68 item_class = (GnomeCanvasItemClass *) class;
70 parent_class = gtk_type_class (gnome_canvas_item_get_type ());
72 gtk_object_add_arg_type ("GnomeCanvasRuler::x1", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_X1);
73 gtk_object_add_arg_type ("GnomeCanvasRuler::y1", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_Y1);
74 gtk_object_add_arg_type ("GnomeCanvasRuler::x2", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_X2);
75 gtk_object_add_arg_type ("GnomeCanvasRuler::y2", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_Y2);
76 gtk_object_add_arg_type ("GnomeCanvasRuler::frames_per_unit", GTK_TYPE_LONG, GTK_ARG_READWRITE, ARG_FRAMES_PER_UNIT);
77 gtk_object_add_arg_type ("GnomeCanvasRuler::fill_color", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_FILL_COLOR);
78 gtk_object_add_arg_type ("GnomeCanvasRuler::tick_color", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_TICK_COLOR);
80 object_class->set_arg = gnome_canvas_ruler_set_arg;
81 object_class->get_arg = gnome_canvas_ruler_get_arg;
83 item_class->update = gnome_canvas_ruler_update;
84 item_class->bounds = gnome_canvas_ruler_bounds;
85 item_class->point = gnome_canvas_ruler_point;
86 item_class->render = gnome_canvas_ruler_render;
87 item_class->draw = gnome_canvas_ruler_draw;
91 gnome_canvas_ruler_init (GnomeCanvasRuler *ruler)
97 ruler->frames_per_unit = 1;
98 ruler->fill_color = 0;
99 ruler->tick_color = 0;
102 //GNOME_CANVAS_ITEM(ruler)->object.flags |= GNOME_CANVAS_ITEM_NO_AUTO_REDRAW;
106 gnome_canvas_ruler_reset_bounds (GnomeCanvasItem *item)
109 double x1, x2, y1, y2;
112 int Ix1, Ix2, Iy1, Iy2;
115 gnome_canvas_ruler_bounds (item, &x1, &y1, &x2, &y2);
122 gnome_canvas_item_i2w_affine (item, i2w);
123 art_affine_point (&w1, &i1, i2w);
124 art_affine_point (&w2, &i2, i2w);
126 Ix1 = (int) rint(w1.x);
127 Ix2 = (int) rint(w2.x);
128 Iy1 = (int) rint(w1.y);
129 Iy2 = (int) rint(w2.y);
131 gnome_canvas_update_bbox (item, Ix1, Iy1, Ix2, Iy2);
139 gnome_canvas_ruler_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
141 GnomeCanvasItem *item;
142 GnomeCanvasRuler *ruler;
146 item = GNOME_CANVAS_ITEM (object);
147 ruler = GNOME_CANVAS_RULER (object);
154 if (ruler->x1 != GTK_VALUE_DOUBLE (*arg)) {
155 ruler->x1 = GTK_VALUE_DOUBLE (*arg);
161 if (ruler->y1 != GTK_VALUE_DOUBLE (*arg)) {
162 ruler->y1 = GTK_VALUE_DOUBLE (*arg);
168 if (ruler->x2 != GTK_VALUE_DOUBLE (*arg)) {
169 ruler->x2 = GTK_VALUE_DOUBLE (*arg);
175 if (ruler->y2 != GTK_VALUE_DOUBLE (*arg)) {
176 ruler->y2 = GTK_VALUE_DOUBLE (*arg);
181 case ARG_FRAMES_PER_UNIT:
182 if (ruler->frames_per_unit != GTK_VALUE_LONG(*arg)) {
183 ruler->frames_per_unit = GTK_VALUE_LONG(*arg);
189 if (ruler->fill_color != GTK_VALUE_INT(*arg)) {
190 ruler->fill_color = GTK_VALUE_INT(*arg);
196 if (ruler->tick_color != GTK_VALUE_INT(*arg)) {
197 ruler->tick_color = GTK_VALUE_INT(*arg);
207 gnome_canvas_ruler_reset_bounds (item);
211 gnome_canvas_item_request_update (item);
217 gnome_canvas_ruler_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
219 GnomeCanvasRuler *ruler;
221 ruler = GNOME_CANVAS_RULER (object);
225 GTK_VALUE_DOUBLE (*arg) = ruler->x1;
228 GTK_VALUE_DOUBLE (*arg) = ruler->y1;
231 GTK_VALUE_DOUBLE (*arg) = ruler->x2;
234 GTK_VALUE_DOUBLE (*arg) = ruler->y2;
236 case ARG_FRAMES_PER_UNIT:
237 GTK_VALUE_LONG (*arg) = ruler->frames_per_unit;
240 GTK_VALUE_INT (*arg) = ruler->fill_color;
243 GTK_VALUE_INT (*arg) = ruler->tick_color;
246 arg->type = GTK_TYPE_INVALID;
252 gnome_canvas_ruler_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
254 GnomeCanvasRuler *ruler;
258 ruler = GNOME_CANVAS_RULER (item);
260 if (parent_class->update)
261 (* parent_class->update) (item, affine, clip_path, flags);
263 gnome_canvas_ruler_reset_bounds (item);
268 gnome_canvas_item_i2w (item, &x, &y);
269 gnome_canvas_w2c (GNOME_CANVAS(item->canvas), x, y, &ruler->bbox_ulx, &ruler->bbox_uly);
274 gnome_canvas_item_i2w (item, &x, &y);
275 gnome_canvas_w2c (GNOME_CANVAS(item->canvas), x, y, &ruler->bbox_lrx, &ruler->bbox_lry);
277 UINT_TO_RGB (ruler->tick_color, &ruler->tick_r, &ruler->tick_g, &ruler->tick_b);
278 UINT_TO_RGB (ruler->fill_color, &ruler->fill_r, &ruler->fill_g, &ruler->fill_b);
282 gnome_canvas_ruler_render (GnomeCanvasItem *item,
285 GnomeCanvasRuler *ruler;
288 ruler = GNOME_CANVAS_RULER (item);
290 if (parent_class->render) {
291 (*parent_class->render) (item, buf);
295 gnome_canvas_buf_ensure_buf (buf);
299 begin = MAX(ruler->bbox_ulx,buf->rect.x0);
301 if (ruler->bbox_lrx >= 0) {
302 end = MIN(ruler->bbox_lrx,buf->rect.x1);
311 PAINT_BOX (buf, ruler->fill_r, ruler->fill_g, ruler->fill_b, 255, begin, ruler->bbox_uly, end, ruler->bbox_lry - 1);
312 PAINT_HORIZ (buf, ruler->tick_r, ruler->tick_g, ruler->tick_b, begin, end, ruler->bbox_lry - 1);
316 gnome_canvas_ruler_draw (GnomeCanvasItem *item,
317 GdkDrawable *drawable,
319 int width, int height)
321 GnomeCanvasRuler *ruler;
323 ruler = GNOME_CANVAS_RULER (item);
325 if (parent_class->draw) {
326 (* parent_class->draw) (item, drawable, x, y, width, height);
329 fprintf (stderr, "please don't use the CanvasRuler item in a non-aa Canvas\n");
334 gnome_canvas_ruler_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
336 GnomeCanvasRuler *ruler = GNOME_CANVAS_RULER (item);
345 gnome_canvas_ruler_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item)
347 GnomeCanvasRuler *ruler;
348 double x1, y1, x2, y2;
351 ruler = GNOME_CANVAS_RULER (item);
355 /* Find the bounds for the rectangle plus its outline width */
357 gnome_canvas_ruler_bounds (item, &x1, &y1, &x2, &y2);
359 /* Is point inside rectangle */
361 if ((x >= x1) && (y >= y1) && (x <= x2) && (y <= y2)) {
365 /* Point is outside rectangle */
381 return sqrt (dx * dx + dy * dy);