[Bf-blender-cvs] [a684165cad4] experimental-build: Fix T57884: Triangle count is incorrect when above around 2 billion

Philipp Oeser noreply at git.blender.org
Wed Nov 21 15:41:45 CET 2018


Commit: a684165cad4cc3afaf89a2118e44a70555cadfae
Author: Philipp Oeser
Date:   Mon Nov 19 15:24:32 2018 +0100
Branches: experimental-build
https://developer.blender.org/rBa684165cad4cc3afaf89a2118e44a70555cadfae

Fix T57884: Triangle count is incorrect when above around 2 billion

Maniphest Tasks: T57884

Differential Revision: https://developer.blender.org/D3962

===================================================================

M	source/blender/blenlib/BLI_string.h
M	source/blender/blenlib/intern/string.c
M	source/blender/editors/space_info/info_stats.c

===================================================================

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 <stdarg.h>
+#include <inttypes.h>
 
 #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 <stdlib.h>
 #include <stdarg.h>
 #include <ctype.h>
+#include <inttypes.h>
 
 #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);



More information about the Bf-blender-cvs mailing list