public static void nk_rp_pack_rects(nk_rp_context *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); } }
public static void nk_rp_qsort(nk_rp_rect *array, uint len, QSortComparer cmp) { uint right; uint left = (uint)(0); uint *stack = stackalloc uint[64]; uint pos = (uint)(0); uint seed = (uint)(len / 2 * 69069 + 1); for (;;) { for (; (left + 1) < (len); len++) { nk_rp_rect pivot = new nk_rp_rect(); nk_rp_rect tmp = new nk_rp_rect(); if ((pos) == (64)) { len = (uint)(stack[pos = (uint)(0)]); } pivot = (nk_rp_rect)(array[left + seed % (len - left)]); seed = (uint)(seed * 69069 + 1); stack[pos++] = (uint)(len); for (right = (uint)(left - 1);;) { while ((cmp(&array[++right], &pivot)) < (0)) { } while ((cmp(&pivot, &array[--len])) < (0)) { } if ((right) >= (len)) { break; } tmp = (nk_rp_rect)(array[right]); array[right] = (nk_rp_rect)(array[len]); array[len] = (nk_rp_rect)(tmp); } } if ((pos) == (0)) { break; } left = (uint)(len); len = (uint)(stack[--pos]); } }