3 #include <gtk-canvas.h>
5 #include "canvas-ruler.h"
6 #include "rgb_macros.h"
20 static void gtk_canvas_ruler_class_init (GtkCanvasRulerClass *class);
21 static void gtk_canvas_ruler_init (GtkCanvasRuler *ruler);
22 static void gtk_canvas_ruler_set_arg (GtkObject *object,
25 static void gtk_canvas_ruler_get_arg (GtkObject *object,
29 static void gtk_canvas_ruler_update (GtkCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
30 static void gtk_canvas_ruler_bounds (GtkCanvasItem *item, double *x1, double *y1, double *x2, double *y2);
31 static double gtk_canvas_ruler_point (GtkCanvasItem *item, double x, double y, int cx, int cy, GtkCanvasItem **actual_item);
32 static void gtk_canvas_ruler_render (GtkCanvasItem *item, GtkCanvasBuf *buf);
33 static void gtk_canvas_ruler_draw (GtkCanvasItem *item, GdkDrawable *drawable, int x, int y, int w, int h);
35 static GtkCanvasItemClass *parent_class;
39 gtk_canvas_ruler_get_type (void)
41 static GtkType ruler_type = 0;
44 GtkTypeInfo ruler_info = {
46 sizeof (GtkCanvasRuler),
47 sizeof (GtkCanvasRulerClass),
48 (GtkClassInitFunc) gtk_canvas_ruler_class_init,
49 (GtkObjectInitFunc) gtk_canvas_ruler_init,
50 NULL, /* reserved_1 */
51 NULL, /* reserved_2 */
52 (GtkClassInitFunc) NULL
55 ruler_type = gtk_type_unique (gtk_canvas_item_get_type (), &ruler_info);
62 gtk_canvas_ruler_class_init (GtkCanvasRulerClass *class)
64 GtkObjectClass *object_class;
65 GtkCanvasItemClass *item_class;
67 object_class = (GtkObjectClass *) class;
68 item_class = (GtkCanvasItemClass *) class;
70 parent_class = gtk_type_class (gtk_canvas_item_get_type ());
72 gtk_object_add_arg_type ("GtkCanvasRuler::x1", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_X1);
73 gtk_object_add_arg_type ("GtkCanvasRuler::y1", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_Y1);
74 gtk_object_add_arg_type ("GtkCanvasRuler::x2", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_X2);
75 gtk_object_add_arg_type ("GtkCanvasRuler::y2", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_Y2);
76 gtk_object_add_arg_type ("GtkCanvasRuler::frames_per_unit", GTK_TYPE_LONG, GTK_ARG_READWRITE, ARG_FRAMES_PER_UNIT);
77 gtk_object_add_arg_type ("GtkCanvasRuler::fill_color", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_FILL_COLOR);
78 gtk_object_add_arg_type ("GtkCanvasRuler::tick_color", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_TICK_COLOR);
80 object_class->set_arg = gtk_canvas_ruler_set_arg;
81 object_class->get_arg = gtk_canvas_ruler_get_arg;
83 item_class->update = gtk_canvas_ruler_update;
84 item_class->bounds = gtk_canvas_ruler_bounds;
85 item_class->point = gtk_canvas_ruler_point;
86 item_class->render = gtk_canvas_ruler_render;
87 item_class->draw = gtk_canvas_ruler_draw;
91 gtk_canvas_ruler_init (GtkCanvasRuler *ruler)
97 ruler->frames_per_unit = 1;
98 ruler->fill_color = 0;
99 ruler->tick_color = 0;
101 GTK_CANVAS_ITEM(ruler)->object.flags |= GTK_CANVAS_ITEM_NO_AUTO_REDRAW;
105 gtk_canvas_ruler_reset_bounds (GtkCanvasItem *item)
108 double x1, x2, y1, y2;
111 int Ix1, Ix2, Iy1, Iy2;
114 gtk_canvas_ruler_bounds (item, &x1, &y1, &x2, &y2);
121 gtk_canvas_item_i2w_affine (item, i2w);
122 art_affine_point (&w1, &i1, i2w);
123 art_affine_point (&w2, &i2, i2w);
125 Ix1 = (int) rint(w1.x);
126 Ix2 = (int) rint(w2.x);
127 Iy1 = (int) rint(w1.y);
128 Iy2 = (int) rint(w2.y);
130 gtk_canvas_update_bbox (item, Ix1, Iy1, Ix2, Iy2);
138 gtk_canvas_ruler_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
141 GtkCanvasRuler *ruler;
145 item = GTK_CANVAS_ITEM (object);
146 ruler = GTK_CANVAS_RULER (object);
153 if (ruler->x1 != GTK_VALUE_DOUBLE (*arg)) {
154 ruler->x1 = GTK_VALUE_DOUBLE (*arg);
160 if (ruler->y1 != GTK_VALUE_DOUBLE (*arg)) {
161 ruler->y1 = GTK_VALUE_DOUBLE (*arg);
167 if (ruler->x2 != GTK_VALUE_DOUBLE (*arg)) {
168 ruler->x2 = GTK_VALUE_DOUBLE (*arg);
174 if (ruler->y2 != GTK_VALUE_DOUBLE (*arg)) {
175 ruler->y2 = GTK_VALUE_DOUBLE (*arg);
180 case ARG_FRAMES_PER_UNIT:
181 if (ruler->frames_per_unit != GTK_VALUE_LONG(*arg)) {
182 ruler->frames_per_unit = GTK_VALUE_LONG(*arg);
188 if (ruler->fill_color != GTK_VALUE_INT(*arg)) {
189 ruler->fill_color = GTK_VALUE_INT(*arg);
195 if (ruler->tick_color != GTK_VALUE_INT(*arg)) {
196 ruler->tick_color = GTK_VALUE_INT(*arg);
206 gtk_canvas_ruler_reset_bounds (item);
210 gtk_canvas_item_request_update (item);
216 gtk_canvas_ruler_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
218 GtkCanvasRuler *ruler;
220 ruler = GTK_CANVAS_RULER (object);
224 GTK_VALUE_DOUBLE (*arg) = ruler->x1;
227 GTK_VALUE_DOUBLE (*arg) = ruler->y1;
230 GTK_VALUE_DOUBLE (*arg) = ruler->x2;
233 GTK_VALUE_DOUBLE (*arg) = ruler->y2;
235 case ARG_FRAMES_PER_UNIT:
236 GTK_VALUE_LONG (*arg) = ruler->frames_per_unit;
239 GTK_VALUE_INT (*arg) = ruler->fill_color;
242 GTK_VALUE_INT (*arg) = ruler->tick_color;
245 arg->type = GTK_TYPE_INVALID;
251 gtk_canvas_ruler_update (GtkCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
253 GtkCanvasRuler *ruler;
257 ruler = GTK_CANVAS_RULER (item);
259 if (parent_class->update)
260 (* parent_class->update) (item, affine, clip_path, flags);
262 gtk_canvas_ruler_reset_bounds (item);
267 gtk_canvas_item_i2w (item, &x, &y);
268 gtk_canvas_w2c (GTK_CANVAS(item->canvas), x, y, &ruler->bbox_ulx, &ruler->bbox_uly);
273 gtk_canvas_item_i2w (item, &x, &y);
274 gtk_canvas_w2c (GTK_CANVAS(item->canvas), x, y, &ruler->bbox_lrx, &ruler->bbox_lry);
276 UINT_TO_RGB (ruler->tick_color, &ruler->tick_r, &ruler->tick_g, &ruler->tick_b);
277 UINT_TO_RGB (ruler->fill_color, &ruler->fill_r, &ruler->fill_g, &ruler->fill_b);
281 gtk_canvas_ruler_render (GtkCanvasItem *item,
284 GtkCanvasRuler *ruler;
287 ruler = GTK_CANVAS_RULER (item);
289 if (parent_class->render) {
290 (*parent_class->render) (item, buf);
294 gtk_canvas_buf_ensure_buf (buf);
298 begin = MAX(ruler->bbox_ulx,buf->rect.x0);
300 if (ruler->bbox_lrx >= 0) {
301 end = MIN(ruler->bbox_lrx,buf->rect.x1);
310 PAINT_BOX (buf, ruler->fill_r, ruler->fill_g, ruler->fill_b, 255, begin, ruler->bbox_uly, end, ruler->bbox_lry - 1);
311 PAINT_HORIZ (buf, ruler->tick_r, ruler->tick_g, ruler->tick_b, begin, end, ruler->bbox_lry - 1);
315 gtk_canvas_ruler_draw (GtkCanvasItem *item,
316 GdkDrawable *drawable,
318 int width, int height)
320 GtkCanvasRuler *ruler;
322 ruler = GTK_CANVAS_RULER (item);
324 if (parent_class->draw) {
325 (* parent_class->draw) (item, drawable, x, y, width, height);
328 fprintf (stderr, "please don't use the CanvasRuler item in a non-aa Canvas\n");
333 gtk_canvas_ruler_bounds (GtkCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
335 GtkCanvasRuler *ruler = GTK_CANVAS_RULER (item);
344 gtk_canvas_ruler_point (GtkCanvasItem *item, double x, double y, int cx, int cy, GtkCanvasItem **actual_item)
346 GtkCanvasRuler *ruler;
347 double x1, y1, x2, y2;
350 ruler = GTK_CANVAS_RULER (item);
354 /* Find the bounds for the rectangle plus its outline width */
356 gtk_canvas_ruler_bounds (item, &x1, &y1, &x2, &y2);
358 /* Is point inside rectangle */
360 if ((x >= x1) && (y >= y1) && (x <= x2) && (y <= y2)) {
364 /* Point is outside rectangle */
380 return sqrt (dx * dx + dy * dy);