gfig.c 18.4 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"

59
#include "pix-data.h"
Manish Singh's avatar
Manish Singh committed
60

61

Manish Singh's avatar
Manish Singh committed
62
63
/***** Magic numbers *****/

64
65
#define GFIG_HEADER      "GFIG Version 0.2\n"

Manish Singh's avatar
Manish Singh committed
66
67

static void      query  (void);
68
static void      run    (const gchar      *name,
69
70
71
72
                         gint              nparams,
                         const GimpParam  *param,
                         gint             *nreturn_vals,
                         GimpParam       **return_vals);
73

74

Manish Singh's avatar
Manish Singh committed
75

76
GimpPlugInInfo PLUG_IN_INFO =
Manish Singh's avatar
Manish Singh committed
77
{
78
79
80
81
  NULL,  /* init_proc  */
  NULL,  /* quit_proc  */
  query, /* query_proc */
  run,   /* run_proc   */
Manish Singh's avatar
Manish Singh committed
82
83
84
85
};



86
gint   line_no;
Manish Singh's avatar
Manish Singh committed
87

88
gint obj_show_single   = -1; /* -1 all >= 0 object number */
Manish Singh's avatar
Manish Singh committed
89
90
91
92
93

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


94
95
Dobject *obj_creating; /* Object we are creating */
Dobject *tmp_line;     /* Needed when drawing lines */
Manish Singh's avatar
Manish Singh committed
96

97

98
gint      need_to_scale;
99

Manish Singh's avatar
Manish Singh committed
100

101
static gint       load_options            (GFigObj *gfig,
102
                                           FILE    *fp);
Manish Singh's avatar
Manish Singh committed
103
104
/* globals */

105
GdkGC  *gfig_gc;
Manish Singh's avatar
Manish Singh committed
106
107

/* Stuff for the preview bit */
108
109
110
111
112
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
113

Adrian Likins's avatar
Adrian Likins committed
114
MAIN ()
Manish Singh's avatar
Manish Singh committed
115
116

static void
117
query (void)
Manish Singh's avatar
Manish Singh committed
118
{
119
  static GimpParamDef args[] =
Manish Singh's avatar
Manish Singh committed
120
  {
121
122
    { GIMP_PDB_INT32,    "run_mode", "Interactive, non-interactive" },
    { GIMP_PDB_IMAGE,    "image",    "Input image (unused)" },
123
    { GIMP_PDB_DRAWABLE, "drawable", "Input drawable" },
124
    { GIMP_PDB_INT32,    "dummy",    "dummy" }
Manish Singh's avatar
Manish Singh committed
125
  };
David Monniaux's avatar
David Monniaux committed
126

Manish Singh's avatar
Manish Singh committed
127
  gimp_install_procedure ("plug_in_gfig",
128
129
130
131
132
                          "Create Geometrical shapes with the Gimp",
                          "More here later",
                          "Andy Thomas",
                          "Andy Thomas",
                          "1997",
133
                          N_("_Gfig..."),
134
135
136
137
                          "RGB*, GRAY*",
                          GIMP_PLUGIN,
                          G_N_ELEMENTS (args), 0,
                          args, NULL);
138
139
140

  gimp_plugin_menu_register ("plug_in_gfig",
                             N_("<Image>/Filters/Render"));
Manish Singh's avatar
Manish Singh committed
141
142
143
}

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

157
158
159
  gfig_context = (GFigContext*)g_malloc (sizeof (GFigContext));
  gfig_context->show_background = TRUE;
  gfig_context->selected_obj = NULL;
Manish Singh's avatar
Manish Singh committed
160
  run_mode = param[0].data.d_int32;
161
162
  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
163
164
165
166

  *nreturn_vals = 1;
  *return_vals = values;

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

170
171
  gimp_image_undo_group_start (gfig_context->image_id);

172

173
  drawable = gimp_drawable_get (param[2].data.d_drawable);
Manish Singh's avatar
Manish Singh committed
174
175

  /* TMP Hack - clear any selections */
176
177
  if (! gimp_selection_is_empty (gfig_context->image_id))
    gimp_selection_clear (gfig_context->image_id);
Manish Singh's avatar
Manish Singh committed
178

