3 #include <libgnomecanvas/libgnomecanvas.h>
5 #include "canvas-simpleline.h"
6 #include "rgb_macros.h"
8 #define _(Text) dgettext (PACKAGE,Text)
19 static void gnome_canvas_simpleline_class_init (GnomeCanvasSimpleLineClass *class);
20 static void gnome_canvas_simpleline_init (GnomeCanvasSimpleLine *simpleline);
21 static void gnome_canvas_simpleline_set_property (GObject *object,
25 static void gnome_canvas_simpleline_get_property (GObject *object,
30 static void gnome_canvas_simpleline_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags);
31 static void gnome_canvas_simpleline_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2);
32 static double gnome_canvas_simpleline_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item);
33 static void gnome_canvas_simpleline_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf);
34 static void gnome_canvas_simpleline_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int w, int h);
36 static GnomeCanvasItemClass *parent_class;
40 gnome_canvas_simpleline_get_type (void)
42 static GtkType simpleline_type = 0;
44 if (!simpleline_type) {
45 GtkTypeInfo simpleline_info = {
46 "GnomeCanvasSimpleLine",
47 sizeof (GnomeCanvasSimpleLine),
48 sizeof (GnomeCanvasSimpleLineClass),
49 (GtkClassInitFunc) gnome_canvas_simpleline_class_init,
50 (GtkObjectInitFunc) gnome_canvas_simpleline_init,
51 NULL, /* reserved_1 */
52 NULL, /* reserved_2 */
53 (GtkClassInitFunc) NULL
56 simpleline_type = gtk_type_unique (gnome_canvas_item_get_type (), &simpleline_info);
59 return simpleline_type;
63 gnome_canvas_simpleline_class_init (GnomeCanvasSimpleLineClass *class)
65 GObjectClass *object_class;
66 GnomeCanvasItemClass *item_class;
68 object_class = G_OBJECT_CLASS (class);
69 item_class = (GnomeCanvasItemClass *) class;
71 parent_class = gtk_type_class (gnome_canvas_item_get_type ());
73 object_class->set_property = gnome_canvas_simpleline_set_property;
74 object_class->get_property = gnome_canvas_simpleline_get_property;
76 g_object_class_install_property (object_class,
78 g_param_spec_double ("x1",
80 _("x coordinate of upper left corner of rect"),
86 g_object_class_install_property (object_class,
88 g_param_spec_double ("y1",
90 _("y coordinate of upper left corner of rect "),
97 g_object_class_install_property (object_class,
99 g_param_spec_double ("x2",
101 _("x coordinate of lower right corner of rect"),
107 g_object_class_install_property (object_class,
109 g_param_spec_double ("y2",
111 _("y coordinate of lower right corner of rect "),
116 g_object_class_install_property (object_class,
118 g_param_spec_uint ("color_rgba",
126 item_class->update = gnome_canvas_simpleline_update;
127 item_class->bounds = gnome_canvas_simpleline_bounds;
128 item_class->point = gnome_canvas_simpleline_point;
129 item_class->render = gnome_canvas_simpleline_render;
130 item_class->draw = gnome_canvas_simpleline_draw;
134 gnome_canvas_simpleline_init (GnomeCanvasSimpleLine *simpleline)
136 simpleline->x1 = 0.0;
137 simpleline->y1 = 0.0;
138 simpleline->x2 = 0.0;
139 simpleline->y2 = 0.0;
140 simpleline->color = RGBA_TO_UINT(98,123,174,241);
141 simpleline->horizontal = TRUE; /* reset in the _update() method */
143 // GNOME_CANVAS_ITEM(simpleline)->object.flags |= GNOME_CANVAS_ITEM_NO_AUTO_REDRAW;
147 gnome_canvas_simpleline_bounds_world (GnomeCanvasItem *item, int* ix1, int* iy1, int* ix2, int* iy2)
149 double x1, x2, y1, y2;
153 GnomeCanvasSimpleLine *simpleline = GNOME_CANVAS_SIMPLELINE(item);
155 gnome_canvas_simpleline_bounds (item, &x1, &y1, &x2, &y2);
162 gnome_canvas_item_i2w_affine (item, i2w);
163 art_affine_point (&w1, &i1, i2w);
164 art_affine_point (&w2, &i2, i2w);
166 *ix1 = (int) rint(w1.x);
167 *ix2 = (int) rint(w2.x);
168 *iy1 = (int) rint(w1.y);
169 *iy2 = (int) rint(w2.y);
171 /* the update rect has to be of non-zero width and height */
174 simpleline->horizontal = FALSE;
177 simpleline->horizontal = TRUE;
183 gnome_canvas_simpleline_reset_bounds (GnomeCanvasItem *item)
185 int Ix1, Ix2, Iy1, Iy2;
187 gnome_canvas_simpleline_bounds_world (item, &Ix1, &Iy1, &Ix2, &Iy2);
188 gnome_canvas_update_bbox (item, Ix1, Iy1, Ix2, Iy2);
196 gnome_canvas_simpleline_set_property (GObject *object,
202 GnomeCanvasSimpleLine *simpleline;
204 int bounds_changed = FALSE;
206 simpleline = GNOME_CANVAS_SIMPLELINE (object);
210 if (simpleline->x1 != g_value_get_double (value)) {
211 simpleline->x1 = g_value_get_double (value);
212 bounds_changed = TRUE;
217 if (simpleline->y1 != g_value_get_double (value)) {
218 simpleline->y1 = g_value_get_double (value);
219 bounds_changed = TRUE;
224 if (simpleline->x2 != g_value_get_double (value)) {
225 simpleline->x2 = g_value_get_double (value);
226 bounds_changed = TRUE;
231 if (simpleline->y2 != g_value_get_double (value)) {
232 simpleline->y2 = g_value_get_double (value);
233 bounds_changed = TRUE;
237 case PROP_COLOR_RGBA:
238 if (simpleline->color != g_value_get_uint(value)) {
239 simpleline->color = g_value_get_uint(value);
247 if (update || bounds_changed) {
248 gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(object));
253 gnome_canvas_simpleline_get_property (GObject *object,
258 GnomeCanvasSimpleLine *line = GNOME_CANVAS_SIMPLELINE (object);
262 g_value_set_double (value, line->x1);
265 g_value_set_double (value, line->x2);
268 g_value_set_double (value, line->y1);
271 g_value_set_double (value, line->y2);
273 case PROP_COLOR_RGBA:
274 g_value_set_uint (value, line->color);
277 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
283 gnome_canvas_simpleline_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
285 GnomeCanvasSimpleLine *simpleline;
289 simpleline = GNOME_CANVAS_SIMPLELINE (item);
291 if (parent_class->update)
292 (* parent_class->update) (item, affine, clip_path, flags);
294 gnome_canvas_simpleline_reset_bounds (item);
299 gnome_canvas_item_i2w (item, &x, &y);
300 gnome_canvas_w2c (GNOME_CANVAS(item->canvas), x, y, &simpleline->bbox_ulx, &simpleline->bbox_uly);
305 gnome_canvas_item_i2w (item, &x, &y);
306 gnome_canvas_w2c (GNOME_CANVAS(item->canvas), x, y, &simpleline->bbox_lrx, &simpleline->bbox_lry);
310 gnome_canvas_simpleline_render (GnomeCanvasItem *item,
313 GnomeCanvasSimpleLine *simpleline;
316 simpleline = GNOME_CANVAS_SIMPLELINE (item);
318 if (parent_class->render) {
319 (*parent_class->render) (item, buf);
323 gnome_canvas_buf_ensure_buf (buf);
327 // begin = MAX(simpleline->bbox_ulx,buf->rect.x0);
328 // end = MIN(simpleline->bbox_lrx,buf->rect.x1);
330 begin = simpleline->bbox_ulx;
331 end = simpleline->bbox_lrx;
333 if (simpleline->color != 0) {
334 if (simpleline->horizontal) {
335 PAINT_HORIZA(buf, simpleline->r, simpleline->g, simpleline->b, simpleline->a,
336 begin, end, simpleline->bbox_uly);
338 PAINT_VERTA(buf, simpleline->r, simpleline->g, simpleline->b, simpleline->a,
339 begin, simpleline->bbox_uly, simpleline->bbox_lry);
345 gnome_canvas_simpleline_draw (GnomeCanvasItem *item,
346 GdkDrawable *drawable,
348 int width, int height)
350 GnomeCanvasSimpleLine *simpleline;
352 simpleline = GNOME_CANVAS_SIMPLELINE (item);
354 if (parent_class->draw) {
355 (* parent_class->draw) (item, drawable, x, y, width, height);
358 fprintf (stderr, "please don't use the CanvasSimpleLine item in a non-aa Canvas\n");
363 gnome_canvas_simpleline_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
365 GnomeCanvasSimpleLine *simpleline = GNOME_CANVAS_SIMPLELINE (item);
367 *x1 = simpleline->x1;
368 *y1 = simpleline->y1;
369 *x2 = simpleline->x2;
370 *y2 = simpleline->y2;
374 gnome_canvas_simpleline_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item)
376 GnomeCanvasSimpleLine *simpleline;
377 double x1, y1, x2, y2;
380 simpleline = GNOME_CANVAS_SIMPLELINE (item);
384 /* Find the bounds for the rectangle plus its outline width */
386 gnome_canvas_simpleline_bounds (item, &x1, &y1, &x2, &y2);
388 /* Is point inside rectangle */
390 if ((x >= x1) && (y >= y1) && (x <= x2) && (y <= y2)) {
394 /* Point is outside rectangle */
410 return sqrt (dx * dx + dy * dy);