gfig.c 19.1 KB
Newer Older
Manish Singh's avatar
Manish Singh committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * Copyright (C) 1995 Spencer Kimball and Peter Mattis
 *
 * This is a plug-in for the GIMP.
 *
 * Generates images containing vector type drawings.
 *
 * Copyright (C) 1997 Andy Thomas  alt@picnic.demon.co.uk
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
22
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Manish Singh's avatar
Manish Singh committed
23
24
 */

Tor Lillqvist's avatar
Tor Lillqvist committed
25
26
#include "config.h"

Manish Singh's avatar
Manish Singh committed
27
28
#include <stdio.h>
#include <stdlib.h>
29
#include <string.h>
30
#include <errno.h>
31

Tor Lillqvist's avatar
Tor Lillqvist committed
32
#ifdef HAVE_UNISTD_H
Manish Singh's avatar
Manish Singh committed
33
#include <unistd.h>
Tor Lillqvist's avatar
Tor Lillqvist committed
34
#endif
35

Manish Singh's avatar
Manish Singh committed
36
#include <gtk/gtk.h>
Tor Lillqvist's avatar
Tor Lillqvist committed
37

38
39
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
40

41
42
#include "libgimp/stdplugins-intl.h"

43
#include "gfig.h"
44
45
#include "gfig-style.h"
#include "gfig-dialog.h"
46
47
48
49
50
#include "gfig-arc.h"
#include "gfig-bezier.h"
#include "gfig-circle.h"
#include "gfig-dobject.h"
#include "gfig-ellipse.h"
51
#include "gfig-grid.h"
52
53
#include "gfig-line.h"
#include "gfig-poly.h"
54
#include "gfig-preview.h"
55
56
#include "gfig-spiral.h"
#include "gfig-star.h"
57
58
#include "gfig-stock.h"

Manish Singh's avatar
Manish Singh committed
59
60
/***** Magic numbers *****/

61
62
#define GFIG_HEADER      "GFIG Version 0.2\n"

Manish Singh's avatar
Manish Singh committed
63
static void      query  (void);
64
static void      run    (const gchar      *name,
65
66
67
68
                         gint              nparams,
                         const GimpParam  *param,
                         gint             *nreturn_vals,
                         GimpParam       **return_vals);
69

70

71
GimpPlugInInfo PLUG_IN_INFO =
Manish Singh's avatar
Manish Singh committed
72
{
73
74
75
76
  NULL,  /* init_proc  */
  NULL,  /* quit_proc  */
  query, /* query_proc */
  run,   /* run_proc   */
Manish Singh's avatar
Manish Singh committed
77
78
79
80
};



81
gint line_no;
Manish Singh's avatar
Manish Singh committed
82

83
gint obj_show_single   = -1; /* -1 all >= 0 object number */
Manish Singh's avatar
Manish Singh committed
84
85
86
87
88

/* Structures etc for the objects */
/* Points used to draw the object  */


89
90
GfigObject *obj_creating; /* Object we are creating */
GfigObject *tmp_line;     /* Needed when drawing lines */
91

92
gboolean need_to_scale;
Manish Singh's avatar
Manish Singh committed
93

94
static gint       load_options            (GFigObj *gfig,
95
                                           FILE    *fp);
Manish Singh's avatar
Manish Singh committed
96
97
/* globals */

98
GdkGC  *gfig_gc;
Manish Singh's avatar
Manish Singh committed
99
100

/* Stuff for the preview bit */
101
102
103
104
105
static gint  sel_x1, sel_y1, sel_x2, sel_y2;
static gint  sel_width, sel_height;
gint         preview_width, preview_height;
gdouble      scale_x_factor, scale_y_factor;
GdkPixbuf   *back_pixbuf = NULL;
Manish Singh's avatar
Manish Singh committed
106

Adrian Likins's avatar
Adrian Likins committed
107
MAIN ()
Manish Singh's avatar
Manish Singh committed
108
109

