more tranzport lowlevel fixes and rebinding
[ardour.git] / gtk2_ardour / canvas-simplerect.c
1 #include <stdio.h>
2 #include <math.h>
3 #include <libgnomecanvas/libgnomecanvas.h>
4
5 #include "canvas-simplerect.h"
6 #include "rgb_macros.h"
7 #include "gettext.h"
8 #define _(Text)  dgettext (PACKAGE,Text)
9
10 enum {
11         PROP_0,
12         PROP_X1,
13         PROP_Y1,
14         PROP_X2,
15         PROP_Y2,
16         PROP_OUTLINE_PIXELS,
17         PROP_OUTLINE_WHAT,
18         PROP_FILL,
19         PROP_FILL_COLOR_RGBA,
20         PROP_OUTLINE_COLOR_RGBA,
21         PROP_DRAW
22         
23 };
24
25 static void   gnome_canvas_simplerect_class_init    (GnomeCanvasSimpleRectClass *class);
26
27 static void   gnome_canvas_simplerect_init          (GnomeCanvasSimpleRect      *simplerect);
28
29 static void   gnome_canvas_simplerect_destroy       (GtkObject                  *object);
30
31 static void   gnome_canvas_simplerect_set_property  (GObject        *object,
32                                                      guint            prop_id,
33                                                      const GValue   *value,
34                                                      GParamSpec     *pspec);
35
36 static void   gnome_canvas_simplerect_get_property  (GObject        *object,
37                                                      guint           prop_id,
38                                                      GValue         *value,
39                                                      GParamSpec     *pspec);
40
41 static void   gnome_canvas_simplerect_update        (GnomeCanvasItem *item,
42                                                      double          *affine,
43                                                      ArtSVP          *clip_path,
44                                                      int              flags);
45
46 static void   gnome_canvas_simplerect_bounds        (GnomeCanvasItem *item,
47                                                      double          *x1,
48                                                      double          *y1,
49                                                      double          *x2,
50                                                      double          *y2);
51
52 static double gnome_canvas_simplerect_point         (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item);
53
54 static void   gnome_canvas_simplerect_render        (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
55
56 static void   gnome_canvas_simplerect_draw          (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int w, int h);
57
58 static GnomeCanvasItemClass *parent_class;
59
60
61 GType
62 gnome_canvas_simplerect_get_type (void)
63 {
64         static GType simplerect_type;
65
66         if (!simplerect_type) {
67                 static const GTypeInfo object_info = {
68                         sizeof (GnomeCanvasSimpleRectClass),
69                         (GBaseInitFunc) NULL,
70                         (GBaseFinalizeFunc) NULL,
71                         (GClassInitFunc) gnome_canvas_simplerect_class_init,
72                         (GClassFinalizeFunc) NULL,
73                         NULL,                   /* class_data */
74                         sizeof (GnomeCanvasSimpleRect),
75                         0,                      /* n_preallocs */
76                         (GInstanceInitFunc) gnome_canvas_simplerect_init,
77                         NULL                    /* value_table */
78                 };
79
80                 simplerect_type = g_type_register_static (GNOME_TYPE_CANVAS_ITEM, "GnomeCanvasSimpleRect",
81                                                           &object_info, 0);
82         }
83
84         return simplerect_type;
85 }
86
87 static void
88 gnome_canvas_simplerect_class_init (GnomeCanvasSimpleRectClass *class)
89 {
90         GObjectClass *gobject_class;
91         GtkObjectClass *object_class;
92         GnomeCanvasItemClass *item_class;
93
94         gobject_class = (GObjectClass *) class;
95         object_class = (GtkObjectClass *) class;
96         item_class = (GnomeCanvasItemClass *) class;
97         
98         parent_class = g_type_class_peek_parent (class);
99
100         gobject_class->set_property = gnome_canvas_simplerect_set_property;
101         gobject_class->get_property = gnome_canvas_simplerect_get_property;
102         
103         g_object_class_install_property (gobject_class,
104                                          PROP_X1,
105                                          g_param_spec_double ("x1",
106                                                               _("x1"),
107                                                               _("x coordinate of upper left corner of rect"),
108                                                               -G_MAXDOUBLE,
109                                                               G_MAXDOUBLE,
110                                                               0.0,
111                                                               G_PARAM_READWRITE));  
112         
113         g_object_class_install_property (gobject_class,
114                                          PROP_Y1,
115                                          g_param_spec_double ("y1",
116                                                               _("y1"),
117                                                               _("y coordinate of upper left corner of rect "),
118                                                               -G_MAXDOUBLE,
119                                                               G_MAXDOUBLE,
120                                                               0.0,
121                                                               G_PARAM_READWRITE));  
122         
123
124         g_object_class_install_property (gobject_class,
125                                          PROP_X2,
126                                          g_param_spec_double ("x2",
127                                                               _("x2"),
128                                                               _("x coordinate of lower right corner of rect"),
129                                                               -G_MAXDOUBLE,
130                                                               G_MAXDOUBLE,
131                                                               0.0,
132                                                               G_PARAM_READWRITE));  
133         
134         g_object_class_install_property (gobject_class,
135                                          PROP_Y2,
136                                          g_param_spec_double ("y2",
137                                                               _("y2"),
138                                                               _("y coordinate of lower right corner of rect "),
139                                                               -G_MAXDOUBLE,
140                                                               G_MAXDOUBLE,
141                                                               0.0,
142                                                               G_PARAM_READWRITE));  
143         
144
145         g_object_class_install_property (gobject_class,
146                                          PROP_OUTLINE_PIXELS,
147                                          g_param_spec_uint ("outline_pixels",
148                                                               _("outline pixels"),
149                                                               _("width in pixels of outline"),
150                                                               0,
151                                                               G_MAXUINT,
152                                                               0,
153                                                               G_PARAM_READWRITE));  
154         
155
156         g_object_class_install_property (gobject_class,
157                                          PROP_OUTLINE_WHAT,
158                                          g_param_spec_uint ("outline_what",
159                                                               _("outline what"),
160                                                               _("which boundaries to outline (mask)"),
161                                                               0,
162                                                               G_MAXUINT,
163                                                               0,
164                                                               G_PARAM_READWRITE));  
165         
166
167
168         g_object_class_install_property (gobject_class,
169                                          PROP_FILL,
170                                          g_param_spec_boolean ("fill",
171                                                                _("fill"),
172                                                                _("fill rectangle"),
173                                                                TRUE,
174                                                                G_PARAM_READWRITE));  
175         
176         g_object_class_install_property (gobject_class,
177                                          PROP_DRAW,
178                                          g_param_spec_boolean ("draw",
179                                                                _("draw"),
180                                                                _("draw rectangle"),
181                                                                TRUE,
182                                                                G_PARAM_READWRITE));  
183         
184
185         g_object_class_install_property (gobject_class,
186                                          PROP_OUTLINE_COLOR_RGBA,
187                                          g_param_spec_uint ("outline_color_rgba",
188                                                             _("outline color rgba"),
189                                                             _("color of outline"),
190                                                             0,
191                                                             G_MAXUINT,
192                                                             0,
193                                                             G_PARAM_READWRITE));  
194         
195
196         g_object_class_install_property (gobject_class,
197                                          PROP_FILL_COLOR_RGBA,
198                                          g_param_spec_uint ("fill_color_rgba",
199                                                             _("fill color rgba"),
200                                                             _("color of fill"),
201                                                             0,
202                                                             G_MAXUINT,
203                                                             0,
204                                                             G_PARAM_READWRITE));  
205
206         object_class->destroy = gnome_canvas_simplerect_destroy;
207
208         item_class->update = gnome_canvas_simplerect_update;
209         item_class->draw = gnome_canvas_simplerect_draw;
210         item_class->bounds = gnome_canvas_simplerect_bounds;
211         item_class->point = gnome_canvas_simplerect_point;
212         item_class->render = gnome_canvas_simplerect_render;
213
214 }
215
216 static void
217 gnome_canvas_simplerect_init (GnomeCanvasSimpleRect *simplerect)
218 {
219         simplerect->x1 = 0.0;
220         simplerect->y1 = 0.0;
221         simplerect->x2 = 0.0;
222         simplerect->y2 = 0.0;
223         simplerect->fill = TRUE;
224         simplerect->draw = TRUE;
225         simplerect->full_draw_on_update = TRUE;
226         simplerect->fill_color = 0;
227         simplerect->outline_color = 0;
228         simplerect->outline_pixels = 1;
229         simplerect->outline_what = 0xf;
230 }
231
232 static void
233 gnome_canvas_simplerect_destroy (GtkObject *object)
234 {
235         GnomeCanvasSimpleRect *rect;
236         
237         g_return_if_fail (object != NULL);
238         g_return_if_fail (GNOME_IS_CANVAS_SIMPLERECT (object));
239
240         rect = GNOME_CANVAS_SIMPLERECT (object);
241
242         /* remember, destroy can be run multiple times! */
243
244         if (GTK_OBJECT_CLASS (parent_class)->destroy)
245               (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
246 }
247
248 static void
249 gnome_canvas_simplerect_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
250 {
251         GnomeCanvasSimpleRect *simplerect = GNOME_CANVAS_SIMPLERECT (item);
252
253         *x1 = simplerect->x1;
254         *y1 = simplerect->y1;
255         *x2 = simplerect->x2 + 1;
256         *y2 = simplerect->y2 + 1;
257
258 }
259
260 static void 
261 gnome_canvas_simplerect_reset_bounds (GnomeCanvasItem *item)
262 {
263         GnomeCanvasSimpleRect* simplerect;
264         double x1, x2, y1, y2;
265         double old_x1, old_x2, old_y1, old_y2;
266         double a, b;
267         
268         old_x1 = item->x1;
269         old_y1 = item->y1;
270         old_x2 = item->x2;
271         old_y2 = item->y2;
272
273         gnome_canvas_simplerect_bounds (item, &x1, &y1, &x2, &y2);
274         gnome_canvas_item_i2w (item, &x1, &y1);
275         gnome_canvas_item_i2w (item, &x2, &y2);
276
277         item->x1 = x1;
278         item->y1 = y1;
279         item->x2 = x2;
280         item->y2 = y2;
281
282         /* now compute bounding box in canvas units */
283
284         simplerect = GNOME_CANVAS_SIMPLERECT (item);
285
286         gnome_canvas_w2c (GNOME_CANVAS(item->canvas), x1, y1, &simplerect->bbox_ulx, &simplerect->bbox_uly);
287         gnome_canvas_w2c (GNOME_CANVAS(item->canvas), x2, y2, &simplerect->bbox_lrx, &simplerect->bbox_lry);
288
289         /* now queue redraws for changed areas */
290
291         if (item->x1 != old_x1) {
292                 
293                 /* left edge changed. redraw the area that altered */
294                 
295                 a = MIN(item->x1, old_x1); 
296                 b = MAX(item->x1, old_x1);
297                 gnome_canvas_request_redraw (item->canvas, a - 1, item->y1, b + 1, item->y2);
298         }
299         
300         if (item->x2 != old_x2) {
301                 
302                 /* right edge changed. redraw the area that altered */
303                 
304                 a = MIN(item->x2, old_x2);
305                 b = MAX(item->x2, old_x2);
306                 gnome_canvas_request_redraw (item->canvas, a - 1, item->y1, b + 1, item->y2);
307         }
308         
309         if (item->y1 != old_y1) {
310                 
311                 /* top edge changed. redraw the area that altered */
312                 
313                 a = MIN(item->y1, old_y1);
314                 b = MAX(item->y1, old_y1);
315                 gnome_canvas_request_redraw (item->canvas, item->x1, a - 1, item->x2, b + 1);
316         }
317         
318         if (item->y2 != old_y2) {
319                 
320                 /* lower edge changed. redraw the area that altered */
321                 
322                 a = MIN(item->y2, old_y2);
323                 b = MAX(item->y2, old_y2);
324                 gnome_canvas_request_redraw (item->canvas, item->x1, a - 1, item->x2, b + 1);
325         }
326 }
327
328 /* 
329  * CANVAS CALLBACKS 
330  */
331
332 static void
333 gnome_canvas_simplerect_set_property (GObject      *object,
334                                       guint         prop_id,
335                                       const GValue *value,
336                                       GParamSpec   *pspec)
337
338 {
339         GnomeCanvasSimpleRect *simplerect;
340         int update = FALSE;
341         int bounds_changed = FALSE;
342         g_return_if_fail (object != NULL);
343         g_return_if_fail (GNOME_IS_CANVAS_SIMPLERECT (object));
344
345         simplerect = GNOME_CANVAS_SIMPLERECT (object);
346
347         switch (prop_id) {
348         case PROP_X1:
349                 if (simplerect->x1 != g_value_get_double (value)) {
350                         simplerect->x1 = g_value_get_double (value);
351                         bounds_changed = TRUE;
352                 }
353                 break;
354
355         case PROP_Y1:
356                 if (simplerect->y1 != g_value_get_double (value)) {
357                         simplerect->y1 = g_value_get_double (value);
358                         bounds_changed = TRUE;
359                 }
360                 break;
361
362         case PROP_X2:
363                 if (simplerect->x2 != g_value_get_double (value)) {
364                         simplerect->x2 = g_value_get_double (value);
365                         bounds_changed = TRUE;
366                 }
367                 break;
368
369         case PROP_Y2:
370                 if (simplerect->y2 != g_value_get_double (value)) {
371                         simplerect->y2 = g_value_get_double (value);
372                         bounds_changed = TRUE;
373                 }
374                 break;
375
376         case PROP_DRAW:
377                 if (simplerect->draw != g_value_get_boolean (value)) {
378                         simplerect->draw = g_value_get_boolean (value);
379                         update = TRUE;
380                 }
381                 break;
382
383
384         case PROP_FILL:
385                 if (simplerect->fill != g_value_get_boolean (value)) {
386                         simplerect->fill = g_value_get_boolean (value);
387                         update = TRUE;
388                 }
389                 break;
390
391         case PROP_FILL_COLOR_RGBA:
392                 if (simplerect->fill_color != g_value_get_uint(value)) {
393                         simplerect->fill_color = g_value_get_uint(value);
394                         update = TRUE;
395                 }
396                 break;
397
398         case PROP_OUTLINE_COLOR_RGBA:
399                 if (simplerect->outline_color != g_value_get_uint(value)) {
400                         simplerect->outline_color = g_value_get_uint(value);
401                         update = TRUE;
402                 }
403                 break;
404
405         case PROP_OUTLINE_PIXELS:
406                 if (simplerect->outline_pixels != g_value_get_uint(value)) {
407                         simplerect->outline_pixels = g_value_get_uint(value);
408                         update = TRUE;
409                 }
410                 break;
411
412         case PROP_OUTLINE_WHAT:
413                 if (simplerect->outline_what != g_value_get_uint(value)) {
414                         simplerect->outline_what = g_value_get_uint(value);
415                         update = TRUE;
416                 }
417                 break;
418
419         default:
420                 break;
421         }
422
423         simplerect->full_draw_on_update = update;
424
425         if (update || bounds_changed) {
426                 gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(object));
427         }
428 }
429
430 static void
431 gnome_canvas_simplerect_get_property (GObject      *object,
432                                       guint         prop_id,
433                                       GValue       *value,
434                                       GParamSpec   *pspec)
435 {
436         GnomeCanvasSimpleRect *rect = GNOME_CANVAS_SIMPLERECT (object);
437         
438         g_return_if_fail (object != NULL);
439         g_return_if_fail (GNOME_IS_CANVAS_SIMPLERECT (object));
440
441         switch (prop_id) {
442         case PROP_X1:
443                 g_value_set_double (value, rect->x1);
444                 break;
445         case PROP_X2:
446                 g_value_set_double (value, rect->x2);
447                 break;
448         case PROP_Y1:
449                 g_value_set_double (value, rect->y1);
450                 break;
451         case PROP_Y2:
452                 g_value_set_double (value, rect->y2);
453                 break;
454         case PROP_OUTLINE_WHAT:
455                 g_value_set_uint (value, rect->outline_what);
456                 break;
457         case PROP_FILL:
458                 g_value_set_boolean (value, rect->fill);
459                 break;
460         case PROP_OUTLINE_PIXELS:
461                 g_value_set_uint (value, rect->outline_pixels);
462                 break;
463         case PROP_FILL_COLOR_RGBA:
464                 g_value_set_uint (value, rect->fill_color);
465                 break;
466         case PROP_OUTLINE_COLOR_RGBA:
467                 g_value_set_uint (value, rect->outline_color);
468                 break;
469         case PROP_DRAW:
470                 g_value_set_boolean (value, rect->draw);
471                 break;
472                 
473         default:
474                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
475                 break;
476         }
477 }
478
479
480 static void
481 gnome_canvas_simplerect_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
482 {
483         GnomeCanvasSimpleRect *simplerect;
484         unsigned char foo;
485
486         simplerect = GNOME_CANVAS_SIMPLERECT (item);
487
488         if (parent_class->update)
489                 (* parent_class->update) (item, affine, clip_path, flags);
490
491         gnome_canvas_simplerect_reset_bounds (item);
492
493         if (simplerect->full_draw_on_update) {
494                 gnome_canvas_request_redraw (item->canvas, 
495                                            simplerect->bbox_ulx,
496                                            simplerect->bbox_uly,
497                                            simplerect->bbox_lrx+1,
498                                            simplerect->bbox_lry+1);
499                 simplerect->full_draw_on_update = FALSE;
500         }
501
502         UINT_TO_RGBA (simplerect->fill_color, &simplerect->fill_r, &simplerect->fill_g, &simplerect->fill_b, &simplerect->fill_a);
503         UINT_TO_RGBA (simplerect->outline_color, &simplerect->outline_r, &simplerect->outline_g, &simplerect->outline_b, &foo);
504 }
505
506 // this can be useful for debugging/understanding how the canvas redraws
507 // stuff.
508
509 #undef HARLEQUIN_DEBUGGING
510
511 #undef SIMPLERECT_FAST_RENDERER
512 #ifdef SIMPLERECT_FAST_RENDERER
513
514 static void
515 gnome_canvas_simplerect_render (GnomeCanvasItem *item,
516                               GnomeCanvasBuf *buf)
517 {
518         GnomeCanvasSimpleRect *simplerect;
519         int end, begin;
520         int ey, sy;
521         unsigned int i;
522         ArtIRect intersection;
523         ArtIRect self;
524
525         simplerect = GNOME_CANVAS_SIMPLERECT (item);
526
527         if (parent_class->render) {
528                 (*parent_class->render) (item, buf);
529         }
530
531         if (buf->is_bg) {
532
533 #ifdef HARLEQUIN_DEBUGGING
534                 gint randr, randg, randb;
535                 randr = random() % 255;
536                 randg = random() % 255;
537                 randb = random() % 255;
538                 PAINT_BOX(buf, randr, randg, randb, 255, buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1);
539 #endif
540                 gnome_canvas_buf_ensure_buf (buf);
541                 buf->is_bg = FALSE;
542         }
543
544         if (!simplerect->draw) {
545                 return;
546         }
547         
548         self.x0 = simplerect->bbox_ulx;
549         self.y0 = simplerect->bbox_uly;
550         self.x1 = simplerect->bbox_lrx;
551         self.y1 = simplerect->bbox_lry;
552
553         art_irect_intersect (&intersection, &self, &buf->rect);
554
555         begin = MAX(simplerect->bbox_ulx, buf->rect.x0);
556         end = MIN((simplerect->bbox_lrx-1), buf->rect.x1);
557
558         sy = simplerect->bbox_uly;
559         ey = simplerect->bbox_lry-1;
560
561         if (simplerect->fill) {
562                 
563                 // this can be useful for debugging/understanding how the canvas redraws
564                 // stuff.
565
566 #ifdef HARLEQUIN_DEBUGGING
567                 gint randr, randg, randb;
568                 randr = random() % 255;
569                 randg = random() % 255;
570                 randb = random() % 255;
571                 PAINT_BOX(buf, randr, randg, randb, simplerect->fill_a, begin, sy, end, ey);
572 #else           
573                 PAINT_BOX (buf, simplerect->fill_r, simplerect->fill_g, simplerect->fill_b, simplerect->fill_a, 
574                            intersection.x0, intersection.y0,
575                            intersection.x1, intersection.y1);
576 #endif
577                 
578         }
579
580         for (i = 0; i < simplerect->outline_pixels; ++i) {
581
582                 if (simplerect->outline_what & 0x1) {
583                         if (begin == simplerect->bbox_ulx) {
584                                 PAINT_VERT(buf, simplerect->outline_r, simplerect->outline_g, simplerect->outline_b, begin + i, sy, ey);
585                         }
586                 }
587
588                 if (simplerect->outline_what & 0x2) {
589                         if (end == (simplerect->bbox_lrx - 1)) {
590                                 PAINT_VERT(buf, simplerect->outline_r, simplerect->outline_g, simplerect->outline_b, end - i, sy, ey + 1);
591                         }
592                 }
593
594                 if (simplerect->outline_what & 0x4) {
595                         PAINT_HORIZ(buf, simplerect->outline_r, simplerect->outline_g, simplerect->outline_b, begin, end, sy+i);
596                 }
597         
598                 if (simplerect->outline_what & 0x8) {
599                         PAINT_HORIZ(buf, simplerect->outline_r, simplerect->outline_g, simplerect->outline_b, begin, end + 1, ey-i);
600                 }
601         }
602 }
603
604 #else /* SIMPLERECT_FAST_RENDERER */
605
606 static void
607 gnome_canvas_simplerect_render (GnomeCanvasItem *item,
608                               GnomeCanvasBuf *buf)
609 {
610         GnomeCanvasSimpleRect *simplerect;
611         int end, begin;
612         int ey, sy;
613         unsigned int i;
614
615         simplerect = GNOME_CANVAS_SIMPLERECT (item);
616
617         if (parent_class->render) {
618                 (*parent_class->render) (item, buf);
619         }
620
621         if (buf->is_bg) {
622
623 #ifdef HARLEQUIN_DEBUGGING
624                 gint randr, randg, randb;
625                 randr = random() % 255;
626                 randg = random() % 255;
627                 randb = random() % 255;
628                 PAINT_BOX(buf, randr, randg, randb, 255, buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1);
629 #endif
630                 gnome_canvas_buf_ensure_buf (buf);
631                 buf->is_bg = FALSE;
632         }
633
634         if (!simplerect->draw) {
635                 return;
636         }
637
638         begin = MAX(simplerect->bbox_ulx,buf->rect.x0);
639         end = MIN((simplerect->bbox_lrx-1),buf->rect.x1);
640
641         sy = simplerect->bbox_uly;
642         ey = simplerect->bbox_lry-1;
643
644         if (simplerect->fill) {
645                 
646 #ifdef HARLEQUIN_DEBUGGING
647                 gint randr, randg, randb;
648                 randr = random() % 255;
649                 randg = random() % 255;
650                 randb = random() % 255;
651                 PAINT_BOX(buf, randr, randg, randb, simplerect->fill_a, begin, sy, end, ey);
652 #else           
653                 PAINT_BOX(buf, simplerect->fill_r, simplerect->fill_g, simplerect->fill_b, simplerect->fill_a, begin, sy, end, ey);
654 #endif
655         }
656
657         for (i = 0; i < simplerect->outline_pixels; ++i) {
658
659                 if (simplerect->outline_what & 0x1) {
660                         if (begin == simplerect->bbox_ulx) {
661                                 PAINT_VERT(buf, simplerect->outline_r, simplerect->outline_g, simplerect->outline_b, begin + i, sy, ey);
662                         }
663                 }
664
665                 if (simplerect->outline_what & 0x2) {
666                         if (end == (simplerect->bbox_lrx - 1)) {
667                                 PAINT_VERT(buf, simplerect->outline_r, simplerect->outline_g, simplerect->outline_b, end - i, sy, ey + 1);
668                         }
669                 }
670
671                 if (simplerect->outline_what & 0x4) {
672                         PAINT_HORIZ(buf, simplerect->outline_r, simplerect->outline_g, simplerect->outline_b, begin, end, sy+i);
673                 }
674         
675                 if (simplerect->outline_what & 0x8) {
676                         PAINT_HORIZ(buf, simplerect->outline_r, simplerect->outline_g, simplerect->outline_b, begin, end + 1, ey-i);
677                 }
678         }
679 }
680 #endif /* SIMPLERECT_FAST_RENDERER */
681
682 static void
683 gnome_canvas_simplerect_draw (GnomeCanvasItem *item,
684                             GdkDrawable *drawable,
685                             int x, int y,
686                             int width, int height)
687 {
688         fprintf (stderr, "please don't use the CanvasSimpleRect item in a non-aa Canvas\n");
689         abort ();
690 }
691
692 static double
693 gnome_canvas_simplerect_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item)
694 {
695         GnomeCanvasSimpleRect *simplerect;
696         double x1, y1, x2, y2;
697         double dx, dy;
698
699         simplerect = GNOME_CANVAS_SIMPLERECT (item);
700
701         *actual_item = item;
702
703         /* Find the bounds for the rectangle plus its outline width */
704
705         gnome_canvas_simplerect_bounds (item, &x1, &y1, &x2, &y2);
706
707         /* Is point inside rectangle */
708         
709         if ((x >= x1) && (y >= y1) && (x <= x2) && (y <= y2)) {
710                 return 0.0;
711         }
712
713         /* Point is outside rectangle */
714
715         if (x < x1)
716                 dx = x1 - x;
717         else if (x > x2)
718                 dx = x - x2;
719         else
720                 dx = 0.0;
721
722         if (y < y1)
723                 dy = y1 - y;
724         else if (y > y2)
725                 dy = y - y2;
726         else
727                 dy = 0.0;
728
729         return sqrt (dx * dx + dy * dy);
730 }