X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Frasterize;a=blobdiff_plain;f=color.h;h=26a6390d2adf70c598652bc33183e5b15a421c23;hp=ba333e2c0f6d279fb42d48836e5113f8b7103c90;hb=c875478cdd823c7df8fdc859941bd9e5948c9315;hpb=0f2508a4f227523a6b7e54798487af19d06a6ce9 diff --git a/color.h b/color.h index ba333e2..26a6390 100644 --- a/color.h +++ b/color.h @@ -5,8 +5,8 @@ * mcgarvey@eng.utah.edu */ -#ifndef __COLOR_H__ -#define __COLOR_H__ +#ifndef _COLOR_H_ +#define _COLOR_H_ #include "common.h" @@ -32,7 +32,7 @@ typedef struct color color_t; /* * Initialize a color. */ -__fast__ +INLINE_MAYBE void color_init(color_t* c, colorchan_t r, colorchan_t g, colorchan_t b, colorchan_t a) { c->r = r; @@ -45,7 +45,7 @@ void color_init(color_t* c, colorchan_t r, colorchan_t g, colorchan_t b, colorch /* * Create a new color, copied by value. */ -__fast__ +INLINE_MAYBE color_t color_new(colorchan_t r, colorchan_t g, colorchan_t b, colorchan_t a) { color_t c; @@ -64,16 +64,88 @@ 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)) +/* + * Print the color to stdout. + */ +INLINE_MAYBE +void color_print(color_t c) +{ +#if (SCALAR_SIZE == 8) + const char* fmt = "[ %9.5lf %9.5lf %9.5lf %9.5lf ]"; +#else + const char* fmt = "[ %9.5f %9.5f %9.5f %9.5f ]"; +#endif + printf(fmt, c.r, c.g, c.b, c.a); +} + + +/* + * Add two colors together. Color may need to be clamped afterward. + */ +INLINE_MAYBE +color_t color_add(color_t c1, color_t c2) +{ + return color_new(c1.r + c2.r, c1.g + c2.g, c1.b + c2.b, c1.a + c2.a); +} + +/* + * Add three colors together. Color may need to be clamped afterward. + */ +INLINE_MAYBE +color_t color_add2(color_t c1, color_t c2, color_t c3) +{ + return color_add(color_add(c1, c2), c3); +} + +/* + * Clamp a color's channels to the normal range of 0.0 to 1.0. + */ +INLINE_MAYBE +color_t color_clamp(color_t c) +{ + c.r = scal_clamp(c.r, S(0.0), S(1.0)); + c.g = scal_clamp(c.g, S(0.0), S(1.0)); + c.b = scal_clamp(c.b, S(0.0), S(1.0)); + c.a = scal_clamp(c.a, S(0.0), S(1.0)); + return c; +} + + +/* + * Interpolate smoothly between two colors with an alpha value. + */ +INLINE_MAYBE +color_t color_interp(color_t c1, color_t c2, scal_t a) +{ + return color_new(c1.r * (S(1.0) - a) + c2.r * a, + c1.g * (S(1.0) - a) + c2.g * a, + c1.b * (S(1.0) - a) + c2.b * a, + c1.a * (S(1.0) - a) + c2.a * a); +} + +/* + * Interpolate smoothly between three colors with barycentric coordinates. + */ +INLINE_MAYBE +color_t color_interp2(color_t c1, color_t c2, color_t c3, scal_t b[3]) +{ + return color_new(c1.r * b[0] + c2.r * b[1] + c3.r * b[2], + c1.g * b[0] + c2.g * b[1] + c3.g * b[2], + c1.b * b[0] + c2.b * b[1] + c3.b * b[2], + S(1.0)); +} + + /* * Define integer types for a 32-bit RGBA color representation. */ -typedef uint32_t rgba_t; typedef uint8_t rgbachan_t; +typedef uint32_t rgba_t; /* * Create a new color from a 32-bit RGBA value. */ -__fast__ +INLINE_MAYBE color_t color_from_rgba(rgba_t n) { colorchan_t r = (colorchan_t)UNPACK(n, 3) / S(255.0); @@ -86,7 +158,7 @@ color_t color_from_rgba(rgba_t n) /* * Split a color into 8-bit RGBA channels. */ -__fast__ +INLINE_MAYBE void color_split(color_t c, rgbachan_t* r, rgbachan_t* g, rgbachan_t* b, rgbachan_t* a) { if (r) *r = (rgbachan_t)(c.r * S(255.0)); @@ -98,7 +170,7 @@ void color_split(color_t c, rgbachan_t* r, rgbachan_t* g, rgbachan_t* b, rgbacha /* * Convert a color to a 32-bit RGBA value. */ -__fast__ +INLINE_MAYBE rgba_t rgba_from_color(color_t c) { rgbachan_t r, g, b, a; @@ -107,5 +179,5 @@ rgba_t rgba_from_color(color_t c) } -#endif // __COLOR_H__ +#endif // _COLOR_H_