|
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 |
¶m_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 |
}
|