X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Frasterize;a=blobdiff_plain;f=color.h;h=bbb32852f8201995709db87e2eafa50be231f482;hp=32765e0901ac2e9902041d431fc55eded1de4aee;hb=bc662e293c854e1bdc9d46e9a410fe220247e6d4;hpb=07083c8dfbbd4fe48e84d86ce8d7e44e0719b84a diff --git a/color.h b/color.h index 32765e0..bbb3285 100644 --- 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; }