Blame gegl/property-types/gegl-color.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 2006 Martin Nordholts <enselic@hotmail.com>
Packit bc1512
 */
Packit bc1512
Packit bc1512
#include "config.h"
Packit bc1512
Packit bc1512
#include <string.h>
Packit bc1512
Packit bc1512
#include <glib-object.h>
Packit bc1512
Packit bc1512
#include "gegl.h"
Packit bc1512
#include "gegl-types-internal.h"
Packit bc1512
#include "gegl-color.h"
Packit bc1512
Packit bc1512
Packit bc1512
enum
Packit bc1512
{
Packit bc1512
  PROP_0,
Packit bc1512
  PROP_STRING
Packit bc1512
};
Packit bc1512
Packit bc1512
typedef struct _ColorNameEntity ColorNameEntity;
Packit bc1512
Packit bc1512
struct _GeglColorPrivate
Packit bc1512
{
Packit bc1512
  gfloat rgba_color[4];
Packit bc1512
};
Packit bc1512
Packit bc1512
struct _ColorNameEntity
Packit bc1512
{
Packit bc1512
  const gchar *color_name;
Packit bc1512
  const gfloat rgba_color[4];
Packit bc1512
};
Packit bc1512
Packit bc1512
static gboolean  parse_float_argument_list (GeglColor *color,
Packit bc1512
                                            GScanner  *scanner,
Packit bc1512
                                            gint       num_arguments);
Packit bc1512
static gboolean  parse_color_name (GeglColor   *color,
Packit bc1512
                                   const gchar *color_string);
Packit bc1512
static gboolean  parse_hex (GeglColor   *color,
Packit bc1512
                            const gchar *color_string);
Packit bc1512
static void      set_property (GObject      *gobject,
Packit bc1512
                               guint         prop_id,
Packit bc1512
                               const GValue *value,
Packit bc1512
                               GParamSpec   *pspec);
Packit bc1512
static void      get_property (GObject    *gobject,
Packit bc1512
                               guint       prop_id,
Packit bc1512
                               GValue     *value,
Packit bc1512
                               GParamSpec *pspec);
Packit bc1512
Packit bc1512
/* These color names are based on those defined in the HTML 4.01 standard. See
Packit bc1512
 * http://www.w3.org/TR/html4/types.html#h-6.5
Packit bc1512
 */
Packit bc1512
static const ColorNameEntity color_names[] =
Packit bc1512
{
Packit bc1512
  { "black",   { 0.f,      0.f,      0.f,      1.f } },
Packit bc1512
  { "silver",  { 0.75294f, 0.75294f, 0.75294f, 1.f } },
Packit bc1512
  { "gray",    { 0.50196f, 0.50196f, 0.50196f, 1.f } },
Packit bc1512
  { "white",   { 1.f,      1.f,      1.f,      1.f } },
Packit bc1512
  { "maroon",  { 0.50196f, 0.f,      0.f,      1.f } },
Packit bc1512
  { "red",     { 1.f,      0.f,      0.f,      1.f } },
Packit bc1512
  { "purple",  { 0.50196f, 0.f,      0.50196f, 1.f } },
Packit bc1512
  { "fuchsia", { 1.f,      0.f,      1.f,      1.f } },
Packit bc1512
  { "green",   { 0.f,      0.50196f, 0.f,      1.f } },
Packit bc1512
  { "lime",    { 0.f,      1.f,      0.f,      1.f } },
Packit bc1512
  { "olive",   { 0.50196f, 0.50196f, 0.f,      1.f } },
Packit bc1512
  { "yellow",  { 1.f,      1.f,      01.f,     1.f } },
Packit bc1512
  { "navy",    { 0.f,      0.f,      0.50196f, 1.f } },
Packit bc1512
  { "blue",    { 0.f,      0.f,      1.f,      1.f } },
Packit bc1512
  { "teal",    { 0.f,      0.50196f, 0.50196f, 1.f } },
Packit bc1512
  { "aqua",    { 0.f,      1.f,      1.f,      1.f } },
Packit bc1512
  { "none",    { 0.f,      0.f,      0.f,      0.f } }
Packit bc1512
};
Packit bc1512
Packit bc1512
/* Copied into GeglColor:s instances when parsing a color from a string fails. */
Packit bc1512
static const gfloat parsing_error_color[4] = { 0.f, 1.f, 1.f, 0.67f };
Packit bc1512
Packit bc1512
/* Copied into all GeglColor:s at their instantiation. */
Packit bc1512
static const gfloat init_color[4] = { 1.f, 1.f, 1.f, 1.f };
Packit bc1512
Packit bc1512
G_DEFINE_TYPE (GeglColor, gegl_color, G_TYPE_OBJECT)
Packit bc1512
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_color_init (GeglColor *self)
Packit bc1512
{
Packit bc1512
  self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self), GEGL_TYPE_COLOR, GeglColorPrivate);
