Blame src-nuklear/nuklear_page_element.c

Ivan Mahonin b53a5c
#include "nuklear.h"
Ivan Mahonin b53a5c
#include "nuklear_internal.h"
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
/* ===============================================================
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 *                          PAGE ELEMENT
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 * ===============================================================*/
Ivan Mahonin b53a5c
NK_LIB struct nk_page_element*
Ivan Mahonin b53a5c
nk_create_page_element(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_page_element *elem;
Ivan Mahonin b53a5c
    if (ctx->freelist) {
Ivan Mahonin b53a5c
        /* unlink page element from free list */
Ivan Mahonin b53a5c
        elem = ctx->freelist;
Ivan Mahonin b53a5c
        ctx->freelist = elem->next;
Ivan Mahonin b53a5c
    } else if (ctx->use_pool) {
Ivan Mahonin b53a5c
        /* allocate page element from memory pool */
Ivan Mahonin b53a5c
        elem = nk_pool_alloc(&ctx->pool);
Ivan Mahonin b53a5c
        NK_ASSERT(elem);
Ivan Mahonin b53a5c
        if (!elem) return 0;
Ivan Mahonin b53a5c
    } else {
Ivan Mahonin b53a5c
        /* allocate new page element from back of fixed size memory buffer */
Ivan Mahonin b53a5c
        NK_STORAGE const nk_size size = sizeof(struct nk_page_element);
Ivan Mahonin b53a5c
        NK_STORAGE const nk_size align = NK_ALIGNOF(struct nk_page_element);
Ivan Mahonin b53a5c
        elem = (struct nk_page_element*)nk_buffer_alloc(&ctx->memory, NK_BUFFER_BACK, size, align);
Ivan Mahonin b53a5c
        NK_ASSERT(elem);
Ivan Mahonin b53a5c
        if (!elem) return 0;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    nk_zero_struct(*elem);
Ivan Mahonin b53a5c
    elem->next = 0;
Ivan Mahonin b53a5c
    elem->prev = 0;
Ivan Mahonin b53a5c
    return elem;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_link_page_element_into_freelist(struct nk_context *ctx,
Ivan Mahonin b53a5c
    struct nk_page_element *elem)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    /* link table into freelist */
Ivan Mahonin b53a5c
    if (!ctx->freelist) {
Ivan Mahonin b53a5c
        ctx->freelist = elem;
Ivan Mahonin b53a5c
    } else {
Ivan Mahonin b53a5c
        elem->next = ctx->freelist;
Ivan Mahonin b53a5c
        ctx->freelist = elem;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_free_page_element(struct nk_context *ctx, struct nk_page_element *elem)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    /* we have a pool so just add to free list */
Ivan Mahonin b53a5c
    if (ctx->use_pool) {
Ivan Mahonin b53a5c
        nk_link_page_element_into_freelist(ctx, elem);
Ivan Mahonin b53a5c
        return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    /* if possible remove last element from back of fixed memory buffer */
Ivan Mahonin b53a5c
    {void *elem_end = (void*)(elem + 1);
Ivan Mahonin b53a5c
    void *buffer_end = (nk_byte*)ctx->memory.memory.ptr + ctx->memory.size;
Ivan Mahonin b53a5c
    if (elem_end == buffer_end)
Ivan Mahonin b53a5c
        ctx->memory.size -= sizeof(struct nk_page_element);
Ivan Mahonin b53a5c
    else nk_link_page_element_into_freelist(ctx, elem);}
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c