From c51d0694aca6cf6da982e9c5162ef863a5f7c7aa Mon Sep 17 00:00:00 2001 From: vurtun Date: Fri, 6 May 2016 10:55:11 +0200 Subject: [PATCH] Removed possible dead table memory bug for windows Tables inside windows get removed if a windows is not longer in use inside `nk_free_window`. But I noticed that they are only removed if they were not used the last frame, because of a copy & paste bug. I removed the additional check and every table should now rightfully be marked as free. I don't know if this bug actually caused any problems, since I checked memory consumption and there were no symptoms of wrong behavior before. --- nuklear.h | 46 ++++++++++++++++++---------------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/nuklear.h b/nuklear.h index 395109e..a1788b6 100644 --- a/nuklear.h +++ b/nuklear.h @@ -1335,7 +1335,7 @@ NK_API struct nk_font* nk_font_atlas_add_compressed_base85(struct nk_font_atlas* const char *data, float height, const struct nk_font_config *config); NK_API const void* nk_font_atlas_bake(struct nk_font_atlas*, int *width, int *height, - enum nk_font_atlas_format); + enum nk_font_atlas_format); NK_API void nk_font_atlas_end(struct nk_font_atlas*, nk_handle tex, struct nk_draw_null_texture*); NK_API void nk_font_atlas_clear(struct nk_font_atlas*); @@ -14805,12 +14805,10 @@ nk_free_window(struct nk_context *ctx, struct nk_window *win) while (it) { /*free window state tables */ n = it->next; - if (it->seq != ctx->seq) { - nk_remove_table(win, it); - nk_free_table(ctx, it); - if (it == win->tables) - win->tables = n; - } + nk_remove_table(win, it); + nk_free_table(ctx, it); + if (it == win->tables) + win->tables = n; it = n; } @@ -17842,7 +17840,6 @@ nk_color_picker(struct nk_context *ctx, struct nk_color color, NK_API int nk_chart_begin(struct nk_context *ctx, const enum nk_chart_type type, int count, float min_value, float max_value) - { struct nk_window *win; struct nk_chart *chart; @@ -17876,17 +17873,14 @@ nk_chart_begin(struct nk_context *ctx, const enum nk_chart_type type, chart->h = bounds.h - 2 * style->padding.y; chart->w = NK_MAX(chart->w, 2 * style->padding.x); chart->h = NK_MAX(chart->h, 2 * style->padding.y); - nk_zero(&chart->slots[0], sizeof(chart->slots[0]) * NK_CHART_MAX_SLOT); - chart->slot = 0; /* add first slot into chart */ - {struct nk_chart_slot *slot = &chart->slots[chart->slot]; + {struct nk_chart_slot *slot = &chart->slots[chart->slot++]; slot->type = type; slot->count = count; slot->min = NK_MIN(min_value, max_value); slot->max = NK_MAX(min_value, max_value); - slot->range = slot->max - slot->min; - chart->slot++;} + slot->range = slot->max - slot->min;} /* draw chart background */ background = &style->background; @@ -17913,13 +17907,12 @@ nk_chart_add_slot(struct nk_context *ctx, const enum nk_chart_type type, /* add another slot into the graph */ {struct nk_chart *chart = &ctx->current->layout->chart; - struct nk_chart_slot *slot = &chart->slots[chart->slot]; + struct nk_chart_slot *slot = &chart->slots[chart->slot++]; slot->type = type; slot->count = count; slot->min = NK_MIN(min_value, max_value); slot->max = NK_MAX(min_value, max_value); - slot->range = slot->max - slot->min; - chart->slot++;} + slot->range = slot->max - slot->min;} } NK_INTERN nk_flags @@ -18019,7 +18012,7 @@ nk_chart_push_column(const struct nk_context *ctx, struct nk_window *win, item.w = (chart->w - padding) / (float)(chart->slots[slot].count); } - /* calculate bounds of the current bar chart entry */ + /* calculate bounds of current bar chart entry */ style = &ctx->style.chart; color = style->color; item.h = chart->h * NK_ABS((value/chart->slots[slot].range)); @@ -18055,9 +18048,9 @@ nk_chart_push_slot(struct nk_context *ctx, float value, int slot) NK_ASSERT(ctx); NK_ASSERT(ctx->current); NK_ASSERT(slot >= 0 && slot < NK_CHART_MAX_SLOT); - NK_ASSERT (ctx->current->layout->chart.slot > slot); - if (!ctx || !ctx->current || slot >= NK_CHART_MAX_SLOT) - return nk_false; + NK_ASSERT(slot < ctx->current->layout->chart.slot); + if (!ctx || !ctx->current || slot >= NK_CHART_MAX_SLOT) return nk_false; + if (slot >= ctx->current->layout->chart.slot) return nk_false; win = ctx->current; if (win->layout->chart.slot < slot) return nk_false; @@ -18091,11 +18084,7 @@ nk_chart_end(struct nk_context *ctx) win = ctx->current; chart = &win->layout->chart; - nk_zero(&chart->slots[0], sizeof(chart->slots[0]) * NK_CHART_MAX_SLOT); - chart->x = 0; - chart->y = 0; - chart->w = 0; - chart->h = 0; + memset(chart, 0, sizeof(*chart)); return; } @@ -18137,8 +18126,9 @@ nk_plot_function(struct nk_context *ctx, enum nk_chart_type type, void *userdata max_value = min_value = value_getter(userdata, offset); for (i = 0; i < count; ++i) { - min_value = NK_MIN(value_getter(userdata, i + offset), min_value); - max_value = NK_MAX(value_getter(userdata, i + offset), max_value); + float value = value_getter(userdata, i + offset); + min_value = NK_MIN(value, min_value); + max_value = NK_MAX(value, max_value); } nk_chart_begin(ctx, type, count, min_value, max_value); for (i = 0; i < count; ++i) @@ -18474,7 +18464,7 @@ nk_tooltip_begin(struct nk_context *ctx, struct nk_panel *layout, float width) bounds.y = (in->mouse.pos.y + 1) - win->layout->clip.y; ret = nk_popup_begin(ctx, layout, NK_POPUP_DYNAMIC, - "__##Tooltip##__", NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_TOOLTIP, bounds); + "__##Tooltip##__", NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_TOOLTIP|NK_WINDOW_BORDER, bounds); if (ret) win->layout->flags &= ~(nk_flags)NK_WINDOW_ROM; return ret; }