Blame tools/operation_reference.c

Packit Service 2781ba
#include "config.h"
Packit Service 2781ba
Packit Service 2781ba
#include <gegl-plugin.h>  /* needed to do full introspection */
Packit Service 2781ba
#include <stdio.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
static GList *
Packit Service 2781ba
gegl_operations_build (GList *list, GType type)
Packit Service 2781ba
{
Packit Service 2781ba
  GeglOperationClass *klass;
Packit Service 2781ba
  GType *ops;
Packit Service 2781ba
  guint  children;
Packit Service 2781ba
  gint   no;
Packit Service 2781ba
Packit Service 2781ba
  if (!type)
Packit Service 2781ba
    return list;
Packit Service 2781ba
Packit Service 2781ba
  klass = g_type_class_ref (type);
Packit Service 2781ba
  if (klass->name != NULL)
Packit Service 2781ba
    list = g_list_prepend (list, klass);
Packit Service 2781ba
Packit Service 2781ba
  ops = g_type_children (type, &children);
Packit Service 2781ba
Packit Service 2781ba
  for (no=0; no
Packit Service 2781ba
    {
Packit Service 2781ba
      list = gegl_operations_build (list, ops[no]);
Packit Service 2781ba
    }
Packit Service 2781ba
  if (ops)
Packit Service 2781ba
    g_free (ops);
Packit Service 2781ba
  return list;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static gint compare_operation_names (gconstpointer a,
Packit Service 2781ba
                                     gconstpointer b)
Packit Service 2781ba
{
Packit Service 2781ba
  const GeglOperationClass *klassA, *klassB;
Packit Service 2781ba
Packit Service 2781ba
  klassA = a;
Packit Service 2781ba
  klassB = b;
Packit Service 2781ba
Packit Service 2781ba
  return strcmp (klassA->name, klassB->name);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static GList *gegl_operations (void)
Packit Service 2781ba
{
Packit Service 2781ba
  static GList *operations = NULL;
Packit Service 2781ba
  if (!operations)
Packit Service 2781ba
    {
Packit Service 2781ba
      operations = gegl_operations_build (NULL, GEGL_TYPE_OPERATION);
Packit Service 2781ba
      operations = g_list_sort (operations, compare_operation_names);
Packit Service 2781ba
    }
Packit Service 2781ba
  return operations;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
GeglColor *
Packit Service 2781ba
gegl_param_spec_color_get_default (GParamSpec *self);
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
list_properties (GType    type,
Packit Service 2781ba
                 gint     indent,
Packit Service 2781ba
                 gboolean html)
Packit Service 2781ba
{
Packit Service 2781ba
  GParamSpec **self;
Packit Service 2781ba
  GParamSpec **parent;
Packit Service 2781ba
  guint n_self;
Packit Service 2781ba
  guint n_parent;
Packit Service 2781ba
  gint prop_no;
Packit Service 2781ba
Packit Service 2781ba
  if (!type)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  self = g_object_class_list_properties (
Packit Service 2781ba
            G_OBJECT_CLASS (g_type_class_ref (type)),
Packit Service 2781ba
            &n_self);
Packit Service 2781ba
  parent = g_object_class_list_properties (
Packit Service 2781ba
            /*G_OBJECT_CLASS (g_type_class_peek_parent (g_type_class_ref (type))),*/
Packit Service 2781ba
            G_OBJECT_CLASS (g_type_class_ref (GEGL_TYPE_OPERATION)),
Packit Service 2781ba
            &n_parent);
Packit Service 2781ba
Packit Service 2781ba
  for (prop_no=0;prop_no
Packit Service 2781ba
    {
Packit Service 2781ba
      gint parent_no;
Packit Service 2781ba
      gboolean found=FALSE;
Packit Service 2781ba
      for (parent_no=0;parent_no
Packit Service 2781ba
        if (self[prop_no]==parent[parent_no])
Packit Service 2781ba
          found=TRUE;
Packit Service 2781ba
      /* only print properties if we are an addition compared to
Packit Service 2781ba
       * GeglOperation
Packit Service 2781ba
       */
Packit Service 2781ba
      if (!found)
Packit Service 2781ba
        {
Packit Service 2781ba
          const gchar *type_name = g_type_name (G_OBJECT_TYPE (self[prop_no]));
Packit Service 2781ba
Packit Service 2781ba
          type_name = strstr (type_name, "Param");
Packit Service 2781ba
          type_name+=5;
Packit Service 2781ba
Packit Service 2781ba
          g_print("  %s
", type_name);
Packit Service 2781ba
Packit Service 2781ba
          if (g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (self[prop_no]), G_TYPE_DOUBLE))
Packit Service 2781ba
            {
Packit Service 2781ba
              gdouble default_value = G_PARAM_SPEC_DOUBLE (self[prop_no])->default_value;
Packit Service 2781ba
              gdouble min = G_PARAM_SPEC_DOUBLE (self[prop_no])->minimum;
Packit Service 2781ba
              gdouble max = G_PARAM_SPEC_DOUBLE (self[prop_no])->maximum;
Packit Service 2781ba
Packit Service 2781ba
              if (default_value<-10000000)
Packit Service 2781ba
                g_print ("-inf ");
Packit Service 2781ba
              else if (default_value>10000000)
Packit Service 2781ba
                g_print ("+inf");
Packit Service 2781ba
              else
Packit Service 2781ba
                g_print ("%2.2f", default_value);
Packit Service 2781ba
Packit Service 2781ba
              g_print ("
");
Packit Service 2781ba
              if (min<-10000000)
Packit Service 2781ba
                g_print ("-inf ");
Packit Service 2781ba
              else
Packit Service 2781ba
                g_print ("%2.2f", min);
Packit Service 2781ba
Packit Service 2781ba
              g_print ("-");
Packit Service 2781ba
Packit Service 2781ba
              if (max>10000000)
Packit Service 2781ba
                g_print (" +inf");
Packit Service 2781ba
              else
Packit Service 2781ba
                g_print ("%2.2f", max);
Packit Service 2781ba
            }
Packit Service 2781ba
          else if (g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (self[prop_no]), G_TYPE_INT))
Packit Service 2781ba
            {
Packit Service 2781ba
              gint default_value = G_PARAM_SPEC_INT (self[prop_no])->default_value;
Packit Service 2781ba
              gint min = G_PARAM_SPEC_INT (self[prop_no])->minimum;
Packit Service 2781ba
              gint max = G_PARAM_SPEC_INT (self[prop_no])->maximum;
Packit Service 2781ba
Packit Service 2781ba
              if (default_value<-10000000)
Packit Service 2781ba
                g_print ("-inf ");
Packit Service 2781ba
              else if (default_value>10000000)
Packit Service 2781ba
                g_print ("+inf");
Packit Service 2781ba
              else
Packit Service 2781ba
                g_print ("%i", default_value);
Packit Service 2781ba
Packit Service 2781ba
              g_print ("
");
Packit Service 2781ba
              if (min<-10000000)
Packit Service 2781ba
                g_print ("-inf ");
Packit Service 2781ba
              else
Packit Service 2781ba
                g_print ("%i", min);
Packit Service 2781ba
Packit Service 2781ba
              g_print ("-");
Packit Service 2781ba
Packit Service 2781ba
              if (max>10000000)
Packit Service 2781ba
                g_print (" +inf");
Packit Service 2781ba
              else
Packit Service 2781ba
                g_print ("%i", max);
Packit Service 2781ba
            }
Packit Service 2781ba
          else if (g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (self[prop_no]), G_TYPE_FLOAT))
Packit Service 2781ba
            {
Packit Service 2781ba
              gfloat default_value = G_PARAM_SPEC_FLOAT (self[prop_no])->default_value;
Packit Service 2781ba
              gfloat min = G_PARAM_SPEC_FLOAT (self[prop_no])->minimum;
Packit Service 2781ba
              gfloat max = G_PARAM_SPEC_FLOAT (self[prop_no])->maximum;
Packit Service 2781ba
Packit Service 2781ba
              if (default_value<-10000000)
Packit Service 2781ba
                g_print ("-inf ");
Packit Service 2781ba
              else if (default_value>10000000)
Packit Service 2781ba
                g_print ("+inf");
Packit Service 2781ba
              else
Packit Service 2781ba
                g_print ("%2.2f", default_value);
Packit Service 2781ba
Packit Service 2781ba
              g_print ("
");
Packit Service 2781ba
              if (min<-10000000)
Packit Service 2781ba
                g_print ("-inf ");
Packit Service 2781ba
              else
Packit Service 2781ba
                g_print ("%2.2f", min);
Packit Service 2781ba
Packit Service 2781ba
              g_print ("-");
Packit Service 2781ba
Packit Service 2781ba
              if (max>10000000)
Packit Service 2781ba
                g_print (" +inf");
Packit Service 2781ba
              else
Packit Service 2781ba
                g_print ("%2.2f", max);
Packit Service 2781ba
            }
Packit Service 2781ba
          else if (g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (self[prop_no]), G_TYPE_BOOLEAN))
Packit Service 2781ba
            {
Packit Service 2781ba
              g_print ("%s", G_PARAM_SPEC_BOOLEAN (self[prop_no])->default_value?"True":"False");
Packit Service 2781ba
            }
Packit Service 2781ba
          else if (g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (self[prop_no]), G_TYPE_STRING))
Packit Service 2781ba
            {
Packit Service 2781ba
              const gchar *string = G_PARAM_SPEC_STRING (self[prop_no])->default_value;
Packit Service 2781ba
Packit Service 2781ba
              if (strlen (string) > 8)
Packit Service 2781ba
                {
Packit Service 2781ba
                  gchar copy[16];
Packit Service 2781ba
                  g_snprintf (copy, 12, "%s..", string);
Packit Service 2781ba
                  g_print ("%s", copy);
Packit Service 2781ba
                }
Packit Service 2781ba
              else
Packit Service 2781ba
                g_print ("%s", string);
Packit Service 2781ba
            }
Packit Service 2781ba
          else if (g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (self[prop_no]), GEGL_TYPE_COLOR))
Packit Service 2781ba
            {
Packit Service 2781ba
              GeglColor *color = gegl_param_spec_color_get_default (self[prop_no]);
Packit Service 2781ba
              if (color)
Packit Service 2781ba
                {
Packit Service 2781ba
                  gchar *string;
Packit Service 2781ba
Packit Service 2781ba
                  g_object_get (color, "string", &string, NULL);
Packit Service 2781ba
                  g_print ("%s", string);
Packit Service 2781ba
                  g_free (string);
Packit Service 2781ba
Packit Service 2781ba
                  g_object_unref (color);
Packit Service 2781ba
                }
Packit Service 2781ba
            }
Packit Service 2781ba
          else
Packit Service 2781ba
            {
Packit Service 2781ba
              g_print ("\n");
Packit Service 2781ba
            }
Packit Service 2781ba
          g_print ("");
Packit Service 2781ba
Packit Service 2781ba
          g_print("%s\n",
Packit Service 2781ba
            g_param_spec_get_name (self[prop_no]));
Packit Service 2781ba
Packit Service 2781ba
          if (g_param_spec_get_blurb (self[prop_no]) &&
Packit Service 2781ba
              g_param_spec_get_blurb (self[prop_no])[0]!='\0')
Packit Service 2781ba
            g_print ("%s\n",
Packit Service 2781ba
            g_param_spec_get_blurb (self[prop_no]));
Packit Service 2781ba
          else
Packit Service 2781ba
            g_print ("not documented\n\n");
Packit Service 2781ba
Packit Service 2781ba
          g_print ("\n");
Packit Service 2781ba
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
  if (self)
Packit Service 2781ba
    g_free (self);
Packit Service 2781ba
  if (parent)
Packit Service 2781ba
    g_free (parent);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
static gchar *html_top = "<html>\n<head>\n<title>GEGL operations</title>\n<link rel='shortcut icon' href='images/gegl.ico'/>\n<style type='text/css'>\n@import url(gegl.css);\ndiv#toc ul { font-size:70%; }\n"
Packit Service 2781ba
".category { margin-bottom: 2em; }\n"
Packit Service 2781ba
".category a {\n  display: block;\n  width: 14em;\n  height: 1.2em;\n  float: left;\n  text-align: left;\n  font-size: 90%;\n}\n"
Packit Service 2781ba
"</style>\n</head>\n\n<body>\n
\n
\n";
Packit Service 2781ba
static gchar *html_bottom = "\n\n</body>\n</html>\n";
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
static void category_index (gpointer key,
Packit Service 2781ba
                            gpointer value,
Packit Service 2781ba
                            gpointer user_data)
Packit Service 2781ba
{
Packit Service 2781ba
  gchar    *category = key;
Packit Service 2781ba
  GList    *operations = value;
Packit Service 2781ba
  GList    *iter;
Packit Service 2781ba
  gboolean  comma;
Packit Service 2781ba
Packit Service 2781ba
  if (!strcmp (category, "hidden"))
Packit Service 2781ba
    return;
Packit Service 2781ba
  g_print ("

%s

\n", category, category);
Packit Service 2781ba
  g_print ("
\n");
Packit Service 2781ba
Packit Service 2781ba
  for (iter=operations, comma=FALSE;iter;iter = g_list_next (iter))
Packit Service 2781ba
    {
Packit Service 2781ba
      GeglOperationClass *klass = iter->data;
Packit Service 2781ba
      const char *categories = gegl_operation_class_get_key (klass, "categories");
Packit Service 2781ba
      if (strstr (categories, "hidden"))
Packit Service 2781ba
        continue;
Packit Service 2781ba
      g_print ("%s%s\n", comma?"":"", klass->name, klass->name);
Packit Service 2781ba
      comma = TRUE;
Packit Service 2781ba
    }
Packit Service 2781ba
  g_print ("
\n");
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void category_menu_index (gpointer key,
Packit Service 2781ba
                                 gpointer value,
Packit Service 2781ba
                                 gpointer user_data)
Packit Service 2781ba
{
Packit Service 2781ba
  gchar    *category = key;
Packit Service 2781ba
  GList    *operations = value;
Packit Service 2781ba
  GList    *iter;
Packit Service 2781ba
Packit Service 2781ba
  if (!strcmp (category, "hidden"))
Packit Service 2781ba
    return;
Packit Service 2781ba
  for (iter=operations;iter;iter = g_list_next (iter))
Packit Service 2781ba
    {
Packit Service 2781ba
      GeglOperationClass *klass = iter->data;
Packit Service 2781ba
      const char *categories = gegl_operation_class_get_key (klass, "categories");
Packit Service 2781ba
      if (!categories || strstr (categories, "hidden"))
Packit Service 2781ba
        continue;
Packit Service 2781ba
      g_print ("
  • %s
  • \n", klass->name, klass->name);
    Packit Service 2781ba
        }
    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
      GList      *operations;
    Packit Service 2781ba
      GList      *iter;
    Packit Service 2781ba
      GHashTable *categories = NULL;
    Packit Service 2781ba
    Packit Service 2781ba
      gegl_init (&argc, &argv);
    Packit Service 2781ba
    Packit Service 2781ba
      operations = gegl_operations ();
    Packit Service 2781ba
    Packit Service 2781ba
      /* Collect categories */
    Packit Service 2781ba
      categories = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
    Packit Service 2781ba
      for (iter=operations;iter;iter = g_list_next (iter))
    Packit Service 2781ba
        {
    Packit Service 2781ba
          GeglOperationClass *klass = iter->data;
    Packit Service 2781ba
          const char *categoris = gegl_operation_class_get_key (klass, "categories");
    Packit Service 2781ba
          const gchar *ptr = categoris;
    Packit Service 2781ba
          while (ptr && *ptr)
    Packit Service 2781ba
            {
    Packit Service 2781ba
              gchar category[64]="";
    Packit Service 2781ba
              gint i=0;
    Packit Service 2781ba
              while (*ptr && *ptr!=':' && i<63)
    Packit Service 2781ba
                {
    Packit Service 2781ba
                  category[i++]=*(ptr++);
    Packit Service 2781ba
                  category[i]='\0';
    Packit Service 2781ba
                }
    Packit Service 2781ba
              if (*ptr==':')
    Packit Service 2781ba
                ptr++;
    Packit Service 2781ba
              {
    Packit Service 2781ba
                GList *items = g_hash_table_lookup (categories, category);
    Packit Service 2781ba
                g_hash_table_insert (categories, g_strdup (category), g_list_append (items, klass));
    Packit Service 2781ba
              }
    Packit Service 2781ba
            }
    Packit Service 2781ba
        }
    Packit Service 2781ba
    Packit Service 2781ba
      g_print ("%s", html_top);
    Packit Service 2781ba
    Packit Service 2781ba
      g_print ("
    \n
      \n");
    Packit Service 2781ba
      g_print ("
  • GEGL
  •  
  • \n");
    Packit Service 2781ba
      g_print ("
  • Documentation
  • \n");
    Packit Service 2781ba
      g_print ("
  •   Glossary
  • \n");
    Packit Service 2781ba
      g_print ("
  •   Operations
  • \n");
    Packit Service 2781ba
      g_print ("
  •   API reference
  • \n");
    Packit Service 2781ba
      g_print ("
  •  
  • \n");
    Packit Service 2781ba
      g_print ("
  • Categories
  • \n");
    Packit Service 2781ba
      g_print ("
  •  
  • \n");
    Packit Service 2781ba
      /*category_menu_item ("All", NULL, NULL);
    Packit Service 2781ba
      g_hash_table_foreach (categories, category_menu_item, NULL);*/
    Packit Service 2781ba
    Packit Service 2781ba
          /*border: 0.1em dashed rgb(210,210,210);
    Packit Service 2781ba
           */
    Packit Service 2781ba
      category_menu_index("All", operations, NULL);
    Packit Service 2781ba
    Packit Service 2781ba
      g_print ("\n\n");
    Packit Service 2781ba
    Packit Service 2781ba
        g_print ("

    GEGL operation reference

    ");
    Packit Service 2781ba
        g_print ("

    Image processing operations are shared objects (plug-ins) loaded when GEGL initializes. "

    Packit Service 2781ba
                 "This page is generated from information registered by the plug-ins themselves.

    "
    Packit Service 2781ba
                  "

    Categories

    A plug-in can "

    Packit Service 2781ba
                 "belong in multiple categories. Below is indexes broken down into the various available categories.

    ");
    Packit Service 2781ba
    Packit Service 2781ba
      /*category_index ("All", operations, NULL);*/
    Packit Service 2781ba
      /* create menus for each of the categories */
    Packit Service 2781ba
    Packit Service 2781ba
      g_hash_table_foreach (categories, category_index, NULL);
    Packit Service 2781ba
    Packit Service 2781ba
      /* list all operations */
    Packit Service 2781ba
      g_print ("\n");
    Packit Service 2781ba
      for (iter=operations;iter;iter = g_list_next (iter))
    Packit Service 2781ba
        {
    Packit Service 2781ba
          GeglOperationClass *klass = iter->data;
    Packit Service 2781ba
          const char *categoris = gegl_operation_class_get_key (klass, "categories");
    Packit Service 2781ba
          const char *description = gegl_operation_class_get_key (klass, "description");
    Packit Service 2781ba
          if (categoris && strstr (categoris, "hidden"))
    Packit Service 2781ba
            continue;
    Packit Service 2781ba
    Packit Service 2781ba
          g_print ("\n   \n  %s\n\n", klass->name, klass->name);
    Packit Service 2781ba
          if (description)
    Packit Service 2781ba
            g_print ("\n   \n  %s\n\n", description);
    Packit Service 2781ba
          list_properties (G_OBJECT_CLASS_TYPE (klass), 2, TRUE);
    Packit Service 2781ba
        }
    Packit Service 2781ba
      g_print ("\n");
    Packit Service 2781ba
    Packit Service 2781ba
    Packit Service 2781ba
      g_print ("%s", html_bottom);
    Packit Service 2781ba
    Packit Service 2781ba
      g_list_free (operations);
    Packit Service 2781ba
      gegl_exit ();
    Packit Service 2781ba
      return 0;
    Packit Service 2781ba
    }