]>
Dogcows Code - chaz/rasterize/blob - color.h
3 * CS5600 University of Utah
5 * mcgarvey@eng.utah.edu
15 * A color channel will be the same as a scalar.
17 typedef scal_t colorchan_t
;
21 * Colors are represented by RGBA values between 0.0 and 1.0.
30 typedef struct color color_t
;
36 void color_init(color_t
* c
, colorchan_t r
, colorchan_t g
, colorchan_t b
, colorchan_t a
)
46 * Create a new color, copied by value.
49 color_t
color_new(colorchan_t r
, colorchan_t g
, colorchan_t b
, colorchan_t a
)
52 color_init(&c
, r
, g
, b
, a
);
56 #define COLOR_CLEAR color_new(S(0.0), S(0.0), S(0.0), S(0.0))
57 #define COLOR_BLACK color_new(S(0.0), S(0.0), S(0.0), S(1.0))
58 #define COLOR_RED color_new(S(1.0), S(0.0), S(0.0), S(1.0))
59 #define COLOR_GREEN color_new(S(0.0), S(1.0), S(0.0), S(1.0))
60 #define COLOR_BLUE color_new(S(0.0), S(0.0), S(1.0), S(1.0))
61 #define COLOR_YELLOW color_new(S(1.0), S(1.0), S(0.0), S(1.0))
62 #define COLOR_MAGENTA color_new(S(1.0), S(0.0), S(1.0), S(1.0))
63 #define COLOR_CYAN color_new(S(0.0), S(1.0), S(1.0), S(1.0))
64 #define COLOR_WHITE color_new(S(1.0), S(1.0), S(1.0), S(1.0))
68 * Get a pointer to the color data.
71 const scal_t
* color_data(const color_t
* c
)
78 * Print the color to stdout.
81 void color_print(color_t c
)
83 #if (SCALAR_SIZE == 8)
84 const char* fmt
= "[ %9.5lf %9.5lf %9.5lf %9.5lf ]";
86 const char* fmt
= "[ %9.5f %9.5f %9.5f %9.5f ]";
88 printf(fmt
, c
.r
, c
.g
, c
.b
, c
.a
);
93 * Add two colors together.
96 color_t
color_add(color_t c1
, color_t c2
)
98 return color_new(c1
.r
+ c2
.r
, c1
.g
+ c2
.g
, c1
.b
+ c2
.b
, c1
.a
);
102 * Add three colors together.
105 color_t
color_add2(color_t c1
, color_t c2
, color_t c3
)
107 return color_add(color_add(c1
, c2
), c3
);
111 * Multiply two colors together.
114 color_t
color_mult(color_t c1
, color_t c2
)
123 * Scale a color by some scalar coefficient.
126 color_t
color_scale(color_t c
, scal_t k
)
135 * Scale a color by another color and some scalar coefficient.
138 color_t
color_scale2(color_t c1
, color_t c2
, scal_t k
)
140 return color_scale(color_mult(c1
, c2
), k
);
144 color_t
color_blend(color_t d
, color_t s
)
146 d
.r
= (S(1.0) - s
.a
) * d
.r
+ s
.a
* s
.r
;
147 d
.g
= (S(1.0) - s
.a
) * d
.g
+ s
.a
* s
.g
;
148 d
.b
= (S(1.0) - s
.a
) * d
.b
+ s
.a
* s
.b
;
153 * Clamp a color's channels to the normal range of 0.0 to 1.0.
156 color_t
color_clamp(color_t c
)
158 c
.r
= scal_clamp(c
.r
, S(0.0), S(1.0));
159 c
.g
= scal_clamp(c
.g
, S(0.0), S(1.0));
160 c
.b
= scal_clamp(c
.b
, S(0.0), S(1.0));
161 c
.a
= scal_clamp(c
.a
, S(0.0), S(1.0));
167 * Interpolate smoothly between two colors with an alpha value.
170 color_t
color_interp(color_t c1
, color_t c2
, scal_t a
)
172 return color_new(c1
.r
* (S(1.0) - a
) + c2
.r
* a
,
173 c1
.g
* (S(1.0) - a
) + c2
.g
* a
,
174 c1
.b
* (S(1.0) - a
) + c2
.b
* a
, c1
.a
);
178 * Interpolate smoothly between three colors with barycentric coordinates.
181 color_t
color_interp2(color_t c1
, color_t c2
, color_t c3
, scal_t b
[3])
183 return color_new(c1
.r
* b
[0] + c2
.r
* b
[1] + c3
.r
* b
[2],
184 c1
.g
* b
[0] + c2
.g
* b
[1] + c3
.g
* b
[2],
185 c1
.b
* b
[0] + c2
.b
* b
[1] + c3
.b
* b
[2], c1
.a
);
190 * Define integer types for a 32-bit RGBA color representation.
192 typedef uint8_t rgbachan_t
;
193 typedef uint32_t rgba_t
;
196 * Split a color into 8-bit RGBA channels.
199 void color_split(color_t c
, rgbachan_t
* r
, rgbachan_t
* g
, rgbachan_t
* b
, rgbachan_t
* a
)
201 if (r
) *r
= (rgbachan_t
)(c
.r
* S(255.0));
202 if (g
) *g
= (rgbachan_t
)(c
.g
* S(255.0));
203 if (b
) *b
= (rgbachan_t
)(c
.b
* S(255.0));
204 if (a
) *a
= (rgbachan_t
)(c
.a
* S(255.0));
208 * Create a new color from a 32-bit RGBA value.
211 color_t
color_from_rgba(rgba_t n
)
216 rgbachan_t r
, g
, b
, a
;
220 colorchan_t r
= (colorchan_t
)u
.chan
.r
/ S(255.0);
221 colorchan_t g
= (colorchan_t
)u
.chan
.g
/ S(255.0);
222 colorchan_t b
= (colorchan_t
)u
.chan
.b
/ S(255.0);
223 colorchan_t a
= (colorchan_t
)u
.chan
.a
/ S(255.0);
224 return color_new(r
, g
, b
, a
);
228 * Convert a color to a 32-bit RGBA value.
231 rgba_t
rgba_from_color(color_t c
)
236 rgbachan_t r
, g
, b
, a
;
239 color_split(c
, &u
.chan
.r
, &u
.chan
.g
, &u
.chan
.b
, &u
.chan
.a
);
This page took 0.040456 seconds and 4 git commands to generate.