31 #define qsort_r BLI_qsort_r
36 # pragma GCC diagnostic error "-Wpadded"
42 #define USE_FREE_STRIP
74 # pragma GCC diagnostic ignored "-Wpadded"
78 #define EPSILON 0.0000001f
79 #define EPSILON_MERGE 0.00001f
81 # define EPSILON_BIAS 0.000001f
87 #define CORNERFLAGS (BLF | TRF | TLF | BRF)
106 return box->
v[
BL]->
x;
111 return box->
v[
TR]->
x;
116 return box->
v[
BL]->
y;
121 return box->
v[
TR]->
y;
143 box->
v[
TR]->
x = f + box->
w;
150 box->
v[
BL]->
x = f - box->
w;
157 box->
v[
TR]->
y = f + box->
h;
164 box->
v[
BL]->
y = f - box->
h;
176 return box->
w * box->
h;
190 static float max_ff(
const float a,
const float b)
192 return b >
a ? b :
a;
205 # define BOXDEBUG(b) \
206 printf("\tBox Debug i %i, w:%.3f h:%.3f x:%.3f y:%.3f\n", b->index, b->w, b->h, b->x, b->y)
216 const BoxPack *b1 = p1, *b2 = p2;
239 static int vertex_sort(
const void *p1,
const void *p2,
void *vs_ctx_p)
248 #ifdef USE_FREE_STRIP
296 uint box_index, verts_pack_len, i, j, k;
297 uint *vertex_pack_indices;
299 float tot_x = 0.0f, tot_y = 0.0f;
317 vertex_pack_indices =
MEM_mallocN(
sizeof(
int[3]) * (
size_t)
len,
"BoxPack Indices");
321 for (box = boxarray, box_index = 0, i = 0; box_index <
len; box_index++, box++) {
372 box->
x = box->
y = 0.0f;
374 for (i = 0; i < 4; i++) {
375 box->
v[i]->
used =
true;
381 for (i = 0; i < 3; i++) {
382 vertex_pack_indices[i] = box->
v[i + 1]->
index;
389 for (box_index = 1; box_index <
len; box_index++, box++) {
395 qsort_r(vertex_pack_indices, (
size_t)verts_pack_len,
sizeof(
int),
vertex_sort, &vs_ctx);
397 #ifdef USE_FREE_STRIP
399 i = verts_pack_len - 1;
400 while ((i != 0) && vs_ctx.
vertarray[vertex_pack_indices[i]].
free == 0) {
403 verts_pack_len = i + 1;
410 for (i = 0; i < verts_pack_len && isect; i++) {
411 vert = &vs_ctx.
vertarray[vertex_pack_indices[i]];
419 for (j = 0; (j < 4) && isect; j++) {
460 for (box_test = boxarray; box_test != box; box_test++) {
519 if (vert->
tlb && vert->
trb && (box == vert->
tlb || box == vert->
trb)) {
522 # define A (vert->trb->v[TL])
523 # define B (vert->tlb->v[TR])
524 # define MASK (BLF | BRF)
527 A->free &=
B->free & ~
MASK;
531 B->free &=
A->free & ~
MASK;
543 else if (vert->
tlb->
h > vert->
trb->
h) {
550 else if (vert->
blb && vert->
brb && (box == vert->
blb || box == vert->
brb)) {
553 # define A (vert->blb->v[BR])
554 # define B (vert->brb->v[BL])
555 # define MASK (TRF | TLF)
558 A->free &=
B->free & ~
MASK;
562 B->free &=
A->free & ~
MASK;
574 else if (vert->
blb->
h > vert->
brb->
h) {
582 if (vert->
tlb && vert->
blb && (box == vert->
tlb || box == vert->
blb)) {
585 # define A (vert->blb->v[TL])
586 # define B (vert->tlb->v[BL])
587 # define MASK (TRF | BRF)
590 A->free &=
B->free & ~
MASK;
594 B->free &=
A->free & ~
MASK;
606 else if (vert->
tlb->
w > vert->
blb->
w) {
613 else if (vert->
trb && vert->
brb && (box == vert->
trb || box == vert->
brb)) {
617 # define A (vert->brb->v[TR])
618 # define B (vert->trb->v[BR])
619 # define MASK (TLF | BLF)
622 A->free &=
B->free & ~
MASK;
626 B->free &=
A->free & ~
MASK;
638 else if (vert->
trb->
w > vert->
brb->
w) {
647 for (k = 0; k < 4; k++) {
648 if (box->
v[k]->
used ==
false) {
649 box->
v[k]->
used =
true;
653 vertex_pack_indices[verts_pack_len] = box->
v[k]->
index;
673 for (box_index = 0; box_index <
len; box_index++) {
674 box = boxarray + box_index;
675 box->
v[0] = box->
v[1] = box->
v[2] = box->
v[3] =
NULL;
711 if (box->w > space->w || box->h > space->h) {
721 if (box->w == space->w && box->h == space->h) {
726 else if (box->w == space->w) {
732 else if (box->h == space->h) {
754 int area_hsplit_large = space->w * (space->h - box->h);
755 int area_vsplit_large = (space->w - box->w) * space->h;
760 if (area_hsplit_large > area_vsplit_large) {
761 new_space->x = space->x + box->w;
762 new_space->y = space->y;
763 new_space->w = space->w - box->w;
764 new_space->h = box->h;
770 new_space->x = space->x;
771 new_space->y = space->y + box->h;
772 new_space->w = box->w;
773 new_space->h = space->h - box->h;
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Strict compiler flags for areas of code we want to ensure don't do conversions without us knowing abo...
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
BLI_INLINE void box_v34x_update(BoxPack *box)
BLI_INLINE void box_v34y_update(BoxPack *box)
static int box_areasort(const void *p1, const void *p2)
static void vert_bias_update(BoxVert *v)
static float box_xmax_get(const BoxPack *box)
void BLI_box_pack_2d_fixedarea(ListBase *boxes, int width, int height, ListBase *packed)
static bool box_isect(const BoxPack *box_a, const BoxPack *box_b)
static float box_ymax_get(const BoxPack *box)
static float box_ymin_get(const BoxPack *box)
static int vertex_sort(const void *p1, const void *p2, void *vs_ctx_p)
static void box_xmin_set(BoxPack *box, const float f)
static void box_ymin_set(BoxPack *box, const float f)
static float max_ff(const float a, const float b)
static void box_ymax_set(BoxPack *box, const float f)
static float box_xmin_get(const BoxPack *box)
BLI_INLINE int quad_flag(uint q)
void BLI_box_pack_2d(BoxPack *boxarray, const uint len, float *r_tot_x, float *r_tot_y)
static float box_area(const BoxPack *box)
static void box_xmax_set(BoxPack *box, const float f)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
struct BoxPack * isect_cache[4]