Blame src-nuklear/nuklear_draw.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
 *                          DRAW
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 * ===============================================================*/
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_command_buffer_init(struct nk_command_buffer *cb,
Ivan Mahonin b53a5c
    struct nk_buffer *b, enum nk_command_clipping clip)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    NK_ASSERT(cb);
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!cb || !b) return;
Ivan Mahonin b53a5c
    cb->base = b;
Ivan Mahonin b53a5c
    cb->use_clipping = (int)clip;
Ivan Mahonin b53a5c
    cb->begin = b->allocated;
Ivan Mahonin b53a5c
    cb->end = b->allocated;
Ivan Mahonin b53a5c
    cb->last = b->allocated;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_command_buffer_reset(struct nk_command_buffer *b)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b) return;
Ivan Mahonin b53a5c
    b->begin = 0;
Ivan Mahonin b53a5c
    b->end = 0;
Ivan Mahonin b53a5c
    b->last = 0;
Ivan Mahonin b53a5c
    b->clip = nk_null_rect;
Ivan Mahonin b53a5c
#ifdef NK_INCLUDE_COMMAND_USERDATA
Ivan Mahonin b53a5c
    b->userdata.ptr = 0;
Ivan Mahonin b53a5c
#endif
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void*
Ivan Mahonin b53a5c
nk_command_buffer_push(struct nk_command_buffer* b,
Ivan Mahonin b53a5c
    enum nk_command_type t, nk_size size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    NK_STORAGE const nk_size align = NK_ALIGNOF(struct nk_command);
Ivan Mahonin b53a5c
    struct nk_command *cmd;
Ivan Mahonin b53a5c
    nk_size alignment;
Ivan Mahonin b53a5c
    void *unaligned;
Ivan Mahonin b53a5c
    void *memory;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    NK_ASSERT(b->base);
Ivan Mahonin b53a5c
    if (!b) return 0;
Ivan Mahonin b53a5c
    cmd = (struct nk_command*)nk_buffer_alloc(b->base,NK_BUFFER_FRONT,size,align);
Ivan Mahonin b53a5c
    if (!cmd) return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* make sure the offset to the next command is aligned */
Ivan Mahonin b53a5c
    b->last = (nk_size)((nk_byte*)cmd - (nk_byte*)b->base->memory.ptr);
Ivan Mahonin b53a5c
    unaligned = (nk_byte*)cmd + size;
Ivan Mahonin b53a5c
    memory = NK_ALIGN_PTR(unaligned, align);
Ivan Mahonin b53a5c
    alignment = (nk_size)((nk_byte*)memory - (nk_byte*)unaligned);
Ivan Mahonin b53a5c
#ifdef NK_ZERO_COMMAND_MEMORY
Ivan Mahonin b53a5c
    NK_MEMSET(cmd, 0, size + alignment);
Ivan Mahonin b53a5c
#endif
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    cmd->type = t;
Ivan Mahonin b53a5c
    cmd->next = b->base->allocated + alignment;
Ivan Mahonin b53a5c
#ifdef NK_INCLUDE_COMMAND_USERDATA
Ivan Mahonin b53a5c
    cmd->userdata = b->userdata;
Ivan Mahonin b53a5c
#endif
Ivan Mahonin b53a5c
    b->end = cmd->next;
Ivan Mahonin b53a5c
    return cmd;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_push_scissor(struct nk_command_buffer *b, struct nk_rect r)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_scissor *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b) return;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    b->clip.x = r.x;
Ivan Mahonin b53a5c
    b->clip.y = r.y;
Ivan Mahonin b53a5c
    b->clip.w = r.w;
Ivan Mahonin b53a5c
    b->clip.h = r.h;
Ivan Mahonin b53a5c
    cmd = (struct nk_command_scissor*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_SCISSOR, sizeof(*cmd));
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->x = (short)r.x;
Ivan Mahonin b53a5c
    cmd->y = (short)r.y;
Ivan Mahonin b53a5c
    cmd->w = (unsigned short)NK_MAX(0, r.w);
Ivan Mahonin b53a5c
    cmd->h = (unsigned short)NK_MAX(0, r.h);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_stroke_line(struct nk_command_buffer *b, float x0, float y0,
Ivan Mahonin b53a5c
    float x1, float y1, float line_thickness, struct nk_color c)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_line *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || line_thickness <= 0) return;
