Пример #1
0
        public static void nk_rp_pack_rects(NkRpContext *context, nk_rp_rect *rects, int num_rects)
        {
            int i;

            for (i = (int)(0); (i) < (num_rects); ++i)
            {
                rects[i].was_packed = (int)(i);
            }
            nk_rp_qsort(rects, (uint)(num_rects), nk_rect_height_compare);
            for (i = (int)(0); (i) < (num_rects); ++i)
            {
                nk_rp__findresult fr =
                    (nk_rp__findresult)(nk_rp__skyline_pack_rectangle(context, (int)(rects[i].w), (int)(rects[i].h)));
                if ((fr.prev_link) != null)
                {
                    rects[i].x = ((ushort)(fr.x));
                    rects[i].y = ((ushort)(fr.y));
                }
                else
                {
                    rects[i].x = (ushort)(rects[i].y = (ushort)(0xffff));
                }
            }
            nk_rp_qsort(rects, (uint)(num_rects), nk_rect_original_order);
            for (i = (int)(0); (i) < (num_rects); ++i)
            {
                rects[i].was_packed = (int)((((rects[i].x) == (0xffff)) && ((rects[i].y) == (0xffff))) ? 0 : 1);
            }
        }
Пример #2
0
 public static void nk_rp_setup_allow_out_of_mem(NkRpContext *context, int allow_out_of_mem)
 {
     if ((allow_out_of_mem) != 0)
     {
         context->align = (int)(1);
     }
     else
     {
         context->align = (int)((context->width + context->num_nodes - 1) / context->num_nodes);
     }
 }
Пример #3
0
        public static nk_rp__findresult nk_rp__skyline_pack_rectangle(NkRpContext *context, int width, int height)
        {
            nk_rp__findresult res = (nk_rp__findresult)(nk_rp__skyline_find_best_pos(context, (int)(width), (int)(height)));
            nk_rp_node *      node;
            nk_rp_node *      cur;

            if ((((res.prev_link) == (null)) || ((res.y + height) > (context->height))) || ((context->free_head) == (null)))
            {
                res.prev_link = null;
                return((nk_rp__findresult)(res));
            }

            node               = context->free_head;
            node->x            = ((ushort)(res.x));
            node->y            = ((ushort)(res.y + height));
            context->free_head = node->next;
            cur = *res.prev_link;
            if ((cur->x) < (res.x))
            {
                nk_rp_node *next = cur->next;
                cur->next = node;
                cur       = next;
            }
            else
            {
                *res.prev_link = node;
            }

            while (((cur->next) != null) && (cur->next->x <= res.x + width))
            {
                nk_rp_node *next = cur->next;
                cur->next          = context->free_head;
                context->free_head = cur;
                cur = next;
            }
            node->next = cur;
            if ((cur->x) < (res.x + width))
            {
                cur->x = ((ushort)(res.x + width));
            }
            return((nk_rp__findresult)(res));
        }
Пример #4
0
        public static int nk_rp__skyline_find_min_y(NkRpContext *c, nk_rp_node *first, int x0, int width, int *pwaste)
        {
            nk_rp_node *node = first;
            int         x1   = (int)(x0 + width);
            int         min_y;
            int         visited_width;
            int         waste_area;

            min_y         = (int)(0);
            waste_area    = (int)(0);
            visited_width = (int)(0);
            while ((node->x) < (x1))
            {
                if ((node->y) > (min_y))
                {
                    waste_area += (int)(visited_width * (node->y - min_y));
                    min_y       = (int)(node->y);
                    if ((node->x) < (x0))
                    {
                        visited_width += (int)(node->next->x - x0);
                    }
                    else
                    {
                        visited_width += (int)(node->next->x - node->x);
                    }
                }
                else
                {
                    int under_width = (int)(node->next->x - node->x);
                    if ((under_width + visited_width) > (width))
                    {
                        under_width = (int)(width - visited_width);
                    }
                    waste_area    += (int)(under_width * (min_y - node->y));
                    visited_width += (int)(under_width);
                }
                node = node->next;
            }
            *pwaste = (int)(waste_area);
            return((int)(min_y));
        }