179
  gimp_drawable_mask_bounds (drawable->drawable_id,
180
                             &sel_x1, &sel_y1, &sel_x2, &sel_y2);
Manish Singh's avatar
Manish Singh committed
181
182
183
184

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

185

Manish Singh's avatar
Manish Singh committed
186
  /* Calculate preview size */
187

188
189
190
191
192
193
194
195
196
  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;
197
    }
198

199

200
  preview_width  = MAX (pwidth, 2);  /* Min size is 2 */
201
  preview_height = MAX (pheight, 2);
Manish Singh's avatar
Manish Singh committed
202

203
204
205
206
  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;
207

208
209
210
211
212
  gimp_tile_cache_ntiles ((drawable->width + gimp_tile_width () - 1) /
                          gimp_tile_width ());

  gimp_drawable_detach (drawable);

213
214
215
  /* initialize */
  gfig_init_object_classes ();

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

225
226
          return;
        }
Manish Singh's avatar
Manish Singh committed
227
228
      break;

229
230
    case GIMP_RUN_NONINTERACTIVE:
      status = GIMP_PDB_CALLING_ERROR;
Manish Singh's avatar
Manish Singh committed
231
232
      break;

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

    default:
      break;
    }

241
  gimp_image_undo_group_end (gfig_context->image_id);
242

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

  values[0].data.d_status = status;

  gimp_drawable_detach (drawable);
}

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

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

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

  while (*src && cnt--)
    {
      if (*src == '\\' && *(src+1) && *(src+2) && *(src+3))
296
297
298
299
300
        {
          sscanf (src+1, "%3o", &tmp);
          *dest++ = tmp;
          src += 4;
        }
Manish Singh's avatar
Manish Singh committed
301
      else
302
        *dest++ = *src++;
Manish Singh's avatar
Manish Singh committed
303
304
305
306
307
308
309
310
311
312
313
    }
  *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.
 */

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

  n = 0;
322

323
  for (tmp = gfig_list; tmp; tmp = g_list_next (tmp))
Manish Singh's avatar
Manish Singh committed
324
325
    {
      g = tmp->data;
326

Manish Singh's avatar
Manish Singh committed
327
      if (strcmp (gfig->draw_name, g->draw_name) <= 0)
328
        break;
329

Manish Singh's avatar
Manish Singh committed
330
331
      n++;
    }
332
  return n;
Manish Singh's avatar
Manish Singh committed
333
334
}

335
/*
336
 *      Insert gfigs in alphabetical order
337
338
 */

339
gint
340
gfig_list_insert (GFigObj *gfig)
Manish Singh's avatar
Manish Singh committed
341
{
342
  gint n;
Manish Singh's avatar
Manish Singh committed
343

344
  n = gfig_list_pos (gfig);
Manish Singh's avatar
Manish Singh committed
345
346
347
348
349
350

  gfig_list = g_list_insert (gfig_list, gfig, n);

  return n;
}

351
void
352
gfig_free (GFigObj *gfig)
Manish Singh's avatar
Manish Singh committed
353
354
355
{
  g_assert (gfig != NULL);

356
  free_all_objs (gfig->obj_list);
357
358
359
360
361

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

Manish Singh's avatar
Manish Singh committed
362
363
364
  g_free (gfig);
}

365
GFigObj *
366
gfig_new (void)
Manish Singh's avatar
Manish Singh committed
367
{
368
  return g_new0 (GFigObj, 1);
Manish Singh's avatar
Manish Singh committed
369
370
}

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

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

387
388
389
390
      /* kludge */
      offset = ftell (fp);
      gfig_skip_style (&style, fp);

391
      obj = d_load_object (load_buf, fp);
392

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

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

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

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

435
  gfig = gfig_new ();
Manish Singh's avatar
Manish Singh committed
436

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


  /* HEADER
   * draw_name
   * version
   * obj_list
   */

447
  get_line (load_buf, MAX_LOAD_LINE, fp, 1);
Manish Singh's avatar
Manish Singh committed
448

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

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

458
459
460
461
  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);
462

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

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

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

477
478
479
480
481
482
  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
483

484
485


486
  gfig_load_objs (gfig, load_count, fp);
487