static void
110
query (void)
Manish Singh's avatar
Manish Singh committed
111
{
112
  static GimpParamDef args[] =
Manish Singh's avatar
Manish Singh committed
113
  {
114
115
    { GIMP_PDB_INT32,    "run_mode", "Interactive, non-interactive" },
    { GIMP_PDB_IMAGE,    "image",    "Input image (unused)" },
116
    { GIMP_PDB_DRAWABLE, "drawable", "Input drawable" },
117
    { GIMP_PDB_INT32,    "dummy",    "dummy" }
Manish Singh's avatar
Manish Singh committed
118
  };
David Monniaux's avatar
David Monniaux committed
119

Manish Singh's avatar
Manish Singh committed
120
  gimp_install_procedure ("plug_in_gfig",
121
                          "Create Geometrical shapes with the Gimp",
122
123
124
125
126
127
128
                          "Draw Vector Graphics and paint them onto your images.  "
                          "Gfig allows you to draw many types of objects "
                          "inlcuding Lines, Circles, Ellipses, Curves, Polygons, "
                          "pointed stars, Bezier curves, and Spirals.  "
                          "Objects can be painted using Brushes or other tools"
                          "or filled using colours or patterns.  "
                          "Gfig objects can also be used to create selections.  ",
129
130
131
                          "Andy Thomas",
                          "Andy Thomas",
                          "1997",
132
                          N_("_Gfig..."),
133
134
135
136
                          "RGB*, GRAY*",
                          GIMP_PLUGIN,
                          G_N_ELEMENTS (args), 0,
                          args, NULL);
137

138
  gimp_plugin_menu_register ("plug_in_gfig", "<Image>/Filters/Render");
Manish Singh's avatar
Manish Singh committed
139
140
141
}

static void
142
143
144
145
146
run (const gchar      *name,
     gint              nparams,
     const GimpParam  *param,
     gint             *nreturn_vals,
     GimpParam       **return_vals)