Пример #5
0
        public static void nk_rp_init_target(NkRpContext *context, int width, int height, nk_rp_node *nodes, int num_nodes)
        {
            int i;

            for (i = (int)(0); (i) < (num_nodes - 1); ++i)
            {
                nodes[i].next = &nodes[i + 1];
            }
            nodes[i].next        = null;
            context->init_mode   = (int)(NK_RP__INIT_skyline);
            context->heuristic   = (int)(NK_RP_HEURISTIC_Skyline_default);
            context->free_head   = &nodes[0];
            context->active_head = &context->extra_0;
            context->width       = (int)(width);
            context->height      = (int)(height);
            context->num_nodes   = (int)(num_nodes);
            nk_rp_setup_allow_out_of_mem(context, (int)(0));
            context->extra_0.x    = (ushort)(0);
            context->extra_0.y    = (ushort)(0);
            context->extra_0.next = &context->extra_1;
            context->extra_1.x    = ((ushort)(width));
            context->extra_1.y    = (ushort)(65535);
            context->extra_1.next = null;
        }
Пример #6
0
        public static nk_rp__findresult nk_rp__skyline_find_best_pos(NkRpContext *c, int width, int height)
        {
            int best_waste = (int)(1 << 30);
            int best_x;
            int best_y           = (int)(1 << 30);
            nk_rp__findresult fr = new nk_rp__findresult();
            nk_rp_node **     prev;
            nk_rp_node *      node;
            nk_rp_node *      tail;
            nk_rp_node **     best = null;

            width  = (int)(width + c->align - 1);
            width -= (int)(width % c->align);
            node   = c->active_head;
            prev   = &c->active_head;
            while (node->x + width <= c->width)
            {
                int y;
                int waste;
                y = (int)(nk_rp__skyline_find_min_y(c, node, (int)(node->x), (int)(width), &waste));
                if ((c->heuristic) == (NK_RP_HEURISTIC_Skyline_BL_sortHeight))
                {
                    if ((y) < (best_y))
                    {
                        best_y = (int)(y);
                        best   = prev;
                    }
                }
                else
                {
                    if (y + height <= c->height)
                    {
                        if (((y) < (best_y)) || (((y) == (best_y)) && ((waste) < (best_waste))))
                        {
                            best_y     = (int)(y);
                            best_waste = (int)(waste);
                            best       = prev;
                        }
                    }
                }
                prev = &node->next;
                node = node->next;
            }
            best_x = (int)(((best) == (null)) ? 0 : (*best)->x);
            if ((c->heuristic) == (NK_RP_HEURISTIC_Skyline_BF_sortHeight))
            {
                tail = c->active_head;
                node = c->active_head;
                prev = &c->active_head;
                while ((tail->x) < (width))
                {
                    tail = tail->next;
                }
                while ((tail) != null)
                {
                    int xpos = (int)(tail->x - width);
                    int y;
                    int waste;
                    while (node->next->x <= xpos)
                    {
                        prev = &node->next;
                        node = node->next;
                    }
                    y = (int)(nk_rp__skyline_find_min_y(c, node, (int)(xpos), (int)(width), &waste));
                    if ((y + height) < (c->height))
                    {
                        if (y <= best_y)
                        {
                            if ((((y) < (best_y)) || ((waste) < (best_waste))) || (((waste) == (best_waste)) && ((xpos) < (best_x))))
                            {
                                best_x     = (int)(xpos);
                                best_y     = (int)(y);
                                best_waste = (int)(waste);
                                best       = prev;
                            }
                        }
                    }
                    tail = tail->next;
                }
            }

            fr.prev_link = best;
            fr.x         = (int)(best_x);
            fr.y         = (int)(best_y);
            return((nk_rp__findresult)(fr));
        }