Blame bin/gegl.c

Packit Service 2781ba
/* This file is part of GEGL editor -- a gtk frontend for GEGL
Packit Service 2781ba
 *
Packit Service 2781ba
 * This program is free software; you can redistribute it and/or modify
Packit Service 2781ba
 * it under the terms of the GNU General Public License as published by
Packit Service 2781ba
 * the Free Software Foundation; either version 3 of the License, or
Packit Service 2781ba
 * (at your option) any later version.
Packit Service 2781ba
 *
Packit Service 2781ba
 * This program is distributed in the hope that it will be useful,
Packit Service 2781ba
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 2781ba
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 2781ba
 * GNU General Public License for more details.
Packit Service 2781ba
 *
Packit Service 2781ba
 * You should have received a copy of the GNU General Public License
Packit Service 2781ba
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service 2781ba
 *
Packit Service 2781ba
 * Copyright (C) 2003, 2004, 2006, 2007, 2008 Øyvind Kolås
Packit Service 2781ba
 */
Packit Service 2781ba
Packit Service 2781ba
#include "config.h"
Packit Service 2781ba
Packit Service 2781ba
#include <glib.h>
Packit Service 2781ba
#include <glib/gprintf.h>
Packit Service 2781ba
#include <gegl.h>
Packit Service 2781ba
#include <stdio.h>
Packit Service 2781ba
#include <stdlib.h>
Packit Service 2781ba
#include <string.h>
Packit Service 2781ba
#ifdef HAVE_UNISTD_H
Packit Service 2781ba
#include <unistd.h>
Packit Service 2781ba
#endif
Packit Service 2781ba
Packit Service 2781ba
#include "gegl-options.h"
Packit Service 2781ba
#ifdef HAVE_SPIRO
Packit Service 2781ba
#include "gegl-path-spiro.h"
Packit Service 2781ba
#endif
Packit Service 2781ba
#include "gegl-path-smooth.h"
Packit Service 2781ba
#include "operation/gegl-extension-handler.h"
Packit Service 2781ba
Packit Service 2781ba
#ifdef G_OS_WIN32
Packit Service 2781ba
#include <direct.h>
Packit Service 2781ba
#define getcwd(b,n) _getcwd(b,n)
Packit Service 2781ba
#define realpath(a,b) _fullpath(b,a,_MAX_PATH)
Packit Service 2781ba
#endif
Packit Service 2781ba
Packit Service 2781ba
#define DEFAULT_COMPOSITION \
Packit Service 2781ba
" <gegl> <node operation='gegl:crop'> <params> <param name='x'>0</param> <param name='y'>0</param> <param name='width'>395</param> <param name='height'>200</param> </params> </node> <node operation='gegl:over'> <node operation='gegl:translate'> <params> <param name='x'>80</param> <param name='y'>162</param> </params> </node> <node operation='gegl:opacity'> <params> <param name='value'>0.5</param> </params> </node> <node name='text' operation='gegl:text'> <params> <param name='string'>2000-2011 © Various contributors</param> <param name='font'>Sans</param> <param name='size'>12</param> <param name='color'>rgb(0.0000, 0.0000, 0.0000)</param> <param name='wrap'>628</param> <param name='alignment'>0</param> <param name='width'>622</param> <param name='height'>40</param> </params> </node> </node> <node operation='gegl:over'> <node operation='gegl:translate'> <params> <param name='x'>20</param> <param name='y'>50</param> </params> </node> <node operation='gegl:over'> <node operation='gegl:translate'> <params> <param name='x'>0</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <gegl:fill-path d='M0,50 C0,78 24,100 50,100 C77,100 100,78 100,50 C100,45 99,40 98,35 C82,35 66,35 50,35 C42,35 35,42 35,50 C35,58 42,65 50,65 C56,65 61,61 64,56 C67,51 75,55 73,60 C69,69 60,75 50,75 C36,75 25,64 25,50 C25,36 36,25 50,25 L93,25 C83,9 67,0 49,0 C25,0 0,20 0,50 z' color='white'/> </node> <node operation='gegl:over'> <node operation='gegl:translate'> <params> <param name='x'>88</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <node operation='gegl:fill-path'> <params> <param name='d'>M50,0 C23,0 0,22 0,50 C0,77 22,100 50,100 C68,100 85,90 93,75 L40,75 C35,75 35,65 40,65 L98,65 C100,55 100,45 98,35 L40,35 C35,35 35,25 40,25 L93,25 C84,10 68,0 50,0 z</param> <param name='color'>rgb(1.0000, 1.0000, 1.0000)</param> </params> </node> </node> <node operation='gegl:over'> <node operation='gegl:translate'> <params> <param name='x'>176</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <node operation='gegl:fill-path'> <params> <param name='d'>M0,50 C0,78 24,100 50,100 C77,100 100,78 100,50 C100,45 99,40 98,35 C82,35 66,35 50,35 C42,35 35,42 35,50 C35,58 42,65 50,65 C56,65 61,61 64,56 C67,51 75,55 73,60 C69,69 60,75 50,75 C36,75 25,64 25,50 C25,36 36,25 50,25 L93,25 C83,9 67,0 49,0 C25,0 0,20 0,50 z</param> <param name='color'>rgb(1.0000, 1.0000, 1.0000)</param> </params> </node> </node> <node operation='gegl:translate'> <params> <param name='x'>264</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <node operation='gegl:fill-path'> <params> <param name='d'>M30,4 C12,13 0,30 0,50 C0,78 23,100 50,100 C71,100 88,88 96,71 L56,71 C42,71 30,59 30,45 L30,4 z</param> <param name='color'>rgb(1.0000, 1.0000, 1.0000)</param> </params> </node> </node> <node operation='gegl:rotate'> <params> <param name='origin-x'>0</param> <param name='origin-y'>0</param> <param name='filter'>linear</param> <param name='hard-edges'>false</param> <param name='lanczos-width'>3</param> <param name='degrees'>42</param> </params> </node> <node operation='gegl:checkerboard'> <params> <param name='x'>43</param> <param name='y'>44</param> <param name='x-offset'>0</param> <param name='y-offset'>0</param> <param name='color1'>rgb(0.7097, 0.7097, 0.7097)</param> <param name='color2'>rgb(0.7661, 0.7661, 0.7661)</param> </params> </node> </gegl>"
Packit Service 2781ba
Packit Service 2781ba
#define STDIN_BUF_SIZE 128
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
gegl_enable_fatal_warnings (void)
Packit Service 2781ba
{
Packit Service 2781ba
  GLogLevelFlags fatal_mask;
Packit Service 2781ba
Packit Service 2781ba
  fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
Packit Service 2781ba
  fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
Packit Service 2781ba
Packit Service 2781ba
  g_log_set_always_fatal (fatal_mask);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static gboolean file_is_gegl_xml (const gchar *path)
Packit Service 2781ba
{
Packit Service 2781ba
  gchar *extension;
Packit Service 2781ba
Packit Service 2781ba
  extension = strrchr (path, '.');
Packit Service 2781ba
  if (!extension)
Packit Service 2781ba
    return FALSE;
Packit Service 2781ba
  extension++;
Packit Service 2781ba
  if (extension[0]=='\0')
Packit Service 2781ba
    return FALSE;
Packit Service 2781ba
  if (!strcmp (extension, "xml")||
Packit Service 2781ba
      !strcmp (extension, "XML")||
Packit Service 2781ba
      !strcmp (extension, "svg")
Packit Service 2781ba
      )
Packit Service 2781ba
    return TRUE;
Packit Service 2781ba
  return FALSE;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
gint
Packit Service 2781ba
main (gint    argc,
Packit Service 2781ba
      gchar **argv)
Packit Service 2781ba
{
Packit Service 2781ba
  GeglOptions *o         = NULL;
Packit Service 2781ba
  GeglNode    *gegl      = NULL;
Packit Service 2781ba
  gchar       *script    = NULL;
Packit Service 2781ba
  GError      *err       = NULL;
Packit Service 2781ba
  gchar       *path_root = NULL;
Packit Service 2781ba
Packit Service 2781ba
  o = gegl_options_parse (argc, argv);
Packit Service 2781ba
Packit Service 2781ba
  if (o->fatal_warnings)
Packit Service 2781ba
    {
Packit Service 2781ba
      gegl_enable_fatal_warnings ();
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  g_thread_init (NULL);
Packit Service 2781ba
  gegl_init (&argc, &argv);
Packit Service 2781ba
#ifdef HAVE_SPIRO
Packit Service 2781ba
  gegl_path_spiro_init ();
Packit Service 2781ba
#endif
Packit Service 2781ba
  gegl_path_smooth_init ();
Packit Service 2781ba
Packit Service 2781ba
  if (o->xml)
Packit Service 2781ba
    {
Packit Service 2781ba
      path_root = g_get_current_dir ();
Packit Service 2781ba
    }
Packit Service 2781ba
  else if (o->file)
Packit Service 2781ba
    {
Packit Service 2781ba
      if (!strcmp (o->file, "-"))  /* read XML from stdin */
Packit Service 2781ba
        {
Packit Service 2781ba
          path_root = g_get_current_dir ();
Packit Service 2781ba
        }
Packit Service 2781ba
      else
Packit Service 2781ba
        {
Packit Service 2781ba
          gchar *tmp;
Packit Service 2781ba
          gchar *temp1 = g_strdup (o->file);
Packit Service 2781ba
          gchar *temp2 = g_path_get_dirname (temp1);
Packit Service 2781ba
          path_root = g_strdup (tmp = realpath (temp2, NULL));
Packit Service 2781ba
          g_free (tmp);
Packit Service 2781ba
          g_free (temp1);
Packit Service 2781ba
          g_free (temp2);
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  if (o->xml)
Packit Service 2781ba
    {
Packit Service 2781ba
      script = g_strdup (o->xml);
Packit Service 2781ba
    }
Packit Service 2781ba
  else if (o->file)
Packit Service 2781ba
    {
Packit Service 2781ba
      if (!strcmp (o->file, "-"))  /* read XML from stdin */
Packit Service 2781ba
        {
Packit Service 2781ba
          gchar buf[STDIN_BUF_SIZE];
Packit Service 2781ba
          GString *acc = g_string_new ("");
Packit Service 2781ba
Packit Service 2781ba
          while (fgets (buf, STDIN_BUF_SIZE, stdin))
Packit Service 2781ba
            {
Packit Service 2781ba
              g_string_append (acc, buf);
Packit Service 2781ba
            }
Packit Service 2781ba
          script = g_string_free (acc, FALSE);
Packit Service 2781ba
        }
Packit Service 2781ba
      else if (file_is_gegl_xml (o->file))
Packit Service 2781ba
        {
Packit Service 2781ba
          g_file_get_contents (o->file, &script, NULL, &err;;
Packit Service 2781ba
          if (err != NULL)
Packit Service 2781ba
            {
Packit Service 2781ba
              g_warning ("Unable to read file: %s", err->message);
Packit Service 2781ba
            }
Packit Service 2781ba
        }
Packit Service 2781ba
      else
Packit Service 2781ba
        {
Packit Service 2781ba
          gchar *leaked_string = g_malloc (strlen (o->file) + 5);
Packit Service 2781ba
          GString *acc = g_string_new ("");
Packit Service 2781ba
Packit Service 2781ba
          {
Packit Service 2781ba
            gchar *file_basename;
Packit Service 2781ba
            gchar *tmp;
Packit Service 2781ba
            tmp = g_strdup (o->file);
Packit Service 2781ba
            file_basename = g_path_get_basename (tmp);
Packit Service 2781ba
Packit Service 2781ba
            g_string_append (acc, "<gegl>
Packit Service 2781ba
            g_string_append (acc, file_basename);
Packit Service 2781ba
            g_string_append (acc, "'/></gegl>");
Packit Service 2781ba
Packit Service 2781ba
            g_free (tmp);
Packit Service 2781ba
          }
Packit Service 2781ba
Packit Service 2781ba
          script = g_string_free (acc, FALSE);
Packit Service 2781ba
Packit Service 2781ba
          leaked_string[0]='\0';
Packit Service 2781ba
          strcat (leaked_string, o->file);
Packit Service 2781ba
          strcat (leaked_string, ".xml");
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
  else
Packit Service 2781ba
    {
Packit Service 2781ba
      if (o->rest)
Packit Service 2781ba
        {
Packit Service 2781ba
          script = g_strdup ("<gegl></gegl>");
Packit Service 2781ba
        }
Packit Service 2781ba
      else
Packit Service 2781ba
        {
Packit Service 2781ba
          script = g_strdup (DEFAULT_COMPOSITION);
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  gegl = gegl_node_new_from_xml (script, path_root);
Packit Service 2781ba
Packit Service 2781ba
  if (!gegl)
Packit Service 2781ba
    {
Packit Service 2781ba
      g_print ("Invalid graph, abort.\n");
Packit Service 2781ba
      return 1;
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  if (o->rest)
Packit Service 2781ba
    {
Packit Service 2781ba
      GeglNode *proxy;
Packit Service 2781ba
      GeglNode *iter;
Packit Service 2781ba
Packit Service 2781ba
      gchar **operation = o->rest;
Packit Service 2781ba
      proxy = gegl_node_get_output_proxy (gegl, "output");
Packit Service 2781ba
      iter = gegl_node_get_producer (proxy, "input", NULL);
Packit Service 2781ba
Packit Service 2781ba
      while (*operation)
Packit Service 2781ba
        {
Packit Service 2781ba
          GeglNode *new;
Packit Service 2781ba
Packit Service 2781ba
          new = gegl_node_new_child (gegl, "operation", *operation, NULL);
Packit Service 2781ba
          if (iter)
Packit Service 2781ba
            {
Packit Service 2781ba
              gegl_node_link_many (iter, new, proxy, NULL);
Packit Service 2781ba
            }
Packit Service 2781ba
          else
Packit Service 2781ba
            {
Packit Service 2781ba
              gegl_node_link_many (new, proxy, NULL);
Packit Service 2781ba
            }
Packit Service 2781ba
          iter = new;
Packit Service 2781ba
          operation++;
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  switch (o->mode)
Packit Service 2781ba
    {
Packit Service 2781ba
      case GEGL_RUN_MODE_DISPLAY:
Packit Service 2781ba
        {
Packit Service 2781ba
          GeglNode *output = gegl_node_new_child (gegl,
Packit Service 2781ba
                                                  "operation", "gegl:display",
Packit Service 2781ba
                                                  o->file ? "window-title" : NULL, o->file,
Packit Service 2781ba
                                                  NULL);
Packit Service 2781ba
          gegl_node_connect_from (output, "input", gegl_node_get_output_proxy (gegl, "output"), "output");
Packit Service 2781ba
          gegl_node_process (output);
Packit Service 2781ba
          g_main_loop_run (g_main_loop_new (NULL, TRUE));
Packit Service 2781ba
          g_object_unref (output);
Packit Service 2781ba
        }
Packit Service 2781ba
        break;
Packit Service 2781ba
      case GEGL_RUN_MODE_XML:
Packit Service 2781ba
        g_printf ("%s\n", gegl_node_to_xml (gegl, path_root));
Packit Service 2781ba
        return 0;
Packit Service 2781ba
        break;
Packit Service 2781ba
Packit Service 2781ba
      case GEGL_RUN_MODE_OUTPUT:
Packit Service 2781ba
        {
Packit Service 2781ba
          GeglNode *output = gegl_node_new_child (gegl,
Packit Service 2781ba
                                                  "operation", "gegl:save",
Packit Service 2781ba
                                                  "path", o->output,
Packit Service 2781ba
                                                  NULL);
Packit Service 2781ba
          gegl_node_connect_from (output, "input", gegl_node_get_output_proxy (gegl, "output"), "output");
Packit Service 2781ba
          gegl_node_process (output);
Packit Service 2781ba
          g_object_unref (output);
Packit Service 2781ba
        }
Packit Service 2781ba
        break;  
Packit Service 2781ba
Packit Service 2781ba
      case GEGL_RUN_MODE_HELP:
Packit Service 2781ba
        break;
Packit Service 2781ba
Packit Service 2781ba
      default:
Packit Service 2781ba
        g_warning ("Unknown GeglOption mode: %d", o->mode);
Packit Service 2781ba
        break;
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  g_list_free_full (o->files, g_free);
Packit Service 2781ba
  g_free (o);
Packit Service 2781ba
  g_object_unref (gegl);
Packit Service 2781ba
  g_free (script);
Packit Service 2781ba
  g_clear_error (&err;;
Packit Service 2781ba
  g_free (path_root);
Packit Service 2781ba
  gegl_exit ();
Packit Service 2781ba
  return 0;
Packit Service 2781ba
}