diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-02-24 07:39:20 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-02-24 07:39:20 +0400 |
commit | d120ec146d3c28b7243371b0de1edf4ba590470c (patch) | |
tree | a05f182978c6007bb9193f6ad0b4f2b210394ee8 /source/blender/blenlib | |
parent | 3df023ae82eef0ea105dc61c9730af87b59a07d1 (diff) | |
parent | 93c3593d825aafe30aaf051182e50bde4c6084dd (diff) |
Merged changes in the trunk up to revision 54802.
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r-- | source/blender/blenlib/BLI_listbase.h | 4 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_math_base.h | 23 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_math_rotation.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_scanfill.h | 3 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_string_utf8.h | 1 | ||||
-rw-r--r-- | source/blender/blenlib/intern/BLI_heap.c | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/BLI_mempool.c | 14 | ||||
-rw-r--r-- | source/blender/blenlib/intern/listbase.c | 140 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_color_inline.c | 3 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_geom.c | 5 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_rotation.c | 6 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_vector.c | 19 | ||||
-rw-r--r-- | source/blender/blenlib/intern/scanfill.c | 94 | ||||
-rw-r--r-- | source/blender/blenlib/intern/string.c | 15 | ||||
-rw-r--r-- | source/blender/blenlib/intern/string_utf8.c | 30 |
15 files changed, 225 insertions, 136 deletions
diff --git a/source/blender/blenlib/BLI_listbase.h b/source/blender/blenlib/BLI_listbase.h index d06956e39de..54cd687eeac 100644 --- a/source/blender/blenlib/BLI_listbase.h +++ b/source/blender/blenlib/BLI_listbase.h @@ -32,6 +32,7 @@ * \ingroup bli */ +#include "BLI_utildefines.h" #include "DNA_listBase.h" //struct ListBase; //struct LinkData; @@ -40,7 +41,6 @@ extern "C" { #endif -void BLI_insertlink(struct ListBase *listbase, void *vprevlink, void *vnewlink); int BLI_findindex(const struct ListBase *listbase, const void *vlink); int BLI_findstringindex(const struct ListBase *listbase, const char *id, const int offset); @@ -59,7 +59,7 @@ void *BLI_rfindptr(const struct ListBase *listbase, const void *ptr, const int o void BLI_freelistN(struct ListBase *listbase); void BLI_addtail(struct ListBase *listbase, void *vlink); void BLI_remlink(struct ListBase *listbase, void *vlink); -int BLI_remlink_safe(struct ListBase *listbase, void *vlink); +bool BLI_remlink_safe(struct ListBase *listbase, void *vlink); void BLI_addhead(struct ListBase *listbase, void *vlink); void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink); diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h index 94063c9a40a..aa4e697b48b 100644 --- a/source/blender/blenlib/BLI_math_base.h +++ b/source/blender/blenlib/BLI_math_base.h @@ -217,5 +217,26 @@ extern double round(double x); double double_round(double x, int ndigits); -#endif /* __BLI_MATH_BASE_H__ */ +/* asserts, some math functions expect normalized inputs + * check the vector is unit length, or zero length (which can't be helped in some cases). + */ +#ifdef DEBUG +/* note: 0.0001 is too small becaues normals may be converted from short's: see [#34322] */ +# define BLI_ASSERT_UNIT_EPSILON 0.0002f +# define BLI_ASSERT_UNIT_V3(v) { \ + const float _test_unit = len_squared_v3(v); \ + BLI_assert((fabsf(_test_unit - 1.0f) < BLI_ASSERT_UNIT_EPSILON) || \ + (fabsf(_test_unit) < BLI_ASSERT_UNIT_EPSILON)); \ +} (void)0 + +# define BLI_ASSERT_UNIT_V2(v) { \ + const float _test_unit = len_squared_v2(v); \ + BLI_assert((fabsf(_test_unit - 1.0f) < BLI_ASSERT_UNIT_EPSILON) || \ + (fabsf(_test_unit) < BLI_ASSERT_UNIT_EPSILON)); \ +} (void)0 +#else +# define BLI_ASSERT_UNIT_V2(v) (void)0 +# define BLI_ASSERT_UNIT_V3(v) (void)0 +#endif +#endif /* __BLI_MATH_BASE_H__ */ diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h index e349a05ac23..5ba37d70ca5 100644 --- a/source/blender/blenlib/BLI_math_rotation.h +++ b/source/blender/blenlib/BLI_math_rotation.h @@ -186,6 +186,8 @@ float fov_to_focallength(float fov, float sensor); float angle_wrap_rad(float angle); float angle_wrap_deg(float angle); +float angle_compat_rad(float angle, float angle_compat); + int mat3_from_axis_conversion(int from_forward, int from_up, int to_forward, int to_up, float r_mat[3][3]); diff --git a/source/blender/blenlib/BLI_scanfill.h b/source/blender/blenlib/BLI_scanfill.h index 7830c0675b4..ce2c6a4252f 100644 --- a/source/blender/blenlib/BLI_scanfill.h +++ b/source/blender/blenlib/BLI_scanfill.h @@ -72,7 +72,8 @@ typedef struct ScanFillVert { float xy[2]; /* 2D copy of vertex location (using dominant axis) */ unsigned int keyindex; /* original index #, for restoring key information */ short poly_nr; - unsigned char f, h; + unsigned char edge_tot; /* number of edges using this vertex */ + unsigned char f; } ScanFillVert; typedef struct ScanFillEdge { diff --git a/source/blender/blenlib/BLI_string_utf8.h b/source/blender/blenlib/BLI_string_utf8.h index ecbc4cb1cd4..30d5c28bf98 100644 --- a/source/blender/blenlib/BLI_string_utf8.h +++ b/source/blender/blenlib/BLI_string_utf8.h @@ -41,6 +41,7 @@ int BLI_str_utf8_size_safe(const char *p); /* copied from glib */ unsigned int BLI_str_utf8_as_unicode(const char *p); unsigned int BLI_str_utf8_as_unicode_and_size(const char *__restrict p, size_t *__restrict index); +unsigned int BLI_str_utf8_as_unicode_and_size_safe(const char *__restrict p, size_t *__restrict index); unsigned int BLI_str_utf8_as_unicode_step(const char *__restrict p, size_t *__restrict index); size_t BLI_str_utf8_from_unicode(unsigned int c, char *outbuf); diff --git a/source/blender/blenlib/intern/BLI_heap.c b/source/blender/blenlib/intern/BLI_heap.c index dcc028630e2..aa54969b6f8 100644 --- a/source/blender/blenlib/intern/BLI_heap.c +++ b/source/blender/blenlib/intern/BLI_heap.c @@ -167,7 +167,7 @@ HeapNode *BLI_heap_insert(Heap *heap, float value, void *ptr) heap->freenodes = (HeapNode *)(((HeapNode *)heap->freenodes)->ptr); } else { - node = (HeapNode *)BLI_memarena_alloc(heap->arena, sizeof *node); + node = (HeapNode *)BLI_memarena_alloc(heap->arena, sizeof(*node)); } node->value = value; diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c index 7670b057a7f..5f0c90f234d 100644 --- a/source/blender/blenlib/intern/BLI_mempool.c +++ b/source/blender/blenlib/intern/BLI_mempool.c @@ -54,6 +54,9 @@ #define FREEWORD MAKE_ID('f', 'r', 'e', 'e') +/* currently totalloc isnt used */ +// #define USE_TOTALLOC + typedef struct BLI_freenode { struct BLI_freenode *next; int freeword; /* used to identify this as a freed node */ @@ -110,6 +113,7 @@ BLI_mempool *BLI_mempool_create(int esize, int totelem, int pchunk, int flag) pool->pchunk = pchunk; pool->csize = esize * pchunk; pool->chunks.first = pool->chunks.last = NULL; + pool->totalloc = 0; pool->totused = 0; maxchunks = totelem / pchunk + 1; @@ -159,10 +163,11 @@ BLI_mempool *BLI_mempool_create(int esize, int totelem, int pchunk, int flag) } } - /* set the end of this chunks memoryy to the new tail for next iteration */ + /* set the end of this chunks memory to the new tail for next iteration */ lasttail = curnode; - +#ifdef USE_TOTALLOC pool->totalloc += pool->pchunk; +#endif } /* terminate the list */ curnode->next = NULL; @@ -213,8 +218,9 @@ void *BLI_mempool_alloc(BLI_mempool *pool) } } curnode->next = NULL; /* terminate the list */ - +#ifdef USE_TOTALLOC pool->totalloc += pool->pchunk; +#endif } retval = pool->free; @@ -282,7 +288,9 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr) } BLI_addtail(&pool->chunks, first); +#ifdef USE_TOTALLOC pool->totalloc = pool->pchunk; +#endif pool->free = first->data; /* start of the list */ for (tmpaddr = first->data, i = 0; i < pool->pchunk; i++) { diff --git a/source/blender/blenlib/intern/listbase.c b/source/blender/blenlib/intern/listbase.c index c60a9ae6bfc..348efaf40a9 100644 --- a/source/blender/blenlib/intern/listbase.c +++ b/source/blender/blenlib/intern/listbase.c @@ -28,9 +28,10 @@ /** \file blender/blenlib/intern/listbase.c * \ingroup bli + * + * Manipulations on ListBase structs */ - #include <string.h> #include <stdlib.h> @@ -41,10 +42,11 @@ #include "BLI_listbase.h" - /* implementation */ -/* Ripped this from blender.c */ +/** + * moves the entire contents of \a src onto the end of \a dst. + */ void BLI_movelisttolist(ListBase *dst, ListBase *src) { if (src->first == NULL) return; @@ -61,6 +63,9 @@ void BLI_movelisttolist(ListBase *dst, ListBase *src) src->first = src->last = NULL; } +/** + * Prepends \a vlink (assumed to begin with a Link) onto listbase. + */ void BLI_addhead(ListBase *listbase, void *vlink) { Link *link = vlink; @@ -77,6 +82,9 @@ void BLI_addhead(ListBase *listbase, void *vlink) } +/** + * Appends \a vlink (assumed to begin with a Link) onto listbase. + */ void BLI_addtail(ListBase *listbase, void *vlink) { Link *link = vlink; @@ -93,6 +101,9 @@ void BLI_addtail(ListBase *listbase, void *vlink) } +/** + * Removes \a vlink from \a listbase. Assumes it is linked into there! + */ void BLI_remlink(ListBase *listbase, void *vlink) { Link *link = vlink; @@ -107,18 +118,24 @@ void BLI_remlink(ListBase *listbase, void *vlink) if (listbase->first == link) listbase->first = link->next; } -int BLI_remlink_safe(ListBase *listbase, void *vlink) +/** + * Checks that \a vlink is linked into listbase, removing it from there if so. + */ +bool BLI_remlink_safe(ListBase *listbase, void *vlink) { if (BLI_findindex(listbase, vlink) != -1) { BLI_remlink(listbase, vlink); - return 1; + return true; } else { - return 0; + return false; } } +/** + * Removes \a vlink from listbase and disposes of it. Assumes it is linked into there! + */ void BLI_freelinkN(ListBase *listbase, void *vlink) { Link *link = vlink; @@ -131,43 +148,11 @@ void BLI_freelinkN(ListBase *listbase, void *vlink) } -void BLI_insertlink(ListBase *listbase, void *vprevlink, void *vnewlink) -{ - Link *prevlink = vprevlink; - Link *newlink = vnewlink; - - /* newlink comes after prevlink */ - if (newlink == NULL) return; - if (listbase == NULL) return; - - /* empty list */ - if (listbase->first == NULL) { - - listbase->first = newlink; - listbase->last = newlink; - return; - } - - /* insert before first element */ - if (prevlink == NULL) { - newlink->next = listbase->first; - newlink->prev = NULL; - newlink->next->prev = newlink; - listbase->first = newlink; - return; - } - - /* at end of list */ - if (listbase->last == prevlink) - listbase->last = newlink; - - newlink->next = prevlink->next; - prevlink->next = newlink; - if (newlink->next) newlink->next->prev = newlink; - newlink->prev = prevlink; -} - -/* This uses insertion sort, so NOT ok for large list */ +/** + * Sorts the elements of listbase into the order defined by cmp + * (which should return 1 iff its first arg should come after its second arg). + * This uses insertion sort, so NOT ok for large list. + */ void BLI_sortlist(ListBase *listbase, int (*cmp)(void *, void *)) { Link *current = NULL; @@ -193,6 +178,10 @@ void BLI_sortlist(ListBase *listbase, int (*cmp)(void *, void *)) } } +/** + * Inserts \a vnewlink immediately following \a vprevlink in \a listbase. + * Or, if \a vprevlink is NULL, puts \a vnewlink at the front of the list. + */ void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) { Link *prevlink = vprevlink; @@ -213,21 +202,28 @@ void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) if (prevlink == NULL) { newlink->prev = NULL; newlink->next = listbase->first; - ((Link *)listbase->first)->prev = newlink; + newlink->next->prev = newlink; listbase->first = newlink; return; } /* at end of list */ - if (listbase->last == prevlink) + if (listbase->last == prevlink) { listbase->last = newlink; + } newlink->next = prevlink->next; newlink->prev = prevlink; prevlink->next = newlink; - if (newlink->next) newlink->next->prev = newlink; + if (newlink->next) { + newlink->next->prev = newlink; + } } +/** + * Inserts \a vnewlink immediately preceding \a vnextlink in listbase. + * Or, if \a vnextlink is NULL, puts \a vnewlink at the end of the list. + */ void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink) { Link *nextlink = vnextlink; @@ -254,16 +250,22 @@ void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink) } /* at beginning of list */ - if (listbase->first == nextlink) + if (listbase->first == nextlink) { listbase->first = newlink; + } newlink->next = nextlink; newlink->prev = nextlink->prev; nextlink->prev = newlink; - if (newlink->prev) newlink->prev->next = newlink; + if (newlink->prev) { + newlink->prev->next = newlink; + } } +/** + * Removes and disposes of the entire contents of listbase using direct free(3). + */ void BLI_freelist(ListBase *listbase) { Link *link, *next; @@ -282,6 +284,9 @@ void BLI_freelist(ListBase *listbase) listbase->last = NULL; } +/** + * Removes and disposes of the entire contents of \a listbase using guardedalloc. + */ void BLI_freelistN(ListBase *listbase) { Link *link, *next; @@ -300,6 +305,9 @@ void BLI_freelistN(ListBase *listbase) } +/** + * Returns the number of elements in \a listbase. + */ int BLI_countlist(const ListBase *listbase) { Link *link; @@ -315,6 +323,9 @@ int BLI_countlist(const ListBase *listbase) return count; } +/** + * Returns the nth element of \a listbase, numbering from 1. + */ void *BLI_findlink(const ListBase *listbase, int number) { Link *link = NULL; @@ -330,6 +341,9 @@ void *BLI_findlink(const ListBase *listbase, int number) return link; } +/** + * Returns the nth-last element of \a listbase, numbering from 1. + */ void *BLI_rfindlink(const ListBase *listbase, int number) { Link *link = NULL; @@ -345,6 +359,9 @@ void *BLI_rfindlink(const ListBase *listbase, int number) return link; } +/** + * Returns the position of \a vlink within \a listbase, numbering from 1, or -1 if not found. + */ int BLI_findindex(const ListBase *listbase, const void *vlink) { Link *link = NULL; @@ -365,6 +382,10 @@ int BLI_findindex(const ListBase *listbase, const void *vlink) return -1; } +/** + * Finds the first element of \a listbase which contains the null-terminated + * string \a id at the specified offset, returning NULL if not found. + */ void *BLI_findstring(const ListBase *listbase, const char *id, const int offset) { Link *link = NULL; @@ -383,6 +404,10 @@ void *BLI_findstring(const ListBase *listbase, const char *id, const int offset) return NULL; } /* same as above but find reverse */ +/** + * Finds the last element of \a listbase which contains the + * null-terminated string \a id at the specified offset, returning NULL if not found. + */ void *BLI_rfindstring(const ListBase *listbase, const char *id, const int offset) { Link *link = NULL; @@ -401,6 +426,10 @@ void *BLI_rfindstring(const ListBase *listbase, const char *id, const int offset return NULL; } +/** + * Finds the first element of \a listbase which contains a pointer to the + * null-terminated string \a id at the specified offset, returning NULL if not found. + */ void *BLI_findstring_ptr(const ListBase *listbase, const char *id, const int offset) { Link *link = NULL; @@ -420,6 +449,10 @@ void *BLI_findstring_ptr(const ListBase *listbase, const char *id, const int off return NULL; } /* same as above but find reverse */ +/** + * Finds the last element of \a listbase which contains a pointer to the + * null-terminated string \a id at the specified offset, returning NULL if not found. + */ void *BLI_rfindstring_ptr(const ListBase *listbase, const char *id, const int offset) { Link *link = NULL; @@ -440,6 +473,8 @@ void *BLI_rfindstring_ptr(const ListBase *listbase, const char *id, const int of } void *BLI_findptr(const ListBase *listbase, const void *ptr, const int offset) +/* finds the first element of listbase which contains the specified pointer value +at the specified offset, returning NULL if not found. */ { Link *link = NULL; const void *ptr_iter; @@ -448,7 +483,7 @@ void *BLI_findptr(const ListBase *listbase, const void *ptr, const int offset) for (link = listbase->first; link; link = link->next) { /* exact copy of BLI_findstring(), except for this line */ - ptr_iter = *((const char **)(((const char *)link) + offset)); + ptr_iter = *((const void **)(((const char *)link) + offset)); if (ptr == ptr_iter) { return link; @@ -459,6 +494,8 @@ void *BLI_findptr(const ListBase *listbase, const void *ptr, const int offset) } /* same as above but find reverse */ void *BLI_rfindptr(const ListBase *listbase, const void *ptr, const int offset) +/* finds the last element of listbase which contains the specified pointer value +at the specified offset, returning NULL if not found. */ { Link *link = NULL; const void *ptr_iter; @@ -467,7 +504,7 @@ void *BLI_rfindptr(const ListBase *listbase, const void *ptr, const int offset) for (link = listbase->last; link; link = link->prev) { /* exact copy of BLI_rfindstring(), except for this line */ - ptr_iter = *((const char **)(((const char *)link) + offset)); + ptr_iter = *((const void **)(((const char *)link) + offset)); if (ptr == ptr_iter) { return link; @@ -478,6 +515,8 @@ void *BLI_rfindptr(const ListBase *listbase, const void *ptr, const int offset) } int BLI_findstringindex(const ListBase *listbase, const char *id, const int offset) +/* returns the 1-based index of the first element of listbase which contains the specified +null-terminated string at the specified offset, or -1 if not found. */ { Link *link = NULL; const char *id_iter; @@ -499,6 +538,7 @@ int BLI_findstringindex(const ListBase *listbase, const char *id, const int offs } void BLI_duplicatelist(ListBase *dst, const ListBase *src) +/* sets dst to a duplicate of the entire contents of src. dst may be the same as src. */ { struct Link *dst_link, *src_link; diff --git a/source/blender/blenlib/intern/math_color_inline.c b/source/blender/blenlib/intern/math_color_inline.c index c24da9fcf80..e9a1c0abc38 100644 --- a/source/blender/blenlib/intern/math_color_inline.c +++ b/source/blender/blenlib/intern/math_color_inline.c @@ -174,7 +174,8 @@ MINLINE void srgb_to_linearrgb_uchar4_predivide(float linear[4], const unsigned } /* color macros for themes */ -#define rgba_char_args_set_fl(col, r, g, b, a) rgba_char_args_set(col, r * 255, g * 255, b * 255, a * 255) +#define rgba_char_args_set_fl(col, r, g, b, a) \ + rgba_char_args_set(col, (r) * 255, (g) * 255, (b) * 255, (a) * 255) MINLINE void rgba_char_args_set(char col[4], const char r, const char g, const char b, const char a) { diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 810c15437dc..baca7bb8f8a 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -2001,10 +2001,7 @@ bool axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3]) float angle; /* double check they are normalized */ -#ifdef DEBUG - float test; - BLI_assert(fabsf((test = len_squared_v3(normal)) - 1.0f) < 0.0001f || fabsf(test) < 0.0001f); -#endif + BLI_ASSERT_UNIT_V3(normal); cross_v3_v3v3(axis, normal, up); angle = saacos(dot_v3v3(normal, up)); diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c index c0ea817ae4a..26576b2dcb2 100644 --- a/source/blender/blenlib/intern/math_rotation.c +++ b/source/blender/blenlib/intern/math_rotation.c @@ -1740,6 +1740,12 @@ float angle_wrap_deg(float angle) return mod_inline(angle + 180.0f, 360.0f) - 180.0f; } +/* returns an angle compatible with angle_compat */ +float angle_compat_rad(float angle, float angle_compat) +{ + return angle + (floorf(((angle_compat - angle) / (float)M_PI) + 0.5f)) * (float)M_PI; +} + /* axis conversion */ static float _axis_convert_matrix[23][3][3] = { {{-1.0, 0.0, 0.0}, {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}}, diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c index 490ed2a99fb..58d444f5794 100644 --- a/source/blender/blenlib/intern/math_vector.c +++ b/source/blender/blenlib/intern/math_vector.c @@ -235,11 +235,8 @@ float angle_signed_v2v2(const float v1[2], const float v2[2]) float angle_normalized_v3v3(const float v1[3], const float v2[3]) { /* double check they are normalized */ -#ifdef DEBUG - float test; - BLI_assert(fabsf((test = len_squared_v3(v1)) - 1.0f) < 0.0001f || fabsf(test) < 0.0001f); - BLI_assert(fabsf((test = len_squared_v3(v2)) - 1.0f) < 0.0001f || fabsf(test) < 0.0001f); -#endif + BLI_ASSERT_UNIT_V3(v1); + BLI_ASSERT_UNIT_V3(v2); /* this is the same as acos(dot_v3v3(v1, v2)), but more accurate */ if (dot_v3v3(v1, v2) < 0.0f) { @@ -258,11 +255,8 @@ float angle_normalized_v3v3(const float v1[3], const float v2[3]) float angle_normalized_v2v2(const float v1[2], const float v2[2]) { /* double check they are normalized */ -#ifdef DEBUG - float test; - BLI_assert(fabsf((test = len_squared_v2(v1)) - 1.0f) < 0.0001f || fabsf(test) < 0.0001f); - BLI_assert(fabsf((test = len_squared_v2(v2)) - 1.0f) < 0.0001f || fabsf(test) < 0.0001f); -#endif + BLI_ASSERT_UNIT_V2(v1); + BLI_ASSERT_UNIT_V2(v2); /* this is the same as acos(dot_v3v3(v1, v2)), but more accurate */ if (dot_v2v2(v1, v2) < 0.0f) { @@ -449,10 +443,7 @@ void rotate_normalized_v3_v3v3fl(float r[3], const float p[3], const float axis[ const float sintheta = sin(angle); /* double check they are normalized */ -#ifdef DEBUG - float test; - BLI_assert(fabsf((test = len_squared_v3(axis)) - 1.0f) < 0.0001f || fabsf(test) < 0.0001f); -#endif + BLI_ASSERT_UNIT_V3(axis); r[0] = ((costheta + (1 - costheta) * axis[0] * axis[0]) * p[0]) + (((1 - costheta) * axis[0] * axis[1] - axis[2] * sintheta) * p[1]) + diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c index 298e37137ce..4d42d71f490 100644 --- a/source/blender/blenlib/intern/scanfill.c +++ b/source/blender/blenlib/intern/scanfill.c @@ -95,7 +95,7 @@ typedef struct ScanFillVertLink { #define SF_EPSILON 0.00003f -#define SF_VERT_UNKNOWN 1 /* TODO, what is this for exactly? - need to document it! */ +#define SF_VERT_AVAILABLE 1 /* available - in an edge */ #define SF_VERT_ZERO_LEN 255 /* Optionally set ScanFillEdge f to this to mark original boundary edges. @@ -424,7 +424,7 @@ static void testvertexnearedge(ScanFillContext *sf_ctx) ScanFillEdge *eed, *ed1; for (eve = sf_ctx->fillvertbase.first; eve; eve = eve->next) { - if (eve->h == 1) { + if (eve->edge_tot == 1) { /* find the edge which has vertex eve, * note: we _know_ this will crash if 'ed1' becomes NULL * but this will never happen. */ @@ -444,14 +444,14 @@ static void testvertexnearedge(ScanFillContext *sf_ctx) if (eve != eed->v1 && eve != eed->v2 && eve->poly_nr == eed->poly_nr) { if (compare_v3v3(eve->co, eed->v1->co, SF_EPSILON)) { ed1->v2 = eed->v1; - eed->v1->h++; - eve->h = 0; + eed->v1->edge_tot++; + eve->edge_tot = 0; break; } else if (compare_v3v3(eve->co, eed->v2->co, SF_EPSILON)) { ed1->v2 = eed->v2; - eed->v2->h++; - eve->h = 0; + eed->v2->edge_tot++; + eve->edge_tot = 0; break; } else { @@ -465,7 +465,7 @@ static void testvertexnearedge(ScanFillContext *sf_ctx) ed1->f = 0; ed1->poly_nr = eed->poly_nr; eed->v1 = eve; - eve->h = 3; + eve->edge_tot = 3; break; } } @@ -646,14 +646,14 @@ static int scanfill(ScanFillContext *sf_ctx, PolyFill *pf, const int flag) ed1 = sc->edge_first; while (ed1) { /* set connectflags */ nexted = ed1->next; - if (ed1->v1->h == 1 || ed1->v2->h == 1) { + if (ed1->v1->edge_tot == 1 || ed1->v2->edge_tot == 1) { BLI_remlink((ListBase *)&(sc->edge_first), ed1); BLI_addtail(&sf_ctx->filledgebase, ed1); - if (ed1->v1->h > 1) ed1->v1->h--; - if (ed1->v2->h > 1) ed1->v2->h--; + if (ed1->v1->edge_tot > 1) ed1->v1->edge_tot--; + if (ed1->v2->edge_tot > 1) ed1->v2->edge_tot--; } else { - ed1->v2->f = SF_VERT_UNKNOWN; + ed1->v2->f = SF_VERT_AVAILABLE; } ed1 = nexted; @@ -674,8 +674,8 @@ static int scanfill(ScanFillContext *sf_ctx, PolyFill *pf, const int flag) /* printf("just 1 edge to vert\n"); */ BLI_addtail(&sf_ctx->filledgebase, ed1); ed1->v2->f = 0; - ed1->v1->h--; - ed1->v2->h--; + ed1->v1->edge_tot--; + ed1->v2->edge_tot--; } else { /* test rest of vertices */ @@ -742,10 +742,10 @@ static int scanfill(ScanFillContext *sf_ctx, PolyFill *pf, const int flag) ed3 = BLI_scanfill_edge_add(sf_ctx, v2, best_sc->vert); BLI_remlink(&sf_ctx->filledgebase, ed3); BLI_insertlinkbefore((ListBase *)&(sc->edge_first), ed2, ed3); - ed3->v2->f = SF_VERT_UNKNOWN; + ed3->v2->f = SF_VERT_AVAILABLE; ed3->f = SF_EDGE_UNKNOWN; - ed3->v1->h++; - ed3->v2->h++; + ed3->v1->edge_tot++; + ed3->v2->edge_tot++; } else { /* new triangle */ @@ -755,31 +755,31 @@ static int scanfill(ScanFillContext *sf_ctx, PolyFill *pf, const int flag) BLI_remlink((ListBase *)&(sc->edge_first), ed1); BLI_addtail(&sf_ctx->filledgebase, ed1); ed1->v2->f = 0; - ed1->v1->h--; - ed1->v2->h--; + ed1->v1->edge_tot--; + ed1->v2->edge_tot--; /* ed2 can be removed when it's a boundary edge */ if ((ed2->f == 0 && twoconnected) || (ed2->f == SF_EDGE_BOUNDARY)) { BLI_remlink((ListBase *)&(sc->edge_first), ed2); BLI_addtail(&sf_ctx->filledgebase, ed2); ed2->v2->f = 0; - ed2->v1->h--; - ed2->v2->h--; + ed2->v1->edge_tot--; + ed2->v2->edge_tot--; } /* new edge */ ed3 = BLI_scanfill_edge_add(sf_ctx, v1, v3); BLI_remlink(&sf_ctx->filledgebase, ed3); ed3->f = SF_EDGE_UNKNOWN; - ed3->v1->h++; - ed3->v2->h++; + ed3->v1->edge_tot++; + ed3->v2->edge_tot++; /* printf("add new edge %x %x\n", v1, v3); */ sc1 = addedgetoscanlist(sf_ctx, ed3, verts); if (sc1) { /* ed3 already exists: remove if a boundary */ /* printf("Edge exists\n"); */ - ed3->v1->h--; - ed3->v2->h--; + ed3->v1->edge_tot--; + ed3->v2->edge_tot--; ed3 = sc1->edge_first; while (ed3) { @@ -787,8 +787,8 @@ static int scanfill(ScanFillContext *sf_ctx, PolyFill *pf, const int flag) if (twoconnected || ed3->f == SF_EDGE_BOUNDARY) { BLI_remlink((ListBase *)&(sc1->edge_first), ed3); BLI_addtail(&sf_ctx->filledgebase, ed3); - ed3->v1->h--; - ed3->v2->h--; + ed3->v1->edge_tot--; + ed3->v2->edge_tot--; } break; } @@ -797,19 +797,21 @@ static int scanfill(ScanFillContext *sf_ctx, PolyFill *pf, const int flag) } } } + /* test for loose edges */ ed1 = sc->edge_first; while (ed1) { nexted = ed1->next; - if (ed1->v1->h < 2 || ed1->v2->h < 2) { + if (ed1->v1->edge_tot < 2 || ed1->v2->edge_tot < 2) { BLI_remlink((ListBase *)&(sc->edge_first), ed1); BLI_addtail(&sf_ctx->filledgebase, ed1); - if (ed1->v1->h > 1) ed1->v1->h--; - if (ed1->v2->h > 1) ed1->v2->h--; + if (ed1->v1->edge_tot > 1) ed1->v1->edge_tot--; + if (ed1->v2->edge_tot > 1) ed1->v2->edge_tot--; } ed1 = nexted; } + /* done with loose edges */ } sc++; @@ -861,7 +863,7 @@ int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag, const float no while (eve) { eve->f = 0; eve->poly_nr = 0; - eve->h = 0; + eve->edge_tot = 0; eve = eve->next; a += 1; } @@ -899,15 +901,15 @@ int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag, const float no eed = sf_ctx->filledgebase.first; while (eed) { eed->poly_nr = 0; - eed->v1->f = SF_VERT_UNKNOWN; - eed->v2->f = SF_VERT_UNKNOWN; + eed->v1->f = SF_VERT_AVAILABLE; + eed->v2->f = SF_VERT_AVAILABLE; eed = eed->next; } eve = sf_ctx->fillvertbase.first; while (eve) { - if (eve->f & SF_VERT_UNKNOWN) { + if (eve->f & SF_VERT_AVAILABLE) { ok = 1; break; } @@ -1017,8 +1019,8 @@ int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag, const float no /* STEP 2: remove loose edges and strings of edges */ eed = sf_ctx->filledgebase.first; while (eed) { - if (eed->v1->h++ > 250) break; - if (eed->v2->h++ > 250) break; + if (eed->v1->edge_tot++ > 250) break; + if (eed->v2->edge_tot++ > 250) break; eed = eed->next; } if (eed) { @@ -1039,14 +1041,14 @@ int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag, const float no while (eed) { if (toggle & 1) nexted = eed->next; else nexted = eed->prev; - if (eed->v1->h == 1) { - eed->v2->h--; + if (eed->v1->edge_tot == 1) { + eed->v2->edge_tot--; BLI_remlink(&sf_ctx->fillvertbase, eed->v1); BLI_remlink(&sf_ctx->filledgebase, eed); ok = 1; } - else if (eed->v2->h == 1) { - eed->v1->h--; + else if (eed->v2->edge_tot == 1) { + eed->v1->edge_tot--; BLI_remlink(&sf_ctx->fillvertbase, eed->v2); BLI_remlink(&sf_ctx->filledgebase, eed); ok = 1; @@ -1061,13 +1063,13 @@ int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag, const float no /* CURRENT STATUS: - * - eve->f :1 = available in edges - * - eve->xs :polynumber - * - eve->h :amount of edges connected to vertex - * - eve->tmp.v :store! original vertex number + * - eve->f :1 = available in edges + * - eve->poly_nr :polynumber + * - eve->edge_tot :amount of edges connected to vertex + * - eve->tmp.v :store! original vertex number * - * - eed->f :1 = boundary edge (optionally set by caller) - * - eed->poly_nr :poly number + * - eed->f :1 = boundary edge (optionally set by caller) + * - eed->poly_nr :poly number */ @@ -1096,7 +1098,7 @@ int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag, const float no min_xy_p[1] = (min_xy_p[1]) < (eve->xy[1]) ? (min_xy_p[1]) : (eve->xy[1]); max_xy_p[0] = (max_xy_p[0]) > (eve->xy[0]) ? (max_xy_p[0]) : (eve->xy[0]); max_xy_p[1] = (max_xy_p[1]) > (eve->xy[1]) ? (max_xy_p[1]) : (eve->xy[1]); - if (eve->h > 2) pflist[eve->poly_nr - 1].f = 1; + if (eve->edge_tot > 2) pflist[eve->poly_nr - 1].f = 1; eve = eve->next; } diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index 28fdf7b61db..3500f3f1805 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -199,12 +199,15 @@ char *BLI_str_quoted_substrN(const char *__restrict str, const char *__restrict /* get the starting point (i.e. where prefix starts, and add prefixLen+1 to it to get be after the first " */ startMatch = strstr(str, prefix) + prefixLen + 1; - - /* get the end point (i.e. where the next occurance of " is after the starting point) */ - endMatch = strchr(startMatch, '"'); /* " NOTE: this comment here is just so that my text editor still shows the functions ok... */ - - /* return the slice indicated */ - return BLI_strdupn(startMatch, (size_t)(endMatch - startMatch)); + if (startMatch) { + /* get the end point (i.e. where the next occurance of " is after the starting point) */ + endMatch = strchr(startMatch, '"'); /* " NOTE: this comment here is just so that my text editor still shows the functions ok... */ + + if (endMatch) + /* return the slice indicated */ + return BLI_strdupn(startMatch, (size_t)(endMatch - startMatch)); + } + return BLI_strdupn("", 0); } /* Replaces all occurrences of oldText with newText in str, returning a new string that doesn't diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c index 9e0f9197ca3..26235de4dd2 100644 --- a/source/blender/blenlib/intern/string_utf8.c +++ b/source/blender/blenlib/intern/string_utf8.c @@ -369,7 +369,7 @@ size_t BLI_strncpy_wchar_from_utf8(wchar_t *__restrict dst_w, const char *__rest int BLI_str_utf8_size(const char *p) { int mask = 0, len; - unsigned char c = (unsigned char) *p; + const unsigned char c = (unsigned char) *p; UTF8_COMPUTE (c, mask, len, -1); @@ -382,7 +382,7 @@ int BLI_str_utf8_size(const char *p) int BLI_str_utf8_size_safe(const char *p) { int mask = 0, len; - unsigned char c = (unsigned char) *p; + const unsigned char c = (unsigned char) *p; UTF8_COMPUTE (c, mask, len, 1); @@ -408,10 +408,10 @@ unsigned int BLI_str_utf8_as_unicode(const char *p) { int i, mask = 0, len; unsigned int result; - unsigned char c = (unsigned char) *p; + const unsigned char c = (unsigned char) *p; UTF8_COMPUTE (c, mask, len, -1); - if (len == -1) + if (UNLIKELY(len == -1)) return BLI_UTF8_ERR; UTF8_GET (result, p, i, mask, len, BLI_UTF8_ERR); @@ -423,16 +423,32 @@ unsigned int BLI_str_utf8_as_unicode_and_size(const char *__restrict p, size_t * { int i, mask = 0, len; unsigned int result; - unsigned char c = (unsigned char) *p; + const unsigned char c = (unsigned char) *p; UTF8_COMPUTE (c, mask, len, -1); - if (len == -1) + if (UNLIKELY(len == -1)) return BLI_UTF8_ERR; UTF8_GET (result, p, i, mask, len, BLI_UTF8_ERR); *index += len; return result; } +unsigned int BLI_str_utf8_as_unicode_and_size_safe(const char *__restrict p, size_t *__restrict index) +{ + int i, mask = 0, len; + unsigned int result; + const unsigned char c = (unsigned char) *p; + + UTF8_COMPUTE (c, mask, len, -1); + if (UNLIKELY(len == -1)) { + *index += 1; + return c; + } + UTF8_GET (result, p, i, mask, len, BLI_UTF8_ERR); + *index += len; + return result; +} + /* another variant that steps over the index, * note, currently this also falls back to latin1 for text drawing. */ unsigned int BLI_str_utf8_as_unicode_step(const char *__restrict p, size_t *__restrict index) @@ -445,7 +461,7 @@ unsigned int BLI_str_utf8_as_unicode_step(const char *__restrict p, size_t *__re c = (unsigned char) *p; UTF8_COMPUTE (c, mask, len, -1); - if (len == -1) { + if (UNLIKELY(len == -1)) { /* when called with NULL end, result will never be NULL, * checks for a NULL character */ char *p_next = BLI_str_find_next_char_utf8(p, NULL); |