Blame tools/introspect.c

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

subclasses

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

%s

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