Ivan Mahonin b53a5c
    cmd = (struct nk_command_line*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_LINE, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->line_thickness = (unsigned short)line_thickness;
Ivan Mahonin b53a5c
    cmd->begin.x = (short)x0;
Ivan Mahonin b53a5c
    cmd->begin.y = (short)y0;
Ivan Mahonin b53a5c
    cmd->end.x = (short)x1;
Ivan Mahonin b53a5c
    cmd->end.y = (short)y1;
Ivan Mahonin b53a5c
    cmd->color = c;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_stroke_curve(struct nk_command_buffer *b, float ax, float ay,
Ivan Mahonin b53a5c
    float ctrl0x, float ctrl0y, float ctrl1x, float ctrl1y,
Ivan Mahonin b53a5c
    float bx, float by, float line_thickness, struct nk_color col)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_curve *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || col.a == 0 || line_thickness <= 0) return;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    cmd = (struct nk_command_curve*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_CURVE, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->line_thickness = (unsigned short)line_thickness;
Ivan Mahonin b53a5c
    cmd->begin.x = (short)ax;
Ivan Mahonin b53a5c
    cmd->begin.y = (short)ay;
Ivan Mahonin b53a5c
    cmd->ctrl[0].x = (short)ctrl0x;
Ivan Mahonin b53a5c
    cmd->ctrl[0].y = (short)ctrl0y;
Ivan Mahonin b53a5c
    cmd->ctrl[1].x = (short)ctrl1x;
Ivan Mahonin b53a5c
    cmd->ctrl[1].y = (short)ctrl1y;
Ivan Mahonin b53a5c
    cmd->end.x = (short)bx;
Ivan Mahonin b53a5c
    cmd->end.y = (short)by;
Ivan Mahonin b53a5c
    cmd->color = col;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_stroke_rect(struct nk_command_buffer *b, struct nk_rect rect,
Ivan Mahonin b53a5c
    float rounding, float line_thickness, struct nk_color c)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_rect *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || c.a == 0 || rect.w == 0 || rect.h == 0 || line_thickness <= 0) return;
Ivan Mahonin b53a5c
    if (b->use_clipping) {
Ivan Mahonin b53a5c
        const struct nk_rect *clip = &b->clip;
Ivan Mahonin b53a5c
        if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h,
Ivan Mahonin b53a5c
            clip->x, clip->y, clip->w, clip->h)) return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    cmd = (struct nk_command_rect*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_RECT, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->rounding = (unsigned short)rounding;
Ivan Mahonin b53a5c
    cmd->line_thickness = (unsigned short)line_thickness;
Ivan Mahonin b53a5c
    cmd->x = (short)rect.x;
Ivan Mahonin b53a5c
    cmd->y = (short)rect.y;
Ivan Mahonin b53a5c
    cmd->w = (unsigned short)NK_MAX(0, rect.w);
Ivan Mahonin b53a5c
    cmd->h = (unsigned short)NK_MAX(0, rect.h);
Ivan Mahonin b53a5c
    cmd->color = c;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_fill_rect(struct nk_command_buffer *b, struct nk_rect rect,
Ivan Mahonin b53a5c
    float rounding, struct nk_color c)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_rect_filled *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || c.a == 0 || rect.w == 0 || rect.h == 0) return;
Ivan Mahonin b53a5c
    if (b->use_clipping) {
Ivan Mahonin b53a5c
        const struct nk_rect *clip = &b->clip;
Ivan Mahonin b53a5c
        if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h,
Ivan Mahonin b53a5c
            clip->x, clip->y, clip->w, clip->h)) return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    cmd = (struct nk_command_rect_filled*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_RECT_FILLED, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->rounding = (unsigned short)rounding;
Ivan Mahonin b53a5c
    cmd->x = (short)rect.x;
Ivan Mahonin b53a5c
    cmd->y = (short)rect.y;
Ivan Mahonin b53a5c
    cmd->w = (unsigned short)NK_MAX(0, rect.w);
Ivan Mahonin b53a5c
    cmd->h = (unsigned short)NK_MAX(0, rect.h);
Ivan Mahonin b53a5c
    cmd->color = c;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_fill_rect_multi_color(struct nk_command_buffer *b, struct nk_rect rect,
Ivan Mahonin b53a5c
    struct nk_color left, struct nk_color top, struct nk_color right,
Ivan Mahonin b53a5c
    struct nk_color bottom)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_rect_multi_color *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || rect.w == 0 || rect.h == 0) return;
