4 #include <libgnomecanvas/libgnomecanvas.h>
6 #include "canvas-simpleline.h"
7 #include "rgb_macros.h"
9 #define _(Text) dgettext (PACKAGE,Text)
20 static void gnome_canvas_simpleline_class_init (GnomeCanvasSimpleLineClass
*class);
22 static void gnome_canvas_simpleline_init (GnomeCanvasSimpleLine
*simpleline
);
24 static void gnome_canvas_simpleline_destroy (GtkObject
*object
);
26 static void gnome_canvas_simpleline_set_property (GObject
*object
,
30 static void gnome_canvas_simpleline_get_property (GObject
*object
,
35 static void gnome_canvas_simpleline_update (GnomeCanvasItem
*item
,
40 static void gnome_canvas_simpleline_bounds (GnomeCanvasItem
*item
,
46 static double gnome_canvas_simpleline_point (GnomeCanvasItem
*item
,
51 GnomeCanvasItem
**actual_item
);
53 static void gnome_canvas_simpleline_render (GnomeCanvasItem
*item
,
56 static void gnome_canvas_simpleline_draw (GnomeCanvasItem
*item
,
57 GdkDrawable
*drawable
,
63 static GnomeCanvasItemClass
*parent_class
;
67 gnome_canvas_simpleline_get_type (void)
69 static GType simpleline_type
;
71 if (!simpleline_type
) {
72 static const GTypeInfo object_info
= {
73 sizeof (GnomeCanvasSimpleLineClass
),
75 (GBaseFinalizeFunc
) NULL
,
76 (GClassInitFunc
) gnome_canvas_simpleline_class_init
,
77 (GClassFinalizeFunc
) NULL
,
78 NULL
, /* class_data */
79 sizeof (GnomeCanvasSimpleLine
),
81 (GInstanceInitFunc
) gnome_canvas_simpleline_init
,
82 NULL
/* value_table */
85 simpleline_type
= g_type_register_static (GNOME_TYPE_CANVAS_ITEM
, "GnomeCanvasSimpleLine",
89 return simpleline_type
;
93 gnome_canvas_simpleline_class_init (GnomeCanvasSimpleLineClass
*class)
95 GObjectClass
*gobject_class
;
96 GtkObjectClass
*object_class
;
97 GnomeCanvasItemClass
*item_class
;
99 gobject_class
= (GObjectClass
*) class;
100 object_class
= (GtkObjectClass
*) class;
101 item_class
= (GnomeCanvasItemClass
*) class;
103 parent_class
= g_type_class_peek_parent (class);
105 gobject_class
->set_property
= gnome_canvas_simpleline_set_property
;
106 gobject_class
->get_property
= gnome_canvas_simpleline_get_property
;
108 g_object_class_install_property (gobject_class
,
110 g_param_spec_double ("x1",
112 _("x coordinate of upper left corner of rect"),
118 g_object_class_install_property (gobject_class
,
120 g_param_spec_double ("y1",
122 _("y coordinate of upper left corner of rect "),
129 g_object_class_install_property (gobject_class
,
131 g_param_spec_double ("x2",
133 _("x coordinate of lower right corner of rect"),
139 g_object_class_install_property (gobject_class
,
141 g_param_spec_double ("y2",
143 _("y coordinate of lower right corner of rect "),
148 g_object_class_install_property (gobject_class
,
150 g_param_spec_uint ("color_rgba",
158 object_class
->destroy
= gnome_canvas_simpleline_destroy
;
160 item_class
->update
= gnome_canvas_simpleline_update
;
161 item_class
->bounds
= gnome_canvas_simpleline_bounds
;
162 item_class
->point
= gnome_canvas_simpleline_point
;
163 item_class
->render
= gnome_canvas_simpleline_render
;
164 item_class
->draw
= gnome_canvas_simpleline_draw
;
168 gnome_canvas_simpleline_init (GnomeCanvasSimpleLine
*simpleline
)
170 simpleline
->x1
= 0.0;
171 simpleline
->y1
= 0.0;
172 simpleline
->x2
= 0.0;
173 simpleline
->y2
= 0.0;
174 simpleline
->color
= RGBA_TO_UINT(98,123,174,241);
178 gnome_canvas_simpleline_destroy (GtkObject
*object
)
180 GnomeCanvasSimpleLine
*line
;
182 g_return_if_fail (object
!= NULL
);
183 g_return_if_fail (GNOME_IS_CANVAS_SIMPLELINE (object
));
185 line
= GNOME_CANVAS_SIMPLELINE (object
);
187 if (GTK_OBJECT_CLASS (parent_class
)->destroy
)
188 (* GTK_OBJECT_CLASS (parent_class
)->destroy
) (object
);
196 gnome_canvas_simpleline_set_property (GObject
*object
,
204 GnomeCanvasSimpleLine
*simpleline
;
206 int bounds_changed
= FALSE
;
209 g_return_if_fail (object
!= NULL
);
210 g_return_if_fail (GNOME_IS_CANVAS_SIMPLELINE (object
));
212 simpleline
= GNOME_CANVAS_SIMPLELINE (object
);
216 d
= g_value_get_double (value
);
217 if (simpleline
->x1
!= d
) {
219 bounds_changed
= TRUE
;
224 d
= g_value_get_double (value
);
225 if (simpleline
->y1
!= d
) {
227 bounds_changed
= TRUE
;
232 d
= g_value_get_double (value
);
233 if (simpleline
->x2
!= d
) {
235 bounds_changed
= TRUE
;
240 d
= g_value_get_double (value
);
241 if (simpleline
->y2
!= d
) {
243 bounds_changed
= TRUE
;
247 case PROP_COLOR_RGBA
:
248 if (simpleline
->color
!= g_value_get_uint(value
)) {
249 simpleline
->color
= g_value_get_uint(value
);
250 UINT_TO_RGBA (simpleline
->color
, &simpleline
->r
, &simpleline
->g
, &simpleline
->b
, &simpleline
->a
);
258 if (update
|| bounds_changed
) {
259 gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(object
));
264 gnome_canvas_simpleline_get_property (GObject
*object
,
269 g_return_if_fail (object
!= NULL
);
270 g_return_if_fail (GNOME_IS_CANVAS_SIMPLELINE (object
));
272 GnomeCanvasSimpleLine
*line
= GNOME_CANVAS_SIMPLELINE (object
);
276 g_value_set_double (value
, line
->x1
);
279 g_value_set_double (value
, line
->x2
);
282 g_value_set_double (value
, line
->y1
);
285 g_value_set_double (value
, line
->y2
);
287 case PROP_COLOR_RGBA
:
288 g_value_set_uint (value
, line
->color
);
291 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
297 gnome_canvas_simpleline_update (GnomeCanvasItem
*item
, double *affine
, ArtSVP
*clip_path
, int flags
)
299 GnomeCanvasSimpleLine
*simpleline
;
300 double x1
, x2
, y1
, y2
;
302 simpleline
= GNOME_CANVAS_SIMPLELINE (item
);
304 if (parent_class
->update
)
305 (* parent_class
->update
) (item
, affine
, clip_path
, flags
);
307 /* redraw old location */
309 gnome_canvas_request_redraw (item
->canvas
, item
->x1
, item
->y1
, item
->x2
, item
->y2
);
311 /* get current bounding box in parent-relative world coordinates */
313 gnome_canvas_simpleline_bounds (item
, &x1
, &y1
, &x2
, &y2
);
315 /* convert parent-relative item coordinates to world coordinates */
317 gnome_canvas_item_i2w (item
, &x1
, &y1
);
318 gnome_canvas_item_i2w (item
, &x2
, &y2
);
320 /* don't suffer from rounding errors */
327 /* force non-zero dimensionality for both axes */
337 /* reset item bounding box (canvas coordinates, so integral. but stored in doubles) */
339 gnome_canvas_w2c_d (GNOME_CANVAS(item
->canvas
), x1
, y1
, &item
->x1
, &item
->y1
);
340 gnome_canvas_w2c_d (GNOME_CANVAS(item
->canvas
), x2
, y2
, &item
->x2
, &item
->y2
);
342 /* redraw new location */
344 gnome_canvas_request_redraw (item
->canvas
, item
->x1
, item
->y1
, item
->x2
, item
->y2
);
346 /* store actual line coords as canvas coordinates for use in render() */
352 /* convert to world */
353 gnome_canvas_item_i2w (item
, &x1
, &y1
);
354 gnome_canvas_item_i2w (item
, &x2
, &y2
);
355 /* avoid rounding errors */
356 x1
= (int) floor (item
->x1
);
357 y1
= (int) floor (item
->y1
);
358 x2
= (int) ceil (item
->x2
);
359 y2
= (int) ceil (item
->y2
);
360 /* convert to canvas coordinates, integral, stored in integers */
361 gnome_canvas_w2c (GNOME_CANVAS(item
->canvas
), x1
, y1
, &simpleline
->cx1
, &simpleline
->cy1
);
362 gnome_canvas_w2c (GNOME_CANVAS(item
->canvas
), x2
, y2
, &simpleline
->cx2
, &simpleline
->cy2
);
366 gnome_canvas_simpleline_render (GnomeCanvasItem
*item
,
369 GnomeCanvasSimpleLine
*simpleline
;
373 simpleline
= GNOME_CANVAS_SIMPLELINE (item
);
375 x1
= simpleline
->cx1
;
376 x2
= simpleline
->cx2
;
377 y1
= simpleline
->cy1
;
380 gnome_canvas_buf_ensure_buf (buf
);
384 if (simpleline
->x1
!= simpleline
->x2
) {
385 PAINT_HORIZA(buf
, simpleline
->r
, simpleline
->g
, simpleline
->b
, simpleline
->a
,
388 y2
= simpleline
->cy2
;
389 PAINT_VERTA (buf
, simpleline
->r
, simpleline
->g
, simpleline
->b
, simpleline
->a
,
396 gnome_canvas_simpleline_draw (GnomeCanvasItem
*item
,
397 GdkDrawable
*drawable
,
399 int width
, int height
)
401 GnomeCanvasSimpleLine
*simpleline
;
403 simpleline
= GNOME_CANVAS_SIMPLELINE (item
);
405 /* XXX not implemented */
409 gnome_canvas_simpleline_bounds (GnomeCanvasItem
*item
, double *x1
, double *y1
, double *x2
, double *y2
)
411 GnomeCanvasSimpleLine
*simpleline
= GNOME_CANVAS_SIMPLELINE (item
);
413 *x1
= simpleline
->x1
;
414 *y1
= simpleline
->y1
;
415 *x2
= simpleline
->x1
;
416 *y2
= simpleline
->y2
;
420 gnome_canvas_simpleline_point (GnomeCanvasItem
*item
, double x
, double y
, int cx
, int cy
, GnomeCanvasItem
**actual_item
)
425 GnomeCanvasSimpleLine
*simpleline
;
426 double x1
, y1
, x2
, y2
;
429 simpleline
= GNOME_CANVAS_SIMPLELINE (item
);
433 /* Find the bounds for the line */
435 gnome_canvas_simpleline_bounds (item
, &x1
, &y1
, &x2
, &y2
);
437 /* Is point inside line */
439 if ((x
>= x1
) && (y
>= y1
) && (x
<= x2
) && (y
<= y2
)) {
442 /* Point is outside line */
458 return sqrt (dx
* dx
+ dy
* dy
);