Commit 5a5f8081 authored by Carlos Garnacho's avatar Carlos Garnacho

Add GdkRGBA struct to supersede GdkColor

GdkRGBA is a boxed struct similar to GdkColor, with the difference
that it stores alpha information as well, and colors are stored in
[0..1] doubles, in the cairo spirit.

gdk_cairo_set_source_rgba() has been also added to allow easier handling
of this new type.
parent c7500031
......@@ -24,6 +24,7 @@
<xi:include href="xml/regions.xml" />
<xi:include href="xml/drawing.xml" />
<xi:include href="xml/colors.xml" />
<xi:include href="xml/rgba_colors.xml" />
<xi:include href="xml/visuals.xml" />
<xi:include href="xml/cursors.xml" />
<xi:include href="xml/windows.xml" />
......
......@@ -259,6 +259,21 @@ GDK_TYPE_COLOR
</SECTION>
<SECTION>
<TITLE>RGBA Colors</TITLE>
<FILE>rgba_colors</FILE>
GdkRGBA
gdk_rgba_copy
gdk_rgba_free
gdk_rgba_parse
gdk_rgba_equal
gdk_rgba_hash
gdk_rgba_to_string
<SUBSECTION Standard>
GDK_TYPE_RGBA
</SECTION>
<SECTION>
<TITLE>Drawing Primitives</TITLE>
<FILE>drawing</FILE>
......@@ -595,6 +610,7 @@ gdk_window_create_similar_surface
gdk_cairo_create
gdk_cairo_get_clip_rectangle
gdk_cairo_set_source_color
gdk_cairo_set_source_rgba
gdk_cairo_set_source_pixbuf
gdk_cairo_set_source_window
gdk_cairo_rectangle
......
......@@ -91,6 +91,7 @@ gdk_public_h_sources = \
gdkprivate.h \
gdkproperty.h \
gdkrectangle.h \
gdkrgba.h \
gdkscreen.h \
gdkselection.h \
gdkspawn.h \
......@@ -130,6 +131,7 @@ gdk_c_sources = \
gdkpango.c \
gdkpixbuf-drawable.c \
gdkrectangle.c \
gdkrgba.c \
gdkscreen.c \
gdkselection.c \
gdkvisual.c \
......
......@@ -167,6 +167,20 @@ gdk_cairo_set_source_color (cairo_t *cr,
color->blue / 65535.);
}
void
gdk_cairo_set_source_rgba (cairo_t *cr,
const GdkRGBA *rgba)
{
g_return_if_fail (cr != NULL);
g_return_if_fail (rgba != NULL);
cairo_set_source_rgba (cr,
rgba->red,
rgba->green,
rgba->blue,
rgba->alpha);
}
/**
* gdk_cairo_rectangle:
* @cr: a #cairo_t
......
......@@ -25,6 +25,7 @@
#define __GDK_CAIRO_H__
#include <gdk/gdkcolor.h>
#include <gdk/gdkrgba.h>
#include <gdk/gdkpixbuf.h>
#include <pango/pangocairo.h>
......@@ -38,6 +39,8 @@ gboolean gdk_cairo_get_clip_rectangle(cairo_t *cr,
void gdk_cairo_set_source_color (cairo_t *cr,
const GdkColor *color);
void gdk_cairo_set_source_rgba (cairo_t *cr,
const GdkRGBA *rgba);
void gdk_cairo_set_source_pixbuf (cairo_t *cr,
const GdkPixbuf *pixbuf,
double pixbuf_x,
......
/* GDK - The GIMP Drawing Kit
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#include "config.h"
#include "gdkrgba.h"
#include <string.h>
/**
* SECTION:rgba_colors
* @Short_description: RGBA colors
* @Title: RGBA Colors
*/
G_DEFINE_BOXED_TYPE (GdkRGBA, gdk_rgba,
gdk_rgba_copy, gdk_rgba_free)
/**
* gdk_rgba_copy:
* @rgba: a #GdkRGBA
*
* Makes a copy of a #GdkRGBA structure, the result must be freed
* through gdk_rgba_free().
*
* Returns: A newly allocated #GdkRGBA
**/
GdkRGBA *
gdk_rgba_copy (GdkRGBA *rgba)
{
GdkRGBA *copy;
copy = g_slice_new (GdkRGBA);
copy->red = rgba->red;
copy->green = rgba->green;
copy->blue = rgba->blue;
copy->alpha = rgba->alpha;
return copy;
}
/**
* gdk_rgba_free:
* @rgba: a #GdkRGBA
*
* Frees a #GdkRGBA struct created with gdk_rgba_copy()
**/
void
gdk_rgba_free (GdkRGBA *rgba)
{
g_slice_free (GdkRGBA, rgba);
}
/**
* gdk_rgba_parse:
* @spec: the string specifying the color
* @rgba: the #GdkRGBA struct to fill in
*
* Parses a textual representation of a color, filling in
* the <structfield>red</structfield>, <structfield>green</structfield>,
* <structfield>blue</structfield> and <structfield>alpha</structfield>
* fields of the @rgba struct.
*
* The string can be either one of:
* <itemizedlist>
* <listitem>
* A standard name (Taken from the X11 rgb.txt file).
* </listitem>
* <listitem>
* A hex value in the form '#rgb' '#rrggbb' '#rrrgggbbb' or '#rrrrggggbbbb'
* </listitem>
* <listitem>
* A RGB color in the form 'rgb(r,g,b)' (In this case the color will
* have full opacity)
* </listitem>
* <listitem>
* A RGBA color in the form 'rgba(r,g,b,a)'
* </listitem>
* </itemizedlist>
*
* Where 'r', 'g', 'b' and 'a' are respectively the red, green, blue and
* alpha color values, parsed in the last 2 cases as double numbers in
* the range [0..1], any other value out of that range will be clamped.
*
* Returns: %TRUE if the parsing succeeded
**/
gboolean
gdk_rgba_parse (const gchar *spec,
GdkRGBA *rgba)
{
gboolean has_alpha;
gdouble r, g, b, a;
gchar *str = (gchar *) spec;
#define SKIP_WHITESPACES(s) while (*(s) == ' ') (s)++;
if (strncmp (str, "rgba", 4) == 0)
{
has_alpha = TRUE;
str += 4;
}
else if (strncmp (str, "rgb", 3) == 0)
{
has_alpha = FALSE;
a = 1;
str += 3;
}
else
{
PangoColor pango_color;
/* Resort on PangoColor for rgb.txt color
* map and '#' prefixed colors */
if (pango_color_parse (&pango_color, str))
{
if (rgba)
{
rgba->red = pango_color.red / 65535.;
rgba->green = pango_color.green / 65535.;
rgba->blue = pango_color.blue / 65535.;
rgba->alpha = 1;
}
return TRUE;
}
else
return FALSE;
}
SKIP_WHITESPACES (str);
if (*str != '(')
return FALSE;
str++;
/* Parse red */
SKIP_WHITESPACES (str);
r = g_ascii_strtod (str, &str);
SKIP_WHITESPACES (str);
if (*str != ',')
return FALSE;
str++;
/* Parse green */
SKIP_WHITESPACES (str);
g = g_ascii_strtod (str, &str);
SKIP_WHITESPACES (str);
if (*str != ',')
return FALSE;
str++;
/* Parse blue */
SKIP_WHITESPACES (str);
b = g_ascii_strtod (str, &str);
SKIP_WHITESPACES (str);
if (has_alpha)
{
if (*str != ',')
return FALSE;
str++;
SKIP_WHITESPACES (str);
a = g_ascii_strtod (str, &str);
SKIP_WHITESPACES (str);
}
if (*str != ')')
return FALSE;
#undef SKIP_WHITESPACES
if (rgba)
{
rgba->red = CLAMP (r, 0, 1);
rgba->green = CLAMP (g, 0, 1);
rgba->blue = CLAMP (b, 0, 1);
rgba->alpha = CLAMP (a, 0, 1);
}
return TRUE;
}
/**
* gdk_rgba_hash:
* @p: a #GdkRGBA pointer.
*
* A hash function suitable for using for a hash
* table that stores #GdkRGBA<!-- -->s.
*
* Return value: The hash function applied to @p
**/
guint
gdk_rgba_hash (gconstpointer p)
{
const GdkRGBA *rgba = p;
return ((guint) (rgba->red * 65535) +
((guint) (rgba->green * 65535) << 11) +
((guint) (rgba->blue * 65535) << 22) +
((guint) (rgba->alpha * 65535) >> 6));
}
/**
* gdk_rgba_equal:
* @p1: a #GdkRGBA pointer.
* @p2: another #GdkRGBA pointer.
*
* Compares two RGBA colors.
*
* Return value: %TRUE if the two colors compare equal
**/
gboolean
gdk_rgba_equal (gconstpointer p1,
gconstpointer p2)
{
const GdkRGBA *rgba1, *rgba2;
rgba1 = p1;
rgba2 = p2;
if (rgba1->red == rgba2->red &&
rgba1->green == rgba2->green &&
rgba1->blue == rgba2->blue &&
rgba1->alpha == rgba2->alpha)
return TRUE;
return FALSE;
}
/**
* gdk_rgba_to_string:
* @rgba: a #GdkRGBA
*
* Returns a textual specification of @rgba in the form
* <literal>rgba (r, g, b, a)</literal>, where 'r', 'g',
* 'b' and 'a' represent the red, green, blue and alpha
* values respectively.
*
* Returns: A newly allocated text string
**/
gchar *
gdk_rgba_to_string (GdkRGBA *rgba)
{
return g_strdup_printf ("rgba(%f,%f,%f,%f)",
CLAMP (rgba->red, 0, 1),
CLAMP (rgba->green, 0, 1),
CLAMP (rgba->blue, 0, 1),
CLAMP (rgba->alpha, 0, 1));
}
/* GDK - The GIMP Drawing Kit
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
#error "Only <gdk/gdk.h> can be included directly."
#endif
#ifndef __GDK_RGBA_H__
#define __GDK_RGBA_H__
#include <gdk/gdktypes.h>
G_BEGIN_DECLS
struct _GdkRGBA
{
gdouble red;
gdouble green;
gdouble blue;
gdouble alpha;
};
#define GDK_TYPE_RGBA (gdk_rgba_get_type ())
GdkRGBA * gdk_rgba_copy (GdkRGBA *rgba);
void gdk_rgba_free (GdkRGBA *rgba);
gboolean gdk_rgba_parse (const gchar *spec,
GdkRGBA *rgba);
guint gdk_rgba_hash (gconstpointer p);
gboolean gdk_rgba_equal (gconstpointer p1,
gconstpointer p2);
gchar * gdk_rgba_to_string (GdkRGBA *rgba);
GType gdk_rgba_get_type (void) G_GNUC_CONST;
G_END_DECLS
#endif /* __GDK_RGBA_H__ */
......@@ -96,6 +96,7 @@ typedef guint32 GdkNativeWindow;
/* Forward declarations of commonly used types
*/
typedef struct _GdkColor GdkColor;
typedef struct _GdkRGBA GdkRGBA;
typedef struct _GdkCursor GdkCursor;
typedef struct _GdkVisual GdkVisual;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment