@ -936,6 +936,18 @@ const char* ImStristr(const char* haystack, const char* haystack_end, const char
return NULL ;
}
static const char * ImAtoi ( const char * src , int * output )
{
int negative = 0 ;
if ( * src = = ' - ' ) { negative = 1 ; src + + ; }
if ( * src = = ' + ' ) { src + + ; }
int v = 0 ;
while ( * src > = ' 0 ' & & * src < = ' 9 ' )
v = ( v * 10 ) + ( * src + + - ' 0 ' ) ;
* output = negative ? - v : v ;
return src ;
}
// MSVC version appears to return -1 on overflow, whereas glibc appears to return total count (which may be >= buf_size).
// Ideally we would test for only one of those limits at runtime depending on the behavior the vsnprintf(), but trying to deduct it at compile time sounds like a pandora can of worm.
int ImFormatString ( char * buf , int buf_size , const char * fmt , . . . )
@ -6462,10 +6474,12 @@ int ImGui::ParseFormatPrecision(const char* fmt, int default_precision)
fmt + + ;
if ( * fmt = = ' . ' )
{
precision = a toi( fmt + 1 ) ;
fmt = ImA toi( fmt + 1 , & precision ) ;
if ( precision < 0 | | precision > 10 )
precision = default_precision ;
}
if ( * fmt = = ' e ' | | * fmt = = ' E ' ) // Maximum precision with scientific notation
precision = - 1 ;
break ;
}
return precision ;
@ -6482,6 +6496,8 @@ float ImGui::RoundScalar(float value, int decimal_precision)
// Round past decimal precision
// So when our value is 1.99999 with a precision of 0.001 we'll end up rounding to 2.0
// FIXME: Investigate better rounding methods
if ( decimal_precision < 0 )
return value ;
const float min_step = GetMinimumStepAtDecimalPrecision ( decimal_precision ) ;
bool negative = value < 0.0f ;
value = fabsf ( value ) ;
@ -6533,7 +6549,7 @@ bool ImGui::SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v
const float grab_padding = 2.0f ;
const float slider_sz = is_horizontal ? ( frame_bb . GetWidth ( ) - grab_padding * 2.0f ) : ( frame_bb . GetHeight ( ) - grab_padding * 2.0f ) ;
float grab_sz ;
if ( decimal_precision > 0 )
if ( decimal_precision ! = 0 )
grab_sz = ImMin ( style . GrabMinSize , slider_sz ) ;
else
grab_sz = ImMin ( ImMax ( 1.0f * ( slider_sz / ( ( v_min < v_max ? v_max - v_min : v_min - v_max ) + 1.0f ) ) , style . GrabMinSize ) , slider_sz ) ; // Integer sliders, if possible have the grab size represent 1 unit