Blame gegl/property-types/gegl-paramspecs.c

Packit bc1512
/* This file is part of GEGL
Packit bc1512
 *
Packit bc1512
 * GEGL is free software; you can redistribute it and/or
Packit bc1512
 * modify it under the terms of the GNU Lesser General Public
Packit bc1512
 * License as published by the Free Software Foundation; either
Packit bc1512
 * version 3 of the License, or (at your option) any later version.
Packit bc1512
 *
Packit bc1512
 * GEGL is distributed in the hope that it will be useful,
Packit bc1512
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bc1512
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit bc1512
 * Lesser General Public License for more details.
Packit bc1512
 *
Packit bc1512
 * You should have received a copy of the GNU Lesser General Public
Packit bc1512
 * License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
Packit bc1512
 *
Packit bc1512
 * Copyright 2003 Calvin Williamson
Packit bc1512
 *           2006 Øyvind Kolås
Packit bc1512
 *
Packit bc1512
 * Original contents copied from gimp/app/core/gimpparamspecs.h
Packit bc1512
 * (c) 1995-2006 Spencer Kimball, Peter Mattis and others.
Packit bc1512
 */
Packit bc1512
Packit bc1512
#include "config.h"
Packit bc1512
Packit bc1512
#include <glib.h>
Packit bc1512
#include <glib-object.h>
Packit bc1512
#include "gegl-paramspecs.h"
Packit bc1512
Packit bc1512
static void       gegl_param_double_class_init (GParamSpecClass *klass);
Packit bc1512
static void       gegl_param_double_init       (GParamSpec      *pspec);
Packit bc1512
Packit bc1512
GType
Packit bc1512
gegl_param_double_get_type (void)
Packit bc1512
{
Packit bc1512
  static GType type = 0;
Packit bc1512
Packit bc1512
  if (!type)
Packit bc1512
    {
Packit bc1512
      const GTypeInfo info =
Packit bc1512
      {
Packit bc1512
        sizeof (GParamSpecClass),
Packit bc1512
        NULL, NULL,
Packit bc1512
        (GClassInitFunc) gegl_param_double_class_init,
Packit bc1512
        NULL, NULL,
Packit bc1512
        sizeof (GeglParamSpecDouble),
Packit bc1512
        0,
Packit bc1512
        (GInstanceInitFunc) gegl_param_double_init
Packit bc1512
      };
Packit bc1512
      type = g_type_register_static (G_TYPE_PARAM_DOUBLE,
Packit bc1512
                                     "GeglParamDouble", &info, 0);
Packit bc1512
    }
Packit bc1512
  return type;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_double_class_init (GParamSpecClass *klass)
Packit bc1512
{
Packit bc1512
  klass->value_type     = G_TYPE_DOUBLE;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_double_init (GParamSpec *pspec)
Packit bc1512
{
Packit bc1512
  GParamSpecDouble    *dpspec  = G_PARAM_SPEC_DOUBLE (pspec);
Packit bc1512
  GeglParamSpecDouble *gdpspec = GEGL_PARAM_SPEC_DOUBLE (pspec);
Packit bc1512
  gdpspec->ui_minimum = dpspec->minimum;
Packit bc1512
  gdpspec->ui_maximum = dpspec->maximum;
Packit bc1512
  gdpspec->ui_gamma   = 1.0;
Packit bc1512
}
Packit bc1512
Packit bc1512
GParamSpec *
Packit bc1512
gegl_param_spec_double (const gchar *name,
Packit bc1512
                        const gchar *nick,
Packit bc1512
                        const gchar *blurb,
Packit bc1512
                        gdouble      minimum,
Packit bc1512
                        gdouble      maximum,
Packit bc1512
                        gdouble      default_value,
Packit bc1512
                        gdouble      ui_minimum,
Packit bc1512
                        gdouble      ui_maximum,
Packit bc1512
                        gdouble      ui_gamma,
Packit bc1512
                        GParamFlags  flags)
Packit bc1512
{
Packit bc1512
  GeglParamSpecDouble *pspec;
Packit bc1512
  GParamSpecDouble *dspec;
Packit bc1512
  
Packit bc1512
  pspec = g_param_spec_internal (GEGL_TYPE_PARAM_DOUBLE,
Packit bc1512
                                 name, nick, blurb, flags);
Packit bc1512
  dspec = G_PARAM_SPEC_DOUBLE (pspec);
Packit bc1512
Packit bc1512
  dspec->minimum = minimum;
Packit bc1512
  dspec->maximum = maximum;
Packit bc1512
  dspec->default_value = default_value;
Packit bc1512
  pspec->ui_minimum = ui_minimum;
Packit bc1512
  pspec->ui_maximum = ui_maximum;
Packit bc1512
  pspec->ui_gamma   = ui_gamma;
Packit bc1512
Packit bc1512
  return G_PARAM_SPEC (pspec);
Packit bc1512
}
Packit bc1512
Packit bc1512
static void       gegl_param_int_class_init (GParamSpecClass *klass);
Packit bc1512
static void       gegl_param_int_init       (GParamSpec      *pspec);
Packit bc1512
Packit bc1512
GType
Packit bc1512
gegl_param_int_get_type (void)
Packit bc1512
{
Packit bc1512
  static GType type = 0;
Packit bc1512
Packit bc1512
  if (!type)
Packit bc1512
    {
Packit bc1512
      const GTypeInfo info =
Packit bc1512
      {
Packit bc1512
        sizeof (GParamSpecClass),
Packit bc1512
        NULL, NULL,
Packit bc1512
        (GClassInitFunc) gegl_param_int_class_init,
Packit bc1512
        NULL, NULL,
Packit bc1512
        sizeof (GeglParamSpecInt),
Packit bc1512
        0,
Packit bc1512
        (GInstanceInitFunc) gegl_param_int_init
Packit bc1512
      };
Packit bc1512
      type = g_type_register_static (G_TYPE_PARAM_INT,
Packit bc1512
                                     "GeglParamint", &info, 0);
Packit bc1512
    }
Packit bc1512
  return type;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_int_class_init (GParamSpecClass *klass)
Packit bc1512
{
Packit bc1512
  klass->value_type     = G_TYPE_INT;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_int_init (GParamSpec *pspec)
Packit bc1512
{
Packit bc1512
  GParamSpecInt    *dpspec  = G_PARAM_SPEC_INT (pspec);
Packit bc1512
  GeglParamSpecInt *gdpspec = GEGL_PARAM_SPEC_INT (pspec);
Packit bc1512
  gdpspec->ui_minimum = dpspec->minimum;
Packit bc1512
  gdpspec->ui_maximum = dpspec->maximum;
Packit bc1512
  gdpspec->ui_gamma = 1.0;
Packit bc1512
}
Packit bc1512
Packit bc1512
GParamSpec *
Packit bc1512
gegl_param_spec_int (const gchar *name,
Packit bc1512
                     const gchar *nick,
Packit bc1512
                     const gchar *blurb,
Packit bc1512
                     gint         minimum,
Packit bc1512
                     gint         maximum,
Packit bc1512
                     gint         default_value,
Packit bc1512
                     gint         ui_minimum,
Packit bc1512
                     gint         ui_maximum,
Packit bc1512
                     gdouble      ui_gamma,
Packit bc1512
                     GParamFlags  flags)
Packit bc1512
{
Packit bc1512
  GeglParamSpecInt *pspec;
Packit bc1512
  GParamSpecInt *ispec;
Packit bc1512
  
Packit bc1512
Packit bc1512
  pspec = g_param_spec_internal (GEGL_TYPE_PARAM_INT,
Packit bc1512
                                 name, nick, blurb, flags);
Packit bc1512
  ispec = G_PARAM_SPEC_INT (pspec);
Packit bc1512
Packit bc1512
  ispec->minimum = minimum;
Packit bc1512
  ispec->maximum = maximum;
Packit bc1512
  ispec->default_value = default_value;
Packit bc1512
  pspec->ui_minimum = ui_minimum;
Packit bc1512
  pspec->ui_maximum = ui_maximum;
Packit bc1512
  pspec->ui_gamma = ui_gamma;
Packit bc1512
Packit bc1512
  return G_PARAM_SPEC (pspec);
Packit bc1512
}
Packit bc1512
Packit bc1512
/*
Packit bc1512
 * GEGL_TYPE_PARAM_STRING
Packit bc1512
 */
Packit bc1512
Packit bc1512
static void       gegl_param_string_class_init (GParamSpecClass *klass);
Packit bc1512
static void       gegl_param_string_init (GParamSpec *pspec);
Packit bc1512
static gboolean   gegl_param_string_validate (GParamSpec *pspec,
Packit bc1512
                                              GValue     *value);
Packit bc1512
Packit bc1512
GType
Packit bc1512
gegl_param_string_get_type (void)
Packit bc1512
{
Packit bc1512
  static GType type = 0;
Packit bc1512
Packit bc1512
  if (!type)
Packit bc1512
    {
Packit bc1512
      const GTypeInfo info =
Packit bc1512
      {
Packit bc1512
        sizeof (GParamSpecClass),
Packit bc1512
        NULL,                                          NULL,
Packit bc1512
        (GClassInitFunc) gegl_param_string_class_init,
Packit bc1512
        NULL,                                          NULL,
Packit bc1512
        sizeof (GeglParamSpecString),
Packit bc1512
        0,
Packit bc1512
        (GInstanceInitFunc) gegl_param_string_init
Packit bc1512
      };
Packit bc1512
Packit bc1512
      type = g_type_register_static (G_TYPE_PARAM_STRING,
Packit bc1512
                                     "GeglParamString", &info, 0);
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return type;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_string_class_init (GParamSpecClass *klass)
Packit bc1512
{
Packit bc1512
  klass->value_type     = G_TYPE_STRING;
Packit bc1512
  klass->value_validate = gegl_param_string_validate;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_string_init (GParamSpec *pspec)
Packit bc1512
{
Packit bc1512
  GeglParamSpecString *sspec = GEGL_PARAM_SPEC_STRING (pspec);
Packit bc1512
Packit bc1512
  sspec->no_validate = FALSE;
Packit bc1512
  sspec->null_ok     = FALSE;
Packit bc1512
}
Packit bc1512
Packit bc1512
static gboolean
Packit bc1512
gegl_param_string_validate (GParamSpec *pspec,
Packit bc1512
                            GValue     *value)
Packit bc1512
{
Packit bc1512
  GeglParamSpecString *sspec  = GEGL_PARAM_SPEC_STRING (pspec);
Packit bc1512
  gchar               *string = value->data[0].v_pointer;
Packit bc1512
Packit bc1512
  if (string)
Packit bc1512
    {
Packit bc1512
      gchar *s;
Packit bc1512
Packit bc1512
      if (!sspec->no_validate &&
Packit bc1512
          !g_utf8_validate (string, -1, (const gchar **) &s))
Packit bc1512
        {
Packit bc1512
          for (; *s; s++)
Packit bc1512
            if (*s < ' ')
Packit bc1512
              *s = '?';
Packit bc1512
Packit bc1512
          return TRUE;
Packit bc1512
        }
Packit bc1512
    }
Packit bc1512
  else if (!sspec->null_ok)
Packit bc1512
    {
Packit bc1512
      value->data[0].v_pointer = g_strdup ("");
Packit bc1512
      return TRUE;
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return FALSE;
Packit bc1512
}
Packit bc1512
Packit bc1512
GParamSpec *
Packit bc1512
gegl_param_spec_string (const gchar *name,
Packit bc1512
                        const gchar *nick,
Packit bc1512
                        const gchar *blurb,
Packit bc1512
                        gboolean     no_validate,
Packit bc1512
                        gboolean     null_ok,
Packit bc1512
                        const gchar *default_value,
Packit bc1512
                        GParamFlags  flags)
Packit bc1512
{
Packit bc1512
  GeglParamSpecString *sspec;
Packit bc1512
Packit bc1512
  sspec = g_param_spec_internal (GEGL_TYPE_PARAM_STRING,
Packit bc1512
                                 name, nick, blurb, flags);
Packit bc1512
Packit bc1512
  if (sspec)
Packit bc1512
    {
Packit bc1512
      g_free (G_PARAM_SPEC_STRING (sspec)->default_value);
Packit bc1512
      G_PARAM_SPEC_STRING (sspec)->default_value = g_strdup (default_value);
Packit bc1512
Packit bc1512
      sspec->no_validate = no_validate ? TRUE : FALSE;
Packit bc1512
      sspec->null_ok     = null_ok     ? TRUE : FALSE;
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return G_PARAM_SPEC (sspec);
Packit bc1512
}
Packit bc1512
Packit bc1512
Packit bc1512
/*
Packit bc1512
 * GEGL_TYPE_PARAM_FILE_PATH
Packit bc1512
 */
Packit bc1512
Packit bc1512
static void       gegl_param_file_path_class_init (GParamSpecClass *klass);
Packit bc1512
static void       gegl_param_file_path_init       (GParamSpec *pspec);
Packit bc1512
static gboolean   gegl_param_file_path_validate   (GParamSpec *pspec,
Packit bc1512
                                                   GValue     *value);
Packit bc1512
Packit bc1512
GType
Packit bc1512
gegl_param_file_path_get_type (void)
Packit bc1512
{
Packit bc1512
  static GType type = 0;
Packit bc1512
Packit bc1512
  if (!type)
Packit bc1512
    {
Packit bc1512
      const GTypeInfo info =
Packit bc1512
      {
Packit bc1512
        sizeof (GParamSpecClass),
Packit bc1512
        NULL,                                        NULL,
Packit bc1512
        (GClassInitFunc) gegl_param_file_path_class_init,
Packit bc1512
        NULL,                                        NULL,
Packit bc1512
        sizeof (GeglParamSpecString),
Packit bc1512
        0,
Packit bc1512
        (GInstanceInitFunc) gegl_param_file_path_init
Packit bc1512
      };
Packit bc1512
Packit bc1512
      type = g_type_register_static (G_TYPE_PARAM_STRING,
Packit bc1512
                                     "GeglParamFilePath", &info, 0);
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return type;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_file_path_class_init (GParamSpecClass *klass)
Packit bc1512
{
Packit bc1512
  klass->value_type     = G_TYPE_STRING;
Packit bc1512
  klass->value_validate = gegl_param_file_path_validate;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_file_path_init (GParamSpec *pspec)
Packit bc1512
{
Packit bc1512
  GeglParamSpecFilePath *sspec = GEGL_PARAM_SPEC_FILE_PATH (pspec);
Packit bc1512
Packit bc1512
  sspec->no_validate = FALSE;
Packit bc1512
  sspec->null_ok     = FALSE;
Packit bc1512
}
Packit bc1512
Packit bc1512
static gboolean
Packit bc1512
gegl_param_file_path_validate (GParamSpec *pspec,
Packit bc1512
                               GValue     *value)
Packit bc1512
{
Packit bc1512
  GeglParamSpecFilePath *sspec = GEGL_PARAM_SPEC_FILE_PATH (pspec);
Packit bc1512
  gchar                 *path  = value->data[0].v_pointer;
Packit bc1512
Packit bc1512
  if (path)
Packit bc1512
    {
Packit bc1512
      gchar *s;
Packit bc1512
Packit bc1512
      if (!sspec->no_validate &&
Packit bc1512
          !g_utf8_validate (path, -1, (const gchar **) &s))
Packit bc1512
        {
Packit bc1512
          for (; *s; s++)
Packit bc1512
            if (*s < ' ')
Packit bc1512
              *s = '?';
Packit bc1512
Packit bc1512
          return TRUE;
Packit bc1512
        }
Packit bc1512
    }
Packit bc1512
  else if (!sspec->null_ok)
Packit bc1512
    {
Packit bc1512
      value->data[0].v_pointer = g_strdup ("");
Packit bc1512
      return TRUE;
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return FALSE;
Packit bc1512
}
Packit bc1512
Packit bc1512
GParamSpec *
Packit bc1512
gegl_param_spec_file_path (const gchar *name,
Packit bc1512
                           const gchar *nick,
Packit bc1512
                           const gchar *blurb,
Packit bc1512
                           gboolean     no_validate,
Packit bc1512
                           gboolean     null_ok,
Packit bc1512
                           const gchar *default_value,
Packit bc1512
                           GParamFlags  flags)
Packit bc1512
{
Packit bc1512
  GeglParamSpecFilePath *sspec;
Packit bc1512
Packit bc1512
  sspec = g_param_spec_internal (GEGL_TYPE_PARAM_FILE_PATH,
Packit bc1512
                                 name, nick, blurb, flags);
Packit bc1512
Packit bc1512
  if (sspec)
Packit bc1512
    {
Packit bc1512
      g_free (G_PARAM_SPEC_STRING (sspec)->default_value);
Packit bc1512
      G_PARAM_SPEC_STRING (sspec)->default_value = g_strdup (default_value);
Packit bc1512
Packit bc1512
      sspec->no_validate = no_validate ? TRUE : FALSE;
Packit bc1512
      sspec->null_ok     = null_ok     ? TRUE : FALSE;
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return G_PARAM_SPEC (sspec);
Packit bc1512
}
Packit bc1512
Packit bc1512
Packit bc1512
/*
Packit bc1512
 * GEGL_TYPE_PARAM_MULTILINE
Packit bc1512
 */
Packit bc1512
Packit bc1512
static void       gegl_param_multiline_class_init (GParamSpecClass *klass);
Packit bc1512
static void       gegl_param_multiline_init (GParamSpec *pspec);
Packit bc1512
static gboolean   gegl_param_multiline_validate (GParamSpec *pspec,
Packit bc1512
                                                 GValue     *value);
Packit bc1512
Packit bc1512
GType
Packit bc1512
gegl_param_multiline_get_type (void)
Packit bc1512
{
Packit bc1512
  static GType type = 0;
Packit bc1512
Packit bc1512
  if (!type)
Packit bc1512
    {
Packit bc1512
      const GTypeInfo info =
Packit bc1512
      {
Packit bc1512
        sizeof (GParamSpecClass),
Packit bc1512
        NULL,                                             NULL,
Packit bc1512
        (GClassInitFunc) gegl_param_multiline_class_init,
Packit bc1512
        NULL,                                             NULL,
Packit bc1512
        sizeof (GeglParamSpecString),
Packit bc1512
        0,
Packit bc1512
        (GInstanceInitFunc) gegl_param_multiline_init
Packit bc1512
      };
Packit bc1512
Packit bc1512
      type = g_type_register_static (G_TYPE_PARAM_STRING,
Packit bc1512
                                     "GeglParamMultiline", &info, 0);
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return type;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_multiline_class_init (GParamSpecClass *klass)
Packit bc1512
{
Packit bc1512
  klass->value_type     = G_TYPE_STRING;
Packit bc1512
  klass->value_validate = gegl_param_multiline_validate;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_multiline_init (GParamSpec *pspec)
Packit bc1512
{
Packit bc1512
  GeglParamSpecMultiline *sspec = GEGL_PARAM_SPEC_MULTILINE (pspec);
Packit bc1512
Packit bc1512
  sspec->no_validate = FALSE;
Packit bc1512
  sspec->null_ok     = FALSE;
Packit bc1512
}
Packit bc1512
Packit bc1512
static gboolean
Packit bc1512
gegl_param_multiline_validate (GParamSpec *pspec,
Packit bc1512
                               GValue     *value)
Packit bc1512
{
Packit bc1512
  GeglParamSpecMultiline *sspec     = GEGL_PARAM_SPEC_MULTILINE (pspec);
Packit bc1512
  gchar                  *multiline = value->data[0].v_pointer;
Packit bc1512
Packit bc1512
  if (multiline)
Packit bc1512
    {
Packit bc1512
      gchar *s;
Packit bc1512
Packit bc1512
      if (!sspec->no_validate &&
Packit bc1512
          !g_utf8_validate (multiline, -1, (const gchar **) &s))
Packit bc1512
        {
Packit bc1512
          for (; *s; s++)
Packit bc1512
            if (*s < ' ')
Packit bc1512
              *s = '?';
Packit bc1512
Packit bc1512
          return TRUE;
Packit bc1512
        }
Packit bc1512
    }
Packit bc1512
  else if (!sspec->null_ok)
Packit bc1512
    {
Packit bc1512
      value->data[0].v_pointer = g_strdup ("");
Packit bc1512
      return TRUE;
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return FALSE;
Packit bc1512
}
Packit bc1512
Packit bc1512
GParamSpec *
Packit bc1512
gegl_param_spec_multiline (const gchar *name,
Packit bc1512
                           const gchar *nick,
Packit bc1512
                           const gchar *blurb,
Packit bc1512
                           const gchar *default_value,
Packit bc1512
                           GParamFlags  flags)
Packit bc1512
{
Packit bc1512
  GeglParamSpecMultiline *sspec;
Packit bc1512
Packit bc1512
  sspec = g_param_spec_internal (GEGL_TYPE_PARAM_MULTILINE,
Packit bc1512
                                 name, nick, blurb, flags);
Packit bc1512
Packit bc1512
  if (sspec)
Packit bc1512
    {
Packit bc1512
      g_free (G_PARAM_SPEC_STRING (sspec)->default_value);
Packit bc1512
      G_PARAM_SPEC_STRING (sspec)->default_value = g_strdup (default_value);
Packit bc1512
/*
Packit bc1512
      sspec->no_validate = no_validate ? TRUE : FALSE;
Packit bc1512
      sspec->null_ok     = null_ok     ? TRUE : FALSE;*/
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return G_PARAM_SPEC (sspec);
Packit bc1512
}
Packit bc1512
Packit bc1512
Packit bc1512
Packit bc1512
Packit bc1512
/*
Packit bc1512
 * GEGL_TYPE_PARAM_ENUM
Packit bc1512
 */
Packit bc1512
Packit bc1512
static void       gegl_param_enum_class_init (GParamSpecClass *klass);
Packit bc1512
static void       gegl_param_enum_init       (GParamSpec      *pspec);
Packit bc1512
static void       gegl_param_enum_finalize   (GParamSpec      *pspec);
Packit bc1512
static gboolean   gegl_param_enum_validate   (GParamSpec      *pspec,
Packit bc1512
                                              GValue          *value);
Packit bc1512
Packit bc1512
GType
Packit bc1512
gegl_param_enum_get_type (void)
Packit bc1512
{
Packit bc1512
  static GType type = 0;
Packit bc1512
Packit bc1512
  if (!type)
Packit bc1512
    {
Packit bc1512
      const GTypeInfo info =
Packit bc1512
      {
Packit bc1512
        sizeof (GParamSpecClass),
Packit bc1512
        NULL,                                        NULL,
Packit bc1512
        (GClassInitFunc) gegl_param_enum_class_init,
Packit bc1512
        NULL,                                        NULL,
Packit bc1512
        sizeof (GeglParamSpecEnum),
Packit bc1512
        0,
Packit bc1512
        (GInstanceInitFunc) gegl_param_enum_init
Packit bc1512
      };
Packit bc1512
Packit bc1512
      type = g_type_register_static (G_TYPE_PARAM_ENUM,
Packit bc1512
                                     "GeglParamEnum", &info, 0);
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return type;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_enum_class_init (GParamSpecClass *klass)
Packit bc1512
{
Packit bc1512
  klass->value_type     = G_TYPE_ENUM;
Packit bc1512
  klass->finalize       = gegl_param_enum_finalize;
Packit bc1512
  klass->value_validate = gegl_param_enum_validate;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_enum_init (GParamSpec *pspec)
Packit bc1512
{
Packit bc1512
  GeglParamSpecEnum *espec = GEGL_PARAM_SPEC_ENUM (pspec);
Packit bc1512
Packit bc1512
  espec->excluded_values = NULL;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_enum_finalize (GParamSpec *pspec)
Packit bc1512
{
Packit bc1512
  GeglParamSpecEnum *espec = GEGL_PARAM_SPEC_ENUM (pspec);
Packit bc1512
  GParamSpecClass   *parent_class;
Packit bc1512
Packit bc1512
  parent_class = g_type_class_peek (g_type_parent (GEGL_TYPE_PARAM_ENUM));
Packit bc1512
Packit bc1512
  g_slist_free (espec->excluded_values);
Packit bc1512
Packit bc1512
  parent_class->finalize (pspec);
Packit bc1512
}
Packit bc1512
Packit bc1512
static gboolean
Packit bc1512
gegl_param_enum_validate (GParamSpec *pspec,
Packit bc1512
                          GValue     *value)
Packit bc1512
{
Packit bc1512
  GeglParamSpecEnum *espec = GEGL_PARAM_SPEC_ENUM (pspec);
Packit bc1512
  GParamSpecClass   *parent_class;
Packit bc1512
  GSList            *list;
Packit bc1512
Packit bc1512
  parent_class = g_type_class_peek (g_type_parent (GEGL_TYPE_PARAM_ENUM));
Packit bc1512
Packit bc1512
  if (parent_class->value_validate (pspec, value))
Packit bc1512
    return TRUE;
Packit bc1512
Packit bc1512
  for (list = espec->excluded_values; list; list = g_slist_next (list))
Packit bc1512
    {
Packit bc1512
      if (GPOINTER_TO_INT (list->data) == value->data[0].v_long)
Packit bc1512
        {
Packit bc1512
          value->data[0].v_long = G_PARAM_SPEC_ENUM (pspec)->default_value;
Packit bc1512
          return TRUE;
Packit bc1512
        }
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return FALSE;
Packit bc1512
}
Packit bc1512
Packit bc1512
GParamSpec *
Packit bc1512
gegl_param_spec_enum (const gchar *name,
Packit bc1512
                      const gchar *nick,
Packit bc1512
                      const gchar *blurb,
Packit bc1512
                      GType        enum_type,
Packit bc1512
                      gint         default_value,
Packit bc1512
                      GParamFlags  flags)
Packit bc1512
{
Packit bc1512
  GeglParamSpecEnum *espec;
Packit bc1512
  GEnumClass        *enum_class;
Packit bc1512
Packit bc1512
  g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL);
Packit bc1512
Packit bc1512
  enum_class = g_type_class_ref (enum_type);
Packit bc1512
Packit bc1512
  g_return_val_if_fail (g_enum_get_value (enum_class, default_value) != NULL,
Packit bc1512
                        NULL);
Packit bc1512
Packit bc1512
  espec = g_param_spec_internal (GEGL_TYPE_PARAM_ENUM,
Packit bc1512
                                 name, nick, blurb, flags);
Packit bc1512
Packit bc1512
  G_PARAM_SPEC_ENUM (espec)->enum_class    = enum_class;
Packit bc1512
  G_PARAM_SPEC_ENUM (espec)->default_value = default_value;
Packit bc1512
  G_PARAM_SPEC (espec)->value_type         = enum_type;
Packit bc1512
Packit bc1512
  return G_PARAM_SPEC (espec);
Packit bc1512
}
Packit bc1512
Packit bc1512
void
Packit bc1512
gegl_param_spec_enum_exclude_value (GeglParamSpecEnum *espec,
Packit bc1512
                                    gint               value)
Packit bc1512
{
Packit bc1512
  g_return_if_fail (GEGL_IS_PARAM_SPEC_ENUM (espec));
Packit bc1512
  g_return_if_fail (g_enum_get_value (G_PARAM_SPEC_ENUM (espec)->enum_class,
Packit bc1512
                                      value) != NULL);
Packit bc1512
Packit bc1512
  espec->excluded_values = g_slist_prepend (espec->excluded_values,
Packit bc1512
                                            GINT_TO_POINTER (value));
Packit bc1512
}