@ -74,22 +74,30 @@ Index of this file:
//-------------------------------------------------------------------------
// Those MIN/MAX values are not define because we need to point to them
static const ImS32 IM_S32_MIN = INT_MIN ; // (-2147483647 - 1), (0x80000000);
static const ImS32 IM_S32_MAX = INT_MAX ; // (2147483647), (0x7FFFFFFF)
static const ImU32 IM_U32_MIN = 0 ;
static const ImU32 IM_U32_MAX = UINT_MAX ; // (0xFFFFFFFF)
static const char IM_S8_MIN = - 128 ;
static const char IM_S8_MAX = 127 ;
static const unsigned char IM_U8_MIN = 0 ;
static const unsigned char IM_U8_MAX = 0xFF ;
static const short IM_S16_MIN = - 32768 ;
static const short IM_S16_MAX = 32767 ;
static const unsigned short IM_U16_MIN = 0 ;
static const unsigned short IM_U16_MAX = 0xFFFF ;
static const ImS32 IM_S32_MIN = INT_MIN ; // (-2147483647 - 1), (0x80000000);
static const ImS32 IM_S32_MAX = INT_MAX ; // (2147483647), (0x7FFFFFFF)
static const ImU32 IM_U32_MIN = 0 ;
static const ImU32 IM_U32_MAX = UINT_MAX ; // (0xFFFFFFFF)
# ifdef LLONG_MIN
static const ImS64 IM_S64_MIN = LLONG_MIN ; // (-9223372036854775807ll - 1ll);
static const ImS64 IM_S64_MAX = LLONG_MAX ; // (9223372036854775807ll);
static const ImS64 IM_S64_MIN = LLONG_MIN ; // (-9223372036854775807ll - 1ll);
static const ImS64 IM_S64_MAX = LLONG_MAX ; // (9223372036854775807ll);
# else
static const ImS64 IM_S64_MIN = - 9223372036854775807LL - 1 ;
static const ImS64 IM_S64_MAX = 9223372036854775807LL ;
static const ImS64 IM_S64_MIN = - 9223372036854775807LL - 1 ;
static const ImS64 IM_S64_MAX = 9223372036854775807LL ;
# endif
static const ImU64 IM_U64_MIN = 0 ;
static const ImU64 IM_U64_MIN = 0 ;
# ifdef ULLONG_MAX
static const ImU64 IM_U64_MAX = ULLONG_MAX ; // (0xFFFFFFFFFFFFFFFFull);
static const ImU64 IM_U64_MAX = ULLONG_MAX ; // (0xFFFFFFFFFFFFFFFFull);
# else
static const ImU64 IM_U64_MAX = ( 2ULL * 9223372036854775807LL + 1 ) ;
static const ImU64 IM_U64_MAX = ( 2ULL * 9223372036854775807LL + 1 ) ;
# endif
//-------------------------------------------------------------------------
@ -1495,17 +1503,21 @@ struct ImGuiDataTypeInfo
static const ImGuiDataTypeInfo GDataTypeInfo [ ] =
{
{ sizeof ( int ) , " %d " , " %d " } ,
{ sizeof ( unsigned int ) , " %u " , " %u " } ,
{ sizeof ( char ) , " %d " , " %d " } , // ImGuiDataType_S8
{ sizeof ( unsigned char ) , " %u " , " %u " } ,
{ sizeof ( short ) , " %d " , " %d " } , // ImGuiDataType_S16
{ sizeof ( unsigned short ) , " %u " , " %u " } ,
{ sizeof ( int ) , " %d " , " %d " } , // ImGuiDataType_S32
{ sizeof ( unsigned int ) , " %u " , " %u " } ,
# ifdef _MSC_VER
{ sizeof ( ImS64 ) , " %I64d " , " %I64d " } ,
{ sizeof ( ImU64 ) , " %I64u " , " %I64u " } ,
{ sizeof ( ImS64 ) , " %I64d " , " %I64d " } , // ImGuiDataType_S64
{ sizeof ( ImU64 ) , " %I64u " , " %I64u " } ,
# else
{ sizeof ( ImS64 ) , " %lld " , " %lld " } ,
{ sizeof ( ImU64 ) , " %llu " , " %llu " } ,
{ sizeof ( ImS64 ) , " %lld " , " %lld " } , // ImGuiDataType_S64
{ sizeof ( ImU64 ) , " %llu " , " %llu " } ,
# endif
{ sizeof ( float ) , " %f " , " %f " } , // float are promoted to double in va_arg
{ sizeof ( double ) , " %f " , " %lf " } ,
{ sizeof ( float ) , " %f " , " %f " } , // ImGuiDataType_Float ( float are promoted to double in va_arg)
{ sizeof ( double ) , " %f " , " %lf " } , // ImGuiDataType_Double
} ;
IM_STATIC_ASSERT ( IM_ARRAYSIZE ( GDataTypeInfo ) = = ImGuiDataType_COUNT ) ;
@ -1535,14 +1547,23 @@ static const char* PatchFormatStringFloatToInt(const char* fmt)
static inline int DataTypeFormatString ( char * buf , int buf_size , ImGuiDataType data_type , const void * data_ptr , const char * format )
{
if ( data_type = = ImGuiDataType_S32 | | data_type = = ImGuiDataType_U32 ) // Signedness doesn't matter when pushing the argument
// Signedness doesn't matter when pushing integer arguments
if ( data_type = = ImGuiDataType_S32 | | data_type = = ImGuiDataType_U32 )
return ImFormatString ( buf , buf_size , format , * ( const ImU32 * ) data_ptr ) ;
if ( data_type = = ImGuiDataType_S64 | | data_type = = ImGuiDataType_U64 ) // Signedness doesn't matter when pushing the argument
if ( data_type = = ImGuiDataType_S64 | | data_type = = ImGuiDataType_U64 )
return ImFormatString ( buf , buf_size , format , * ( const ImU64 * ) data_ptr ) ;
if ( data_type = = ImGuiDataType_Float )
return ImFormatString ( buf , buf_size , format , * ( const float * ) data_ptr ) ;
if ( data_type = = ImGuiDataType_Double )
return ImFormatString ( buf , buf_size , format , * ( const double * ) data_ptr ) ;
if ( data_type = = ImGuiDataType_S8 )
return ImFormatString ( buf , buf_size , format , * ( const ImS8 * ) data_ptr ) ;
if ( data_type = = ImGuiDataType_U8 )
return ImFormatString ( buf , buf_size , format , * ( const ImU8 * ) data_ptr ) ;
if ( data_type = = ImGuiDataType_S16 )
return ImFormatString ( buf , buf_size , format , * ( const ImS16 * ) data_ptr ) ;
if ( data_type = = ImGuiDataType_U16 )
return ImFormatString ( buf , buf_size , format , * ( const ImU16 * ) data_ptr ) ;
IM_ASSERT ( 0 ) ;
return 0 ;
}
@ -1553,13 +1574,29 @@ static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void*
IM_ASSERT ( op = = ' + ' | | op = = ' - ' ) ;
switch ( data_type )
{
case ImGuiDataType_S8 :
if ( op = = ' + ' ) * ( ImS8 * ) output = * ( const ImS8 * ) arg1 + * ( const ImS8 * ) arg2 ;
else if ( op = = ' - ' ) * ( ImS8 * ) output = * ( const ImS8 * ) arg1 - * ( const ImS8 * ) arg2 ;
return ;
case ImGuiDataType_U8 :
if ( op = = ' + ' ) * ( ImU8 * ) output = * ( const ImU8 * ) arg1 + * ( const ImU8 * ) arg2 ;
else if ( op = = ' - ' ) * ( ImU8 * ) output = * ( const ImU8 * ) arg1 - * ( const ImU8 * ) arg2 ;
return ;
case ImGuiDataType_S16 :
if ( op = = ' + ' ) * ( ImS16 * ) output = * ( const ImS16 * ) arg1 + * ( const ImS16 * ) arg2 ;
else if ( op = = ' - ' ) * ( ImS16 * ) output = * ( const ImS16 * ) arg1 - * ( const ImS16 * ) arg2 ;
return ;
case ImGuiDataType_U16 :
if ( op = = ' + ' ) * ( ImU16 * ) output = * ( const ImU16 * ) arg1 + * ( const ImU16 * ) arg2 ;
else if ( op = = ' - ' ) * ( ImU16 * ) output = * ( const ImU16 * ) arg1 - * ( const ImU16 * ) arg2 ;
return ;
case ImGuiDataType_S32 :
if ( op = = ' + ' ) * ( int * ) output = * ( const int * ) arg1 + * ( const int * ) arg2 ;
else if ( op = = ' - ' ) * ( int * ) output = * ( const int * ) arg1 - * ( const int * ) arg2 ;
if ( op = = ' + ' ) * ( ImS32 * ) output = * ( const ImS32 * ) arg1 + * ( const ImS32 * ) arg2 ;
else if ( op = = ' - ' ) * ( ImS32 * ) output = * ( const ImS32 * ) arg1 - * ( const ImS32 * ) arg2 ;
return ;
case ImGuiDataType_U32 :
if ( op = = ' + ' ) * ( unsigned int * ) output = * ( const unsigned int * ) arg1 + * ( const ImU32 * ) arg2 ;
else if ( op = = ' - ' ) * ( unsigned int * ) output = * ( const unsigned int * ) arg1 - * ( const ImU32 * ) arg2 ;
if ( op = = ' + ' ) * ( ImU32 * ) output = * ( const ImU32 * ) arg1 + * ( const ImU32 * ) arg2 ;
else if ( op = = ' - ' ) * ( ImU32 * ) output = * ( const ImU32 * ) arg1 - * ( const ImU32 * ) arg2 ;
return ;
case ImGuiDataType_S64 :
if ( op = = ' + ' ) * ( ImS64 * ) output = * ( const ImS64 * ) arg1 + * ( const ImS64 * ) arg2 ;
@ -1614,6 +1651,7 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
if ( format = = NULL )
format = GDataTypeInfo [ data_type ] . ScanFmt ;
// FIXME-LEGACY: The aim is to remove those operators and write a proper expression evaluator at some point..
int arg1i = 0 ;
if ( data_type = = ImGuiDataType_S32 )
{
@ -1628,12 +1666,6 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
else if ( op = = ' / ' ) { if ( sscanf ( buf , " %f " , & arg1f ) & & arg1f ! = 0.0f ) * v = ( int ) ( arg0i / arg1f ) ; } // Divide
else { if ( sscanf ( buf , format , & arg1i ) = = 1 ) * v = arg1i ; } // Assign constant
}
else if ( data_type = = ImGuiDataType_U32 | | data_type = = ImGuiDataType_S64 | | data_type = = ImGuiDataType_U64 )
{
// Assign constant
// FIXME: We don't bother handling support for legacy operators since they are a little too crappy. Instead we may implement a proper expression evaluator in the future.
sscanf ( buf , format , data_ptr ) ;
}
else if ( data_type = = ImGuiDataType_Float )
{
// For floats we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in
@ -1663,6 +1695,29 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
else if ( op = = ' / ' ) { if ( arg1f ! = 0.0f ) * v = arg0f / arg1f ; } // Divide
else { * v = arg1f ; } // Assign constant
}
else if ( data_type = = ImGuiDataType_U32 | | data_type = = ImGuiDataType_S64 | | data_type = = ImGuiDataType_U64 )
{
// All other types assign constant
// We don't bother handling support for legacy operators since they are a little too crappy. Instead we will later implement a proper expression evaluator in the future.
sscanf ( buf , format , data_ptr ) ;
}
else
{
// Small types need a 32-bit buffer to receive the result from scanf()
int v32 ;
sscanf ( buf , format , & v32 ) ;
if ( data_type = = ImGuiDataType_S8 )
* ( ImS8 * ) data_ptr = ( ImS8 ) ImClamp ( v32 , ( int ) IM_S8_MIN , ( int ) IM_S8_MAX ) ;
else if ( data_type = = ImGuiDataType_U8 )
* ( ImU8 * ) data_ptr = ( ImU8 ) ImClamp ( v32 , ( int ) IM_U8_MIN , ( int ) IM_U8_MAX ) ;
else if ( data_type = = ImGuiDataType_S16 )
* ( ImS16 * ) data_ptr = ( ImS16 ) ImClamp ( v32 , ( int ) IM_S16_MIN , ( int ) IM_S16_MAX ) ;
else if ( data_type = = ImGuiDataType_U16 )
* ( ImU16 * ) data_ptr = ( ImU16 ) ImClamp ( v32 , ( int ) IM_U16_MIN , ( int ) IM_U16_MAX ) ;
else
IM_ASSERT ( 0 ) ;
}
return memcmp ( data_backup , data_ptr , GDataTypeInfo [ data_type ] . Size ) ! = 0 ;
}
@ -1845,6 +1900,10 @@ bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_s
switch ( data_type )
{
case ImGuiDataType_S8 : { ImS32 v32 = ( ImS32 ) * ( ImS8 * ) v ; bool r = DragBehaviorT < ImS32 , ImS32 , float > ( ImGuiDataType_S32 , & v32 , v_speed , v_min ? * ( const ImS8 * ) v_min : IM_S8_MIN , v_max ? * ( const ImS8 * ) v_max : IM_S8_MAX , format , power , flags ) ; if ( r ) * ( ImS8 * ) v = ( ImS8 ) v32 ; return r ; }
case ImGuiDataType_U8 : { ImU32 v32 = ( ImU32 ) * ( ImU8 * ) v ; bool r = DragBehaviorT < ImU32 , ImS32 , float > ( ImGuiDataType_U32 , & v32 , v_speed , v_min ? * ( const ImU8 * ) v_min : IM_U8_MIN , v_max ? * ( const ImU8 * ) v_max : IM_U8_MAX , format , power , flags ) ; if ( r ) * ( ImU8 * ) v = ( ImU8 ) v32 ; return r ; }
case ImGuiDataType_S16 : { ImS32 v32 = ( ImS32 ) * ( ImS16 * ) v ; bool r = DragBehaviorT < ImS32 , ImS32 , float > ( ImGuiDataType_S32 , & v32 , v_speed , v_min ? * ( const ImS16 * ) v_min : IM_S16_MIN , v_max ? * ( const ImS16 * ) v_max : IM_S16_MAX , format , power , flags ) ; if ( r ) * ( ImS16 * ) v = ( ImS16 ) v32 ; return r ; }
case ImGuiDataType_U16 : { ImU32 v32 = ( ImU32 ) * ( ImU16 * ) v ; bool r = DragBehaviorT < ImU32 , ImS32 , float > ( ImGuiDataType_U32 , & v32 , v_speed , v_min ? * ( const ImU16 * ) v_min : IM_U16_MIN , v_max ? * ( const ImU16 * ) v_max : IM_U16_MAX , format , power , flags ) ; if ( r ) * ( ImU16 * ) v = ( ImU16 ) v32 ; return r ; }
case ImGuiDataType_S32 : return DragBehaviorT < ImS32 , ImS32 , float > ( data_type , ( ImS32 * ) v , v_speed , v_min ? * ( const ImS32 * ) v_min : IM_S32_MIN , v_max ? * ( const ImS32 * ) v_max : IM_S32_MAX , format , power , flags ) ;
case ImGuiDataType_U32 : return DragBehaviorT < ImU32 , ImS32 , float > ( data_type , ( ImU32 * ) v , v_speed , v_min ? * ( const ImU32 * ) v_min : IM_U32_MIN , v_max ? * ( const ImU32 * ) v_max : IM_U32_MAX , format , power , flags ) ;
case ImGuiDataType_S64 : return DragBehaviorT < ImS64 , ImS64 , double > ( data_type , ( ImS64 * ) v , v_speed , v_min ? * ( const ImS64 * ) v_min : IM_S64_MIN , v_max ? * ( const ImS64 * ) v_max : IM_S64_MAX , format , power , flags ) ;
@ -2269,6 +2328,10 @@ bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type
{
switch ( data_type )
{
case ImGuiDataType_S8 : { ImS32 v32 = ( ImS32 ) * ( ImS8 * ) v ; bool r = SliderBehaviorT < ImS32 , ImS32 , float > ( bb , id , ImGuiDataType_S32 , & v32 , * ( const ImS8 * ) v_min , * ( const ImS8 * ) v_max , format , power , flags , out_grab_bb ) ; if ( r ) * ( ImS8 * ) v = ( ImS8 ) v32 ; return r ; }
case ImGuiDataType_U8 : { ImU32 v32 = ( ImU32 ) * ( ImU8 * ) v ; bool r = SliderBehaviorT < ImU32 , ImS32 , float > ( bb , id , ImGuiDataType_U32 , & v32 , * ( const ImU8 * ) v_min , * ( const ImU8 * ) v_max , format , power , flags , out_grab_bb ) ; if ( r ) * ( ImU8 * ) v = ( ImU8 ) v32 ; return r ; }
case ImGuiDataType_S16 : { ImS32 v32 = ( ImS32 ) * ( ImS16 * ) v ; bool r = SliderBehaviorT < ImS32 , ImS32 , float > ( bb , id , ImGuiDataType_S32 , & v32 , * ( const ImS16 * ) v_min , * ( const ImS16 * ) v_max , format , power , flags , out_grab_bb ) ; if ( r ) * ( ImS16 * ) v = ( ImS16 ) v32 ; return r ; }
case ImGuiDataType_U16 : { ImU32 v32 = ( ImU32 ) * ( ImU16 * ) v ; bool r = SliderBehaviorT < ImU32 , ImS32 , float > ( bb , id , ImGuiDataType_U32 , & v32 , * ( const ImU16 * ) v_min , * ( const ImU16 * ) v_max , format , power , flags , out_grab_bb ) ; if ( r ) * ( ImU16 * ) v = ( ImU16 ) v32 ; return r ; }
case ImGuiDataType_S32 :
IM_ASSERT ( * ( const ImS32 * ) v_min > = IM_S32_MIN / 2 & & * ( const ImS32 * ) v_max < = IM_S32_MAX / 2 ) ;
return SliderBehaviorT < ImS32 , ImS32 , float > ( bb , id , data_type , ( ImS32 * ) v , * ( const ImS32 * ) v_min , * ( const ImS32 * ) v_max , format , power , flags , out_grab_bb ) ;