Manish Singh's avatar
Manish Singh committed
147
{
148
149
150
151
  GimpParam         *values = g_new (GimpParam, 1);
  GimpDrawable      *drawable;
  GimpRunMode        run_mode;
  GimpPDBStatusType  status = GIMP_PDB_SUCCESS;
152
  gint               pwidth, pheight;
153
154
  INIT_I18N ();

David Odin's avatar
typo    
David Odin committed
155
  gfig_context = g_new (GFigContext, 1);
156
157
  gfig_context->show_background = TRUE;
  gfig_context->selected_obj = NULL;
Manish Singh's avatar
Manish Singh committed
158
  run_mode = param[0].data.d_int32;
159
160
  gfig_context->image_id = param[1].data.d_image;
  gfig_context->drawable_id = param[2].data.d_drawable;
Manish Singh's avatar
Manish Singh committed
161
162
163
164

  *nreturn_vals = 1;
  *return_vals = values;

165
  values[0].type = GIMP_PDB_STATUS;
Manish Singh's avatar
Manish Singh committed
166
167
  values[0].data.d_status = status;

168
169
170
  gimp_image_undo_group_start (gfig_context->image_id);

  drawable = gimp_drawable_get (param[2].data.d_drawable);
Manish Singh's avatar
Manish Singh committed
171
172

  /* TMP Hack - clear any selections */
173
  if (! gimp_selection_is_empty (gfig_context->image_id))
174
    gimp_selection_none (gfig_context->image_id);
Manish Singh's avatar
Manish Singh committed
175

176
  gimp_drawable_mask_bounds (drawable->drawable_id,
177
                             &sel_x1, &sel_y1, &sel_x2, &sel_y2);
Manish Singh's avatar
Manish Singh committed
178
179
180
181

  sel_width  = sel_x2 - sel_x1;
  sel_height = sel_y2 - sel_y1;

182

Manish Singh's avatar
Manish Singh committed
183
  /* Calculate preview size */
184

185
186
187
188
189
190
191
192
193
  if (sel_width > sel_height)
    {
      pwidth  = MIN (sel_width, PREVIEW_SIZE);
      pheight = sel_height * pwidth / sel_width;
    }
  else
    {
      pheight = MIN (sel_height, PREVIEW_SIZE);
      pwidth  = sel_width * pheight / sel_height;
194
    }
195

196

197
  preview_width  = MAX (pwidth, 2);  /* Min size is 2 */
198
  preview_height = MAX (pheight, 2);
Manish Singh's avatar
Manish Singh committed
199

200
201
202
203
  org_scale_x_factor = scale_x_factor =
    (gdouble) sel_width / (gdouble) preview_width;
  org_scale_y_factor = scale_y_factor =
    (gdouble) sel_height / (gdouble) preview_height;
204

205
206
207
208
209
  gimp_tile_cache_ntiles ((drawable->width + gimp_tile_width () - 1) /
                          gimp_tile_width ());

  gimp_drawable_detach (drawable);

210
211
212
  /* initialize */
  gfig_init_object_classes ();

Manish Singh's avatar
Manish Singh committed
213
214
  switch (run_mode)
    {
215
    case GIMP_RUN_INTERACTIVE:
Manish Singh's avatar
Manish Singh committed
216
      /*gimp_get_data ("plug_in_gfig", &selvals);*/
217
      if (! gfig_dialog ())
218
        {
219
220
221
          gimp_drawable_detach (gfig_drawable);
          gimp_image_undo_group_end (gfig_context->image_id);

222
223
          return;
        }
Manish Singh's avatar
Manish Singh committed
224
225
      break;

226
227
    case GIMP_RUN_NONINTERACTIVE:
      status = GIMP_PDB_CALLING_ERROR;
Manish Singh's avatar
Manish Singh committed
228
229
      break;

230
    case GIMP_RUN_WITH_LAST_VALS:
Manish Singh's avatar
Manish Singh committed
231
232
233
234
235
236
237
      /*gimp_get_data ("plug_in_gfig", &selvals);*/
      break;

    default:
      break;
    }

238
  gimp_image_undo_group_end (gfig_context->image_id);
239

240
241
  if (run_mode != GIMP_RUN_NONINTERACTIVE)
    gimp_displays_flush ();
242
  else
Manish Singh's avatar
Manish Singh committed
243
#if 0
244
245
  if (run_mode == GIMP_RUN_INTERACTIVE)
    gimp_set_data ("plug_in_gfig", &selvals, sizeof (SelectItVals));
Manish Singh's avatar
Manish Singh committed
246
  else
247
#endif /* 0 */
Manish Singh's avatar
Manish Singh committed
248
    {
249
      status = GIMP_PDB_EXECUTION_ERROR;
Manish Singh's avatar
Manish Singh committed
250
251
252
253
    }

  values[0].data.d_status = status;

254
  /* gimp_drawable_detach (drawable) already done above, don't do it twice */
Manish Singh's avatar
Manish Singh committed
255
256
257
258
}

/*
  Translate SPACE to "\\040", etc.
Manish Singh's avatar
Manish Singh committed
259
  Taken from gflare plugin
Manish Singh's avatar
Manish Singh committed
260
 */
261
void
262
gfig_name_encode (gchar *dest,
263
                  gchar *src)
Manish Singh's avatar
Manish Singh committed
264
{
265
  gint cnt = MAX_LOAD_LINE - 1;
Manish Singh's avatar
Manish Singh committed
266
267
268

  while (*src && cnt--)
    {
269
      if (g_ascii_iscntrl (*src) || g_ascii_isspace (*src) || *src == '\\')
270
271
272
273
        {
          sprintf (dest, "\\%03o", *src++);
          dest += 4;
        }
Manish Singh's avatar
Manish Singh committed
274
      else
275
        *dest++ = *src++;
Manish Singh's avatar
Manish Singh committed
276
277
278
279
280
281
282
    }
  *dest = '\0';
}

/*
  Translate "\\040" to SPACE, etc.
 */
283
void
284
gfig_name_decode (gchar       *dest,
285
                  const gchar *src)
Manish Singh's avatar
Manish Singh committed
286
{
287
288
  gint  cnt = MAX_LOAD_LINE - 1;
  guint tmp;
Manish Singh's avatar
Manish Singh committed
289
290
291
292

  while (*src && cnt--)
    {
      if (*src == '\\' && *(src+1) && *(src+2) && *(src+3))
293
294
295
296
297
        {
          sscanf (src+1, "%3o", &tmp);
          *dest++ = tmp;
          src += 4;
        }
Manish Singh's avatar
Manish Singh committed
298
      else
299
        *dest++ = *src++;
Manish Singh's avatar
Manish Singh committed
300
301
302
303
304
305
306
307
308
309
310
    }
  *dest = '\0';
}


