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

Maniphest Tasks: T57884

Differential Revision: https://developer.blender.org/D3962
This commit is contained in:
Philipp Oeser 2018-11-19 15:24:32 +01:00
parent d3e686d61e
commit cec83e92e6
Notes: blender-bot 2023-02-14 19:45:25 +01:00
Referenced by issue #57884, Triangle count is incorrect when above around 2 billion
3 changed files with 46 additions and 22 deletions

View File

@ -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();

View File

@ -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

View File

@ -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);