Ivan Mahonin b53a5c
    if (b->use_clipping) {
Ivan Mahonin b53a5c
        const struct nk_rect *clip = &b->clip;
Ivan Mahonin b53a5c
        if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h,
Ivan Mahonin b53a5c
            clip->x, clip->y, clip->w, clip->h)) return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    cmd = (struct nk_command_rect_multi_color*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_RECT_MULTI_COLOR, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->x = (short)rect.x;
Ivan Mahonin b53a5c
    cmd->y = (short)rect.y;
Ivan Mahonin b53a5c
    cmd->w = (unsigned short)NK_MAX(0, rect.w);
Ivan Mahonin b53a5c
    cmd->h = (unsigned short)NK_MAX(0, rect.h);
Ivan Mahonin b53a5c
    cmd->left = left;
Ivan Mahonin b53a5c
    cmd->top = top;
Ivan Mahonin b53a5c
    cmd->right = right;
Ivan Mahonin b53a5c
    cmd->bottom = bottom;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_stroke_circle(struct nk_command_buffer *b, struct nk_rect r,
Ivan Mahonin b53a5c
    float line_thickness, struct nk_color c)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_circle *cmd;
Ivan Mahonin b53a5c
    if (!b || r.w == 0 || r.h == 0 || line_thickness <= 0) return;
Ivan Mahonin b53a5c
    if (b->use_clipping) {
Ivan Mahonin b53a5c
        const struct nk_rect *clip = &b->clip;
Ivan Mahonin b53a5c
        if (!NK_INTERSECT(r.x, r.y, r.w, r.h, clip->x, clip->y, clip->w, clip->h))
Ivan Mahonin b53a5c
            return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    cmd = (struct nk_command_circle*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_CIRCLE, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->line_thickness = (unsigned short)line_thickness;
Ivan Mahonin b53a5c
    cmd->x = (short)r.x;
Ivan Mahonin b53a5c
    cmd->y = (short)r.y;
Ivan Mahonin b53a5c
    cmd->w = (unsigned short)NK_MAX(r.w, 0);
Ivan Mahonin b53a5c
    cmd->h = (unsigned short)NK_MAX(r.h, 0);
Ivan Mahonin b53a5c
    cmd->color = c;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_fill_circle(struct nk_command_buffer *b, struct nk_rect r, struct nk_color c)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_circle_filled *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || c.a == 0 || r.w == 0 || r.h == 0) return;
Ivan Mahonin b53a5c
    if (b->use_clipping) {
Ivan Mahonin b53a5c
        const struct nk_rect *clip = &b->clip;
Ivan Mahonin b53a5c
        if (!NK_INTERSECT(r.x, r.y, r.w, r.h, clip->x, clip->y, clip->w, clip->h))
Ivan Mahonin b53a5c
            return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    cmd = (struct nk_command_circle_filled*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_CIRCLE_FILLED, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->x = (short)r.x;
Ivan Mahonin b53a5c
    cmd->y = (short)r.y;
Ivan Mahonin b53a5c
    cmd->w = (unsigned short)NK_MAX(r.w, 0);
Ivan Mahonin b53a5c
    cmd->h = (unsigned short)NK_MAX(r.h, 0);
Ivan Mahonin b53a5c
    cmd->color = c;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_stroke_arc(struct nk_command_buffer *b, float cx, float cy, float radius,
Ivan Mahonin b53a5c
    float a_min, float a_max, float line_thickness, struct nk_color c)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_arc *cmd;
Ivan Mahonin b53a5c
    if (!b || c.a == 0 || line_thickness <= 0) return;
Ivan Mahonin b53a5c
    cmd = (struct nk_command_arc*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_ARC, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->line_thickness = (unsigned short)line_thickness;
Ivan Mahonin b53a5c
    cmd->cx = (short)cx;
Ivan Mahonin b53a5c
    cmd->cy = (short)cy;
Ivan Mahonin b53a5c
    cmd->r = (unsigned short)radius;
Ivan Mahonin b53a5c
    cmd->a[0] = a_min;
Ivan Mahonin b53a5c
    cmd->a[1] = a_max;
Ivan Mahonin b53a5c
    cmd->color = c;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_fill_arc(struct nk_command_buffer *b, float cx, float cy, float radius,
Ivan Mahonin b53a5c
    float a_min, float a_max, struct nk_color c)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_arc_filled *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || c.a == 0) return;
Ivan Mahonin b53a5c
    cmd = (struct nk_command_arc_filled*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_ARC_FILLED, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->cx = (short)cx;
Ivan Mahonin b53a5c
    cmd->cy = (short)cy;
Ivan Mahonin b53a5c
    cmd->r = (unsigned short)radius;
Ivan Mahonin b53a5c
    cmd->a[0] = a_min;
Ivan Mahonin b53a5c
    cmd->a[1] = a_max;
Ivan Mahonin b53a5c
    cmd->color = c;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_stroke_triangle(struct nk_command_buffer *b, float x0, float y0, float x1,
Ivan Mahonin b53a5c
    float y1, float x2, float y2, float line_thickness, struct nk_color c)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_triangle *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || c.a == 0 || line_thickness <= 0) return;
Ivan Mahonin b53a5c
    if (b->use_clipping) {
Ivan Mahonin b53a5c
        const struct nk_rect *clip = &b->clip;
Ivan Mahonin b53a5c
        if (!NK_INBOX(x0, y0, clip->x, clip->y, clip->w, clip->h) &&
Ivan Mahonin b53a5c
            !NK_INBOX(x1, y1, clip->x, clip->y, clip->w, clip->h) &&
Ivan Mahonin b53a5c
            !NK_INBOX(x2, y2, clip->x, clip->y, clip->w, clip->h))
Ivan Mahonin b53a5c
            return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    cmd = (struct nk_command_triangle*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_TRIANGLE, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->line_thickness = (unsigned short)line_thickness;
Ivan Mahonin b53a5c
    cmd->a.x = (short)x0;
Ivan Mahonin b53a5c
    cmd->a.y = (short)y0;
Ivan Mahonin b53a5c
    cmd->b.x = (short)x1;
Ivan Mahonin b53a5c
    cmd->b.y = (short)y1;
Ivan Mahonin b53a5c
    cmd->c.x = (short)x2;
Ivan Mahonin b53a5c
    cmd->c.y = (short)y2;
Ivan Mahonin b53a5c
    cmd->color = c;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_fill_triangle(struct nk_command_buffer *b, float x0, float y0, float x1,
Ivan Mahonin b53a5c
    float y1, float x2, float y2, struct nk_color c)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_triangle_filled *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || c.a == 0) return;
Ivan Mahonin b53a5c
    if (!b) return;
Ivan Mahonin b53a5c
    if (b->use_clipping) {
Ivan Mahonin b53a5c
        const struct nk_rect *clip = &b->clip;
Ivan Mahonin b53a5c
        if (!NK_INBOX(x0, y0, clip->x, clip->y, clip->w, clip->h) &&
Ivan Mahonin b53a5c
            !NK_INBOX(x1, y1, clip->x, clip->y, clip->w, clip->h) &&
Ivan Mahonin b53a5c
            !NK_INBOX(x2, y2, clip->x, clip->y, clip->w, clip->h))
Ivan Mahonin b53a5c
            return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    cmd = (struct nk_command_triangle_filled*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_TRIANGLE_FILLED, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->a.x = (short)x0;
Ivan Mahonin b53a5c
    cmd->a.y = (short)y0;
Ivan Mahonin b53a5c
    cmd->b.x = (short)x1;
Ivan Mahonin b53a5c
    cmd->b.y = (short)y1;
Ivan Mahonin b53a5c
    cmd->c.x = (short)x2;
Ivan Mahonin b53a5c
    cmd->c.y = (short)y2;
Ivan Mahonin b53a5c
    cmd->color = c;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_stroke_polygon(struct nk_command_buffer *b,  float *points, int point_count,
Ivan Mahonin b53a5c
    float line_thickness, struct nk_color col)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int i;
Ivan Mahonin b53a5c
    nk_size size = 0;
Ivan Mahonin b53a5c
    struct nk_command_polygon *cmd;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || col.a == 0 || line_thickness <= 0) return;
Ivan Mahonin b53a5c
    size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count;
Ivan Mahonin b53a5c
    cmd = (struct nk_command_polygon*) nk_command_buffer_push(b, NK_COMMAND_POLYGON, size);
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->color = col;
Ivan Mahonin b53a5c
    cmd->line_thickness = (unsigned short)line_thickness;
Ivan Mahonin b53a5c
    cmd->point_count = (unsigned short)point_count;
Ivan Mahonin b53a5c
    for (i = 0; i < point_count; ++i) {
Ivan Mahonin b53a5c
        cmd->points[i].x = (short)points[i*2];
Ivan Mahonin b53a5c
        cmd->points[i].y = (short)points[i*2+1];
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_fill_polygon(struct nk_command_buffer *b, float *points, int point_count,
Ivan Mahonin b53a5c
    struct nk_color col)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int i;
Ivan Mahonin b53a5c
    nk_size size = 0;
Ivan Mahonin b53a5c
    struct nk_command_polygon_filled *cmd;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || col.a == 0) return;
Ivan Mahonin b53a5c
    size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count;
Ivan Mahonin b53a5c
    cmd = (struct nk_command_polygon_filled*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_POLYGON_FILLED, size);
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->color = col;
Ivan Mahonin b53a5c
    cmd->point_count = (unsigned short)point_count;
Ivan Mahonin b53a5c
    for (i = 0; i < point_count; ++i) {
Ivan Mahonin b53a5c
        cmd->points[i].x = (short)points[i*2+0];
Ivan Mahonin b53a5c
        cmd->points[i].y = (short)points[i*2+1];
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_stroke_polyline(struct nk_command_buffer *b, float *points, int point_count,
Ivan Mahonin b53a5c
    float line_thickness, struct nk_color col)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int i;
Ivan Mahonin b53a5c
    nk_size size = 0;
Ivan Mahonin b53a5c
    struct nk_command_polyline *cmd;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b || col.a == 0 || line_thickness <= 0) return;
Ivan Mahonin b53a5c
    size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count;
Ivan Mahonin b53a5c
    cmd = (struct nk_command_polyline*) nk_command_buffer_push(b, NK_COMMAND_POLYLINE, size);
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->color = col;
Ivan Mahonin b53a5c
    cmd->point_count = (unsigned short)point_count;
Ivan Mahonin b53a5c
    cmd->line_thickness = (unsigned short)line_thickness;
Ivan Mahonin b53a5c
    for (i = 0; i < point_count; ++i) {
Ivan Mahonin b53a5c
        cmd->points[i].x = (short)points[i*2];
Ivan Mahonin b53a5c
        cmd->points[i].y = (short)points[i*2+1];
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_draw_image(struct nk_command_buffer *b, struct nk_rect r,
Ivan Mahonin b53a5c
    const struct nk_image *img, struct nk_color col)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_image *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b) return;
Ivan Mahonin b53a5c
    if (b->use_clipping) {
Ivan Mahonin b53a5c
        const struct nk_rect *c = &b->clip;
Ivan Mahonin b53a5c
        if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h))
Ivan Mahonin b53a5c
            return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    cmd = (struct nk_command_image*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_IMAGE, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->x = (short)r.x;
Ivan Mahonin b53a5c
    cmd->y = (short)r.y;
Ivan Mahonin b53a5c
    cmd->w = (unsigned short)NK_MAX(0, r.w);
Ivan Mahonin b53a5c
    cmd->h = (unsigned short)NK_MAX(0, r.h);
Ivan Mahonin b53a5c
    cmd->img = *img;
Ivan Mahonin b53a5c
    cmd->col = col;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_draw_nine_slice(struct nk_command_buffer *b, struct nk_rect r,
Ivan Mahonin b53a5c
    const struct nk_nine_slice *slc, struct nk_color col)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_image img;
Ivan Mahonin b53a5c
    const struct nk_image *slcimg = (const struct nk_image*)slc;
Ivan Mahonin b53a5c
    nk_ushort rgnX, rgnY, rgnW, rgnH;
Ivan Mahonin b53a5c
    rgnX = slcimg->region[0];
Ivan Mahonin b53a5c
    rgnY = slcimg->region[1];
Ivan Mahonin b53a5c
    rgnW = slcimg->region[2];
Ivan Mahonin b53a5c
    rgnH = slcimg->region[3];
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* top-left */
Ivan Mahonin b53a5c
    img.handle = slcimg->handle;
Ivan Mahonin b53a5c
    img.w = slcimg->w;
Ivan Mahonin b53a5c
    img.h = slcimg->h;
Ivan Mahonin b53a5c
    img.region[0] = rgnX;
Ivan Mahonin b53a5c
    img.region[1] = rgnY;
Ivan Mahonin b53a5c
    img.region[2] = slc->l;
Ivan Mahonin b53a5c
    img.region[3] = slc->t;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    nk_draw_image(b,
Ivan Mahonin b53a5c
        nk_rect(r.x, r.y, (float)slc->l, (float)slc->t),
Ivan Mahonin b53a5c
        &img, col);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
#define IMG_RGN(x, y, w, h) img.region[0] = (nk_ushort)(x); img.region[1] = (nk_ushort)(y); img.region[2] = (nk_ushort)(w); img.region[3] = (nk_ushort)(h);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* top-center */
Ivan Mahonin b53a5c
    IMG_RGN(rgnX + slc->l, rgnY, rgnW - slc->l - slc->r, slc->t);
Ivan Mahonin b53a5c
    nk_draw_image(b,
Ivan Mahonin b53a5c
        nk_rect(r.x + (float)slc->l, r.y, (float)(r.w - slc->l - slc->r), (float)slc->t),
Ivan Mahonin b53a5c
        &img, col);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* top-right */
Ivan Mahonin b53a5c
    IMG_RGN(rgnX + rgnW - slc->r, rgnY, slc->r, slc->t);
Ivan Mahonin b53a5c
    nk_draw_image(b,
Ivan Mahonin b53a5c
        nk_rect(r.x + r.w - (float)slc->r, r.y, (float)slc->r, (float)slc->t),
Ivan Mahonin b53a5c
        &img, col);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* center-left */
Ivan Mahonin b53a5c
    IMG_RGN(rgnX, rgnY + slc->t, slc->l, rgnH - slc->t - slc->b);
Ivan Mahonin b53a5c
    nk_draw_image(b,
Ivan Mahonin b53a5c
        nk_rect(r.x, r.y + (float)slc->t, (float)slc->l, (float)(r.h - slc->t - slc->b)),
Ivan Mahonin b53a5c
        &img, col);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* center */
Ivan Mahonin b53a5c
    IMG_RGN(rgnX + slc->l, rgnY + slc->t, rgnW - slc->l - slc->r, rgnH - slc->t - slc->b);
Ivan Mahonin b53a5c
    nk_draw_image(b,
Ivan Mahonin b53a5c
        nk_rect(r.x + (float)slc->l, r.y + (float)slc->t, (float)(r.w - slc->l - slc->r), (float)(r.h - slc->t - slc->b)),
Ivan Mahonin b53a5c
        &img, col);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* center-right */
Ivan Mahonin b53a5c
    IMG_RGN(rgnX + rgnW - slc->r, rgnY + slc->t, slc->r, rgnH - slc->t - slc->b);
Ivan Mahonin b53a5c
    nk_draw_image(b,
Ivan Mahonin b53a5c
        nk_rect(r.x + r.w - (float)slc->r, r.y + (float)slc->t, (float)slc->r, (float)(r.h - slc->t - slc->b)),
Ivan Mahonin b53a5c
        &img, col);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* bottom-left */
Ivan Mahonin b53a5c
    IMG_RGN(rgnX, rgnY + rgnH - slc->b, slc->l, slc->b);
Ivan Mahonin b53a5c
    nk_draw_image(b,
Ivan Mahonin b53a5c
        nk_rect(r.x, r.y + r.h - (float)slc->b, (float)slc->l, (float)slc->b),
Ivan Mahonin b53a5c
        &img, col);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* bottom-center */
Ivan Mahonin b53a5c
    IMG_RGN(rgnX + slc->l, rgnY + rgnH - slc->b, rgnW - slc->l - slc->r, slc->b);
Ivan Mahonin b53a5c
    nk_draw_image(b,
Ivan Mahonin b53a5c
        nk_rect(r.x + (float)slc->l, r.y + r.h - (float)slc->b, (float)(r.w - slc->l - slc->r), (float)slc->b),
Ivan Mahonin b53a5c
        &img, col);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* bottom-right */
Ivan Mahonin b53a5c
    IMG_RGN(rgnX + rgnW - slc->r, rgnY + rgnH - slc->b, slc->r, slc->b);
Ivan Mahonin b53a5c
    nk_draw_image(b,
Ivan Mahonin b53a5c
        nk_rect(r.x + r.w - (float)slc->r, r.y + r.h - (float)slc->b, (float)slc->r, (float)slc->b),
Ivan Mahonin b53a5c
        &img, col);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
#undef IMG_RGN
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_push_custom(struct nk_command_buffer *b, struct nk_rect r,
Ivan Mahonin b53a5c
    nk_command_custom_callback cb, nk_handle usr)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_command_custom *cmd;
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    if (!b) return;
Ivan Mahonin b53a5c
    if (b->use_clipping) {
Ivan Mahonin b53a5c
        const struct nk_rect *c = &b->clip;
Ivan Mahonin b53a5c
        if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h))
Ivan Mahonin b53a5c
            return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    cmd = (struct nk_command_custom*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_CUSTOM, sizeof(*cmd));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->x = (short)r.x;
Ivan Mahonin b53a5c
    cmd->y = (short)r.y;
Ivan Mahonin b53a5c
    cmd->w = (unsigned short)NK_MAX(0, r.w);
Ivan Mahonin b53a5c
    cmd->h = (unsigned short)NK_MAX(0, r.h);
Ivan Mahonin b53a5c
    cmd->callback_data = usr;
Ivan Mahonin b53a5c
    cmd->callback = cb;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_draw_text(struct nk_command_buffer *b, struct nk_rect r,
Ivan Mahonin b53a5c
    const char *string, int length, const struct nk_user_font *font,
Ivan Mahonin b53a5c
    struct nk_color bg, struct nk_color fg)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    float text_width = 0;
Ivan Mahonin b53a5c
    struct nk_command_text *cmd;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(b);
Ivan Mahonin b53a5c
    NK_ASSERT(font);
Ivan Mahonin b53a5c
    if (!b || !string || !length || (bg.a == 0 && fg.a == 0)) return;
Ivan Mahonin b53a5c
    if (b->use_clipping) {
Ivan Mahonin b53a5c
        const struct nk_rect *c = &b->clip;
Ivan Mahonin b53a5c
        if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h))
Ivan Mahonin b53a5c
            return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* make sure text fits inside bounds */
Ivan Mahonin b53a5c
    text_width = font->width(font->userdata, font->height, string, length);
Ivan Mahonin b53a5c
    if (text_width > r.w){
Ivan Mahonin b53a5c
        int glyphs = 0;
Ivan Mahonin b53a5c
        float txt_width = (float)text_width;
Ivan Mahonin b53a5c
        length = nk_text_clamp(font, string, length, r.w, &glyphs, &txt_width, 0,0);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    if (!length) return;
Ivan Mahonin b53a5c
    cmd = (struct nk_command_text*)
Ivan Mahonin b53a5c
        nk_command_buffer_push(b, NK_COMMAND_TEXT, sizeof(*cmd) + (nk_size)(length + 1));
Ivan Mahonin b53a5c
    if (!cmd) return;
Ivan Mahonin b53a5c
    cmd->x = (short)r.x;
Ivan Mahonin b53a5c
    cmd->y = (short)r.y;
Ivan Mahonin b53a5c
    cmd->w = (unsigned short)r.w;
Ivan Mahonin b53a5c
    cmd->h = (unsigned short)r.h;
Ivan Mahonin b53a5c
    cmd->background = bg;
Ivan Mahonin b53a5c
    cmd->foreground = fg;
Ivan Mahonin b53a5c
    cmd->font = font;
Ivan Mahonin b53a5c
    cmd->length = length;
Ivan Mahonin b53a5c
    cmd->height = font->height;
Ivan Mahonin b53a5c
    NK_MEMCPY(cmd->string, string, (nk_size)length);
Ivan Mahonin b53a5c
    cmd->string[length] = '\0';
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c