|
@ -1,4 +1,4 @@ |
|
|
// stb_rect_pack.h - v0.10 - public domain - rectangle packing
|
|
|
// stb_rect_pack.h - v0.11 - 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.
|
|
@ -27,11 +27,14 @@ |
|
|
// Sean Barrett
|
|
|
// Sean Barrett
|
|
|
// Minor features
|
|
|
// Minor features
|
|
|
// Martins Mozeiko
|
|
|
// Martins Mozeiko
|
|
|
|
|
|
// github:IntellectualKitty
|
|
|
|
|
|
//
|
|
|
// Bugfixes / warning fixes
|
|
|
// Bugfixes / warning fixes
|
|
|
// Jeremy Jaussaud
|
|
|
// Jeremy Jaussaud
|
|
|
//
|
|
|
//
|
|
|
// Version history:
|
|
|
// Version history:
|
|
|
//
|
|
|
//
|
|
|
|
|
|
// 0.11 (2017-03-03) return packing success/fail result
|
|
|
// 0.10 (2016-10-25) remove cast-away-const to avoid warnings
|
|
|
// 0.10 (2016-10-25) remove cast-away-const to avoid warnings
|
|
|
// 0.09 (2016-08-27) fix compiler warnings
|
|
|
// 0.09 (2016-08-27) fix compiler warnings
|
|
|
// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0)
|
|
|
// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0)
|
|
@ -43,9 +46,7 @@ |
|
|
//
|
|
|
//
|
|
|
// LICENSE
|
|
|
// LICENSE
|
|
|
//
|
|
|
//
|
|
|
// This software is dual-licensed to the public domain and under the following
|
|
|
// See end of file for license information.
|
|
|
// license: you are granted a perpetual, irrevocable license to copy, modify,
|
|
|
|
|
|
// publish, and distribute this file as you see fit.
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
//
|
|
|
//
|
|
@ -77,7 +78,7 @@ typedef int stbrp_coord; |
|
|
typedef unsigned short stbrp_coord; |
|
|
typedef unsigned short stbrp_coord; |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
STBRP_DEF void 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
|
|
|
// 'stbrp_rect' defined below, stored in the array 'rects', and there
|
|
|
// 'stbrp_rect' defined below, stored in the array 'rects', and there
|
|
|
// are 'num_rects' many of them.
|
|
|
// are 'num_rects' many of them.
|
|
@ -98,6 +99,9 @@ STBRP_DEF void stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int |
|
|
// arrays will probably produce worse packing results than calling it
|
|
|
// arrays will probably produce worse packing results than calling it
|
|
|
// a single time with the full rectangle array, but the option is
|
|
|
// a single time with the full rectangle array, but the option is
|
|
|
// available.
|
|
|
// available.
|
|
|
|
|
|
//
|
|
|
|
|
|
// The function returns 1 if all of the rectangles were successfully
|
|
|
|
|
|
// packed and 0 otherwise.
|
|
|
|
|
|
|
|
|
struct stbrp_rect |
|
|
struct stbrp_rect |
|
|
{ |
|
|
{ |
|
@ -520,17 +524,6 @@ static int 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); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static int rect_width_compare(const void *a, const void *b) |
|
|
|
|
|
{ |
|
|
|
|
|
const stbrp_rect *p = (const stbrp_rect *) a; |
|
|
|
|
|
const stbrp_rect *q = (const stbrp_rect *) b; |
|
|
|
|
|
if (p->w > q->w) |
|
|
|
|
|
return -1; |
|
|
|
|
|
if (p->w < q->w) |
|
|
|
|
|
return 1; |
|
|
|
|
|
return (p->h > q->h) ? -1 : (p->h < q->h); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int rect_original_order(const void *a, const void *b) |
|
|
static int 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; |
|
@ -544,9 +537,9 @@ static int rect_original_order(const void *a, const void *b) |
|
|
#define STBRP__MAXVAL 0xffff |
|
|
#define STBRP__MAXVAL 0xffff |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
STBRP_DEF void 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; |
|
|
int i, all_rects_packed = 1; |
|
|
|
|
|
|
|
|
// we use the 'was_packed' field internally to allow sorting/unsorting
|
|
|
// we use the 'was_packed' field internally to allow sorting/unsorting
|
|
|
for (i=0; i < num_rects; ++i) { |
|
|
for (i=0; i < num_rects; ++i) { |
|
@ -576,8 +569,56 @@ STBRP_DEF void stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int n |
|
|
// unsort
|
|
|
// unsort
|
|
|
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); |
|
|
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); |
|
|
|
|
|
|
|
|
// set was_packed flags
|
|
|
// set was_packed flags and all_rects_packed status
|
|
|
for (i=0; i < num_rects; ++i) |
|
|
for (i=0; i < num_rects; ++i) { |
|
|
rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); |
|
|
rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); |
|
|
|
|
|
if (!rects[i].was_packed) |
|
|
|
|
|
all_rects_packed = 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// return the all_rects_packed status
|
|
|
|
|
|
return all_rects_packed; |
|
|
} |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
------------------------------------------------------------------------------ |
|
|
|
|
|
This software is available under 2 licenses -- choose whichever you prefer. |
|
|
|
|
|
------------------------------------------------------------------------------ |
|
|
|
|
|
ALTERNATIVE A - MIT License |
|
|
|
|
|
Copyright (c) 2017 Sean Barrett |
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of |
|
|
|
|
|
this software and associated documentation files (the "Software"), to deal in |
|
|
|
|
|
the Software without restriction, including without limitation the rights to |
|
|
|
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies |
|
|
|
|
|
of the Software, and to permit persons to whom the Software is furnished to do |
|
|
|
|
|
so, subject to the following conditions: |
|
|
|
|
|
The above copyright notice and this permission notice shall be included in all |
|
|
|
|
|
copies or substantial portions of the Software. |
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
|
|
|
|
SOFTWARE. |
|
|
|
|
|
------------------------------------------------------------------------------ |
|
|
|
|
|
ALTERNATIVE B - Public Domain (www.unlicense.org) |
|
|
|
|
|
This is free and unencumbered software released into the public domain. |
|
|
|
|
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this |
|
|
|
|
|
software, either in source code form or as a compiled binary, for any purpose, |
|
|
|
|
|
commercial or non-commercial, and by any means. |
|
|
|
|
|
In jurisdictions that recognize copyright laws, the author or authors of this |
|
|
|
|
|
software dedicate any and all copyright interest in the software to the public |
|
|
|
|
|
domain. We make this dedication for the benefit of the public at large and to |
|
|
|
|
|
the detriment of our heirs and successors. We intend this dedication to be an |
|
|
|
|
|
overt act of relinquishment in perpetuity of all present and future rights to |
|
|
|
|
|
this software under copyright law. |
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
|
|
|
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
|
|
|
|
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
|
|
|
|
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
|
|
------------------------------------------------------------------------------ |
|
|
|
|
|
*/ |
|
|