Manish Singh's avatar
Manish Singh committed
488
  /* Check count ? */
489

490
  chk_count = gfig_obj_counts (gfig->obj_list);
491

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

499
  fclose (fp);
Manish Singh's avatar
Manish Singh committed
500

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

  gfig->obj_status = GFIG_OK;

506
  return gfig;
Manish Singh's avatar
Manish Singh committed
507
508
}

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

  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");
  g_string_append_printf (string, "</OPTIONS>\n");
}

539
540
static void
gfig_save_obj_start (Dobject *obj,
541
542
                     GString *string)
{
543
544
545
  g_string_append_printf (string, "<%s ", obj->class->name);
  gfig_style_save_as_attributes (&obj->style, string);
  g_string_append_printf (string, ">\n");
546
547
}

548
549
static void
gfig_save_obj_end (Dobject *obj,
550
551
                   GString *string)
{
552
  g_string_append_printf (string, "</%s>\n",obj->class->name);
553
554
555
556
}

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

566
  return (0);
Manish Singh's avatar
Manish Singh committed
567
568
}

569
570
static gint
load_options (GFigObj *gfig,
571
              FILE    *fp)
Manish Singh's avatar
Manish Singh committed
572
573
574
575
576
{
  gchar load_buf[MAX_LOAD_LINE];
  gchar str_buf[MAX_LOAD_LINE];
  gchar opt_buf[MAX_LOAD_LINE];

577
  get_line (load_buf, MAX_LOAD_LINE, fp, 0);
Manish Singh's avatar
Manish Singh committed
578
579

#ifdef DEBUG
580
  printf ("load '%s'\n", load_buf);
Manish Singh's avatar
Manish Singh committed
581
582
#endif /* DEBUG */

583
584
  if (strcmp (load_buf, "<OPTIONS>"))
    return (-1);
585

586
  get_line (load_buf, MAX_LOAD_LINE, fp, 0);
Manish Singh's avatar
Manish Singh committed
587
588

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

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

598
      printf ("option %s val %s\n", str_buf, opt_buf);
Manish Singh's avatar
Manish Singh committed
599
#else
600
      sscanf (load_buf, "%s %s", str_buf, opt_buf);
Manish Singh's avatar
Manish Singh committed
601
602
#endif /* DEBUG */

603
      if (!strcmp (str_buf, "GridSpacing:"))
604
605
606
607
608
609
610
611
        {
          /* Value is decimal */
          int sp = 0;
          sp = atoi (opt_buf);
          if (sp <= 0)
            return (-1);
          gfig->opts.gridspacing = sp;
        }
612
      else if (!strcmp (str_buf, "DrawGrid:"))
613
614
615
616
617
        {
          /* Value is bool */
          if (load_bool (opt_buf, &gfig->opts.drawgrid))
            return (-1);
        }
618
      else if (!strcmp (str_buf, "Snap2Grid:"))
619
620
621
622
623
        {
          /* Value is bool */
          if (load_bool (opt_buf, &gfig->opts.snap2grid))
            return (-1);
        }
624
      else if (!strcmp (str_buf, "LockOnGrid:"))
625
626
627
628
629
        {
          /* Value is bool */
          if (load_bool (opt_buf, &gfig->opts.lockongrid))
            return (-1);
        }
630
      else if (!strcmp (str_buf, "ShowControl:"))
631
632
633
634
635
        {
          /* Value is bool */
          if (load_bool (opt_buf, &gfig->opts.showcontrol))
            return (-1);
        }
636
      else if (!strcmp (str_buf, "GridType:"))
637
638
639
640
641
642
643
644
645
646
647
        {
          /* 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
648

649
      get_line (load_buf, MAX_LOAD_LINE, fp, 0);
650

Manish Singh's avatar
Manish Singh committed
651
#ifdef DEBUG
652
      printf ("opt line '%s'\n", load_buf);
Manish Singh's avatar
Manish Singh committed
653
#endif /* DEBUG */
654
    }
655
  return (0);
Manish Singh's avatar
Manish Singh committed
656
657
}