/*
 * Load all gfig, which are founded in gfig-path-list, into gfig_list.
 * gfig-path-list must be initialized first. (plug_in_parse_gfig_path ())
 * based on code from Gflare.
 */

311
gint
312
gfig_list_pos (GFigObj *gfig)
Manish Singh's avatar
Manish Singh committed
313
{
314
  GFigObj *g;
315
316
  gint     n;
  GList   *tmp;
Manish Singh's avatar
Manish Singh committed
317
318

  n = 0;
319

320
  for (tmp = gfig_list; tmp; tmp = g_list_next (tmp))
Manish Singh's avatar
Manish Singh committed
321
322
    {
      g = tmp->data;
323

Manish Singh's avatar
Manish Singh committed
324
      if (strcmp (gfig->draw_name, g->draw_name) <= 0)
325
        break;
326

Manish Singh's avatar
Manish Singh committed
327
328
      n++;
    }
329
  return n;
Manish Singh's avatar
Manish Singh committed
330
331
}

332
/*
333
 *      Insert gfigs in alphabetical order
334
335
 */

336
gint
337
gfig_list_insert (GFigObj *gfig)
Manish Singh's avatar
Manish Singh committed
338
{
339
  gint n;
Manish Singh's avatar
Manish Singh committed
340

341
  n = gfig_list_pos (gfig);
Manish Singh's avatar
Manish Singh committed
342
343
344
345
346
347

  gfig_list = g_list_insert (gfig_list, gfig, n);

  return n;
}

348
void
349
gfig_free (GFigObj *gfig)
Manish Singh's avatar
Manish Singh committed
350
351
352
{
  g_assert (gfig != NULL);

353
  free_all_objs (gfig->obj_list);
354
355
356
357
358

  g_free (gfig->name);
  g_free (gfig->filename);
  g_free (gfig->draw_name);

Manish Singh's avatar
Manish Singh committed
359
360
361
  g_free (gfig);
}

362
GFigObj *
363
gfig_new (void)
Manish Singh's avatar
Manish Singh committed
364
{
365
  return g_new0 (GFigObj, 1);
Manish Singh's avatar
Manish Singh committed
366
367
}

368
369
static void
gfig_load_objs (GFigObj *gfig,
370
371
                gint     load_count,
                FILE    *fp)
Manish Singh's avatar
Manish Singh committed
372
{
373
374
375
376
377
  GfigObject *obj;
  gchar       load_buf[MAX_LOAD_LINE];
  glong       offset;
  glong       offset2;
  Style       style;
Manish Singh's avatar
Manish Singh committed
378

379
  while (load_count-- > 0)
Manish Singh's avatar
Manish Singh committed
380
381
    {
      obj = NULL;
382
383
      get_line (load_buf, MAX_LOAD_LINE, fp, 0);

384
385
386
387
      /* kludge */
      offset = ftell (fp);
      gfig_skip_style (&style, fp);

388
      obj = d_load_object (load_buf, fp);
389

390
      if (obj)
391
392
        {
          add_to_all_obj (gfig, obj);
393
394
395
396
          offset2 = ftell (fp);
          fseek (fp, offset, SEEK_SET);
          gfig_load_style (&obj->style, fp);
          fseek (fp, offset2, SEEK_SET);
397
        }
398
399
400
401
      else
        {
          g_message ("Failed to load object, load count = %d", load_count);
        }
Manish Singh's avatar
Manish Singh committed
402
403
404
    }
}

405
GFigObj *
406
407
gfig_load (const gchar *filename,
           const gchar *name)
