Blame tools/introspect.c

Packit Service 2781ba
#include "config.h"
Packit Service 2781ba
#include <gegl.h> /* needed instead of gegl.h to be able to do full
Packit Service 2781ba
                     introspection*/
Packit Service 2781ba
#include <stdio.h>
Packit Service 2781ba
Packit Service 2781ba
FILE *file = NULL;
Packit Service 2781ba
Packit Service 2781ba
void collapse_all (GType type);
Packit Service 2781ba
void expand_all (GType type);
Packit Service 2781ba
Packit Service 2781ba
static gchar *collapsibles_html =
Packit Service 2781ba
"   <script type='text/javascript'>/*
Packit Service 2781ba
"    function hide(id)"
Packit Service 2781ba
"    {"
Packit Service 2781ba
"      (document.getElementById(id)).style.display = \"none\";"
Packit Service 2781ba
"    }"
Packit Service 2781ba
"    function show(id)"
Packit Service 2781ba
"    {"
Packit Service 2781ba
"      (document.getElementById(id)).style.display = \"block\";"
Packit Service 2781ba
"    }"
Packit Service 2781ba
"    function get_visible (id)"
Packit Service 2781ba
"    {"
Packit Service 2781ba
"      var element = document.getElementById(id);"
Packit Service 2781ba
""
Packit Service 2781ba
"      if (element &&"
Packit Service 2781ba
"          element.style.display &&"
Packit Service 2781ba
"          element.style.display != \"none\")"
Packit Service 2781ba
"         return true;"
Packit Service 2781ba
"      return false;"
Packit Service 2781ba
"    }"
Packit Service 2781ba
"    function set_visible (id, visible)"
Packit Service 2781ba
"    {"
Packit Service 2781ba
"      var element = document.getElementById(id);"
Packit Service 2781ba
""
Packit Service 2781ba
"      if (element)"
Packit Service 2781ba
"        {"
Packit Service 2781ba
"          if (visible)"
Packit Service 2781ba
"              element.style.display = \"block\";"
Packit Service 2781ba
"          else"
Packit Service 2781ba
"              element.style.display = \"none\";"
Packit Service 2781ba
"        }"
Packit Service 2781ba
"    }"
Packit Service 2781ba
"    function toggle_visible (id)"
Packit Service 2781ba
"    {"
Packit Service 2781ba
"      if (get_visible(id))"
Packit Service 2781ba
"        set_visible(id, false);"
Packit Service 2781ba
"      else"
Packit Service 2781ba
"        set_visible(id,true);"
Packit Service 2781ba
"    }"
Packit Service 2781ba
"    /*-->*/</script>";
Packit Service 2781ba
Packit Service 2781ba
static gchar *escape (const gchar *string)
Packit Service 2781ba
{
Packit Service 2781ba
  gchar buf[4095]="";
Packit Service 2781ba
  const gchar *p=string;
Packit Service 2781ba
  gint i=0;
Packit Service 2781ba
Packit Service 2781ba
  while (p && *p)
Packit Service 2781ba
    {
Packit Service 2781ba
      switch (*p)
Packit Service 2781ba
        {
Packit Service 2781ba
          case '<':
Packit Service 2781ba
            buf[i++]='&';
Packit Service 2781ba
            buf[i++]='l';
Packit Service 2781ba
            buf[i++]='t';
Packit Service 2781ba
            buf[i++]=';';
Packit Service 2781ba
            break;
Packit Service 2781ba
          case '>':
Packit Service 2781ba
            buf[i++]='&';
Packit Service 2781ba
            buf[i++]='g';
Packit Service 2781ba
            buf[i++]='t';
Packit Service 2781ba
            buf[i++]=';';
Packit Service 2781ba
            break;
Packit Service 2781ba
          case '&':
Packit Service 2781ba
            buf[i++]='&';
Packit Service 2781ba
            buf[i++]='a';
Packit Service 2781ba
            buf[i++]='m';
Packit Service 2781ba
            buf[i++]='p';
Packit Service 2781ba
            buf[i++]=';';
Packit Service 2781ba
            break;
Packit Service 2781ba
          default:
Packit Service 2781ba
            buf[i++]=*p;
Packit Service 2781ba
        }
Packit Service 2781ba
      p++;
Packit Service 2781ba
      buf[i]='\0';
Packit Service 2781ba
    }
Packit Service 2781ba
  return g_strdup (buf);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
void  introspect_overview (GType type, gint  indent);
Packit Service 2781ba
void  introspect (GType type, gint  indent);
Packit Service 2781ba
gint  stuff      (gint    argc, gchar **argv);
Packit Service 2781ba
Packit Service 2781ba
static void introspection (void)
Packit Service 2781ba
{
Packit Service 2781ba
  file = stdout;
Packit Service 2781ba
  fprintf (file, "\n"
Packit Service 2781ba
                 "<html xmlns='http://www.w3.org/1999/xhtml' lang='en' xml:lang='en'>");
Packit Service 2781ba
Packit Service 2781ba
  fprintf (file, "<head><title>GObject class introspection</title><link rel='shortcut icon' href='images/gegl.ico'/><style type='text/css'>@import url(devhelp.css);</style>%s</head><body>\n", collapsibles_html);
Packit Service 2781ba
  fprintf (file, "
Packit Service 2781ba
  fprintf (file, "\n");
Packit Service 2781ba
  fprintf (file, "
\n");
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
  fprintf (file, "\n");
Packit Service 2781ba
  fprintf (file, "
\n");
Packit Service 2781ba
  fprintf (file, "
Packit Service 2781ba
  collapse_all (G_TYPE_OBJECT);
Packit Service 2781ba
  fprintf (file, "'> - /
Packit Service 2781ba
  expand_all (G_TYPE_OBJECT);
Packit Service 2781ba
  fprintf (file, "'> + ");
Packit Service 2781ba
  introspect_overview (G_TYPE_OBJECT,0);
Packit Service 2781ba
  fprintf (file, "\n");
Packit Service 2781ba
  introspect (G_TYPE_OBJECT,0);
Packit Service 2781ba
  fprintf (file, "</body></html>\n");
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
  stuff (argc, argv);
Packit Service 2781ba
  introspection ();
Packit Service 2781ba
Packit Service 2781ba
  return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
list_subclasses (GType type)
Packit Service 2781ba
{
Packit Service 2781ba
  GType      *children;
Packit Service 2781ba
  guint       count;
Packit Service 2781ba
  gint        no;
Packit Service 2781ba
Packit Service 2781ba
  if (!type)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  children=g_type_children (type, &count);
Packit Service 2781ba
Packit Service 2781ba
  if (!children)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  if (count)
Packit Service 2781ba
    {
Packit Service 2781ba
    fprintf (file, "

subclasses

\n");
Packit Service 2781ba
    fprintf (file, "
\n");
Packit Service 2781ba
Packit Service 2781ba
    for (no=0; no
Packit Service 2781ba
      {
Packit Service 2781ba
        fprintf (file, "%s
\n", g_type_name (children[no]),
Packit Service 2781ba
                                                     g_type_name (children[no]));
Packit Service 2781ba
Packit Service 2781ba
      }
Packit Service 2781ba
    fprintf (file, "\n");
Packit Service 2781ba
    }
Packit Service 2781ba
  g_free (children);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
list_superclasses (GType type)
Packit Service 2781ba
{
Packit Service 2781ba
  GString *str = g_string_new ("");
Packit Service 2781ba
  gboolean last=TRUE;
Packit Service 2781ba
Packit Service 2781ba
  while (type != 0)
Packit Service 2781ba
    {
Packit Service 2781ba
      if (!last)
Packit Service 2781ba
        g_string_prepend (str, "/");
Packit Service 2781ba
      g_string_prepend (str, "");
Packit Service 2781ba
      g_string_prepend (str, g_type_name (type));
Packit Service 2781ba
      g_string_prepend (str, "'>");
Packit Service 2781ba
      g_string_prepend (str, g_type_name (type));
Packit Service 2781ba
      g_string_prepend (str, "
Packit Service 2781ba
      type = g_type_parent (type);
Packit Service 2781ba
      last = FALSE;
Packit Service 2781ba
    }
Packit Service 2781ba
  fprintf (file, "%s\n", str->str);
Packit Service 2781ba
  g_string_free (str, TRUE);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
list_properties_simple (GType type)
Packit Service 2781ba
{
Packit Service 2781ba
  GParamSpec **self;
Packit Service 2781ba
  GParamSpec **parent = NULL;
Packit Service 2781ba
  guint n_self;
Packit Service 2781ba
  guint n_parent=0;
Packit Service 2781ba
  gint prop_no;
Packit Service 2781ba
  gboolean first=TRUE;
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
  if (g_type_parent (type))
Packit Service 2781ba
    parent = g_object_class_list_properties (
Packit Service 2781ba
              G_OBJECT_CLASS (g_type_class_ref (g_type_parent (type))),
Packit Service 2781ba
              &n_parent);
Packit Service 2781ba
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
       * the parent class
Packit Service 2781ba
       */
Packit Service 2781ba
      if (!found)
Packit Service 2781ba
        {
Packit Service 2781ba
Packit Service 2781ba
          if (first)
Packit Service 2781ba
            {
Packit Service 2781ba
               fprintf (file, "
");
Packit Service 2781ba
               first = FALSE;
Packit Service 2781ba
            }
Packit Service 2781ba
          fprintf (file, "
%s %s
%s
\n",
Packit Service 2781ba
              g_param_spec_get_name (self[prop_no]),
Packit Service 2781ba
              g_type_name (G_OBJECT_TYPE(self[prop_no])),
Packit Service 2781ba
              escape (g_param_spec_get_blurb (self[prop_no])));
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
  if (!first)
Packit Service 2781ba
    fprintf (file, "\n");
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
static void
Packit Service 2781ba
list_properties (GType type,
Packit Service 2781ba
                 gint  indent)
Packit Service 2781ba
{
Packit Service 2781ba
  GParamSpec **self;
Packit Service 2781ba
  GParamSpec **parent = NULL;
Packit Service 2781ba
  guint n_self;
Packit Service 2781ba
  guint n_parent = 0;
Packit Service 2781ba
  gint prop_no;
Packit Service 2781ba
  gboolean first=TRUE;
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
  if (g_type_parent (type))
Packit Service 2781ba
  parent = g_object_class_list_properties (
Packit Service 2781ba
            G_OBJECT_CLASS (g_type_class_ref (g_type_parent (type))),
Packit Service 2781ba
            &n_parent);
Packit Service 2781ba
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
       * the parent class
Packit Service 2781ba
       */
Packit Service 2781ba
      if (!found)
Packit Service 2781ba
        {
Packit Service 2781ba
Packit Service 2781ba
          if (first)
Packit Service 2781ba
            {
Packit Service 2781ba
               fprintf (file, "
Properties
");
Packit Service 2781ba
               first = FALSE;
Packit Service 2781ba
            }
Packit Service 2781ba
          fprintf (file, "
%s %s
%s
\n",
Packit Service 2781ba
              g_param_spec_get_name (self[prop_no]),
Packit Service 2781ba
              g_type_name (G_OBJECT_TYPE(self[prop_no])),
Packit Service 2781ba
              escape(g_param_spec_get_blurb (self[prop_no])));
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
  if (!first)
Packit Service 2781ba
    fprintf (file, "\n");
Packit Service 2781ba
Packit Service 2781ba
  first = TRUE;
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
       * the parent class
Packit Service 2781ba
       */
Packit Service 2781ba
      if (found)
Packit Service 2781ba
        {
Packit Service 2781ba
          if (first)
Packit Service 2781ba
            {
Packit Service 2781ba
               fprintf (file, "
Inherited Properties
");
Packit Service 2781ba
               first = FALSE;
Packit Service 2781ba
            }
Packit Service 2781ba
          fprintf (file, "
%s %s
%s
\n",
Packit Service 2781ba
              g_param_spec_get_name (self[prop_no]),
Packit Service 2781ba
              g_type_name (G_OBJECT_TYPE(self[prop_no])),
Packit Service 2781ba
              escape(g_param_spec_get_blurb (self[prop_no])));
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
  if (!first)
Packit Service 2781ba
    fprintf (file, "\n");
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
static void
Packit Service 2781ba
details_for_type (GType type)
Packit Service 2781ba
{
Packit Service 2781ba
  fprintf (file, "
\n");
Packit Service 2781ba
Packit Service 2781ba
  list_properties (type, 0);
Packit Service 2781ba
  fprintf (file, "\n");
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
void
Packit Service 2781ba
collapse_all (GType type)
Packit Service 2781ba
{
Packit Service 2781ba
  GType      *children;
Packit Service 2781ba
  guint       count;
Packit Service 2781ba
  gint        no;
Packit Service 2781ba
Packit Service 2781ba
  if (!type)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  fprintf (file, "hide(\"x_%s\");", g_type_name(type));
Packit Service 2781ba
Packit Service 2781ba
  children=g_type_children (type, &count);
Packit Service 2781ba
Packit Service 2781ba
  if (!children)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  for (no=0; no
Packit Service 2781ba
    {
Packit Service 2781ba
      collapse_all (children[no]);
Packit Service 2781ba
    }
Packit Service 2781ba
  g_free (children);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
void
Packit Service 2781ba
expand_all (GType type)
Packit Service 2781ba
{
Packit Service 2781ba
  GType      *children;
Packit Service 2781ba
  guint       count;
Packit Service 2781ba
  gint        no;
Packit Service 2781ba
Packit Service 2781ba
  if (!type)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  fprintf (file, "show(\"x_%s\");", g_type_name(type));
Packit Service 2781ba
Packit Service 2781ba
  children=g_type_children (type, &count);
Packit Service 2781ba
Packit Service 2781ba
  if (!children)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  for (no=0; no
Packit Service 2781ba
    {
Packit Service 2781ba
      expand_all (children[no]);
Packit Service 2781ba
    }
Packit Service 2781ba
  g_free (children);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
void
Packit Service 2781ba
introspect (GType type,
Packit Service 2781ba
            gint  indent)
Packit Service 2781ba
{
Packit Service 2781ba
  GType      *children;
Packit Service 2781ba
  guint       count;
Packit Service 2781ba
  gint        no;
Packit Service 2781ba
Packit Service 2781ba
  if (!type)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  fprintf (file, "
\n");
Packit Service 2781ba
  fprintf (file, "

%s

\n", g_type_name (type),
Packit Service 2781ba
                                                   g_type_name (type));
Packit Service 2781ba
  list_superclasses (type);
Packit Service 2781ba
  details_for_type (type);
Packit Service 2781ba
  list_subclasses (type);
Packit Service 2781ba
Packit Service 2781ba
  children=g_type_children (type, &count);
Packit Service 2781ba
Packit Service 2781ba
  if (!children)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  for (no=0; no
Packit Service 2781ba
    {
Packit Service 2781ba
      introspect (children[no], indent+2);
Packit Service 2781ba
    }
Packit Service 2781ba
  g_free (children);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
void
Packit Service 2781ba
introspect_overview (GType type,
Packit Service 2781ba
                     gint  indent)
Packit Service 2781ba
{
Packit Service 2781ba
  GType      *children;
Packit Service 2781ba
  guint       count;
Packit Service 2781ba
  gint        no;
Packit Service 2781ba
Packit Service 2781ba
  if (!type)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  fprintf (file, "
\n"
Packit Service 2781ba
                   "\n"
Packit Service 2781ba
                   "
",
Packit Service 2781ba
    g_type_name (type), 
Packit Service 2781ba
    g_type_name (type), 
Packit Service 2781ba
    g_type_name (type)
Packit Service 2781ba
    );
Packit Service 2781ba
Packit Service 2781ba
  children=g_type_children (type, &count);
Packit Service 2781ba
Packit Service 2781ba
  list_properties_simple (type);
Packit Service 2781ba
  
Packit Service 2781ba
  if (!children)
Packit Service 2781ba
    return;
Packit Service 2781ba
Packit Service 2781ba
  for (no=0; no
Packit Service 2781ba
    {
Packit Service 2781ba
      introspect_overview (children[no], indent+1);
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  fprintf (file, "");
Packit Service 2781ba
  g_free (children);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
gint
Packit Service 2781ba
stuff (gint    argc,
Packit Service 2781ba
      gchar **argv)
Packit Service 2781ba
{
Packit Service 2781ba
  g_thread_init (NULL);
Packit Service 2781ba
  gegl_init (&argc, &argv);
Packit Service 2781ba
  
Packit Service 2781ba
    {
Packit Service 2781ba
      GeglNode  *gegl = g_object_new (GEGL_TYPE_NODE, NULL);
Packit Service 2781ba
Packit Service 2781ba
      GeglNode  *save = gegl_node_new_child (gegl,
Packit Service 2781ba
                    "operation", "gegl:png-save",
Packit Service 2781ba
                    "path", "/dev/null",
Packit Service 2781ba
                    NULL);
Packit Service 2781ba
      GeglNode *crop = gegl_node_new_child (gegl,
Packit Service 2781ba
       "operation", "gegl:crop",
Packit Service 2781ba
       "x", 0.0,
Packit Service 2781ba
       "y", 0.0,
Packit Service 2781ba
       "width", 50.0,
Packit Service 2781ba
       "height", 50.0,
Packit Service 2781ba
       NULL);
Packit Service 2781ba
      GeglNode  *png_load = gegl_node_new_child (gegl,
Packit Service 2781ba
                    "operation", "gegl:checkerboard",
Packit Service 2781ba
                    NULL);
Packit Service 2781ba
Packit Service 2781ba
      /* connect operations */
Packit Service 2781ba
      gegl_node_link_many (png_load, crop, save, NULL);
Packit Service 2781ba
Packit Service 2781ba
      /* then the whole output region */
Packit Service 2781ba
      gegl_node_process (save);
Packit Service 2781ba
      g_object_unref (gegl);
Packit Service 2781ba
    }
Packit Service 2781ba
  return 0;
Packit Service 2781ba
}