[Cogl] [PATCH] color: Store components as floats and make public
Robert Bragg
robert at sixbynine.org
Tue Aug 28 08:52:50 PDT 2012
From: Robert Bragg <robert at linux.intel.com>
Instead of storing the CoglColor components as bytes we now store them
as single precision floats and also make the members public. The
intention is to evolve the cogl_color_ api into a more useful utility
api for color space manipulations.
---
cogl/cogl-color-private.h | 4 +-
cogl/cogl-color.c | 164 ++++++++++++++++--------------------
cogl/cogl-color.h | 99 ++++++++++------------
cogl/cogl-pipeline-private.h | 4 -
cogl/cogl-pipeline-state-private.h | 17 ++++
cogl/cogl-pipeline-state.c | 11 ---
cogl/cogl-types.h | 20 +----
7 files changed, 140 insertions(+), 179 deletions(-)
diff --git a/cogl/cogl-color-private.h b/cogl/cogl-color-private.h
index 591ff73..e0f0a57 100644
--- a/cogl/cogl-color-private.h
+++ b/cogl/cogl-color-private.h
@@ -38,8 +38,8 @@
#define _COGL_COLOR_DATA_SIZE 4
void
-_cogl_color_get_rgba_4ubv (const CoglColor *color,
- uint8_t *dest);
+_cogl_color_get_rgba_4fv (const CoglColor *color,
+ float *dest);
#endif /* __COGL_COLOR_PRIVATE_PRIVATE_H */
diff --git a/cogl/cogl-color.c b/cogl/cogl-color.c
index ed4dd46..0919a75 100644
--- a/cogl/cogl-color.c
+++ b/cogl/cogl-color.c
@@ -3,7 +3,7 @@
*
* An object oriented GL/GLES Abstraction/Utility Layer
*
- * Copyright (C) 2008,2009 Intel Corporation.
+ * Copyright (C) 2008,2009,2012 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -16,7 +16,8 @@
* 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, see <http://www.gnu.org/licenses/>.
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
*
*
*/
@@ -31,28 +32,6 @@
#include "cogl-color.h"
#include "cogl-color-private.h"
-CoglColor *
-cogl_color_new (void)
-{
- return g_slice_new (CoglColor);
-}
-
-CoglColor *
-cogl_color_copy (const CoglColor *color)
-{
- if (G_LIKELY (color))
- return g_slice_dup (CoglColor, color);
-
- return NULL;
-}
-
-void
-cogl_color_free (CoglColor *color)
-{
- if (G_LIKELY (color))
- g_slice_free (CoglColor, color);
-}
-
void
cogl_color_init_from_4ub (CoglColor *color,
uint8_t red,
@@ -60,12 +39,10 @@ cogl_color_init_from_4ub (CoglColor *color,
uint8_t blue,
uint8_t alpha)
{
- _COGL_RETURN_IF_FAIL (color != NULL);
-
- color->red = red;
- color->green = green;
- color->blue = blue;
- color->alpha = alpha;
+ color->red = red / 255.0f;
+ color->green = green / 255.0f;
+ color->blue = blue / 255.0f;
+ color->alpha = alpha / 255.0f;
}
void
@@ -75,188 +52,181 @@ cogl_color_init_from_4f (CoglColor *color,
float blue,
float alpha)
{
- _COGL_RETURN_IF_FAIL (color != NULL);
-
- color->red = (red * 255);
- color->green = (green * 255);
- color->blue = (blue * 255);
- color->alpha = (alpha * 255);
+ color->red = red;
+ color->green = green;
+ color->blue = blue;
+ color->alpha = alpha;
}
void
cogl_color_init_from_4fv (CoglColor *color,
float *color_array)
{
- _COGL_RETURN_IF_FAIL (color != NULL);
-
- color->red = (color_array[0] * 255);
- color->green = (color_array[1] * 255);
- color->blue = (color_array[2] * 255);
- color->alpha = (color_array[3] * 255);
+ memcpy (color, color_array, sizeof (CoglColor));
}
-unsigned char
+uint8_t
cogl_color_get_red_byte (const CoglColor *color)
{
- return color->red;
+ return color->red * 255;
}
float
cogl_color_get_red_float (const CoglColor *color)
{
- return (float) color->red / 255.0;
+ return color->red;
}
float
cogl_color_get_red (const CoglColor *color)
{
- return ((float) color->red / 255.0);
+ return color->red;
}
-unsigned char
+uint8_t
cogl_color_get_green_byte (const CoglColor *color)
{
- return color->green;
+ return color->green * 255;
}
float
cogl_color_get_green_float (const CoglColor *color)
{
- return (float) color->green / 255.0;
+ return color->green;
}
float
cogl_color_get_green (const CoglColor *color)
{
- return ((float) color->green / 255.0);
+ return color->green;
}
-unsigned char
+uint8_t
cogl_color_get_blue_byte (const CoglColor *color)
{
- return color->blue;
+ return color->blue * 255;
}
float
cogl_color_get_blue_float (const CoglColor *color)
{
- return (float) color->blue / 255.0;
+ return color->blue;
}
float
cogl_color_get_blue (const CoglColor *color)
{
- return ((float) color->blue / 255.0);
+ return color->blue;
}
-unsigned char
+uint8_t
cogl_color_get_alpha_byte (const CoglColor *color)
{
- return color->alpha;
+ return color->alpha * 255;
}
float
cogl_color_get_alpha_float (const CoglColor *color)
{
- return (float) color->alpha / 255.0;
+ return color->alpha;
}
float
cogl_color_get_alpha (const CoglColor *color)
{
- return ((float) color->alpha / 255.0);
+ return color->alpha;
}
void
-cogl_color_set_red_byte (CoglColor *color,
- unsigned char red)
+cogl_color_set_red_byte (CoglColor *color,
+ uint8_t red)
{
- color->red = red;
+ color->red = red / 255.0f;
}
void
cogl_color_set_red_float (CoglColor *color,
- float red)
+ float red)
{
- color->red = red * 255.0;
+ color->red = red;
}
void
cogl_color_set_red (CoglColor *color,
- float red)
+ float red)
{
- color->red = red * 255.0;
+ color->red = red;
}
void
-cogl_color_set_green_byte (CoglColor *color,
- unsigned char green)
+cogl_color_set_green_byte (CoglColor *color,
+ uint8_t green)
{
- color->green = green;
+ color->green = green / 255.0f;
}
void
cogl_color_set_green_float (CoglColor *color,
float green)
{
- color->green = green * 255.0;
+ color->green = green;
}
void
cogl_color_set_green (CoglColor *color,
float green)
{
- color->green = green * 255.0;
+ color->green = green;
}
void
cogl_color_set_blue_byte (CoglColor *color,
- unsigned char blue)
+ uint8_t blue)
{
- color->blue = blue;
+ color->blue = blue / 255.0f;
}
void
cogl_color_set_blue_float (CoglColor *color,
float blue)
{
- color->blue = blue * 255.0;
+ color->blue = blue;
}
void
cogl_color_set_blue (CoglColor *color,
float blue)
{
- color->blue = blue * 255.0;
+ color->blue = blue;
}
void
cogl_color_set_alpha_byte (CoglColor *color,
- unsigned char alpha)
+ uint8_t alpha)
{
- color->alpha = alpha;
+ color->alpha = alpha / 255.0f;
}
void
cogl_color_set_alpha_float (CoglColor *color,
float alpha)
{
- color->alpha = alpha * 255.0;
+ color->alpha = alpha;
}
void
cogl_color_set_alpha (CoglColor *color,
float alpha)
{
- color->alpha = alpha * 255.0;
+ color->alpha = alpha;
}
void
cogl_color_premultiply (CoglColor *color)
{
- color->red = (color->red * color->alpha + 128) / 255;
- color->green = (color->green * color->alpha + 128) / 255;
- color->blue = (color->blue * color->alpha + 128) / 255;
+ color->red *= color->alpha;
+ color->green *= color->alpha;
+ color->blue *= color->alpha;
}
void
@@ -264,28 +234,40 @@ cogl_color_unpremultiply (CoglColor *color)
{
if (color->alpha != 0)
{
- color->red = (color->red * 255) / color->alpha;
- color->green = (color->green * 255) / color->alpha;
- color->blue = (color->blue * 255) / color->alpha;
+ color->red /= color->alpha;
+ color->green /= color->alpha;
+ color->blue /= color->alpha;
}
}
CoglBool
cogl_color_equal (const void *v1, const void *v2)
{
- const uint32_t *c1 = v1, *c2 = v2;
-
_COGL_RETURN_VAL_IF_FAIL (v1 != NULL, FALSE);
_COGL_RETURN_VAL_IF_FAIL (v2 != NULL, FALSE);
- /* XXX: We don't compare the padding */
- return *c1 == *c2 ? TRUE : FALSE;
+ return memcmp (v1, v2, sizeof (CoglColor)) == 0;
+}
+
+CoglColor *
+cogl_color_copy (const CoglColor *color)
+{
+ if (G_LIKELY (color))
+ return g_slice_dup (CoglColor, color);
+
+ return NULL;
}
void
-_cogl_color_get_rgba_4ubv (const CoglColor *color,
- uint8_t *dest)
+cogl_color_free (CoglColor *color)
{
- memcpy (dest, color, 4);
+ if (G_LIKELY (color))
+ g_slice_free (CoglColor, color);
}
+void
+_cogl_color_get_rgba_4fv (const CoglColor *color,
+ float *dest)
+{
+ memcpy (dest, color, sizeof (CoglColor));
+}
diff --git a/cogl/cogl-color.h b/cogl/cogl-color.h
index 3bff8fe..0a2e3ff 100644
--- a/cogl/cogl-color.h
+++ b/cogl/cogl-color.h
@@ -3,7 +3,7 @@
*
* An object oriented GL/GLES Abstraction/Utility Layer
*
- * Copyright (C) 2008,2009 Intel Corporation.
+ * Copyright (C) 2008,2009,2012 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -43,44 +43,6 @@
G_BEGIN_DECLS
/**
- * cogl_color_new:
- *
- * Creates a new (empty) color
- *
- * Return value: a newly-allocated #CoglColor. Use cogl_color_free()
- * to free the allocated resources
- *
- * Since: 1.0
- */
-CoglColor *
-cogl_color_new (void);
-
-/**
- * cogl_color_copy:
- * @color: the color to copy
- *
- * Creates a copy of @color
- *
- * Return value: a newly-allocated #CoglColor. Use cogl_color_free()
- * to free the allocate resources
- *
- * Since: 1.0
- */
-CoglColor *
-cogl_color_copy (const CoglColor *color);
-
-/**
- * cogl_color_free:
- * @color: the color to free
- *
- * Frees the resources allocated by cogl_color_new() and cogl_color_copy()
- *
- * Since: 1.0
- */
-void
-cogl_color_free (CoglColor *color);
-
-/**
* cogl_color_init_from_4ub:
* @color: A pointer to a #CoglColor to initialize
* @red: value of the red channel, between 0 and 255
@@ -142,7 +104,7 @@ cogl_color_init_from_4fv (CoglColor *color,
*
* Since: 1.0
*/
-unsigned char
+uint8_t
cogl_color_get_red_byte (const CoglColor *color);
/**
@@ -156,7 +118,7 @@ cogl_color_get_red_byte (const CoglColor *color);
*
* Since: 1.0
*/
-unsigned char
+uint8_t
cogl_color_get_green_byte (const CoglColor *color);
/**
@@ -170,7 +132,7 @@ cogl_color_get_green_byte (const CoglColor *color);
*
* Since: 1.0
*/
-unsigned char
+uint8_t
cogl_color_get_blue_byte (const CoglColor *color);
/**
@@ -184,7 +146,7 @@ cogl_color_get_blue_byte (const CoglColor *color);
*
* Since: 1.0
*/
-unsigned char
+uint8_t
cogl_color_get_alpha_byte (const CoglColor *color);
/**
@@ -309,8 +271,8 @@ cogl_color_get_alpha (const CoglColor *color);
* Since: 1.4
*/
void
-cogl_color_set_red_byte (CoglColor *color,
- unsigned char red);
+cogl_color_set_red_byte (CoglColor *color,
+ uint8_t red);
/**
* cogl_color_set_green_byte:
@@ -322,8 +284,8 @@ cogl_color_set_red_byte (CoglColor *color,
* Since: 1.4
*/
void
-cogl_color_set_green_byte (CoglColor *color,
- unsigned char green);
+cogl_color_set_green_byte (CoglColor *color,
+ uint8_t green);
/**
* cogl_color_set_blue_byte:
@@ -335,8 +297,8 @@ cogl_color_set_green_byte (CoglColor *color,
* Since: 1.4
*/
void
-cogl_color_set_blue_byte (CoglColor *color,
- unsigned char blue);
+cogl_color_set_blue_byte (CoglColor *color,
+ uint8_t blue);
/**
* cogl_color_set_alpha_byte:
@@ -348,8 +310,8 @@ cogl_color_set_blue_byte (CoglColor *color,
* Since: 1.4
*/
void
-cogl_color_set_alpha_byte (CoglColor *color,
- unsigned char alpha);
+cogl_color_set_alpha_byte (CoglColor *color,
+ uint8_t alpha);
/**
* cogl_color_set_red_float:
@@ -362,7 +324,7 @@ cogl_color_set_alpha_byte (CoglColor *color,
*/
void
cogl_color_set_red_float (CoglColor *color,
- float red);
+ float red);
/**
* cogl_color_set_green_float:
@@ -375,7 +337,7 @@ cogl_color_set_red_float (CoglColor *color,
*/
void
cogl_color_set_green_float (CoglColor *color,
- float green);
+ float green);
/**
* cogl_color_set_blue_float:
@@ -388,7 +350,7 @@ cogl_color_set_green_float (CoglColor *color,
*/
void
cogl_color_set_blue_float (CoglColor *color,
- float blue);
+ float blue);
/**
* cogl_color_set_alpha_float:
@@ -401,7 +363,7 @@ cogl_color_set_blue_float (CoglColor *color,
*/
void
cogl_color_set_alpha_float (CoglColor *color,
- float alpha);
+ float alpha);
/**
* cogl_color_set_red:
@@ -414,7 +376,7 @@ cogl_color_set_alpha_float (CoglColor *color,
*/
void
cogl_color_set_red (CoglColor *color,
- float red);
+ float red);
/**
* cogl_color_set_green:
@@ -498,6 +460,31 @@ cogl_color_unpremultiply (CoglColor *color);
CoglBool
cogl_color_equal (const void *v1, const void *v2);
+/**
+ * cogl_color_copy:
+ * @color: the color to copy
+ *
+ * Creates a copy of @color
+ *
+ * Return value: a newly-allocated #CoglColor. Use cogl_color_free()
+ * to free the allocate resources
+ *
+ * Since: 1.0
+ */
+CoglColor *
+cogl_color_copy (const CoglColor *color);
+
+/**
+ * cogl_color_free:
+ * @color: the color to free
+ *
+ * Frees the resources allocated by cogl_color_new() and cogl_color_copy()
+ *
+ * Since: 1.0
+ */
+void
+cogl_color_free (CoglColor *color);
+
G_END_DECLS
#endif /* __COGL_COLOR_H__ */
diff --git a/cogl/cogl-pipeline-private.h b/cogl/cogl-pipeline-private.h
index 5760f85..31d896f 100644
--- a/cogl/cogl-pipeline-private.h
+++ b/cogl/cogl-pipeline-private.h
@@ -832,10 +832,6 @@ _cogl_pipeline_set_vertend (CoglPipeline *pipeline, int vertend);
CoglPipeline *
_cogl_pipeline_get_parent (CoglPipeline *pipeline);
-void
-_cogl_pipeline_get_colorubv (CoglPipeline *pipeline,
- uint8_t *color);
-
/* XXX: At some point it could be good for this to accept a mask of
* the state groups we are interested in comparing since we can
* probably use that information in a number situations to reduce
diff --git a/cogl/cogl-pipeline-state-private.h b/cogl/cogl-pipeline-state-private.h
index 3954f23..8c8b2b8 100644
--- a/cogl/cogl-pipeline-state-private.h
+++ b/cogl/cogl-pipeline-state-private.h
@@ -28,6 +28,23 @@
#ifndef __COGL_PIPELINE_STATE_PRIVATE_H
#define __COGL_PIPELINE_STATE_PRIVATE_H
+#include "cogl-pipeline-private.h"
+
+/* This is used heavily by the cogl journal when logging quads */
+static inline void
+_cogl_pipeline_get_colorubv (CoglPipeline *pipeline,
+ uint8_t *color)
+{
+ CoglPipeline *authority =
+ _cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_COLOR);
+ const CoglColor *cogl_color = &authority->color;
+
+ color[0] = cogl_color->red * 255;
+ color[1] = cogl_color->green * 255;
+ color[2] = cogl_color->blue * 255;
+ color[3] = cogl_color->alpha * 255;
+}
+
CoglBool
_cogl_pipeline_maybe_has_custom_texture_transform (CoglPipeline *pipeline);
diff --git a/cogl/cogl-pipeline-state.c b/cogl/cogl-pipeline-state.c
index b0a83de..b8e53dc 100644
--- a/cogl/cogl-pipeline-state.c
+++ b/cogl/cogl-pipeline-state.c
@@ -315,17 +315,6 @@ cogl_pipeline_get_color (CoglPipeline *pipeline,
*color = authority->color;
}
-/* This is used heavily by the cogl journal when logging quads */
-void
-_cogl_pipeline_get_colorubv (CoglPipeline *pipeline,
- uint8_t *color)
-{
- CoglPipeline *authority =
- _cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_COLOR);
-
- _cogl_color_get_rgba_4ubv (&authority->color, color);
-}
-
void
cogl_pipeline_set_color (CoglPipeline *pipeline,
const CoglColor *color)
diff --git a/cogl/cogl-types.h b/cogl/cogl-types.h
index 7684412..9e61ca4 100644
--- a/cogl/cogl-types.h
+++ b/cogl/cogl-types.h
@@ -398,26 +398,16 @@ typedef enum
/**
* CoglColor:
*
- * A structure for holding a color definition. The contents of
- * the CoglColor structure are private and should never by accessed
- * directly.
+ * A structure for holding a single color definition.
*
* Since: 1.0
*/
struct _CoglColor
{
- /*< private >*/
- uint8_t COGL_PRIVATE (red);
- uint8_t COGL_PRIVATE (green);
- uint8_t COGL_PRIVATE (blue);
-
- uint8_t COGL_PRIVATE (alpha);
-
- /* padding in case we want to change to floats at
- * some point */
- uint32_t COGL_PRIVATE (padding0);
- uint32_t COGL_PRIVATE (padding1);
- uint32_t COGL_PRIVATE (padding2);
+ float red;
+ float green;
+ float blue;
+ float alpha;
};
COGL_STRUCT_SIZE_ASSERT (CoglColor, 16);
--
1.7.7.6
More information about the Cogl
mailing list