Manish Singh's avatar
Manish Singh committed
408
{
409
410
411
412
413
414
  GFigObj *gfig;
  FILE    *fp;
  gchar    load_buf[MAX_LOAD_LINE];
  gchar    str_buf[MAX_LOAD_LINE];
  gint     chk_count;
  gint     load_count = 0;
415
416
417
  gdouble  version;
  guchar   magic1[20];
  guchar   magic2[20];
418

Manish Singh's avatar
Manish Singh committed
419
420
421
  g_assert (filename != NULL);

#ifdef DEBUG
422
  printf ("Loading %s (%s)\n", filename, name);
Manish Singh's avatar
Manish Singh committed
423
424
425
426
427
#endif /* DEBUG */

  fp = fopen (filename, "r");
  if (!fp)
    {
428
      g_message (_("Could not open '%s' for reading: %s"),
429
                  gimp_filename_to_utf8 (filename), g_strerror (errno));
Manish Singh's avatar
Manish Singh committed
430
431
432
      return NULL;
    }

433
  gfig = gfig_new ();
Manish Singh's avatar
Manish Singh committed
434

435
436
  gfig->name = g_strdup (name);
  gfig->filename = g_strdup (filename);
Manish Singh's avatar
Manish Singh committed
437
438
439
440
441
442
443
444


  /* HEADER
   * draw_name
   * version
   * obj_list
   */

445
  get_line (load_buf, MAX_LOAD_LINE, fp, 1);
Manish Singh's avatar
Manish Singh committed
446

447
448
449
  sscanf (load_buf, "%10s %10s %lf", magic1, magic2, &version);

  if (strcmp (magic1, "GFIG") || strcmp (magic2, "Version"))
Manish Singh's avatar
Manish Singh committed
450
    {
451
452
      g_message ("File '%s' is not a gfig file",
                  gimp_filename_to_utf8 (gfig->filename));
453
      return NULL;
Manish Singh's avatar
Manish Singh committed
454
    }
455

456
457
458
459
  get_line (load_buf, MAX_LOAD_LINE, fp, 0);
  sscanf (load_buf, "Name: %100s", str_buf);
  gfig_name_decode (load_buf, str_buf);
  gfig->draw_name = g_strdup (load_buf);
460

461
  get_line (load_buf, MAX_LOAD_LINE, fp, 0);
462
463
  if (strncmp (load_buf, "Version: ", 9) == 0)
    gfig->version = g_ascii_strtod (load_buf + 9, NULL);
464

465
466
  get_line (load_buf, MAX_LOAD_LINE, fp, 0);
  sscanf (load_buf, "ObjCount: %d", &load_count);
467

468
  if (load_options (gfig, fp))
Manish Singh's avatar
Manish Singh committed
469
    {
470
      g_message ("File '%s' corrupt file - Line %d Option section incorrect",
471
                 gimp_filename_to_utf8 (filename), line_no);
472
      return NULL;
Manish Singh's avatar
Manish Singh committed
473
474
    }

475
476
477
478
479
480
  if (gfig_load_styles (gfig, fp))
    {
      g_message ("File '%s' corrupt file - Line %d Option section incorrect",
                 gimp_filename_to_utf8 (filename), line_no);
      return NULL;
    }
Manish Singh's avatar
Manish Singh committed
481

482
483


484
  gfig_load_objs (gfig, load_count, fp);
485

Manish Singh's avatar
Manish Singh committed
486
  /* Check count ? */
487

488
  chk_count = g_list_length (gfig->obj_list);
489

490
  if (chk_count != load_count)
Manish Singh's avatar
Manish Singh committed
491
    {
492
      g_message ("File '%s' corrupt file - Line %d Object count to small",
493
                 gimp_filename_to_utf8 (filename), line_no);
494
      return NULL;
Manish Singh's avatar
Manish Singh committed
495
    }
496

497
  fclose (fp);
Manish Singh's avatar
Manish Singh committed
498

499
500
  if (!gfig_context->current_obj)
    gfig_context->current_obj = gfig;
Manish Singh's avatar
Manish Singh committed
501
502
503

  gfig->obj_status = GFIG_OK;

504
  return gfig;
Manish Singh's avatar
Manish Singh committed
505
506
}

