Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2017-08-01 17:35:07 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2017-08-01 17:42:35 +0300
commit636289b755f6cea1167440602a06aedf5cc2e1d5 (patch)
tree52c448afa478d6829b54f5fc283352c0742ce2ec
parentc1e177ad29249a9508ee4f1c7b09f51fba9ac9e9 (diff)
Fix multi-units drawing re precision handling.
This is still far from prefect, but yet much better than what we had so far (more consistent with inheritent precision available in floats). Note that this fixes some (currently commented out) units unittests, and requires adjusting some others, will be done in next commit.
-rw-r--r--source/blender/blenkernel/intern/unit.c8
-rw-r--r--source/blender/editors/interface/interface.c10
2 files changed, 12 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index f97b89f1fd5..8606da0743b 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -375,8 +375,7 @@ static size_t unit_as_string(char *str, int len_max, double value, int prec, con
/* Adjust precision to expected number of significant digits.
* Note that here, we shall not have to worry about very big/small numbers, units are expected to replace
* 'scientific notation' in those cases. */
- const int l10 = (value_conv == 0.0) ? 0 : (int)log10(fabs(value_conv));
- prec -= l10 + (int)(l10 < 0);
+ prec -= integer_digits_d(value_conv);
CLAMP(prec, 0, 6);
/* Convert to a string */
@@ -449,12 +448,15 @@ size_t bUnit_AsString(char *str, int len_max, double value, int prec, int system
size_t i;
i = unit_as_string(str, len_max, value_a, prec, usys, unit_a, '\0');
+ prec -= integer_digits_d(value_a / unit_b->scalar) - integer_digits_d(value_b / unit_b->scalar);
+ prec = max_ii(prec, 0);
+
/* is there enough space for at least 1 char of the next unit? */
if (i + 2 < len_max) {
str[i++] = ' ';
/* use low precision since this is a smaller unit */
- i += unit_as_string(str + i, len_max - i, value_b, prec ? 1 : 0, usys, unit_b, '\0');
+ i += unit_as_string(str + i, len_max - i, value_b, prec, usys, unit_b, '\0');
}
return i;
}
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index a013f75f9e8..7ab4e1d9c35 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -2228,20 +2228,24 @@ void ui_but_string_get_ex(uiBut *but, char *str, const size_t maxlen, const int
else {
int prec = (float_precision == -1) ? ui_but_calc_float_precision(but, value) : float_precision;
if (use_exp_float) {
- const int l10 = (value == 0.0f) ? 0 : (int)log10(fabs(value));
- if (l10 < -6 || l10 > 12) {
+ const int int_digits_num = integer_digits_f(value);
+ if (int_digits_num < -6 || int_digits_num > 12) {
BLI_snprintf(str, maxlen, "%.*g", prec, value);
if (r_use_exp_float) {
*r_use_exp_float = true;
}
}
else {
- prec -= l10 + (int)(l10 < 0);
+ prec -= int_digits_num;
CLAMP(prec, 0, UI_PRECISION_FLOAT_MAX);
BLI_snprintf(str, maxlen, "%.*f", prec, value);
}
}
else {
+#if 0 /* TODO, but will likely break some stuff, so better after 2.79 release. */
+ prec -= int_digits_num;
+ CLAMP(prec, 0, UI_PRECISION_FLOAT_MAX);
+#endif
BLI_snprintf(str, maxlen, "%.*f", prec, value);
}
}