Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenlib/intern/math_color.c
| Context not available. | |||||
| void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b) | void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b) | ||||
| { | { | ||||
| if (s != 0.0f) { | float nr, ng, nb; | ||||
| float i, f, p; | |||||
| h = (h - floorf(h)) * 6.0f; | |||||
| i = floorf(h); | |||||
| f = h - i; | |||||
| /* avoid computing q/t when not needed */ | |||||
| p = (v * (1.0f - s)); | |||||
| #define q (v * (1.0f - (s * f))) | |||||
| #define t (v * (1.0f - (s * (1.0f - f)))) | |||||
| /* faster to compare floats then int conversion */ | |||||
| if (i < 1.0f) { | |||||
| *r = v; | |||||
| *g = t; | |||||
| *b = p; | |||||
| } | |||||
| else if (i < 2.0f) { | |||||
| *r = q; | |||||
| *g = v; | |||||
| *b = p; | |||||
| } | |||||
| else if (i < 3.0f) { | |||||
| *r = p; | |||||
| *g = v; | |||||
| *b = t; | |||||
| } | |||||
| else if (i < 4.0f) { | |||||
| *r = p; | |||||
| *g = q; | |||||
| *b = v; | |||||
| } | |||||
| else if (i < 5.0f) { | |||||
| *r = t; | |||||
| *g = p; | |||||
| *b = v; | |||||
| } | |||||
| else { | |||||
| *r = v; | |||||
| *g = p; | |||||
| *b = q; | |||||
| } | |||||
| #undef q | nr = fabsf(h * 6.0f - 3.0f) - 1.0f; | ||||
| #undef t | ng = 2.0f - fabsf(h * 6.0f - 2.0f); | ||||
| nb = 2.0f - fabsf(h * 6.0f - 4.0f); | |||||
| } | CLAMP(nr, 0.0f, 1.0f); | ||||
| else { | CLAMP(nb, 0.0f, 1.0f); | ||||
| *r = v; | CLAMP(ng, 0.0f, 1.0f); | ||||
| *g = v; | |||||
| *b = v; | *r = ((nr - 1.0f) * s + 1.0f) * v; | ||||
| } | *g = ((ng - 1.0f) * s + 1.0f) * v; | ||||
| *b = ((nb - 1.0f) * s + 1.0f) * v; | |||||
| } | } | ||||
| /* HSL to rgb conversion from https://en.wikipedia.org/wiki/HSL_and_HSV */ | |||||
| void hsl_to_rgb(float h, float s, float l, float *r, float *g, float *b) | void hsl_to_rgb(float h, float s, float l, float *r, float *g, float *b) | ||||
| { | { | ||||
| float i, f, c; | float nr, ng, nb, chroma; | ||||
campbellbarton: *picky*, prefer all lowercase names, also C is used for context. | |||||
| h = (h - floorf(h)) * 6.0f; | |||||
| c = (l > 0.5f) ? (2.0f * (1.0f - l) * s) : (2.0f * l * s); | |||||
| i = floorf(h); | |||||
| f = h - i; | |||||
| #define x2 (c * f) | nr = fabsf(h * 6.0f - 3.0f) - 1.0f; | ||||
| #define x1 (c * (1.0f - f)) | ng = 2.0f - fabsf(h * 6.0f - 2.0f); | ||||
| nb = 2.0f - fabsf(h * 6.0f - 4.0f); | |||||
Not Done Inline Actionsshould use fabsf campbellbarton: should use `fabsf` | |||||
| /* faster to compare floats then int conversion */ | CLAMP(nr, 0.0f, 1.0f); | ||||
| if (i < 1.0f) { | CLAMP(nb, 0.0f, 1.0f); | ||||
| *r = c; | CLAMP(ng, 0.0f, 1.0f); | ||||
| *g = x2; | |||||
| *b = 0; | |||||
| } | |||||
| else if (i < 2.0f) { | |||||
| *r = x1; | |||||
| *g = c; | |||||
| *b = 0; | |||||
| } | |||||
| else if (i < 3.0f) { | |||||
| *r = 0; | |||||
| *g = c; | |||||
| *b = x2; | |||||
| } | |||||
| else if (i < 4.0f) { | |||||
| *r = 0; | |||||
| *g = x1; | |||||
| *b = c; | |||||
| } | |||||
| else if (i < 5.0f) { | |||||
| *r = x2; | |||||
| *g = 0; | |||||
| *b = c; | |||||
| } | |||||
| else { | |||||
| *r = c; | |||||
| *g = 0; | |||||
| *b = x1; | |||||
| } | |||||
| #undef x1 | chroma = (1.0f - fabsf(2.0f * l - 1.0f)) * s; | ||||
| #undef x2 | |||||
| f = l - 0.5f * c; | *r = (nr - 0.5f) * chroma + l; | ||||
| *r += f; | *g = (ng - 0.5f) * chroma + l; | ||||
| *g += f; | *b = (nb - 0.5f) * chroma + l; | ||||
| *b += f; | |||||
| } | } | ||||
| /* convenience function for now */ | /* convenience function for now */ | ||||
| Context not available. | |||||
| void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv) | void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv) | ||||
| { | { | ||||
| float h, s, v; | float k = 0.0f; | ||||
| float cmax, cmin; | float chroma; | ||||
| cmax = r; | if (g < b) { | ||||
| cmin = r; | SWAP(float, g, b); | ||||
| cmax = (g > cmax ? g : cmax); | k = -1.0f; | ||||
| cmin = (g < cmin ? g : cmin); | |||||
| cmax = (b > cmax ? b : cmax); | |||||
| cmin = (b < cmin ? b : cmin); | |||||
| v = cmax; /* value */ | |||||
| if (cmax != 0.0f) { | |||||
| float cdelta; | |||||
| cdelta = cmax - cmin; | |||||
| s = cdelta / cmax; | |||||
| if (s != 0.0f) { | |||||
| float rc, gc, bc; | |||||
| rc = (cmax - r) / cdelta; | |||||
| gc = (cmax - g) / cdelta; | |||||
| bc = (cmax - b) / cdelta; | |||||
| if (r == cmax) { | |||||
| h = bc - gc; | |||||
| if (h < 0.0f) { | |||||
| h += 6.0f; | |||||
| } | |||||
| } | |||||
| else if (g == cmax) { | |||||
| h = 2.0f + rc - bc; | |||||
| } | |||||
| else { | |||||
| h = 4.0f + gc - rc; | |||||
| } | |||||
| h *= (1.0f / 6.0f); | |||||
| } | |||||
| else { | |||||
| h = 0.0f; | |||||
| } | |||||
| } | } | ||||
| else { | if (r < g) { | ||||
| h = 0.0f; | SWAP(float, r, g); | ||||
| s = 0.0f; | k = -2.0f * 6e-1f - k; | ||||
| } | } | ||||
| *lh = h; | chroma = r - min_ff(g, b); | ||||
| *ls = s; | |||||
| *lv = v; | *lh = fabsf(k + (g - b) / (6.0f * chroma + 1e-20f)); | ||||
| *ls = chroma / (r + 1e-20f); | |||||
| *lv = r; | |||||
| } | } | ||||
| /* convenience function for now */ | /* convenience function for now */ | ||||
| Context not available. | |||||
*picky*, prefer all lowercase names, also C is used for context.