[Bf-blender-cvs] [b6cb7b2c92b] master: Fix two issues with recent changes to number display while editing them.

Bastien Montagne noreply at git.blender.org
Mon Jul 31 15:48:51 CEST 2017


Commit: b6cb7b2c92bfa3fa111e4e363f723baadc56ed3c
Author: Bastien Montagne
Date:   Mon Jul 31 15:40:26 2017 +0200
Branches: master
https://developer.blender.org/rBb6cb7b2c92bfa3fa111e4e363f723baadc56ed3c

Fix two issues with recent changes to number display while editing them.

* Numbers with units (especially, angles) where not handled correctly
regarding number of significant digits (spotted by @brecht in T52222
comment, thanks).
* Zero value has no valid log, need to take that into account!

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

M	source/blender/blenkernel/intern/unit.c
M	source/blender/editors/interface/interface.c

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

diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index c0a373395dc..f97b89f1fd5 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -372,6 +372,13 @@ static size_t unit_as_string(char *str, int len_max, double value, int prec, con
 
 	value_conv = value / unit->scalar;
 
+	/* 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);
+	CLAMP(prec, 0, 6);
+
 	/* Convert to a string */
 	len = BLI_snprintf_rlen(str, len_max, "%.*f", prec, value_conv);
 
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 0dc7c6ccbec..a013f75f9e8 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -2226,9 +2226,9 @@ void ui_but_string_get_ex(uiBut *but, char *str, const size_t maxlen, const int
 				ui_get_but_string_unit(but, str, maxlen, value, false, float_precision);
 			}
 			else {
-				const int prec = (float_precision == -1) ? ui_but_calc_float_precision(but, value) : float_precision;
+				int prec = (float_precision == -1) ? ui_but_calc_float_precision(but, value) : float_precision;
 				if (use_exp_float) {
-					const int l10 = (int)log10(fabs(value));
+					const int l10 = (value == 0.0f) ? 0 : (int)log10(fabs(value));
 					if (l10 < -6 || l10 > 12) {
 						BLI_snprintf(str, maxlen, "%.*g", prec, value);
 						if (r_use_exp_float) {
@@ -2236,7 +2236,9 @@ void ui_but_string_get_ex(uiBut *but, char *str, const size_t maxlen, const int
 						}
 					}
 					else {
-						BLI_snprintf(str, maxlen, "%.*f", prec - l10 + (int)(l10 < 0), value);
+						prec -= l10 + (int)(l10 < 0);
+						CLAMP(prec, 0, UI_PRECISION_FLOAT_MAX);
+						BLI_snprintf(str, maxlen, "%.*f", prec, value);
 					}
 				}
 				else {




More information about the Bf-blender-cvs mailing list