]> Dogcows Code - chaz/rasterize/blobdiff - color.h
add opengl support
[chaz/rasterize] / color.h
diff --git a/color.h b/color.h
index 32765e0901ac2e9902041d431fc55eded1de4aee..bbb32852f8201995709db87e2eafa50be231f482 100644 (file)
--- a/color.h
+++ b/color.h
@@ -64,6 +64,16 @@ color_t color_new(colorchan_t r, colorchan_t g, colorchan_t b, colorchan_t a)
 #define COLOR_WHITE   color_new(S(1.0), S(1.0), S(1.0), S(1.0))
 
 
+/*
+ * Get a pointer to the color data.
+ */
+INLINE_MAYBE
+const scal_t* color_data(const color_t* c)
+{
+    return &c->r;
+}
+
+
 /*
  * Print the color to stdout.
  */
@@ -182,19 +192,6 @@ color_t color_interp2(color_t c1, color_t c2, color_t c3, scal_t b[3])
 typedef uint8_t     rgbachan_t;
 typedef uint32_t    rgba_t;
 
-/*
- * Create a new color from a 32-bit RGBA value.
- */
-INLINE_MAYBE
-color_t color_from_rgba(rgba_t n)
-{
-    colorchan_t r = (colorchan_t)UNPACK(n, 3) / S(255.0);
-    colorchan_t g = (colorchan_t)UNPACK(n, 2) / S(255.0);
-    colorchan_t b = (colorchan_t)UNPACK(n, 1) / S(255.0);
-    colorchan_t a = (colorchan_t)UNPACK(n, 0) / S(255.0);
-    return color_new(r, g, b, a);
-}
-
 /*
  * Split a color into 8-bit RGBA channels.
  */
@@ -207,15 +204,40 @@ void color_split(color_t c, rgbachan_t* r, rgbachan_t* g, rgbachan_t* b, rgbacha
     if (a) *a = (rgbachan_t)(c.a * S(255.0));
 }
 
+/*
+ * Create a new color from a 32-bit RGBA value.
+ */
+INLINE_MAYBE
+color_t color_from_rgba(rgba_t n)
+{
+    union {
+        rgba_t rgba;
+        struct {
+            rgbachan_t r, g, b, a;
+        } chan;
+    } u;
+    u.rgba = n;
+    colorchan_t r = (colorchan_t)u.chan.r / S(255.0);
+    colorchan_t g = (colorchan_t)u.chan.g / S(255.0);
+    colorchan_t b = (colorchan_t)u.chan.b / S(255.0);
+    colorchan_t a = (colorchan_t)u.chan.a / S(255.0);
+    return color_new(r, g, b, a);
+}
+
 /*
  * Convert a color to a 32-bit RGBA value.
  */
 INLINE_MAYBE
 rgba_t rgba_from_color(color_t c)
 {
-    rgbachan_t r, g, b, a;
-    color_split(c, &r, &g, &b, &a);
-    return ((rgba_t)r << 24) | ((rgba_t)g << 16) | ((rgba_t)b << 8) | (rgba_t)a;
+    union {
+        rgba_t rgba;
+        struct {
+            rgbachan_t r, g, b, a;
+        } chan;
+    } u;
+    color_split(c, &u.chan.r, &u.chan.g, &u.chan.b, &u.chan.a);
+    return u.rgba;
 }
 
 
This page took 0.019524 seconds and 4 git commands to generate.