507
508
void
save_options (GString *string)
Manish Singh's avatar
Manish Singh committed
509
510
{
  /* Save options */
511
  g_string_append_printf (string, "<OPTIONS>\n");
512
513
  g_string_append_printf (string, "GridSpacing: %d\n",
                          selvals.opts.gridspacing);
514
  if (selvals.opts.gridtype == RECT_GRID)
515
516
517
    {
      g_string_append_printf (string, "GridType: RECT_GRID\n");
    }
518
  else if (selvals.opts.gridtype == POLAR_GRID)
519
520
521
    {
      g_string_append_printf (string, "GridType: POLAR_GRID\n");
    }
522
  else if (selvals.opts.gridtype == ISO_GRID)
523
524
525
    {
      g_string_append_printf (string, "GridType: ISO_GRID\n");
    }
526
  else
527
    {
528
529
      /* default to RECT_GRID */
      g_string_append_printf (string, "GridType: RECT_GRID\n");
530
531
    }

532
533
534
535
536
537
538
539
  g_string_append_printf (string, "DrawGrid: %s\n",
                          (selvals.opts.drawgrid) ? "TRUE" : "FALSE");
  g_string_append_printf (string, "Snap2Grid: %s\n",
                          (selvals.opts.snap2grid) ? "TRUE" : "FALSE");
  g_string_append_printf (string, "LockOnGrid: %s\n",
                          (selvals.opts.lockongrid) ? "TRUE" : "FALSE");
  g_string_append_printf (string, "ShowControl: %s\n",
                          (selvals.opts.showcontrol) ? "TRUE" : "FALSE");
540
541
542
  g_string_append_printf (string, "</OPTIONS>\n");
}

543
static void
544
545
gfig_save_obj_start (GfigObject *obj,
                     GString    *string)
546
{
547
548
549
  g_string_append_printf (string, "<%s ", obj->class->name);
  gfig_style_save_as_attributes (&obj->style, string);
  g_string_append_printf (string, ">\n");
550
551
}

552
static void
553
554
gfig_save_obj_end (GfigObject *obj,
                   GString    *string)
555
{
556
  g_string_append_printf (string, "</%s>\n",obj->class->name);
557
558
}

559
static gboolean
560
load_bool (gchar *opt_buf,
561
           gint  *toset)
562
563
{
  if (!strcmp (opt_buf, "TRUE"))
Manish Singh's avatar
Manish Singh committed
564
    *toset = 1;
565
  else if (!strcmp (opt_buf, "FALSE"))
Manish Singh's avatar
Manish Singh committed
566
567
    *toset = 0;
  else
568
    return TRUE;
Manish Singh's avatar
Manish Singh committed
569

570
  return FALSE;
Manish Singh's avatar
Manish Singh committed
571
572
}

573
574
static gint
load_options (GFigObj *gfig,
575
              FILE    *fp)
