]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-mini-preview.c
- Created Makefile.am in ./data and ./pixmaps directories
[glabels] / glabels2 / src / wdgt-mini-preview.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  wdgt_mini_preview.c:  mini preview widget module
5  *
6  *  Copyright (C) 2001  Jim Evins <evins@snaught.com>.
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  */
22
23 #include <config.h>
24
25 #include <math.h>
26
27 #include "wdgt-mini-preview.h"
28 #include "marshal.h"
29 #include "color.h"
30
31 #include "debug.h"
32
33 #define WDGT_MINI_PREVIEW_MAX_PIXELS 175
34 #define SHADOW_X_OFFSET 3
35 #define SHADOW_Y_OFFSET 3
36 #define SHADOW_COLOR GL_COLOR_A (33, 33, 33, 192)
37
38 #define RES 5 /* Resolution in degrees for Business Card CD outlines */
39
40 /*===========================================*/
41 /* Private types                             */
42 /*===========================================*/
43
44 enum {
45         CLICKED,
46         PRESSED,
47         LAST_SIGNAL
48 };
49
50
51 /*===========================================*/
52 /* Private globals                           */
53 /*===========================================*/
54
55 static GtkContainerClass *parent_class;
56
57 static gint wdgt_mini_preview_signals[LAST_SIGNAL] = { 0 };
58
59 /*===========================================*/
60 /* Local function prototypes                 */
61 /*===========================================*/
62
63 static void gl_wdgt_mini_preview_class_init    (glWdgtMiniPreviewClass * class);
64 static void gl_wdgt_mini_preview_instance_init (glWdgtMiniPreview * preview);
65 static void gl_wdgt_mini_preview_finalize      (GObject * object);
66
67 static void gl_wdgt_mini_preview_construct     (glWdgtMiniPreview * preview,
68                                                 gint height, gint width);
69
70 static GList *mini_outline_list_new            (GnomeCanvas *canvas,
71                                                 glTemplate *template);
72 static void mini_outline_list_free             (GList ** list);
73
74 static gint canvas_event_cb                    (GnomeCanvas * canvas,
75                                                 GdkEvent * event,
76                                                 gpointer data);
77
78 static GnomeCanvasItem *cdbc_item              (GnomeCanvasGroup *group,
79                                                 gdouble           x1,
80                                                 gdouble           y1,
81                                                 glTemplate       *template);
82
83
84 \f
85 /****************************************************************************/
86 /* Boilerplate Object stuff.                                                */
87 /****************************************************************************/
88 guint
89 gl_wdgt_mini_preview_get_type (void)
90 {
91         static guint wdgt_mini_preview_type = 0;
92
93         if (!wdgt_mini_preview_type) {
94                 GTypeInfo wdgt_mini_preview_info = {
95                         sizeof (glWdgtMiniPreviewClass),
96                         NULL,
97                         NULL,
98                         (GClassInitFunc) gl_wdgt_mini_preview_class_init,
99                         NULL,
100                         NULL,
101                         sizeof (glWdgtMiniPreview),
102                         0,
103                         (GInstanceInitFunc) gl_wdgt_mini_preview_instance_init,
104                 };
105
106                 wdgt_mini_preview_type =
107                         g_type_register_static (gtk_hbox_get_type (),
108                                                 "glWdgtMiniPreview",
109                                                 &wdgt_mini_preview_info, 0);
110         }
111
112         return wdgt_mini_preview_type;
113 }
114
115 static void
116 gl_wdgt_mini_preview_class_init (glWdgtMiniPreviewClass * class)
117 {
118         GObjectClass *object_class;
119
120         gl_debug (DEBUG_MINI_PREVIEW, "START");
121
122         object_class = (GObjectClass *) class;
123
124         parent_class = gtk_type_class (gtk_hbox_get_type ());
125
126         object_class->finalize = gl_wdgt_mini_preview_finalize;
127
128         wdgt_mini_preview_signals[CLICKED] =
129             g_signal_new ("clicked",
130                           G_OBJECT_CLASS_TYPE(object_class),
131                           G_SIGNAL_RUN_LAST,
132                           G_STRUCT_OFFSET (glWdgtMiniPreviewClass, clicked),
133                           NULL, NULL,
134                           gl_marshal_VOID__INT,
135                           G_TYPE_NONE, 1, G_TYPE_INT);
136
137         wdgt_mini_preview_signals[PRESSED] =
138             g_signal_new ("pressed",
139                           G_OBJECT_CLASS_TYPE(object_class),
140                           G_SIGNAL_RUN_LAST,
141                           G_STRUCT_OFFSET (glWdgtMiniPreviewClass, pressed),
142                           NULL, NULL,
143                           gl_marshal_VOID__INT_INT,
144                           G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
145
146         gl_debug (DEBUG_MINI_PREVIEW, "END");
147 }
148
149 static void
150 gl_wdgt_mini_preview_instance_init (glWdgtMiniPreview * preview)
151 {
152         gl_debug (DEBUG_MINI_PREVIEW, "START");
153
154         preview->canvas = NULL;
155         preview->label_items = NULL;
156
157         gl_debug (DEBUG_MINI_PREVIEW, "END");
158 }
159
160 static void
161 gl_wdgt_mini_preview_finalize (GObject * object)
162 {
163         glWdgtMiniPreview *preview;
164         glWdgtMiniPreviewClass *class;
165
166         gl_debug (DEBUG_MINI_PREVIEW, "START");
167
168         g_return_if_fail (object != NULL);
169         g_return_if_fail (GL_IS_WDGT_MINI_PREVIEW (object));
170
171         preview = GL_WDGT_MINI_PREVIEW (object);
172
173         G_OBJECT_CLASS (parent_class)->finalize (object);
174
175         gl_debug (DEBUG_MINI_PREVIEW, "END");
176 }
177
178 GtkWidget *
179 gl_wdgt_mini_preview_new (gint height,
180                           gint width)
181 {
182         glWdgtMiniPreview *preview;
183
184         gl_debug (DEBUG_MINI_PREVIEW, "START");
185
186         preview = g_object_new (gl_wdgt_mini_preview_get_type (), NULL);
187
188         gl_wdgt_mini_preview_construct (preview, height, width);
189
190         gl_debug (DEBUG_MINI_PREVIEW, "END");
191
192         return GTK_WIDGET (preview);
193 }
194
195 /*--------------------------------------------------------------------------*/
196 /* Construct composite widget.                                              */
197 /*--------------------------------------------------------------------------*/
198 static void
199 gl_wdgt_mini_preview_construct (glWdgtMiniPreview * preview,
200                                 gint height,
201                                 gint width)
202 {
203         GtkWidget *whbox;
204         GnomeCanvasGroup *group;
205
206         gl_debug (DEBUG_MINI_PREVIEW, "START");
207
208         whbox = GTK_WIDGET (preview);
209
210         preview->height = height;
211         preview->width  = width;
212
213         /* create canvas */
214         gtk_widget_push_colormap (gdk_rgb_get_colormap ());
215         preview->canvas = gnome_canvas_new_aa ();
216         gtk_widget_pop_colormap ();
217         gtk_box_pack_start (GTK_BOX (whbox), preview->canvas, TRUE, TRUE, 0);
218         gtk_widget_set_size_request (preview->canvas, width, height);
219         gnome_canvas_set_scroll_region (GNOME_CANVAS (preview->canvas),
220                                         0.0, 0.0, width, height);
221
222         gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (preview->canvas), 1.0);
223         group = gnome_canvas_root (GNOME_CANVAS (preview->canvas));
224
225         /* draw shadow */
226         preview->shadow_item =
227                 gnome_canvas_item_new (group,
228                                        gnome_canvas_rect_get_type (),
229                                        "x1", (gdouble)SHADOW_X_OFFSET,
230                                        "y1", (gdouble)SHADOW_Y_OFFSET,
231                                        "x2", (gdouble)(SHADOW_X_OFFSET + width),
232                                        "y2", (gdouble)(SHADOW_Y_OFFSET + height),
233                                        "fill_color_rgba", SHADOW_COLOR,
234                                        NULL);
235
236         /* draw an initial paper outline */
237         preview->paper_item =
238                 gnome_canvas_item_new (group,
239                                        gnome_canvas_rect_get_type (),
240                                        "x1", 0.0,
241                                        "y1", 0.0,
242                                        "x2", (gdouble)width,
243                                        "y2", (gdouble)height,
244                                        "width_pixels", 1,
245                                        "outline_color", "black",
246                                        "fill_color", "white",
247                                        NULL);
248
249         /* create empty list of label canvas items */
250         preview->label_items = NULL;
251         preview->labels_per_sheet = 0;
252
253         /* Event handler */
254         g_signal_connect (G_OBJECT (preview->canvas), "event",
255                           G_CALLBACK (canvas_event_cb), preview);
256
257         gl_debug (DEBUG_MINI_PREVIEW, "END");
258 }
259
260 /****************************************************************************/
261 /* Set label for mini-preview to determine geometry.                        */
262 /****************************************************************************/
263 void gl_wdgt_mini_preview_set_label (glWdgtMiniPreview *preview,
264                                      gchar             *name)
265 {
266         glTemplate *template;
267         gchar      *page_size;
268         gdouble     canvas_scale;
269         gdouble     w, h;
270         gdouble     shadow_x, shadow_y;
271
272         gl_debug (DEBUG_MINI_PREVIEW, "START");
273
274         /* Fetch template */
275         template = gl_template_from_name (name);
276
277         gl_debug (DEBUG_MINI_PREVIEW, "page_size = %s, page_width = %g, page_height = %g",
278                   template->page_size, template->page_width, template->page_height);
279
280         /* get paper size and set scale */
281         w = preview->width - 4 - 2*SHADOW_X_OFFSET;
282         h = preview->height - 4 - 2*SHADOW_Y_OFFSET;
283         if ( (w/template->page_width) > (h/template->page_height) ) {
284                 canvas_scale = h / template->page_height;
285         } else {
286                 canvas_scale = w / template->page_width;
287         }
288         gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (preview->canvas),
289                                           canvas_scale);
290 #if 0
291         gnome_canvas_set_scroll_region (GNOME_CANVAS (preview->canvas),
292                                         0.0, 0.0,
293                                         template->page_width, template->page_height);
294 #else
295         gnome_canvas_set_scroll_region (GNOME_CANVAS (preview->canvas),
296                                         0.0, 0.0,
297                                         preview->width/canvas_scale,
298                                         preview->height/canvas_scale);
299 #endif
300
301         /* update shadow */
302         shadow_x = SHADOW_X_OFFSET/canvas_scale;
303         shadow_y = SHADOW_Y_OFFSET/canvas_scale;
304         gnome_canvas_item_set (preview->shadow_item,
305                                "x1", shadow_x,
306                                "y1", shadow_y,
307                                "x2", shadow_x + template->page_width,
308                                "y2", shadow_y + template->page_height,
309                                NULL);
310
311         /* update paper outline */
312         gnome_canvas_item_set (preview->paper_item,
313                                "x2", template->page_width,
314                                "y2", template->page_height,
315                                NULL);
316
317         /* update label items */
318         mini_outline_list_free (&preview->label_items);
319         preview->label_items =
320                 mini_outline_list_new (GNOME_CANVAS(preview->canvas),
321                                        template);
322
323         gl_template_free( &template );
324         
325         gl_debug (DEBUG_MINI_PREVIEW, "END");
326 }
327
328 /*--------------------------------------------------------------------------*/
329 /* PRIVATE.  Draw label outlines and return canvas item list.               */
330 /*--------------------------------------------------------------------------*/
331 static GList *
332 mini_outline_list_new (GnomeCanvas *canvas,
333                        glTemplate  *template)
334 {
335         GnomeCanvasGroup      *group = NULL;
336         GnomeCanvasItem       *item = NULL;
337         GList                 *list = NULL;
338         gint                   i, n_labels;
339         glTemplateOrigin      *origins;
340         gdouble                x1, y1, x2, y2, w, h;
341
342         gl_debug (DEBUG_MINI_PREVIEW, "START");
343
344         group = gnome_canvas_root (canvas);
345
346         /* draw mini label outlines */
347         n_labels = gl_template_get_n_labels (template);
348         origins  = gl_template_get_origins (template);
349         gl_template_get_label_size (template, &w, &h);
350         for ( i=0; i < n_labels; i++ ) {
351
352                 x1 = origins[i].x;
353                 y1 = origins[i].y;
354                 x2 = x1 + w;
355                 y2 = y1 + h;
356
357                 switch (template->label.style) {
358                 case GL_TEMPLATE_STYLE_RECT:
359                         item = gnome_canvas_item_new (group,
360                                                       gnome_canvas_rect_get_type(),
361                                                       "x1", x1,
362                                                       "y1", y1,
363                                                       "x2", x2,
364                                                       "y2", y2,
365                                                       "width_pixels", 1,
366                                                       "outline_color", "black",
367                                                       "fill_color", "white",
368                                                       NULL);
369                         break;
370                 case GL_TEMPLATE_STYLE_ROUND:
371                         item = gnome_canvas_item_new (group,
372                                                       gnome_canvas_ellipse_get_type(),
373                                                       "x1", x1,
374                                                       "y1", y1,
375                                                       "x2", x2,
376                                                       "y2", y2,
377                                                       "width_pixels", 1,
378                                                       "outline_color", "black",
379                                                       "fill_color", "white",
380                                                       NULL);
381                         break;
382                 case GL_TEMPLATE_STYLE_CD:
383                         if ( w == h ) {
384                                 item = gnome_canvas_item_new (group,
385                                                               gnome_canvas_ellipse_get_type(),
386                                                               "x1", x1,
387                                                               "y1", y1,
388                                                               "x2", x2,
389                                                               "y2", y2,
390                                                               "width_pixels", 1,
391                                                               "outline_color", "black",
392                                                               "fill_color", "white",
393                                                               NULL);
394                         } else {
395                                 item = cdbc_item (group, x1, y1, template);
396                         }
397                         break;
398                 default:
399                         g_warning ("Unknown label style");
400                         return list;
401                         break;
402                 }
403                 g_object_set_data (G_OBJECT (item), "i",
404                                    GINT_TO_POINTER (i+1));
405                 
406                 list = g_list_append (list, item);
407         }
408
409         gl_debug (DEBUG_MINI_PREVIEW, "END");
410         return list;
411 }
412
413 /*--------------------------------------------------------------------------*/
414 /* PRIVATE.  Draw label outlines and return canvas item list.               */
415 /*--------------------------------------------------------------------------*/
416 static void
417 mini_outline_list_free (GList ** list)
418 {
419         GnomeCanvasItem *item;
420         GList *p;
421
422         gl_debug (DEBUG_MINI_PREVIEW, "START");
423
424         if ( *list != NULL ) {
425
426                 for (p = *list; p != NULL; p = p->next) {
427                         item = GNOME_CANVAS_ITEM (p->data);
428                         gtk_object_destroy (GTK_OBJECT (item));
429                 }
430
431                 g_list_free (*list);
432                 *list = NULL;
433
434         }
435
436         gl_debug (DEBUG_MINI_PREVIEW, "END");
437 }
438
439 /*--------------------------------------------------------------------------*/
440 /* PRIVATE.  Canvas event handler, select first and last items.             */
441 /*--------------------------------------------------------------------------*/
442 static gint
443 canvas_event_cb (GnomeCanvas * canvas,
444                  GdkEvent * event,
445                  gpointer data)
446 {
447         glWdgtMiniPreview *preview = GL_WDGT_MINI_PREVIEW (data);
448         GnomeCanvasItem *item;
449         static gboolean dragging = FALSE;
450         static gint prev_i = 0, first, last;
451         gint i;
452         gdouble x, y;
453
454         gl_debug (DEBUG_MINI_PREVIEW, "START");
455
456         switch (event->type) {
457
458         case GDK_BUTTON_PRESS:
459                 gnome_canvas_window_to_world (canvas,
460                                               event->button.x, event->button.y,
461                                               &x, &y);
462                 switch (event->button.button) {
463                 case 1:
464                         /* Get item at cursor and make sure
465                            it's a label object ("i" is valid) */
466                         item = gnome_canvas_get_item_at (GNOME_CANVAS (canvas),
467                                                          x, y);
468                         if (item == NULL)
469                                 break;
470                         i = GPOINTER_TO_INT (g_object_get_data
471                                              (G_OBJECT (item), "i"));
472                         if (i == 0)
473                                 break;
474                         /* Go into dragging mode while remains pressed. */
475                         dragging = TRUE;
476                         gnome_canvas_item_grab (canvas->root,
477                                                 GDK_POINTER_MOTION_MASK |
478                                                 GDK_BUTTON_RELEASE_MASK |
479                                                 GDK_BUTTON_PRESS_MASK,
480                                                 NULL, event->button.time);
481                         g_signal_emit (G_OBJECT(preview),
482                                        wdgt_mini_preview_signals[CLICKED],
483                                        0, i);
484                         first = i;
485                         last = i;
486                         g_signal_emit (G_OBJECT(preview),
487                                        wdgt_mini_preview_signals[PRESSED],
488                                        0, first, last);
489                         prev_i = i;
490                         break;
491
492                 default:
493                         break;
494                 }
495                 break;
496
497         case GDK_BUTTON_RELEASE:
498                 gnome_canvas_window_to_world (canvas,
499                                               event->button.x, event->button.y,
500                                               &x, &y);
501                 switch (event->button.button) {
502                 case 1:
503                         /* Exit dragging mode */
504                         dragging = FALSE;
505                         gnome_canvas_item_ungrab (canvas->root, event->button.time);
506                         break;
507
508                 default:
509                         break;
510                 }
511                 break;
512
513         case GDK_MOTION_NOTIFY:
514                 gnome_canvas_window_to_world (canvas,
515                                               event->motion.x, event->motion.y,
516                                               &x, &y);
517                 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
518                         /* Get item at cursor and
519                            make sure it's a label object ("i" is valid) */
520                         item = gnome_canvas_get_item_at (GNOME_CANVAS (canvas),
521                                                          x, y);
522                         if (item == NULL)
523                                 break;
524                         i = GPOINTER_TO_INT (g_object_get_data
525                                              (G_OBJECT (item), "i"));
526                         if (i == 0)
527                                 break;
528                         if (prev_i != i) {
529                                 /* Entered into a new item */
530                                 last = i;
531                                 g_signal_emit (G_OBJECT(preview),
532                                                wdgt_mini_preview_signals[PRESSED],
533                                                0,
534                                                MIN (first, last),
535                                                MAX (first, last));
536                                 prev_i = i;
537                         }
538                 }
539                 break;
540
541         default:
542                 break;
543         }
544
545         gl_debug (DEBUG_MINI_PREVIEW, "END");
546
547         return FALSE;
548 }
549
550 /****************************************************************************/
551 /* Highlight given label outlines.                                          */
552 /****************************************************************************/
553 void
554 gl_wdgt_mini_preview_highlight_range (glWdgtMiniPreview * preview,
555                                       gint first_label,
556                                       gint last_label)
557 {
558         GnomeCanvasItem *item = NULL;
559         GList *p = NULL;
560         gint i;
561
562         gl_debug (DEBUG_MINI_PREVIEW, "START");
563
564         for (p = preview->label_items, i = 1; p != NULL; i++, p = p->next) {
565
566                 item = GNOME_CANVAS_ITEM (p->data);
567
568                 if ((i >= first_label) && (i <= last_label)) {
569                         gnome_canvas_item_set (item,
570                                                "fill_color", "light blue",
571                                                NULL);
572                 } else {
573                         gnome_canvas_item_set (item,
574                                                "fill_color", "white", NULL);
575                 }
576
577         }
578
579         gl_debug (DEBUG_MINI_PREVIEW, "END");
580 }
581
582 /*--------------------------------------------------------------------------*/
583 /* PRIVATE.  Draw CD business card item (cut-off in w and/or h).            */
584 /*--------------------------------------------------------------------------*/
585 static GnomeCanvasItem *
586 cdbc_item (GnomeCanvasGroup *group,
587            gdouble           x1,
588            gdouble           y1,
589            glTemplate       *template)
590 {
591         GnomeCanvasPoints *points;
592         gint               i_coords, i_theta;
593         gdouble            theta1, theta2;
594         gdouble            x0, y0, w, h, r;
595         GnomeCanvasItem   *item;
596
597         gl_template_get_label_size (template, &w, &h);
598         r = template->label.cd.r1;
599         x0 = x1 + (w/2.0);
600         y0 = y1 + (h/2.0);
601
602         theta1 = (180.0/G_PI) * acos (w / (2.0*r));
603         theta2 = (180.0/G_PI) * asin (h / (2.0*r));
604
605         points = gnome_canvas_points_new (360/RES + 1);
606         i_coords = 0;
607
608         points->coords[i_coords++] = x0 + r * cos (theta1 * G_PI / 180.0);
609         points->coords[i_coords++] = y0 + r * sin (theta1 * G_PI / 180.0);
610
611         for ( i_theta = theta1 + RES; i_theta < theta2; i_theta +=RES ) {
612                 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
613                 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
614         }
615
616         points->coords[i_coords++] = x0 + r * cos (theta2 * G_PI / 180.0);
617         points->coords[i_coords++] = y0 + r * sin (theta2 * G_PI / 180.0);
618
619
620         if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
621                 points->coords[i_coords++] = x0 + r * cos ((180-theta2) * G_PI / 180.0);
622                 points->coords[i_coords++] = y0 + r * sin ((180-theta2) * G_PI / 180.0);
623         }
624
625         for ( i_theta = 180-theta2+RES; i_theta < (180-theta1); i_theta +=RES ) {
626                 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
627                 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
628         }
629
630         points->coords[i_coords++] = x0 + r * cos ((180-theta1) * G_PI / 180.0);
631         points->coords[i_coords++] = y0 + r * sin ((180-theta1) * G_PI / 180.0);
632
633         if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
634                 points->coords[i_coords++] = x0 + r * cos ((180+theta1) * G_PI / 180.0);
635                 points->coords[i_coords++] = y0 + r * sin ((180+theta1) * G_PI / 180.0);
636         }
637
638         for ( i_theta = 180+theta1+RES; i_theta < (180+theta2); i_theta +=RES ) {
639                 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
640                 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
641         }
642
643         points->coords[i_coords++] = x0 + r * cos ((180+theta2) * G_PI / 180.0);
644         points->coords[i_coords++] = y0 + r * sin ((180+theta2) * G_PI / 180.0);
645
646         if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
647                 points->coords[i_coords++] = x0 + r * cos ((360-theta2) * G_PI / 180.0);
648                 points->coords[i_coords++] = y0 + r * sin ((360-theta2) * G_PI / 180.0);
649         }
650
651         for ( i_theta = 360-theta2+RES; i_theta < (360-theta1); i_theta +=RES ) {
652                 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
653                 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
654         }
655
656         if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
657                 points->coords[i_coords++] = x0 + r * cos ((360-theta1) * G_PI / 180.0);
658                 points->coords[i_coords++] = y0 + r * sin ((360-theta1) * G_PI / 180.0);
659         }
660
661         points->num_points = i_coords / 2;
662
663
664         item = gnome_canvas_item_new (group,
665                                       gnome_canvas_polygon_get_type (),
666                                       "points", points,
667                                       "width_pixels", 1,
668                                       "outline_color", "black",
669                                       "fill_color", "white",
670                                       NULL);
671
672         gnome_canvas_points_free (points);
673
674         return item;
675 }
676