Packit bc1512
Packit bc1512
  memcpy (self->priv->rgba_color, init_color, sizeof (init_color));
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_color_class_init (GeglColorClass *klass)
Packit bc1512
{
Packit bc1512
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
Packit bc1512
Packit bc1512
  gobject_class->set_property = set_property;
Packit bc1512
  gobject_class->get_property = get_property;
Packit bc1512
Packit bc1512
  g_object_class_install_property (gobject_class, PROP_STRING,
Packit bc1512
                                   g_param_spec_string ("string",
Packit bc1512
                                                        "String",
Packit bc1512
                                                        "A String representation of the GeglColor",
Packit bc1512
                                                        "",
Packit bc1512
                                                        G_PARAM_READWRITE));
Packit bc1512
Packit bc1512
  g_type_class_add_private (klass, sizeof (GeglColorPrivate));
Packit bc1512
}
Packit bc1512
Packit bc1512
static gboolean
Packit bc1512
parse_float_argument_list (GeglColor *color,
Packit bc1512
                           GScanner  *scanner,
Packit bc1512
                           gint       num_arguments)
Packit bc1512
{
Packit bc1512
  GTokenType        token_type;
Packit bc1512
  GTokenValue       token_value;
Packit bc1512
  gint              i;
Packit bc1512
Packit bc1512
  /* Make sure there is a leading '(' */
Packit bc1512
  if (g_scanner_get_next_token (scanner) != G_TOKEN_LEFT_PAREN)
Packit bc1512
    {
Packit bc1512
      return FALSE;
Packit bc1512
    }
Packit bc1512
Packit bc1512
  /* Iterate through the arguments and copy each value
Packit bc1512
   * to the rgba_color array of GeglColor.
Packit bc1512
   */
Packit bc1512
  for (i = 0; i < num_arguments; ++i)
Packit bc1512
    {
Packit bc1512
      switch (g_scanner_get_next_token (scanner))
Packit bc1512
        {
Packit bc1512
          case G_TOKEN_FLOAT:
Packit bc1512
            token_value = g_scanner_cur_value (scanner);
Packit bc1512
            color->priv->rgba_color[i] = token_value.v_float;
Packit bc1512
            break;
Packit bc1512
Packit bc1512
          case G_TOKEN_INT:
Packit bc1512
            token_value = g_scanner_cur_value (scanner);
Packit bc1512
            color->priv->rgba_color[i] = token_value.v_int64;
Packit bc1512
            break;
Packit bc1512
Packit bc1512
          default:
Packit bc1512
            return FALSE;
Packit bc1512
        }
Packit bc1512
Packit bc1512
      /* Verify that there is a ',' after each float, except the last one */
Packit bc1512
      if (i < (num_arguments - 1))
Packit bc1512
        {
Packit bc1512
          token_type = g_scanner_get_next_token (scanner);
Packit bc1512
          if (token_type != G_TOKEN_COMMA)
Packit bc1512
            {
Packit bc1512
              return FALSE;
Packit bc1512
            }
Packit bc1512
        }
Packit bc1512
    }
Packit bc1512
Packit bc1512
  /* Make sure there is a traling ')' and that that is the last token. */
Packit bc1512
  if (g_scanner_get_next_token (scanner) == G_TOKEN_RIGHT_PAREN &&
Packit bc1512
      g_scanner_get_next_token (scanner) == G_TOKEN_EOF)
Packit bc1512
    {
Packit bc1512
      return TRUE;
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return FALSE;
Packit bc1512
}
Packit bc1512
Packit bc1512
static gboolean
Packit bc1512
parse_color_name (GeglColor   *color,
Packit bc1512
                  const gchar *color_string)
Packit bc1512
{
Packit bc1512
  gsize i;
Packit bc1512
Packit bc1512
  for (i = 0; i < G_N_ELEMENTS (color_names); ++i)
Packit bc1512
    {
Packit bc1512
      if (g_ascii_strcasecmp (color_names[i].color_name, color_string) == 0)
Packit bc1512
        {
Packit bc1512
          memcpy (color->priv->rgba_color, color_names[i].rgba_color, sizeof (color_names[i].rgba_color));
Packit bc1512
          return TRUE;
Packit bc1512
        }
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return FALSE;
Packit bc1512
}
Packit bc1512
Packit bc1512
static gboolean
Packit bc1512
parse_hex (GeglColor   *color,
Packit bc1512
           const gchar *color_string)
Packit bc1512
{
Packit bc1512
  gint              i;
Packit bc1512
  gsize             string_length = strlen (color_string);
Packit bc1512
Packit bc1512
  if (string_length == 7 ||  /* #rrggbb   */
Packit bc1512
      string_length == 9)    /* #rrggbbaa */
Packit bc1512
    {
Packit bc1512
      gint num_iterations = (string_length - 1) / 2;
Packit bc1512
      for (i = 0; i < num_iterations; ++i)
Packit bc1512
        {
Packit bc1512
          if (g_ascii_isxdigit (color_string[2 * i + 1]) &&
Packit bc1512
              g_ascii_isxdigit (color_string[2 * i + 2]))
Packit bc1512
            {
Packit bc1512
              color->priv->rgba_color[i] = (g_ascii_xdigit_value (color_string[2 * i + 1]) << 4 |
Packit bc1512
                                     g_ascii_xdigit_value (color_string[2 * i + 2])) / 255.f;
Packit bc1512
            }
Packit bc1512
          else
Packit bc1512
            {
Packit bc1512
              return FALSE;
Packit bc1512
            }
Packit bc1512
        }
Packit bc1512
Packit bc1512
      /* Successful #rrggbb(aa) parsing! */
Packit bc1512
      return TRUE;
Packit bc1512
    }
Packit bc1512
  else if (string_length == 4 ||  /* #rgb  */
Packit bc1512
           string_length == 5)    /* #rgba */
Packit bc1512
    {
Packit bc1512
      gint num_iterations = string_length - 1;
Packit bc1512
      for (i = 0; i < num_iterations; ++i)
Packit bc1512
        {
Packit bc1512
          if (g_ascii_isxdigit (color_string[i + 1]))
Packit bc1512
            {
Packit bc1512
              color->priv->rgba_color[i] = (g_ascii_xdigit_value (color_string[i + 1]) << 4 |
Packit bc1512
                                     g_ascii_xdigit_value (color_string[i + 1])) / 255.f;
Packit bc1512
            }
Packit bc1512
          else
Packit bc1512
            {
Packit bc1512
              return FALSE;
Packit bc1512
            }
Packit bc1512
        }
Packit bc1512
Packit bc1512
      /* Successful #rgb(a) parsing! */
Packit bc1512
      return TRUE;
Packit bc1512
    }
Packit bc1512
Packit bc1512
  /* String was of unsupported length. */
Packit bc1512
  return FALSE;
Packit bc1512
}
Packit bc1512
Packit bc1512
#if 0
Packit bc1512
const gfloat *
Packit bc1512
gegl_color_float4 (GeglColor *self)
Packit bc1512
{
Packit bc1512
  g_return_val_if_fail (GEGL_IS_COLOR (self), NULL);
Packit bc1512
  return &self->rgba_color[0];
Packit bc1512
}
Packit bc1512
#endif
Packit bc1512
Packit bc1512
void         gegl_color_set_pixel              (GeglColor   *color,
Packit bc1512
                                                const Babl  *format,
Packit bc1512
                                                const void  *pixel)
Packit bc1512
{
Packit bc1512
  g_return_if_fail (GEGL_IS_COLOR (color));
Packit bc1512
  g_return_if_fail (format);
Packit bc1512
  g_return_if_fail (pixel);
Packit bc1512
Packit bc1512
  babl_process (
Packit bc1512
      babl_fish (format, babl_format ("RGBA float")),
Packit bc1512
      pixel, color->priv->rgba_color, 1);
Packit bc1512
}
Packit bc1512
Packit bc1512
void         gegl_color_get_pixel              (GeglColor   *color,
Packit bc1512
                                                const Babl  *format,
Packit bc1512
                                                void        *pixel)
Packit bc1512
{
Packit bc1512
  g_return_if_fail (GEGL_IS_COLOR (color));
Packit bc1512
  g_return_if_fail (format);
Packit bc1512
  g_return_if_fail (pixel);
Packit bc1512
Packit bc1512
  babl_process (
Packit bc1512
      babl_fish (babl_format ("RGBA float"), format),
Packit bc1512
      color->priv->rgba_color, pixel, 1);
Packit bc1512
}
Packit bc1512
Packit bc1512
void
Packit bc1512
gegl_color_set_rgba (GeglColor *self,
Packit bc1512
                     gdouble    r,
Packit bc1512
                     gdouble    g,
Packit bc1512
                     gdouble    b,
Packit bc1512
                     gdouble    a)
Packit bc1512
{
Packit bc1512
  g_return_if_fail (GEGL_IS_COLOR (self));
Packit bc1512
Packit bc1512
  self->priv->rgba_color[0] = r;
Packit bc1512
  self->priv->rgba_color[1] = g;
Packit bc1512
  self->priv->rgba_color[2] = b;
Packit bc1512
  self->priv->rgba_color[3] = a;
Packit bc1512
}
Packit bc1512
Packit bc1512
void
Packit bc1512
gegl_color_get_rgba (GeglColor *self,
Packit bc1512
                     gdouble   *r,
Packit bc1512
                     gdouble   *g,
Packit bc1512
                     gdouble   *b,
Packit bc1512
                     gdouble   *a)
Packit bc1512
{
Packit bc1512
  g_return_if_fail (GEGL_IS_COLOR (self));
Packit bc1512
Packit bc1512
  *r = self->priv->rgba_color[0];
Packit bc1512
  *g = self->priv->rgba_color[1];
Packit bc1512
  *b = self->priv->rgba_color[2];
Packit bc1512
  *a = self->priv->rgba_color[3];
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_color_set_from_string (GeglColor   *self,
Packit bc1512
                            const gchar *color_string)
Packit bc1512
{
Packit bc1512
  GScanner         *scanner;
Packit bc1512
  GTokenType        token_type;
Packit bc1512
  GTokenValue       token_value;
Packit bc1512
  gboolean          color_parsing_successfull;
Packit bc1512
Packit bc1512
  scanner                               = g_scanner_new (NULL);
Packit bc1512
  scanner->config->cpair_comment_single = "";
Packit bc1512
  g_scanner_input_text (scanner, color_string, strlen (color_string));
Packit bc1512
Packit bc1512
  token_type  = g_scanner_get_next_token (scanner);
Packit bc1512
  token_value = g_scanner_cur_value (scanner);
Packit bc1512
Packit bc1512
  if (token_type == G_TOKEN_IDENTIFIER &&
Packit bc1512
      g_ascii_strcasecmp (token_value.v_identifier, "rgb") == 0)
Packit bc1512
    {
Packit bc1512
      color_parsing_successfull = parse_float_argument_list (self, scanner, 3);
Packit bc1512
      self->priv->rgba_color[3]       = 1.f;
Packit bc1512
    }
Packit bc1512
  else if (token_type == G_TOKEN_IDENTIFIER &&
Packit bc1512
           g_ascii_strcasecmp (token_value.v_identifier, "rgba") == 0)
Packit bc1512
    {
Packit bc1512
      color_parsing_successfull = parse_float_argument_list (self, scanner, 4);
Packit bc1512
    }
Packit bc1512
  else if (token_type == '#') /* FIXME: Verify that this is a safe way to check for '#' */
Packit bc1512
    {
Packit bc1512
      color_parsing_successfull = parse_hex (self, color_string);
Packit bc1512
    }
Packit bc1512
  else if (token_type == G_TOKEN_IDENTIFIER)
Packit bc1512
    {
Packit bc1512
      color_parsing_successfull = parse_color_name (self, color_string);
Packit bc1512
    }
Packit bc1512
  else
Packit bc1512
    {
Packit bc1512
      color_parsing_successfull = FALSE;
Packit bc1512
    }
Packit bc1512
Packit bc1512
  if (!color_parsing_successfull)
Packit bc1512
    {
Packit bc1512
      memcpy (self->priv->rgba_color,
Packit bc1512
              parsing_error_color,
Packit bc1512
              sizeof (parsing_error_color));
Packit bc1512
      g_warning ("Parsing of color string \"%s\" into GeglColor failed! "
Packit bc1512
                 "Using transparent cyan instead",
Packit bc1512
                 color_string);
Packit bc1512
    }
Packit bc1512
Packit bc1512
  g_scanner_destroy (scanner);
Packit bc1512
}
Packit bc1512
Packit bc1512
static gchar *
Packit bc1512
gegl_color_get_string (GeglColor *color)
Packit bc1512
{
Packit bc1512
  if (color->priv->rgba_color[3] == 1.0)
Packit bc1512
    {
Packit bc1512
      gchar buf [3][G_ASCII_DTOSTR_BUF_SIZE];
Packit bc1512
      g_ascii_formatd (buf[0], G_ASCII_DTOSTR_BUF_SIZE, "%1.4f", color->priv->rgba_color[0]);
Packit bc1512
      g_ascii_formatd (buf[1], G_ASCII_DTOSTR_BUF_SIZE, "%1.4f", color->priv->rgba_color[1]);
Packit bc1512
      g_ascii_formatd (buf[2], G_ASCII_DTOSTR_BUF_SIZE, "%1.4f", color->priv->rgba_color[2]);
Packit bc1512
      return g_strdup_printf ("rgb(%s, %s, %s)", buf[0], buf[1], buf[2]);
Packit bc1512
    }
Packit bc1512
  else
Packit bc1512
    {
Packit bc1512
      gchar buf [4][G_ASCII_DTOSTR_BUF_SIZE];
Packit bc1512
      g_ascii_formatd (buf[0], G_ASCII_DTOSTR_BUF_SIZE, "%1.4f", color->priv->rgba_color[0]);
Packit bc1512
      g_ascii_formatd (buf[1], G_ASCII_DTOSTR_BUF_SIZE, "%1.4f", color->priv->rgba_color[1]);
Packit bc1512
      g_ascii_formatd (buf[2], G_ASCII_DTOSTR_BUF_SIZE, "%1.4f", color->priv->rgba_color[2]);
Packit bc1512
      g_ascii_formatd (buf[3], G_ASCII_DTOSTR_BUF_SIZE, "%1.4f", color->priv->rgba_color[3]);
Packit bc1512
      return g_strdup_printf ("rgba(%s, %s, %s, %s)", buf[0], buf[1], buf[2], buf[3]);
Packit bc1512
    }
Packit bc1512
}
Packit bc1512
Packit bc1512
Packit bc1512
static void
Packit bc1512
set_property (GObject      *gobject,
Packit bc1512
              guint         property_id,
Packit bc1512
              const GValue *value,
Packit bc1512
              GParamSpec   *pspec)
Packit bc1512
{
Packit bc1512
  GeglColor *color = GEGL_COLOR (gobject);
Packit bc1512
Packit bc1512
  switch (property_id)
Packit bc1512
    {
Packit bc1512
      case PROP_STRING:
Packit bc1512
        gegl_color_set_from_string (color, g_value_get_string (value));
Packit bc1512
        break;
Packit bc1512
Packit bc1512
      default:
Packit bc1512
        G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, pspec);
Packit bc1512
        break;
Packit bc1512
    }
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
get_property (GObject    *gobject,
Packit bc1512
              guint       property_id,
Packit bc1512
              GValue     *value,
Packit bc1512
              GParamSpec *pspec)
Packit bc1512
{
Packit bc1512
  GeglColor *color = GEGL_COLOR (gobject);
Packit bc1512
Packit bc1512
  switch (property_id)
Packit bc1512
    {
Packit bc1512
      case PROP_STRING:
Packit bc1512
      {
Packit bc1512
        gchar *string = gegl_color_get_string (color);
Packit bc1512
        g_value_set_string (value, string);
Packit bc1512
        g_free (string);
Packit bc1512
      }
Packit bc1512
        break;
Packit bc1512
Packit bc1512
      default:
Packit bc1512
        G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, pspec);
Packit bc1512
        break;
Packit bc1512
    }
Packit bc1512
}
Packit bc1512
Packit bc1512
GeglColor *
Packit bc1512
gegl_color_new (const gchar *string)
Packit bc1512
{
Packit bc1512
  if (string)
Packit bc1512
    return g_object_new (GEGL_TYPE_COLOR, "string", string, NULL);
Packit bc1512
Packit bc1512
  return g_object_new (GEGL_TYPE_COLOR, NULL);
Packit bc1512
}
Packit bc1512
Packit bc1512
/* --------------------------------------------------------------------------
Packit bc1512
 * A GParamSpec class to describe behavior of GeglColor as an object property
Packit bc1512
 * follows.
Packit bc1512
 * --------------------------------------------------------------------------
Packit bc1512
 */
Packit bc1512
Packit bc1512
#define GEGL_PARAM_COLOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEGL_TYPE_PARAM_COLOR, GeglParamColor))
Packit bc1512
#define GEGL_IS_PARAM_COLOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEGL_TYPE_PARAM_COLOR))
Packit bc1512
Packit bc1512
typedef struct _GeglParamColor GeglParamColor;
Packit bc1512
Packit bc1512
struct _GeglParamColor
Packit bc1512
{
Packit bc1512
  GParamSpec parent_instance;
Packit bc1512
Packit bc1512
  GeglColor *default_color;
Packit bc1512
};
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_color_init (GParamSpec *self)
Packit bc1512
{
Packit bc1512
  GEGL_PARAM_COLOR (self)->default_color = NULL;
Packit bc1512
}
Packit bc1512
Packit bc1512
GeglColor *
Packit bc1512
gegl_param_spec_color_get_default (GParamSpec *self);
Packit bc1512
GeglColor *
Packit bc1512
gegl_param_spec_color_get_default (GParamSpec *self)
Packit bc1512
{
Packit bc1512
  return GEGL_PARAM_COLOR (self)->default_color;
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_color_finalize (GParamSpec *self)
Packit bc1512
{
Packit bc1512
  GeglParamColor  *param_color  = GEGL_PARAM_COLOR (self);
Packit bc1512
  GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (GEGL_TYPE_PARAM_COLOR));
Packit bc1512
Packit bc1512
  if (param_color->default_color)
Packit bc1512
    {
Packit bc1512
      g_object_unref (param_color->default_color);
Packit bc1512
      param_color->default_color = NULL;
Packit bc1512
    }
Packit bc1512
Packit bc1512
  parent_class->finalize (self);
Packit bc1512
}
Packit bc1512
Packit bc1512
static void
Packit bc1512
gegl_param_color_set_default (GParamSpec *param_spec,
Packit bc1512
                              GValue     *value)
Packit bc1512
{
Packit bc1512
  GeglParamColor *gegl_color = GEGL_PARAM_COLOR (param_spec);
Packit bc1512
Packit bc1512
  g_value_set_object (value, gegl_color->default_color);
Packit bc1512
}
Packit bc1512
Packit bc1512
GType
Packit bc1512
gegl_param_color_get_type (void)
Packit bc1512
{
Packit bc1512
  static GType param_color_type = 0;
Packit bc1512
Packit bc1512
  if (G_UNLIKELY (param_color_type == 0))
Packit bc1512
    {
Packit bc1512
      static GParamSpecTypeInfo param_color_type_info = {
Packit bc1512
        sizeof (GeglParamColor),
Packit bc1512
        0,
Packit bc1512
        gegl_param_color_init,
Packit bc1512
        0,
Packit bc1512
        gegl_param_color_finalize,
Packit bc1512
        gegl_param_color_set_default,
Packit bc1512
        NULL,
Packit bc1512
        NULL
Packit bc1512
      };
Packit bc1512
      param_color_type_info.value_type = GEGL_TYPE_COLOR;
Packit bc1512
Packit bc1512
      param_color_type = g_param_type_register_static ("GeglParamColor",
Packit bc1512
                                                       &param_color_type_info);
Packit bc1512
    }
Packit bc1512
Packit bc1512
  return param_color_type;
Packit bc1512
}
Packit bc1512
Packit bc1512
GParamSpec *
Packit bc1512
gegl_param_spec_color (const gchar *name,
Packit bc1512
                       const gchar *nick,
Packit bc1512
                       const gchar *blurb,
Packit bc1512
                       GeglColor   *default_color,
Packit bc1512
                       GParamFlags  flags)
Packit bc1512
{
Packit bc1512
  GeglParamColor *param_color;
Packit bc1512
Packit bc1512
  param_color = g_param_spec_internal (GEGL_TYPE_PARAM_COLOR,
Packit bc1512
                                       name, nick, blurb, flags);
Packit bc1512
Packit bc1512
  param_color->default_color = default_color;
Packit bc1512
  if (default_color)
Packit bc1512
    g_object_ref (default_color);
Packit bc1512
Packit bc1512
  return G_PARAM_SPEC (param_color);
Packit bc1512
}
Packit bc1512
Packit bc1512
GParamSpec *
Packit bc1512
gegl_param_spec_color_from_string (const gchar *name,
Packit bc1512
                                   const gchar *nick,
Packit bc1512
                                   const gchar *blurb,
Packit bc1512
                                   const gchar *default_color_string,
Packit bc1512
                                   GParamFlags  flags)
Packit bc1512
{
Packit bc1512
  GeglParamColor *param_color;
Packit bc1512
Packit bc1512
  param_color = g_param_spec_internal (GEGL_TYPE_PARAM_COLOR,
Packit bc1512
                                       name, nick, blurb, flags);
Packit bc1512
Packit bc1512
  param_color->default_color = g_object_new (GEGL_TYPE_COLOR,
Packit bc1512
                                             "string", default_color_string,
Packit bc1512
                                             NULL);
Packit bc1512
Packit bc1512
  return G_PARAM_SPEC (param_color);
Packit bc1512
}