Manish Singh's avatar
Manish Singh committed
576
577
578
579
580
{
  gchar load_buf[MAX_LOAD_LINE];
  gchar str_buf[MAX_LOAD_LINE];
  gchar opt_buf[MAX_LOAD_LINE];

581
  get_line (load_buf, MAX_LOAD_LINE, fp, 0);
Manish Singh's avatar
Manish Singh committed
582
583

#ifdef DEBUG
584
  printf ("load '%s'\n", load_buf);
Manish Singh's avatar
Manish Singh committed
585
586
#endif /* DEBUG */

587
588
  if (strcmp (load_buf, "<OPTIONS>"))
    return (-1);
589

590
  get_line (load_buf, MAX_LOAD_LINE, fp, 0);
Manish Singh's avatar
Manish Singh committed
591
592

#ifdef DEBUG
593
  printf ("opt line '%s'\n", load_buf);
Manish Singh's avatar
Manish Singh committed
594
595
#endif /* DEBUG */

596
  while (strcmp (load_buf, "</OPTIONS>"))
Manish Singh's avatar
Manish Singh committed
597
598
599
    {
      /* Get option name */
#ifdef DEBUG
600
      printf ("num = %d\n", sscanf (load_buf, "%s %s", str_buf, opt_buf));
Manish Singh's avatar
Manish Singh committed
601

602
      printf ("option %s val %s\n", str_buf, opt_buf);
Manish Singh's avatar
Manish Singh committed
603
#else
604
      sscanf (load_buf, "%s %s", str_buf, opt_buf);
Manish Singh's avatar
Manish Singh committed
605
606
#endif /* DEBUG */

607
      if (!strcmp (str_buf, "GridSpacing:"))
608
609
610
611
612
613
614
615
        {
          /* Value is decimal */
          int sp = 0;
          sp = atoi (opt_buf);
          if (sp <= 0)
            return (-1);
          gfig->opts.gridspacing = sp;
        }
616
      else if (!strcmp (str_buf, "DrawGrid:"))
617
618
619
620
621
        {
          /* Value is bool */
          if (load_bool (opt_buf, &gfig->opts.drawgrid))
            return (-1);
        }
622
      else if (!strcmp (str_buf, "Snap2Grid:"))
623
624
625
626
627
        {
          /* Value is bool */
          if (load_bool (opt_buf, &gfig->opts.snap2grid))
            return (-1);
        }
628
      else if (!strcmp (str_buf, "LockOnGrid:"))
629
630
631
632
633
        {
          /* Value is bool */
          if (load_bool (opt_buf, &gfig->opts.lockongrid))
            return (-1);
        }
634
      else if (!strcmp (str_buf, "ShowControl:"))
635
636
637
638
639
        {
          /* Value is bool */
          if (load_bool (opt_buf, &gfig->opts.showcontrol))
            return (-1);
        }
640
      else if (!strcmp (str_buf, "GridType:"))
641
642
643
644
645
646
647
648
649
650
651
        {
          /* Value is string */
          if (!strcmp (opt_buf, "RECT_GRID"))
            gfig->opts.gridtype = RECT_GRID;
          else if (!strcmp (opt_buf, "POLAR_GRID"))
            gfig->opts.gridtype = POLAR_GRID;
          else if (!strcmp (opt_buf, "ISO_GRID"))
            gfig->opts.gridtype = ISO_GRID;
          else
            return (-1);
        }
Manish Singh's avatar
Manish Singh committed
652

653
      get_line (load_buf, MAX_LOAD_LINE, fp, 0);
654

Manish Singh's avatar
Manish Singh committed
655
#ifdef DEBUG
656
      printf ("opt line '%s'\n", load_buf);
Manish Singh's avatar
Manish Singh committed
657
#endif /* DEBUG */
658
    }
659
  return (0);
Manish Singh's avatar
Manish Singh committed
660
661
}

662
GString *
663
gfig_save_as_string (void)
Manish Singh's avatar
Manish Singh committed
664
{
665
666
  GList    *objs;
  gint      count;
667
668
669
  gchar     buf[G_ASCII_DTOSTR_BUF_SIZE];
  gchar     conv_buf[MAX_LOAD_LINE * 3 + 1];
  GString  *string;
Manish Singh's avatar
Manish Singh committed
670

671
  string = g_string_new (GFIG_HEADER);
672

673
674
675
676
677
678
  gfig_name_encode (conv_buf, gfig_context->current_obj->draw_name);
  g_string_append_printf (string, "Name: %s\n", conv_buf);
  g_string_append_printf (string, "Version: %s\n",
                          g_ascii_formatd (buf, G_ASCII_DTOSTR_BUF_SIZE, "%f",
                                           gfig_context->current_obj->version));
  objs = gfig_context->current_obj->obj_list;
Manish Singh's avatar
Manish Singh committed
679

680
  count = g_list_length (objs);
Manish Singh's avatar
Manish Singh committed
681

682
  g_string_append_printf (string, "ObjCount: %d\n", count);
Manish Singh's avatar
Manish Singh committed
683

684
  save_options (string);
Manish Singh's avatar
Manish Singh committed
685

686
  gfig_save_styles (string);
687

688
689
690
  for (objs = gfig_context->current_obj->obj_list;
       objs;
       objs = g_list_next (objs))
Manish Singh's avatar
Manish Singh committed
691
    {
692
      GfigObject *object = objs->data;
693

694
      gfig_save_obj_start (object, string);
695

696
      gfig_save_style (&object->style, string);
Manish Singh's avatar
Manish Singh committed
697

698
699
700
701
      if (object->points)
        d_save_object (object, string);

      gfig_save_obj_end (object, string);
Manish Singh's avatar
Manish Singh committed
702
703
    }

704
  return string;
Manish Singh's avatar
Manish Singh committed
705
706
707
}


