[cogl] Adds _cogl_pixel_format_is_endian_dependant api
- From: Robert Bragg <rbragg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [cogl] Adds _cogl_pixel_format_is_endian_dependant api
- Date: Mon, 20 Feb 2012 23:25:50 +0000 (UTC)
commit 07e972505cc7b999519240c87664d3de993e623b
Author: Robert Bragg <robert linux intel com>
Date: Mon Feb 13 23:28:28 2012 +0000
Adds _cogl_pixel_format_is_endian_dependant api
This adds an internal utility function
_cogl_pixel_format_is_endian_dependant() that can query whether
accessing the components of a given format depends on the endianness of
the current host CPU or whether a pixel can be loaded as a word and
channels accessed using bit masking and shifting.
Reviewed-by: Neil Roberts <neil linux intel com>
cogl/cogl-private.h | 27 +++++++++++++++++++++++++++
cogl/cogl.c | 21 +++++++++++++++++++++
2 files changed, 48 insertions(+), 0 deletions(-)
---
diff --git a/cogl/cogl-private.h b/cogl/cogl-private.h
index b4ff420..8f2a72e 100644
--- a/cogl/cogl-private.h
+++ b/cogl/cogl-private.h
@@ -75,6 +75,33 @@ _cogl_get_enable_legacy_state (void);
int
_cogl_pixel_format_get_bytes_per_pixel (CoglPixelFormat format);
+/*
+ * _cogl_pixel_format_has_aligned_components:
+ * @format: a #CoglPixelFormat
+ *
+ * Queries whether the ordering of the components for the given
+ * @format depend on the endianness of the host CPU or if the
+ * components can be accessed using bit shifting and bitmasking by
+ * loading a whole pixel into a word.
+ *
+ * XXX: If we ever consider making something like this public we
+ * should really try to think of a better name and come up with
+ * much clearer documentation since it really depends on what
+ * point of view you consider this from whether a format like
+ * COGL_PIXEL_FORMAT_RGBA_8888 is endian dependent. E.g. If you
+ * read an RGBA_8888 pixel into a uint32
+ * it's endian dependent how you mask out the different channels.
+ * But If you already have separate color components and you want
+ * to write them to an RGBA_8888 pixel then the bytes can be
+ * written sequentially regardless of the endianness.
+ *
+ * Return value: %TRUE if you need to consider the host CPU
+ * endianness when dealing with the given @format
+ * else %FALSE.
+ */
+gboolean
+_cogl_pixel_format_is_endian_dependant (CoglPixelFormat format);
+
G_END_DECLS
#endif /* __COGL_PRIVATE_H__ */
diff --git a/cogl/cogl.c b/cogl/cogl.c
index d22a91f..82a7f77 100644
--- a/cogl/cogl.c
+++ b/cogl/cogl.c
@@ -1024,3 +1024,24 @@ _cogl_pixel_format_get_bytes_per_pixel (CoglPixelFormat format)
return bpp_lut [format & 0xf];
}
+
+/* Note: this also refers to the mapping defined above for
+ * _cogl_pixel_format_get_bytes_per_pixel() */
+gboolean
+_cogl_pixel_format_is_endian_dependant (CoglPixelFormat format)
+{
+ int aligned_lut[] = { -1, 1, 1, 1,
+ 0, 0, 0, -1,
+ 1, 1, -1, -1,
+ 0, 0, -1, -1};
+ int aligned = aligned_lut[format & 0xf];
+
+ _COGL_RETURN_VAL_IF_FAIL (aligned != -1, FALSE);
+
+ /* NB: currently checking whether the format components are aligned
+ * or not determines whether the format is endian dependent or not.
+ * In the future though we might consider adding formats with
+ * aligned components that are also endian independant. */
+
+ return aligned;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]