diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 12f974c..7aafc5a 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -11,6 +11,12 @@ Changes: -------- +- 2017/01/05 (3.00.0) - BREAKING CHANGE: The previous color picker API was broken + because of conversions between float and byte color representation. + Color pickers now use floating point values to represent + HSV values. To get back the old behavior I added some additional + color conversion functions to cast between nk_color and + nk_colorf. - 2017/12/23 (2.00.7) - Fixed small warning - 2017/12/23 (2.00.7) - Fixed nk_edit_buffer behavior if activated to allow input - 2017/12/23 (2.00.7) - Fixed modifyable progressbar dragging visuals and input behavior diff --git a/demo/overview.c b/demo/overview.c index 9d5353a..3c3f381 100644 --- a/demo/overview.c +++ b/demo/overview.c @@ -319,7 +319,7 @@ overview(struct nk_context *ctx) static int check_values[5]; static float position[3]; static struct nk_color combo_color = {130, 50, 50, 255}; - static struct nk_color combo_color2 = {130, 180, 50, 255}; + static struct nk_colorf combo_color2 = {0.509f, 0.705f, 0.2f, 1.0f}; static size_t prog_a = 20, prog_b = 40, prog_c = 10, prog_d = 90; static const char *weapons[] = {"Fist","Pistol","Shotgun","Plasma","BFG"}; @@ -344,9 +344,8 @@ overview(struct nk_context *ctx) combo_color.a = (nk_byte)nk_slide_int(ctx, 0, combo_color.a , 255, 5); nk_combo_end(ctx); } - /* complex color combobox */ - if (nk_combo_begin_color(ctx, combo_color2, nk_vec2(200,400))) { + if (nk_combo_begin_color(ctx, nk_rgb_cf(combo_color2), nk_vec2(200,400))) { enum color_mode {COL_RGB, COL_HSV}; static int col_mode = COL_RGB; #ifndef DEMO_DO_NOT_USE_COLOR_PICKER @@ -360,22 +359,21 @@ overview(struct nk_context *ctx) nk_layout_row_dynamic(ctx, 25, 1); if (col_mode == COL_RGB) { - combo_color2.r = (nk_byte)nk_propertyi(ctx, "#R:", 0, combo_color2.r, 255, 1,1); - combo_color2.g = (nk_byte)nk_propertyi(ctx, "#G:", 0, combo_color2.g, 255, 1,1); - combo_color2.b = (nk_byte)nk_propertyi(ctx, "#B:", 0, combo_color2.b, 255, 1,1); - combo_color2.a = (nk_byte)nk_propertyi(ctx, "#A:", 0, combo_color2.a, 255, 1,1); + combo_color2.r = nk_propertyf(ctx, "#R:", 0, combo_color2.r, 1.0f, 0.01f,0.005f); + combo_color2.g = nk_propertyf(ctx, "#G:", 0, combo_color2.g, 1.0f, 0.01f,0.005f); + combo_color2.b = nk_propertyf(ctx, "#B:", 0, combo_color2.b, 1.0f, 0.01f,0.005f); + combo_color2.a = nk_propertyf(ctx, "#A:", 0, combo_color2.a, 1.0f, 0.01f,0.005f); } else { - nk_byte tmp[4]; - nk_color_hsva_bv(tmp, combo_color2); - tmp[0] = (nk_byte)nk_propertyi(ctx, "#H:", 0, tmp[0], 255, 1,1); - tmp[1] = (nk_byte)nk_propertyi(ctx, "#S:", 0, tmp[1], 255, 1,1); - tmp[2] = (nk_byte)nk_propertyi(ctx, "#V:", 0, tmp[2], 255, 1,1); - tmp[3] = (nk_byte)nk_propertyi(ctx, "#A:", 0, tmp[3], 255, 1,1); - combo_color2 = nk_hsva_bv(tmp); + float hsva[4]; + nk_colorf_hsva_fv(hsva, combo_color2); + hsva[0] = nk_propertyf(ctx, "#H:", 0, hsva[0], 1.0f, 0.01f,0.05f); + hsva[1] = nk_propertyf(ctx, "#S:", 0, hsva[1], 1.0f, 0.01f,0.05f); + hsva[2] = nk_propertyf(ctx, "#V:", 0, hsva[2], 1.0f, 0.01f,0.05f); + hsva[3] = nk_propertyf(ctx, "#A:", 0, hsva[3], 1.0f, 0.01f,0.05f); + combo_color2 = nk_hsva_colorfv(hsva); } nk_combo_end(ctx); } - /* progressbar combobox */ sum = prog_a + prog_b + prog_c + prog_d; sprintf(buffer, "%lu", sum); @@ -459,7 +457,9 @@ overview(struct nk_context *ctx) if (nk_combo_begin_label(ctx, buffer, nk_vec2(350,400))) { int i = 0; - const char *month[] = {"January", "February", "March", "Apil", "May", "June", "July", "August", "September", "Ocotober", "November", "December"}; + const char *month[] = {"January", "February", "March", + "April", "May", "June", "July", "August", "September", + "October", "November", "December"}; const char *week_days[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; const int month_days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; int year = sel_date.tm_year+1900; diff --git a/nuklear.h b/nuklear.h index 38d32e7..34aabc9 100644 --- a/nuklear.h +++ b/nuklear.h @@ -1,5 +1,5 @@ /* - Nuklear - 2.00.7 - public domain + Nuklear - 3.00.0 - public domain no warranty implied; use at your own risk. authored from 2015-2017 by Micha Mettke @@ -2130,8 +2130,8 @@ NK_API nk_size nk_prog(struct nk_context*, nk_size cur, nk_size max, int modifya * COLOR PICKER * * ============================================================================= */ -NK_API struct nk_color nk_color_picker(struct nk_context*, struct nk_color, enum nk_color_format); -NK_API int nk_color_pick(struct nk_context*, struct nk_color*, enum nk_color_format); +NK_API struct nk_colorf nk_color_picker(struct nk_context*, struct nk_colorf, enum nk_color_format); +NK_API int nk_color_pick(struct nk_context*, struct nk_colorf*, enum nk_color_format); /* ============================================================================= * * PROPERTIES @@ -2365,6 +2365,7 @@ NK_API struct nk_color nk_rgb_iv(const int *rgb); NK_API struct nk_color nk_rgb_bv(const nk_byte* rgb); NK_API struct nk_color nk_rgb_f(float r, float g, float b); NK_API struct nk_color nk_rgb_fv(const float *rgb); +NK_API struct nk_color nk_rgb_cf(struct nk_colorf c); NK_API struct nk_color nk_rgb_hex(const char *rgb); NK_API struct nk_color nk_rgba(int r, int g, int b, int a); @@ -2373,8 +2374,14 @@ NK_API struct nk_color nk_rgba_iv(const int *rgba); NK_API struct nk_color nk_rgba_bv(const nk_byte *rgba); NK_API struct nk_color nk_rgba_f(float r, float g, float b, float a); NK_API struct nk_color nk_rgba_fv(const float *rgba); +NK_API struct nk_color nk_rgba_cf(struct nk_colorf c); NK_API struct nk_color nk_rgba_hex(const char *rgb); +NK_API struct nk_colorf nk_hsva_colorf(float h, float s, float v, float a); +NK_API struct nk_colorf nk_hsva_colorfv(float *c); +NK_API void nk_colorf_hsva_f(float *out_h, float *out_s, float *out_v, float *out_a, struct nk_colorf in); +NK_API void nk_colorf_hsva_fv(float *hsva, struct nk_colorf in); + NK_API struct nk_color nk_hsv(int h, int s, int v); NK_API struct nk_color nk_hsv_iv(const int *hsv); NK_API struct nk_color nk_hsv_bv(const nk_byte *hsv); @@ -2390,6 +2397,7 @@ NK_API struct nk_color nk_hsva_fv(const float *hsva); /* color (conversion nuklear --> user) */ NK_API void nk_color_f(float *r, float *g, float *b, float *a, struct nk_color); NK_API void nk_color_fv(float *rgba_out, struct nk_color); +NK_API struct nk_colorf nk_color_cf(struct nk_color); NK_API void nk_color_d(double *r, double *g, double *b, double *a, struct nk_color); NK_API void nk_color_dv(double *rgba_out, struct nk_color); @@ -5958,6 +5966,12 @@ nk_rgba_fv(const float *c) return nk_rgba_f(c[0], c[1], c[2], c[3]); } +NK_API struct nk_color +nk_rgba_cf(struct nk_colorf c) +{ + return nk_rgba_f(c.r, c.g, c.b, c.a); +} + NK_API struct nk_color nk_rgb_f(float r, float g, float b) { @@ -5975,6 +5989,12 @@ nk_rgb_fv(const float *c) return nk_rgb_f(c[0], c[1], c[2]); } +NK_API struct nk_color +nk_rgb_cf(struct nk_colorf c) +{ + return nk_rgb_f(c.r, c.g, c.b); +} + NK_API struct nk_color nk_hsv(int h, int s, int v) { @@ -6027,18 +6047,16 @@ nk_hsva_bv(const nk_byte *c) return nk_hsva(c[0], c[1], c[2], c[3]); } -NK_API struct nk_color -nk_hsva_f(float h, float s, float v, float a) +NK_API struct nk_colorf +nk_hsva_colorf(float h, float s, float v, float a) { - struct nk_colorf out = {0,0,0,0}; - float p, q, t, f; int i; - + float p, q, t, f; + struct nk_colorf out = {0,0,0,0}; if (s <= 0.0f) { - out.r = v; out.g = v; out.b = v; - return nk_rgb_f(out.r, out.g, out.b); + out.r = v; out.g = v; out.b = v; out.a = a; + return out; } - h = h / (60.0f/360.0f); i = (int)h; f = h - (float)i; @@ -6052,9 +6070,22 @@ nk_hsva_f(float h, float s, float v, float a) case 2: out.r = p; out.g = v; out.b = t; break; case 3: out.r = p; out.g = q; out.b = v; break; case 4: out.r = t; out.g = p; out.b = v; break; - case 5: out.r = v; out.g = p; out.b = q; break; - } - return nk_rgba_f(out.r, out.g, out.b, a); + case 5: out.r = v; out.g = p; out.b = q; break;} + out.a = a; + return out; +} + +NK_API struct nk_colorf +nk_hsva_colorfv(float *c) +{ + return nk_hsva_colorf(c[0], c[1], c[2], c[3]); +} + +NK_API struct nk_color +nk_hsva_f(float h, float s, float v, float a) +{ + struct nk_colorf c = nk_hsva_colorf(h, s, v, a); + return nk_rgba_f(c.r, c.g, c.b, c.a); } NK_API struct nk_color @@ -6089,6 +6120,14 @@ nk_color_fv(float *c, struct nk_color in) nk_color_f(&c[0], &c[1], &c[2], &c[3], in); } +NK_API struct nk_colorf +nk_color_cf(struct nk_color in) +{ + struct nk_colorf o; + nk_color_f(&o.r, &o.g, &o.b, &o.a, in); + return o; +} + NK_API void nk_color_d(double *r, double *g, double *b, double *a, struct nk_color in) { @@ -6120,27 +6159,39 @@ nk_color_hsv_fv(float *out, struct nk_color in) } NK_API void -nk_color_hsva_f(float *out_h, float *out_s, - float *out_v, float *out_a, struct nk_color in) +nk_colorf_hsva_f(float *out_h, float *out_s, + float *out_v, float *out_a, struct nk_colorf in) { float chroma; float K = 0.0f; - float r,g,b,a; - - nk_color_f(&r,&g,&b,&a, in); - if (g < b) { - const float t = g; g = b; b = t; + if (in.g < in.b) { + const float t = in.g; in.g = in.b; in.b = t; K = -1.f; } - if (r < g) { - const float t = r; r = g; g = t; + if (in.r < in.g) { + const float t = in.r; in.r = in.g; in.g = t; K = -2.f/6.0f - K; } - chroma = r - ((g < b) ? g: b); - *out_h = NK_ABS(K + (g - b)/(6.0f * chroma + 1e-20f)); - *out_s = chroma / (r + 1e-20f); - *out_v = r; + chroma = in.r - ((in.g < in.b) ? in.g: in.b); + *out_h = NK_ABS(K + (in.g - in.b)/(6.0f * chroma + 1e-20f)); + *out_s = chroma / (in.r + 1e-20f); + *out_v = in.r; *out_a = (float)in.a / 255.0f; + +} + +NK_API void +nk_colorf_hsva_fv(float *hsva, struct nk_colorf in) +{ + nk_colorf_hsva_f(&hsva[0], &hsva[1], &hsva[2], &hsva[3], in); +} +NK_API void +nk_color_hsva_f(float *out_h, float *out_s, + float *out_v, float *out_a, struct nk_color in) +{ + struct nk_colorf col; + nk_color_f(&col.r,&col.g,&col.b,&col.a, in); + nk_colorf_hsva_f(out_h, out_s, out_v, out_a, col); } NK_API void @@ -16447,7 +16498,7 @@ NK_INTERN int nk_color_picker_behavior(nk_flags *state, const struct nk_rect *bounds, const struct nk_rect *matrix, const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar, - struct nk_color *color, const struct nk_input *in) + struct nk_colorf *color, const struct nk_input *in) { float hsva[4]; int value_changed = 0; @@ -16459,19 +16510,17 @@ nk_color_picker_behavior(nk_flags *state, NK_ASSERT(color); /* color matrix */ - nk_color_hsva_fv(hsva, *color); + nk_colorf_hsva_fv(hsva, *color); if (nk_button_behavior(state, *matrix, in, NK_BUTTON_REPEATER)) { hsva[1] = NK_SATURATE((in->mouse.pos.x - matrix->x) / (matrix->w-1)); hsva[2] = 1.0f - NK_SATURATE((in->mouse.pos.y - matrix->y) / (matrix->h-1)); value_changed = hsv_changed = 1; } - /* hue bar */ if (nk_button_behavior(state, *hue_bar, in, NK_BUTTON_REPEATER)) { hsva[0] = NK_SATURATE((in->mouse.pos.y - hue_bar->y) / (hue_bar->h-1)); value_changed = hsv_changed = 1; } - /* alpha bar */ if (alpha_bar) { if (nk_button_behavior(state, *alpha_bar, in, NK_BUTTON_REPEATER)) { @@ -16481,14 +16530,13 @@ nk_color_picker_behavior(nk_flags *state, } nk_widget_state_reset(state); if (hsv_changed) { - *color = nk_hsva_fv(hsva); + *color = nk_hsva_colorfv(hsva); *state = NK_WIDGET_STATE_ACTIVE; } if (value_changed) { - color->a = (nk_byte)(hsva[3] * 255.0f); + color->a = hsva[3]; *state = NK_WIDGET_STATE_ACTIVE; } - /* set color picker widget state */ if (nk_input_is_mouse_hovering_rect(in, *bounds)) *state = NK_WIDGET_STATE_HOVERED; @@ -16502,7 +16550,7 @@ nk_color_picker_behavior(nk_flags *state, NK_INTERN void nk_draw_color_picker(struct nk_command_buffer *o, const struct nk_rect *matrix, const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar, - struct nk_color color) + struct nk_colorf col) { NK_STORAGE const struct nk_color black = {0,0,0,255}; NK_STORAGE const struct nk_color white = {255, 255, 255, 255}; @@ -16519,16 +16567,11 @@ nk_draw_color_picker(struct nk_command_buffer *o, const struct nk_rect *matrix, NK_ASSERT(hue_bar); /* draw hue bar */ - nk_color_hsv_fv(hsva, color); + nk_colorf_hsva_fv(hsva, col); for (i = 0; i < 6; ++i) { NK_GLOBAL const struct nk_color hue_colors[] = { - {255, 0, 0, 255}, - {255,255,0,255}, - {0,255,0,255}, - {0, 255,255,255}, - {0,0,255,255}, - {255, 0, 255, 255}, - {255, 0, 0, 255} + {255, 0, 0, 255}, {255,255,0,255}, {0,255,0,255}, {0, 255,255,255}, + {0,0,255,255}, {255, 0, 255, 255}, {255, 0, 0, 255} }; nk_fill_rect_multi_color(o, nk_rect(hue_bar->x, hue_bar->y + (float)i * (hue_bar->h/6.0f) + 0.5f, @@ -16541,7 +16584,7 @@ nk_draw_color_picker(struct nk_command_buffer *o, const struct nk_rect *matrix, /* draw alpha bar */ if (alpha_bar) { - float alpha = NK_SATURATE((float)color.a/255.0f); + float alpha = NK_SATURATE(col.a); line_y = (float)(int)(alpha_bar->y + (1.0f - alpha) * matrix->h + 0.5f); nk_fill_rect_multi_color(o, *alpha_bar, white, white, black, black); @@ -16566,7 +16609,7 @@ nk_draw_color_picker(struct nk_command_buffer *o, const struct nk_rect *matrix, NK_INTERN int nk_do_color_picker(nk_flags *state, - struct nk_command_buffer *out, struct nk_color *color, + struct nk_command_buffer *out, struct nk_colorf *col, enum nk_color_format fmt, struct nk_rect bounds, struct nk_vec2 padding, const struct nk_input *in, const struct nk_user_font *font) @@ -16578,10 +16621,10 @@ nk_do_color_picker(nk_flags *state, float bar_w; NK_ASSERT(out); - NK_ASSERT(color); + NK_ASSERT(col); NK_ASSERT(state); NK_ASSERT(font); - if (!out || !color || !state || !font) + if (!out || !col || !state || !font) return ret; bar_w = font->height; @@ -16606,8 +16649,8 @@ nk_do_color_picker(nk_flags *state, alpha_bar.h = matrix.h; ret = nk_color_picker_behavior(state, &bounds, &matrix, &hue_bar, - (fmt == NK_RGBA) ? &alpha_bar:0, color, in); - nk_draw_color_picker(out, &matrix, &hue_bar, (fmt == NK_RGBA) ? &alpha_bar:0, *color); + (fmt == NK_RGBA) ? &alpha_bar:0, col, in); + nk_draw_color_picker(out, &matrix, &hue_bar, (fmt == NK_RGBA) ? &alpha_bar:0, *col); return ret; } @@ -21792,7 +21835,7 @@ nk_propertyd(struct nk_context *ctx, const char *name, double min, * * --------------------------------------------------------------*/ NK_API int -nk_color_pick(struct nk_context * ctx, struct nk_color *color, +nk_color_pick(struct nk_context * ctx, struct nk_colorf *color, enum nk_color_format fmt) { struct nk_window *win; @@ -21820,8 +21863,8 @@ nk_color_pick(struct nk_context * ctx, struct nk_color *color, nk_vec2(0,0), in, config->font); } -NK_API struct nk_color -nk_color_picker(struct nk_context *ctx, struct nk_color color, +NK_API struct nk_colorf +nk_color_picker(struct nk_context *ctx, struct nk_colorf color, enum nk_color_format fmt) { nk_color_pick(ctx, &color, fmt);