708
gboolean
709
gfig_save_as_parasite (void)
Manish Singh's avatar
Manish Singh committed
710
{
711
712
  GimpParasite *parasite;
  GString       *string;
Manish Singh's avatar
Manish Singh committed
713

714
  string = gfig_save_as_string ();
Michael Natterer's avatar
Michael Natterer committed
715

716
717
718
719
  /* temporarily make the parasite non-persistent until the
   * format has stabilized.
   */
#if 0
720
  parasite = gimp_parasite_new ("gfig", GIMP_PARASITE_PERSISTENT | GIMP_PARASITE_UNDOABLE,
721
722
                                datasize, data);
#endif
Michael Natterer's avatar
Michael Natterer committed
723

724
  parasite = gimp_parasite_new ("gfig", GIMP_PARASITE_UNDOABLE,
725
                                string->len, string->str);
Michael Natterer's avatar
Michael Natterer committed
726

727
  g_string_free (string, TRUE);
Michael Natterer's avatar
Michael Natterer committed
728

729
  if (!gimp_drawable_parasite_attach (gfig_context->drawable_id, parasite))
730
    {
731
732
733
      g_message (_("Error trying to save figure as a parasite: can't attach parasite to drawable.\n"));
      gimp_parasite_free (parasite);
      return FALSE;
734
    }
Manish Singh's avatar
Manish Singh committed
735

736
737
  gimp_parasite_free (parasite);
  return TRUE;
Manish Singh's avatar
Manish Singh committed
738
739
}

740
GFigObj *
741
gfig_load_from_parasite (void)
Manish Singh's avatar
Manish Singh committed
742
{
743
744
745
746
  FILE         *fp;
  gchar        *fname;
  GimpParasite *parasite;
  GFigObj      *gfig;
Manish Singh's avatar
Manish Singh committed
747

748
749
750
751
752
753
754
  fname = gimp_temp_name ("gfigtmp");
  fp = fopen (fname, "w");
  if (!fp)
    {
      g_message (_("Error trying to open temp file '%s'for parasite loading.\n"), fname);
      return NULL;
    }
Manish Singh's avatar
Manish Singh committed
755

756
  parasite = gimp_drawable_parasite_find (gfig_context->drawable_id, "gfig");
Manish Singh's avatar
Manish Singh committed
757

758
759
  if (!parasite)
    return NULL;
760

761
  fprintf (stderr, "GFig parasite found.\n");
Manish Singh's avatar
Manish Singh committed
762

763
764
765
766
767
768
769
  fwrite (gimp_parasite_data (parasite),
          sizeof (guchar),
          gimp_parasite_data_size (parasite),
          fp);

  gimp_parasite_free (parasite);
  fclose (fp);
Manish Singh's avatar
Manish Singh committed
770

771
772
  gfig = gfig_load (fname, "(none)");
  unlink (fname);
Manish Singh's avatar
Manish Singh committed
773

774
  return (gfig);
Manish Singh's avatar
Manish Singh committed
775
776
}

777
778
void
gfig_save_callbk (void)
Manish Singh's avatar
Manish Singh committed
779
{
780
781
782
  FILE     *fp;
  gchar    *savename;
  GString  *string;
Manish Singh's avatar
Manish Singh committed
783

784
  savename = gfig_context->current_obj->filename;
Manish Singh's avatar
Manish Singh committed
785

786
  fp = fopen (savename, "w+");
Manish Singh's avatar
Manish Singh committed
787

788
  if (!fp)
Manish Singh's avatar
Manish Singh committed
789
    {
790
791
792
      g_message (_("Could not open '%s' for writing: %s"),
                 gimp_filename_to_utf8 (savename), g_strerror (errno));
      return;
Manish Singh's avatar
Manish Singh committed
793
794
    }

795
  string = gfig_save_as_string ();
796

797
  fwrite (string->str, string->len, 1, fp);
798

799
800
801
802
803
  if (ferror (fp))
    g_message ("Failed to write file\n");
  else
    {
      gfig_context->current_obj->obj_status &= ~(GFIG_MODIFIED | GFIG_READONLY);
Manish Singh's avatar
Manish Singh committed
804
805
    }

806
  fclose (fp);
Manish Singh's avatar
Manish Singh committed
807

808
}