minor speedup for UI draw code, noticed ui_get_but_val() could be called 3-5 times per button draw,

for RNA buttons this gets the entire array for each call so its not great to call many times.
This commit is contained in:
Campbell Barton
2011-06-16 06:00:02 +00:00
parent 2e8ca6d196
commit 051dedeeec

View File

@@ -77,6 +77,10 @@
#define PRECISION_FLOAT_MAX 7
#define PRECISION_FLOAT_MAX_POW 10000000 /* pow(10, PRECISION_FLOAT_MAX) */
/* avoid unneeded calls to ui_get_but_val */
#define UI_BUT_VALUE_UNSET DBL_MAX
#define UI_GET_BUT_VALUE_INIT(_but, _value) if(_value == DBL_MAX) { (_value)= ui_get_but_val(_but); }
/*
* a full doc with API notes can be found in bf-blender/trunk/blender/doc/guides/interface_API.txt
*
@@ -967,17 +971,16 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
/* ************* EVENTS ************* */
static void ui_is_but_sel(uiBut *but)
static void ui_is_but_sel(uiBut *but, double *value)
{
double value; /* only initialized when needed, to avoid calling when not used */
short push=0, true=1;
if(ELEM3(but->type, TOGN, ICONTOGN, OPTIONN)) true= 0;
if( but->bit ) {
int lvalue;
value= ui_get_but_val(but);
lvalue= (int)value;
UI_GET_BUT_VALUE_INIT(but, *value)
lvalue= (int)*value;
if( BTST(lvalue, (but->bitnr)) ) push= true;
else push= !true;
}
@@ -997,24 +1000,24 @@ static void ui_is_but_sel(uiBut *but)
case BUT_TOGDUAL:
case ICONTOG:
case OPTION:
value= ui_get_but_val(but);
if(value != (double)but->hardmin) push= 1;
if(*value != (double)but->hardmin) push= 1;
break;
case ICONTOGN:
case TOGN:
case OPTIONN:
value= ui_get_but_val(but);
if(value==0.0) push= 1;
UI_GET_BUT_VALUE_INIT(but, *value)
if(*value==0.0) push= 1;
break;
case ROW:
case LISTROW:
value= ui_get_but_val(but);
UI_GET_BUT_VALUE_INIT(but, *value)
/* support for rna enum buts */
if(but->rnaprop && (RNA_property_flag(but->rnaprop) & PROP_ENUM_FLAG)) {
if((int)value & (int)but->hardmax) push= 1;
if((int)*value & (int)but->hardmax) push= 1;
}
else {
if(value == (double)but->hardmax) push= 1;
if(*value == (double)but->hardmax) push= 1;
}
break;
case COL:
@@ -1385,6 +1388,10 @@ void ui_set_but_val(uiBut *but, double value)
break;
}
}
/* we can't be sure what RNA set functions actually do,
* so leave this unset */
value= UI_BUT_VALUE_UNSET;
}
else if(but->pointype==0);
else if(but->type==HSVSLI ) {
@@ -1425,19 +1432,19 @@ void ui_set_but_val(uiBut *but, double value)
/* then set value with possible edit override */
if(but->editval)
*but->editval= value;
value= *but->editval= value;
else if(but->pointype==CHA)
*((char *)but->poin)= (char)value;
value= *((char *)but->poin)= (char)value;
else if(but->pointype==SHO)
*((short *)but->poin)= (short)value;
value= *((short *)but->poin)= (short)value;
else if(but->pointype==INT)
*((int *)but->poin)= (int)value;
value= *((int *)but->poin)= (int)value;
else if(but->pointype==FLO)
*((float *)but->poin)= (float)value;
value= *((float *)but->poin)= (float)value;
}
/* update select flag */
ui_is_but_sel(but);
ui_is_but_sel(but, &value);
}
int ui_get_but_string_max_length(uiBut *but)
@@ -1974,17 +1981,19 @@ void uiBlockSetEmboss(uiBlock *block, char dt)
void ui_check_but(uiBut *but)
{
/* if something changed in the button */
double value;
double value= UI_BUT_VALUE_UNSET;
// float okwidth; // UNUSED
// int transopts= ui_translate_buttons();
ui_is_but_sel(but);
ui_is_but_sel(but, &value);
// if(but->type==TEX || but->type==IDPOIN) transopts= 0;
/* only update soft range while not editing */
if(but->rnaprop && !(but->editval || but->editstr || but->editvec))
ui_set_but_soft_range(but, ui_get_but_val(but));
if(but->rnaprop && !(but->editval || but->editstr || but->editvec)) {
UI_GET_BUT_VALUE_INIT(but, value)
ui_set_but_soft_range(but, value);
}
/* test for min and max, icon sliders, etc */
switch( but->type ) {
@@ -1993,17 +2002,20 @@ void ui_check_but(uiBut *but)
case SCROLL:
case NUMSLI:
case HSVSLI:
value= ui_get_but_val(but);
UI_GET_BUT_VALUE_INIT(but, value)
if(value < (double)but->hardmin) ui_set_but_val(but, but->hardmin);
else if(value > (double)but->hardmax) ui_set_but_val(but, but->hardmax);
break;
case NUMABS:
value= fabs( ui_get_but_val(but) );
if(value < (double)but->hardmin) ui_set_but_val(but, but->hardmin);
else if(value > (double)but->hardmax) ui_set_but_val(but, but->hardmax);
{
double value_abs;
UI_GET_BUT_VALUE_INIT(but, value)
value_abs= fabs(value);
if(value_abs < (double)but->hardmin) ui_set_but_val(but, but->hardmin);
else if(value_abs > (double)but->hardmax) ui_set_but_val(but, but->hardmax);
break;
}
case ICONTOG:
case ICONTOGN:
if(!but->rnaprop || (RNA_property_flag(but->rnaprop) & PROP_ICONS_CONSECUTIVE)) {
@@ -2014,14 +2026,14 @@ void ui_check_but(uiBut *but)
case ICONROW:
if(!but->rnaprop || (RNA_property_flag(but->rnaprop) & PROP_ICONS_CONSECUTIVE)) {
value= ui_get_but_val(but);
UI_GET_BUT_VALUE_INIT(but, value)
but->iconadd= (int)value- (int)(but->hardmin);
}
break;
case ICONTEXTROW:
if(!but->rnaprop || (RNA_property_flag(but->rnaprop) & PROP_ICONS_CONSECUTIVE)) {
value= ui_get_but_val(but);
UI_GET_BUT_VALUE_INIT(but, value)
but->iconadd= (int)value- (int)(but->hardmin);
}
break;
@@ -2038,7 +2050,7 @@ void ui_check_but(uiBut *but)
case ICONTEXTROW:
if(but->x2 - but->x1 > 24) {
value= ui_get_but_val(but);
UI_GET_BUT_VALUE_INIT(but, value)
ui_set_name_menu(but, (int)value);
}
break;
@@ -2048,7 +2060,7 @@ void ui_check_but(uiBut *but)
case HSVSLI:
case NUMABS:
value= ui_get_but_val(but);
UI_GET_BUT_VALUE_INIT(but, value)
if(ui_is_but_float(but)) {
if(value == (double) FLT_MAX) sprintf(but->drawstr, "%sinf", but->str);
@@ -2079,7 +2091,7 @@ void ui_check_but(uiBut *but)
case LABEL:
if(ui_is_but_float(but)) {
int prec;
value= ui_get_but_val(but);
UI_GET_BUT_VALUE_INIT(but, value)
prec= ui_but_float_precision(but, value);
BLI_snprintf(but->drawstr, sizeof(but->drawstr), "%s%.*f", but->str, prec, value);
}
@@ -2105,8 +2117,10 @@ void ui_check_but(uiBut *but)
strncpy(but->drawstr, but->str, UI_MAX_DRAW_STR);
if (but->flag & UI_SELECT) {
strcat(but->drawstr, "Press a key");
} else {
strcat(but->drawstr, WM_key_event_string((short) ui_get_but_val(but)));
}
else {
UI_GET_BUT_VALUE_INIT(but, value)
strcat(but->drawstr, WM_key_event_string((short)value));
}
break;