From cec83e92e6160adf1e39e0173c77743cb1ff1be7 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Mon, 19 Nov 2018 15:24:32 +0100 Subject: Fix T57884: Triangle count is incorrect when above around 2 billion Maniphest Tasks: T57884 Differential Revision: https://developer.blender.org/D3962 --- source/blender/blenlib/BLI_string.h | 2 ++ source/blender/blenlib/intern/string.c | 48 +++++++++++++++++++------- source/blender/editors/space_info/info_stats.c | 18 +++++----- 3 files changed, 46 insertions(+), 22 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h index eef4e0647aa..2fb8f045841 100644 --- a/source/blender/blenlib/BLI_string.h +++ b/source/blender/blenlib/BLI_string.h @@ -33,6 +33,7 @@ */ #include +#include #ifdef __cplusplus extern "C" { @@ -71,6 +72,7 @@ char *BLI_sprintfN(const char *__restrict format, ...) ATTR_WARN_UNUSED_RESULT A size_t BLI_strescape(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL(); size_t BLI_str_format_int_grouped(char dst[16], int num) ATTR_NONNULL(); +size_t BLI_str_format_uint64_grouped(char dst[16], uint64_t num) ATTR_NONNULL(); void BLI_str_format_byte_unit(char dst[15], long long int size, const bool base_10) ATTR_NONNULL(); int BLI_strcaseeq(const char *a, const char *b) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index 938728aa4bb..3deab9b2ae9 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "MEM_guardedalloc.h" @@ -975,24 +976,13 @@ size_t BLI_str_partition_ex( return end ? (size_t)(end - str) : strlen(str); } -/** - * Format ints with decimal grouping. - * 1000 -> 1,000 - * - * \param dst The resulting string - * \param num Number to format - * \return The length of \a dst - */ -size_t BLI_str_format_int_grouped(char dst[16], int num) +size_t BLI_str_format_int_grouped_ex(char src[16], char dst[16], int num_len) { - char src[16]; char *p_src = src; char *p_dst = dst; const char separator = ','; - int num_len, commas; - - num_len = sprintf(src, "%d", num); + int commas; if (*p_src == '-') { *p_dst++ = *p_src++; @@ -1010,6 +1000,38 @@ size_t BLI_str_format_int_grouped(char dst[16], int num) return (size_t)(p_dst - dst); } +/** + * Format ints with decimal grouping. + * 1000 -> 1,000 + * + * \param dst The resulting string + * \param num Number to format + * \return The length of \a dst + */ +size_t BLI_str_format_int_grouped(char dst[16], int num) +{ + char src[16]; + int num_len = sprintf(src, "%d", num); + + return BLI_str_format_int_grouped_ex(src, dst, num_len); +} + +/** + * Format uint64_t with decimal grouping. + * 1000 -> 1,000 + * + * \param dst The resulting string + * \param num Number to format + * \return The length of \a dst + */ +size_t BLI_str_format_uint64_grouped(char dst[16], uint64_t num) +{ + char src[16]; + int num_len = sprintf(src, "%"PRIu64"",num); + + return BLI_str_format_int_grouped_ex(src, dst, num_len); +} + /** * Format a size in bytes using binary units. * 1000 -> 1 KB diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c index 1848a22a619..c842ac07eef 100644 --- a/source/blender/editors/space_info/info_stats.c +++ b/source/blender/editors/space_info/info_stats.c @@ -70,14 +70,14 @@ #define MAX_INFO_NUM_LEN 16 typedef struct SceneStats { - int totvert, totvertsel; - int totedge, totedgesel; - int totface, totfacesel; - int totbone, totbonesel; - int totobj, totobjsel; - int totlamp, totlampsel; - int tottri; - int totgplayer, totgpframe, totgpstroke, totgppoint; + uint64_t totvert, totvertsel; + uint64_t totedge, totedgesel; + uint64_t totface, totfacesel; + uint64_t totbone, totbonesel; + uint64_t totobj, totobjsel; + uint64_t totlamp, totlampsel; + uint64_t tottri; + uint64_t totgplayer, totgpframe, totgpstroke, totgppoint; char infostr[MAX_INFO_LEN]; } SceneStats; @@ -450,7 +450,7 @@ static void stats_string(ViewLayer *view_layer) /* Generate formatted numbers */ #define SCENE_STATS_FMT_INT(_id) \ - BLI_str_format_int_grouped(stats_fmt._id, stats->_id) + BLI_str_format_uint64_grouped(stats_fmt._id, stats->_id) SCENE_STATS_FMT_INT(totvert); SCENE_STATS_FMT_INT(totvertsel); -- cgit v1.2.3