658
659
GString *
gfig_save_as_string ()
Manish Singh's avatar
Manish Singh committed
660
{
661
662
663
664
665
  DAllObjs     *objs;
  gint          count = 0;
  gchar         buf[G_ASCII_DTOSTR_BUF_SIZE];
  gchar         conv_buf[MAX_LOAD_LINE*3 +1];
  GString       *string;
Manish Singh's avatar
Manish Singh committed
666

667
  string = g_string_new (GFIG_HEADER);
668

669
670
671
672
673
674
  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
675

676
  count = gfig_obj_counts (objs);
Manish Singh's avatar
Manish Singh committed
677

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

680
  save_options (string);
Manish Singh's avatar
Manish Singh committed
681

682
  gfig_save_styles (string);
683

684
  for (objs = gfig_context->current_obj->obj_list; objs; objs = objs->next)
Manish Singh's avatar
Manish Singh committed
685
    {
686
      gfig_save_obj_start (objs->obj, string);
687

688
      gfig_save_style (&objs->obj->style, string);
689

690
      if (objs->obj->points)
691
        d_save_object (objs->obj, string);
Manish Singh's avatar
Manish Singh committed
692

693
      gfig_save_obj_end (objs->obj, string);
Manish Singh's avatar
Manish Singh committed
694
695
    }

696
  return string;
Manish Singh's avatar
Manish Singh committed
697
698
699
}


700
701
gboolean
gfig_save_as_parasite ()
Manish Singh's avatar
Manish Singh committed
702
{
703
704
  GimpParasite *parasite;
  GString       *string;
Manish Singh's avatar
Manish Singh committed
705

706
  string = gfig_save_as_string ();
Michael Natterer's avatar
Michael Natterer committed
707

708
709
710
711
  /* temporarily make the parasite non-persistent until the
   * format has stabilized.
   */
#if 0
712
  parasite = gimp_parasite_new ("gfig", GIMP_PARASITE_PERSISTENT | GIMP_PARASITE_UNDOABLE,
713
714
                                datasize, data);
#endif
Michael Natterer's avatar
Michael Natterer committed
715

716
  parasite = gimp_parasite_new ("gfig", GIMP_PARASITE_UNDOABLE,
717
                                string->len, string->str);
Michael Natterer's avatar
Michael Natterer committed
718

719
  g_string_free (string, TRUE);
Michael Natterer's avatar
Michael Natterer committed
720

721
  if (!gimp_drawable_parasite_attach (gfig_context->drawable_id, parasite))
722
    {
723
724
725
      g_message (_("Error trying to save figure as a parasite: can't attach parasite to drawable.\n"));
      gimp_parasite_free (parasite);
      return FALSE;
726
    }
Manish Singh's avatar
Manish Singh committed
727

728
729
  gimp_parasite_free (parasite);
  return TRUE;
Manish Singh's avatar
Manish Singh committed
730
731
}

732
733
GFigObj *
gfig_load_from_parasite ()
Manish Singh's avatar
Manish Singh committed
734
{
735
736
737
738
  FILE         *fp;
  gchar        *fname;
  GimpParasite *parasite;
  GFigObj      *gfig;
Manish Singh's avatar
Manish Singh committed
739

740
741
742
743
744
745
746
  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
747

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

750
751
  if (!parasite)
    return NULL;
752

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

755
756
757
758
759
760
761
  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
762

763
764
  gfig = gfig_load (fname, "(none)");
  unlink (fname);
Manish Singh's avatar
Manish Singh committed
765

766
  return (gfig);
Manish Singh's avatar
Manish Singh committed
767
768
}

769
770
void
gfig_save_callbk (void)
Manish Singh's avatar
Manish Singh committed
771
{
772
773
774
  FILE     *fp;
  gchar    *savename;
  GString  *string;
Manish Singh's avatar
Manish Singh committed
775

776
  savename = gfig_context->current_obj->filename;
Manish Singh's avatar
Manish Singh committed
777

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

780
  if (!fp)
Manish Singh's avatar
Manish Singh committed
781
    {
782
783
784
      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
785
786
    }

787
  string = gfig_save_as_string ();
788

789
  fwrite (string->str, string->len, 1, fp);
790

791
792
793
794
795
  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
796
797
    }

798
  fclose (fp);
Manish Singh's avatar
Manish Singh committed
799

800
}