Nuklear
This is a minimal-state, immediate-mode graphical user interface toolkit written in ANSI C and licensed under public domain. It was designed as a simple embeddable user interface for application and does not have any dependencies, a default render backend or OS window/input handling but instead provides a highly modular, library-based approach, with simple input state for input and draw commands describing primitive shapes as output. So instead of providing a layered library that tries to abstract over a number of platform and render backends, it focuses only on the actual UI.
 
Loading...
Searching...
No Matches
nuklear_color.c
1#include "nuklear.h"
2#include "nuklear_internal.h"
3
4/* ==============================================================
5 *
6 * COLOR
7 *
8 * ===============================================================*/
9NK_INTERN int
10nk_parse_hex(const char *p, int length)
11{
12 int i = 0;
13 int len = 0;
14 while (len < length) {
15 i <<= 4;
16 if (p[len] >= 'a' && p[len] <= 'f')
17 i += ((p[len] - 'a') + 10);
18 else if (p[len] >= 'A' && p[len] <= 'F')
19 i += ((p[len] - 'A') + 10);
20 else i += (p[len] - '0');
21 len++;
22 }
23 return i;
24}
25NK_API struct nk_color
26nk_rgb_factor(struct nk_color col, float factor)
27{
28 if (factor == 1.0f)
29 return col;
30 col.r = (nk_byte)(col.r * factor);
31 col.g = (nk_byte)(col.g * factor);
32 col.b = (nk_byte)(col.b * factor);
33 return col;
34}
35NK_API struct nk_color
36nk_rgba(int r, int g, int b, int a)
37{
38 struct nk_color ret;
39 ret.r = (nk_byte)NK_CLAMP(0, r, 255);
40 ret.g = (nk_byte)NK_CLAMP(0, g, 255);
41 ret.b = (nk_byte)NK_CLAMP(0, b, 255);
42 ret.a = (nk_byte)NK_CLAMP(0, a, 255);
43 return ret;
44}
45NK_API struct nk_color
46nk_rgb_hex(const char *rgb)
47{
48 struct nk_color col;
49 const char *c = rgb;
50 if (*c == '#') c++;
51 col.r = (nk_byte)nk_parse_hex(c, 2);
52 col.g = (nk_byte)nk_parse_hex(c+2, 2);
53 col.b = (nk_byte)nk_parse_hex(c+4, 2);
54 col.a = 255;
55 return col;
56}
57NK_API struct nk_color
58nk_rgba_hex(const char *rgb)
59{
60 struct nk_color col;
61 const char *c = rgb;
62 if (*c == '#') c++;
63 col.r = (nk_byte)nk_parse_hex(c, 2);
64 col.g = (nk_byte)nk_parse_hex(c+2, 2);
65 col.b = (nk_byte)nk_parse_hex(c+4, 2);
66 col.a = (nk_byte)nk_parse_hex(c+6, 2);
67 return col;
68}
69NK_API void
70nk_color_hex_rgba(char *output, struct nk_color col)
71{
72 #define NK_TO_HEX(i) ((i) <= 9 ? '0' + (i): 'A' - 10 + (i))
73 output[0] = (char)NK_TO_HEX((col.r & 0xF0) >> 4);
74 output[1] = (char)NK_TO_HEX((col.r & 0x0F));
75 output[2] = (char)NK_TO_HEX((col.g & 0xF0) >> 4);
76 output[3] = (char)NK_TO_HEX((col.g & 0x0F));
77 output[4] = (char)NK_TO_HEX((col.b & 0xF0) >> 4);
78 output[5] = (char)NK_TO_HEX((col.b & 0x0F));
79 output[6] = (char)NK_TO_HEX((col.a & 0xF0) >> 4);
80 output[7] = (char)NK_TO_HEX((col.a & 0x0F));
81 output[8] = '\0';
82 #undef NK_TO_HEX
83}
84NK_API void
85nk_color_hex_rgb(char *output, struct nk_color col)
86{
87 #define NK_TO_HEX(i) ((i) <= 9 ? '0' + (i): 'A' - 10 + (i))
88 output[0] = (char)NK_TO_HEX((col.r & 0xF0) >> 4);
89 output[1] = (char)NK_TO_HEX((col.r & 0x0F));
90 output[2] = (char)NK_TO_HEX((col.g & 0xF0) >> 4);
91 output[3] = (char)NK_TO_HEX((col.g & 0x0F));
92 output[4] = (char)NK_TO_HEX((col.b & 0xF0) >> 4);
93 output[5] = (char)NK_TO_HEX((col.b & 0x0F));
94 output[6] = '\0';
95 #undef NK_TO_HEX
96}
97NK_API struct nk_color
98nk_rgba_iv(const int *c)
99{
100 return nk_rgba(c[0], c[1], c[2], c[3]);
101}
102NK_API struct nk_color
103nk_rgba_bv(const nk_byte *c)
104{
105 return nk_rgba(c[0], c[1], c[2], c[3]);
106}
107NK_API struct nk_color
108nk_rgb(int r, int g, int b)
109{
110 struct nk_color ret;
111 ret.r = (nk_byte)NK_CLAMP(0, r, 255);
112 ret.g = (nk_byte)NK_CLAMP(0, g, 255);
113 ret.b = (nk_byte)NK_CLAMP(0, b, 255);
114 ret.a = (nk_byte)255;
115 return ret;
116}
117NK_API struct nk_color
118nk_rgb_iv(const int *c)
119{
120 return nk_rgb(c[0], c[1], c[2]);
121}
122NK_API struct nk_color
123nk_rgb_bv(const nk_byte* c)
124{
125 return nk_rgb(c[0], c[1], c[2]);
126}
127NK_API struct nk_color
128nk_rgba_u32(nk_uint in)
129{
130 struct nk_color ret;
131 ret.r = (in & 0xFF);
132 ret.g = ((in >> 8) & 0xFF);
133 ret.b = ((in >> 16) & 0xFF);
134 ret.a = (nk_byte)((in >> 24) & 0xFF);
135 return ret;
136}
137NK_API struct nk_color
138nk_rgba_f(float r, float g, float b, float a)
139{
140 struct nk_color ret;
141 ret.r = (nk_byte)(NK_SATURATE(r) * 255.0f);
142 ret.g = (nk_byte)(NK_SATURATE(g) * 255.0f);
143 ret.b = (nk_byte)(NK_SATURATE(b) * 255.0f);
144 ret.a = (nk_byte)(NK_SATURATE(a) * 255.0f);
145 return ret;
146}
147NK_API struct nk_color
148nk_rgba_fv(const float *c)
149{
150 return nk_rgba_f(c[0], c[1], c[2], c[3]);
151}
152NK_API struct nk_color
153nk_rgba_cf(struct nk_colorf c)
154{
155 return nk_rgba_f(c.r, c.g, c.b, c.a);
156}
157NK_API struct nk_color
158nk_rgb_f(float r, float g, float b)
159{
160 struct nk_color ret;
161 ret.r = (nk_byte)(NK_SATURATE(r) * 255.0f);
162 ret.g = (nk_byte)(NK_SATURATE(g) * 255.0f);
163 ret.b = (nk_byte)(NK_SATURATE(b) * 255.0f);
164 ret.a = 255;
165 return ret;
166}
167NK_API struct nk_color
168nk_rgb_fv(const float *c)
169{
170 return nk_rgb_f(c[0], c[1], c[2]);
171}
172NK_API struct nk_color
173nk_rgb_cf(struct nk_colorf c)
174{
175 return nk_rgb_f(c.r, c.g, c.b);
176}
177NK_API struct nk_color
178nk_hsv(int h, int s, int v)
179{
180 return nk_hsva(h, s, v, 255);
181}
182NK_API struct nk_color
183nk_hsv_iv(const int *c)
184{
185 return nk_hsv(c[0], c[1], c[2]);
186}
187NK_API struct nk_color
188nk_hsv_bv(const nk_byte *c)
189{
190 return nk_hsv(c[0], c[1], c[2]);
191}
192NK_API struct nk_color
193nk_hsv_f(float h, float s, float v)
194{
195 return nk_hsva_f(h, s, v, 1.0f);
196}
197NK_API struct nk_color
198nk_hsv_fv(const float *c)
199{
200 return nk_hsv_f(c[0], c[1], c[2]);
201}
202NK_API struct nk_color
203nk_hsva(int h, int s, int v, int a)
204{
205 float hf = ((float)NK_CLAMP(0, h, 255)) / 255.0f;
206 float sf = ((float)NK_CLAMP(0, s, 255)) / 255.0f;
207 float vf = ((float)NK_CLAMP(0, v, 255)) / 255.0f;
208 float af = ((float)NK_CLAMP(0, a, 255)) / 255.0f;
209 return nk_hsva_f(hf, sf, vf, af);
210}
211NK_API struct nk_color
212nk_hsva_iv(const int *c)
213{
214 return nk_hsva(c[0], c[1], c[2], c[3]);
215}
216NK_API struct nk_color
217nk_hsva_bv(const nk_byte *c)
218{
219 return nk_hsva(c[0], c[1], c[2], c[3]);
220}
221NK_API struct nk_colorf
222nk_hsva_colorf(float h, float s, float v, float a)
223{
224 int i;
225 float p, q, t, f;
226 struct nk_colorf out = {0,0,0,0};
227 if (s <= 0.0f) {
228 out.r = v; out.g = v; out.b = v; out.a = a;
229 return out;
230 }
231 h = h / (60.0f/360.0f);
232 i = (int)h;
233 f = h - (float)i;
234 p = v * (1.0f - s);
235 q = v * (1.0f - (s * f));
236 t = v * (1.0f - s * (1.0f - f));
237
238 switch (i) {
239 case 0: default: out.r = v; out.g = t; out.b = p; break;
240 case 1: out.r = q; out.g = v; out.b = p; break;
241 case 2: out.r = p; out.g = v; out.b = t; break;
242 case 3: out.r = p; out.g = q; out.b = v; break;
243 case 4: out.r = t; out.g = p; out.b = v; break;
244 case 5: out.r = v; out.g = p; out.b = q; break;}
245 out.a = a;
246 return out;
247}
248NK_API struct nk_colorf
249nk_hsva_colorfv(const float *c)
250{
251 return nk_hsva_colorf(c[0], c[1], c[2], c[3]);
252}
253NK_API struct nk_color
254nk_hsva_f(float h, float s, float v, float a)
255{
256 struct nk_colorf c = nk_hsva_colorf(h, s, v, a);
257 return nk_rgba_f(c.r, c.g, c.b, c.a);
258}
259NK_API struct nk_color
260nk_hsva_fv(const float *c)
261{
262 return nk_hsva_f(c[0], c[1], c[2], c[3]);
263}
264NK_API nk_uint
265nk_color_u32(struct nk_color in)
266{
267 nk_uint out = (nk_uint)in.r;
268 out |= ((nk_uint)in.g << 8);
269 out |= ((nk_uint)in.b << 16);
270 out |= ((nk_uint)in.a << 24);
271 return out;
272}
273NK_API void
274nk_color_f(float *r, float *g, float *b, float *a, struct nk_color in)
275{
276 NK_STORAGE const float s = 1.0f/255.0f;
277 *r = (float)in.r * s;
278 *g = (float)in.g * s;
279 *b = (float)in.b * s;
280 *a = (float)in.a * s;
281}
282NK_API void
283nk_color_fv(float *c, struct nk_color in)
284{
285 nk_color_f(&c[0], &c[1], &c[2], &c[3], in);
286}
287NK_API struct nk_colorf
288nk_color_cf(struct nk_color in)
289{
290 struct nk_colorf o;
291 nk_color_f(&o.r, &o.g, &o.b, &o.a, in);
292 return o;
293}
294NK_API void
295nk_color_d(double *r, double *g, double *b, double *a, struct nk_color in)
296{
297 NK_STORAGE const double s = 1.0/255.0;
298 *r = (double)in.r * s;
299 *g = (double)in.g * s;
300 *b = (double)in.b * s;
301 *a = (double)in.a * s;
302}
303NK_API void
304nk_color_dv(double *c, struct nk_color in)
305{
306 nk_color_d(&c[0], &c[1], &c[2], &c[3], in);
307}
308NK_API void
309nk_color_hsv_f(float *out_h, float *out_s, float *out_v, struct nk_color in)
310{
311 float a;
312 nk_color_hsva_f(out_h, out_s, out_v, &a, in);
313}
314NK_API void
315nk_color_hsv_fv(float *out, struct nk_color in)
316{
317 float a;
318 nk_color_hsva_f(&out[0], &out[1], &out[2], &a, in);
319}
320NK_API void
321nk_colorf_hsva_f(float *out_h, float *out_s,
322 float *out_v, float *out_a, struct nk_colorf in)
323{
324 float chroma;
325 float K = 0.0f;
326 if (in.g < in.b) {
327 const float t = in.g; in.g = in.b; in.b = t;
328 K = -1.f;
329 }
330 if (in.r < in.g) {
331 const float t = in.r; in.r = in.g; in.g = t;
332 K = -2.f/6.0f - K;
333 }
334 chroma = in.r - ((in.g < in.b) ? in.g: in.b);
335 *out_h = NK_ABS(K + (in.g - in.b)/(6.0f * chroma + 1e-20f));
336 *out_s = chroma / (in.r + 1e-20f);
337 *out_v = in.r;
338 *out_a = in.a;
339
340}
341NK_API void
342nk_colorf_hsva_fv(float *hsva, struct nk_colorf in)
343{
344 nk_colorf_hsva_f(&hsva[0], &hsva[1], &hsva[2], &hsva[3], in);
345}
346NK_API void
347nk_color_hsva_f(float *out_h, float *out_s,
348 float *out_v, float *out_a, struct nk_color in)
349{
350 struct nk_colorf col;
351 nk_color_f(&col.r,&col.g,&col.b,&col.a, in);
352 nk_colorf_hsva_f(out_h, out_s, out_v, out_a, col);
353}
354NK_API void
355nk_color_hsva_fv(float *out, struct nk_color in)
356{
357 nk_color_hsva_f(&out[0], &out[1], &out[2], &out[3], in);
358}
359NK_API void
360nk_color_hsva_i(int *out_h, int *out_s, int *out_v,
361 int *out_a, struct nk_color in)
362{
363 float h,s,v,a;
364 nk_color_hsva_f(&h, &s, &v, &a, in);
365 *out_h = (nk_byte)(h * 255.0f);
366 *out_s = (nk_byte)(s * 255.0f);
367 *out_v = (nk_byte)(v * 255.0f);
368 *out_a = (nk_byte)(a * 255.0f);
369}
370NK_API void
371nk_color_hsva_iv(int *out, struct nk_color in)
372{
373 nk_color_hsva_i(&out[0], &out[1], &out[2], &out[3], in);
374}
375NK_API void
376nk_color_hsva_bv(nk_byte *out, struct nk_color in)
377{
378 int tmp[4];
379 nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in);
380 out[0] = (nk_byte)tmp[0];
381 out[1] = (nk_byte)tmp[1];
382 out[2] = (nk_byte)tmp[2];
383 out[3] = (nk_byte)tmp[3];
384}
385NK_API void
386nk_color_hsva_b(nk_byte *h, nk_byte *s, nk_byte *v, nk_byte *a, struct nk_color in)
387{
388 int tmp[4];
389 nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in);
390 *h = (nk_byte)tmp[0];
391 *s = (nk_byte)tmp[1];
392 *v = (nk_byte)tmp[2];
393 *a = (nk_byte)tmp[3];
394}
395NK_API void
396nk_color_hsv_i(int *out_h, int *out_s, int *out_v, struct nk_color in)
397{
398 int a;
399 nk_color_hsva_i(out_h, out_s, out_v, &a, in);
400}
401NK_API void
402nk_color_hsv_b(nk_byte *out_h, nk_byte *out_s, nk_byte *out_v, struct nk_color in)
403{
404 int tmp[4];
405 nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in);
406 *out_h = (nk_byte)tmp[0];
407 *out_s = (nk_byte)tmp[1];
408 *out_v = (nk_byte)tmp[2];
409}
410NK_API void
411nk_color_hsv_iv(int *out, struct nk_color in)
412{
413 nk_color_hsv_i(&out[0], &out[1], &out[2], in);
414}
415NK_API void
416nk_color_hsv_bv(nk_byte *out, struct nk_color in)
417{
418 int tmp[4];
419 nk_color_hsv_i(&tmp[0], &tmp[1], &tmp[2], in);
420 out[0] = (nk_byte)tmp[0];
421 out[1] = (nk_byte)tmp[1];
422 out[2] = (nk_byte)tmp[2];
423}
main API and documentation file