|
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 |
|