|
@ -1,15 +1,19 @@ |
|
|
// [DEAR IMGUI]
|
|
|
// [DEAR IMGUI]
|
|
|
// This is a slightly modified version of stb_rect_pack.h 1.00.
|
|
|
// This is a slightly modified version of stb_rect_pack.h 1.01.
|
|
|
// Those changes would need to be pushed into nothings/stb:
|
|
|
|
|
|
// - Added STBRP__CDECL
|
|
|
|
|
|
// Grep for [DEAR IMGUI] to find the changes.
|
|
|
// Grep for [DEAR IMGUI] to find the changes.
|
|
|
|
|
|
//
|
|
|
// stb_rect_pack.h - v1.00 - public domain - rectangle packing
|
|
|
// stb_rect_pack.h - v1.01 - public domain - rectangle packing
|
|
|
// Sean Barrett 2014
|
|
|
// Sean Barrett 2014
|
|
|
//
|
|
|
//
|
|
|
// Useful for e.g. packing rectangular textures into an atlas.
|
|
|
// Useful for e.g. packing rectangular textures into an atlas.
|
|
|
// Does not do rotation.
|
|
|
// Does not do rotation.
|
|
|
//
|
|
|
//
|
|
|
|
|
|
// Before #including,
|
|
|
|
|
|
//
|
|
|
|
|
|
// #define STB_RECT_PACK_IMPLEMENTATION
|
|
|
|
|
|
//
|
|
|
|
|
|
// in the file that you want to have the implementation.
|
|
|
|
|
|
//
|
|
|
// Not necessarily the awesomest packing method, but better than
|
|
|
// Not necessarily the awesomest packing method, but better than
|
|
|
// the totally naive one in stb_truetype (which is primarily what
|
|
|
// the totally naive one in stb_truetype (which is primarily what
|
|
|
// this is meant to replace).
|
|
|
// this is meant to replace).
|
|
@ -41,6 +45,7 @@ |
|
|
//
|
|
|
//
|
|
|
// Version history:
|
|
|
// Version history:
|
|
|
//
|
|
|
//
|
|
|
|
|
|
// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section
|
|
|
// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles
|
|
|
// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles
|
|
|
// 0.99 (2019-02-07) warning fixes
|
|
|
// 0.99 (2019-02-07) warning fixes
|
|
|
// 0.11 (2017-03-03) return packing success/fail result
|
|
|
// 0.11 (2017-03-03) return packing success/fail result
|
|
@ -81,11 +86,10 @@ typedef struct stbrp_context stbrp_context; |
|
|
typedef struct stbrp_node stbrp_node; |
|
|
typedef struct stbrp_node stbrp_node; |
|
|
typedef struct stbrp_rect stbrp_rect; |
|
|
typedef struct stbrp_rect stbrp_rect; |
|
|
|
|
|
|
|
|
#ifdef STBRP_LARGE_RECTS |
|
|
|
|
|
typedef int stbrp_coord; |
|
|
typedef int stbrp_coord; |
|
|
#else |
|
|
|
|
|
typedef unsigned short stbrp_coord; |
|
|
#define STBRP__MAXVAL 0x7fffffff |
|
|
#endif |
|
|
// Mostly for internal use, but this is the maximum supported coordinate value.
|
|
|
|
|
|
|
|
|
STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects); |
|
|
STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects); |
|
|
// Assign packed locations to rectangles. The rectangles are of type
|
|
|
// Assign packed locations to rectangles. The rectangles are of type
|
|
@ -213,10 +217,9 @@ struct stbrp_context |
|
|
#define STBRP_ASSERT assert |
|
|
#define STBRP_ASSERT assert |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
// [DEAR IMGUI] Added STBRP__CDECL
|
|
|
|
|
|
#ifdef _MSC_VER |
|
|
#ifdef _MSC_VER |
|
|
#define STBRP__NOTUSED(v) (void)(v) |
|
|
#define STBRP__NOTUSED(v) (void)(v) |
|
|
#define STBRP__CDECL __cdecl |
|
|
#define STBRP__CDECL __cdecl |
|
|
#else |
|
|
#else |
|
|
#define STBRP__NOTUSED(v) (void)sizeof(v) |
|
|
#define STBRP__NOTUSED(v) (void)sizeof(v) |
|
|
#define STBRP__CDECL |
|
|
#define STBRP__CDECL |
|
@ -262,9 +265,6 @@ STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_ou |
|
|
STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes) |
|
|
STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes) |
|
|
{ |
|
|
{ |
|
|
int i; |
|
|
int i; |
|
|
#ifndef STBRP_LARGE_RECTS |
|
|
|
|
|
STBRP_ASSERT(width <= 0xffff && height <= 0xffff); |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
for (i=0; i < num_nodes-1; ++i) |
|
|
for (i=0; i < num_nodes-1; ++i) |
|
|
nodes[i].next = &nodes[i+1]; |
|
|
nodes[i].next = &nodes[i+1]; |
|
@ -283,11 +283,7 @@ STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, |
|
|
context->extra[0].y = 0; |
|
|
context->extra[0].y = 0; |
|
|
context->extra[0].next = &context->extra[1]; |
|
|
context->extra[0].next = &context->extra[1]; |
|
|
context->extra[1].x = (stbrp_coord) width; |
|
|
context->extra[1].x = (stbrp_coord) width; |
|
|
#ifdef STBRP_LARGE_RECTS |
|
|
|
|
|
context->extra[1].y = (1<<30); |
|
|
context->extra[1].y = (1<<30); |
|
|
#else |
|
|
|
|
|
context->extra[1].y = 65535; |
|
|
|
|
|
#endif |
|
|
|
|
|
context->extra[1].next = NULL; |
|
|
context->extra[1].next = NULL; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -433,7 +429,7 @@ static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int widt |
|
|
if (y <= best_y) { |
|
|
if (y <= best_y) { |
|
|
if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) { |
|
|
if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) { |
|
|
best_x = xpos; |
|
|
best_x = xpos; |
|
|
STBRP_ASSERT(y <= best_y); |
|
|
//STBRP_ASSERT(y <= best_y); [DEAR IMGUI]
|
|
|
best_y = y; |
|
|
best_y = y; |
|
|
best_waste = waste; |
|
|
best_waste = waste; |
|
|
best = prev; |
|
|
best = prev; |
|
@ -529,7 +525,6 @@ static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, i |
|
|
return res; |
|
|
return res; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// [DEAR IMGUI] Added STBRP__CDECL
|
|
|
|
|
|
static int STBRP__CDECL rect_height_compare(const void *a, const void *b) |
|
|
static int STBRP__CDECL rect_height_compare(const void *a, const void *b) |
|
|
{ |
|
|
{ |
|
|
const stbrp_rect *p = (const stbrp_rect *) a; |
|
|
const stbrp_rect *p = (const stbrp_rect *) a; |
|
@ -541,7 +536,6 @@ static int STBRP__CDECL rect_height_compare(const void *a, const void *b) |
|
|
return (p->w > q->w) ? -1 : (p->w < q->w); |
|
|
return (p->w > q->w) ? -1 : (p->w < q->w); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// [DEAR IMGUI] Added STBRP__CDECL
|
|
|
|
|
|
static int STBRP__CDECL rect_original_order(const void *a, const void *b) |
|
|
static int STBRP__CDECL rect_original_order(const void *a, const void *b) |
|
|
{ |
|
|
{ |
|
|
const stbrp_rect *p = (const stbrp_rect *) a; |
|
|
const stbrp_rect *p = (const stbrp_rect *) a; |
|
@ -549,12 +543,6 @@ static int STBRP__CDECL rect_original_order(const void *a, const void *b) |
|
|
return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); |
|
|
return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#ifdef STBRP_LARGE_RECTS |
|
|
|
|
|
#define STBRP__MAXVAL 0xffffffff |
|
|
|
|
|
#else |
|
|
|
|
|
#define STBRP__MAXVAL 0xffff |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects) |
|
|
STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects) |
|
|
{ |
|
|
{ |
|
|
int i, all_rects_packed = 1; |
|
|
int i, all_rects_packed = 1; |
|
|