- Fixed: drawstring didn't properly align itself when variable strings were used.

SVN r2360 (trunk)
This commit is contained in:
Braden Obrzut 2010-06-07 15:45:09 +00:00
parent ed81b4718b
commit afd9bcb59a
1 changed files with 23 additions and 14 deletions

View File

@ -582,7 +582,7 @@ class CommandDrawString : public SBarInfoCommand
str = sc.String; str = sc.String;
} }
sc.MustGetToken(','); sc.MustGetToken(',');
GetCoordinates(sc, fullScreenOffsets, x, y); GetCoordinates(sc, fullScreenOffsets, startX, y);
if(sc.CheckToken(',')) //spacing if(sc.CheckToken(',')) //spacing
{ {
sc.MustGetToken(TK_IntConst); sc.MustGetToken(TK_IntConst);
@ -590,10 +590,7 @@ class CommandDrawString : public SBarInfoCommand
} }
sc.MustGetToken(';'); sc.MustGetToken(';');
if(script->spacingCharacter == '\0') RealignString();
x -= static_cast<int> (font->StringWidth(str)+(spacing * str.Len()));
else //monospaced, so just multiplay the character size
x -= static_cast<int> ((font->GetCharWidth((int) script->spacingCharacter) + spacing) * str.Len());
} }
void Reset() void Reset()
{ {
@ -619,6 +616,7 @@ class CommandDrawString : public SBarInfoCommand
{ {
cache = level.lumpnum; cache = level.lumpnum;
str = level.LevelName; str = level.LevelName;
RealignString();
} }
break; break;
case LEVELLUMP: case LEVELLUMP:
@ -626,6 +624,7 @@ class CommandDrawString : public SBarInfoCommand
{ {
cache = level.lumpnum; cache = level.lumpnum;
str = level.mapname; str = level.mapname;
RealignString();
} }
break; break;
case SKILLNAME: case SKILLNAME:
@ -633,6 +632,7 @@ class CommandDrawString : public SBarInfoCommand
{ {
cache = level.lumpnum; cache = level.lumpnum;
str = G_SkillName(); str = G_SkillName();
RealignString();
} }
break; break;
case PLAYERCLASS: case PLAYERCLASS:
@ -640,6 +640,7 @@ class CommandDrawString : public SBarInfoCommand
{ {
cache = statusBar->CPlayer->userinfo.PlayerClass; cache = statusBar->CPlayer->userinfo.PlayerClass;
str = statusBar->CPlayer->cls->Meta.GetMetaString(APMETA_DisplayName); str = statusBar->CPlayer->cls->Meta.GetMetaString(APMETA_DisplayName);
RealignString();
} }
break; break;
case AMMO1TAG: case AMMO1TAG:
@ -658,12 +659,14 @@ class CommandDrawString : public SBarInfoCommand
// Can't think of a good way to detect changes to this, so // Can't think of a good way to detect changes to this, so
// I guess copying it every tick will have to do. // I guess copying it every tick will have to do.
str = statusBar->CPlayer->userinfo.netname; str = statusBar->CPlayer->userinfo.netname;
RealignString();
break; break;
case GLOBALVAR: case GLOBALVAR:
if(ACS_GlobalVars[valueArgument] != cache) if(ACS_GlobalVars[valueArgument] != cache)
{ {
cache = ACS_GlobalVars[valueArgument]; cache = ACS_GlobalVars[valueArgument];
str = FBehavior::StaticLookupString(ACS_GlobalVars[valueArgument]); str = FBehavior::StaticLookupString(ACS_GlobalVars[valueArgument]);
RealignString();
} }
break; break;
case GLOBALARRAY: case GLOBALARRAY:
@ -671,6 +674,7 @@ class CommandDrawString : public SBarInfoCommand
{ {
cache = ACS_GlobalArrays[valueArgument][consoleplayer]; cache = ACS_GlobalArrays[valueArgument][consoleplayer];
str = FBehavior::StaticLookupString(ACS_GlobalArrays[valueArgument][consoleplayer]); str = FBehavior::StaticLookupString(ACS_GlobalArrays[valueArgument][consoleplayer]);
RealignString();
} }
break; break;
default: default:
@ -678,6 +682,15 @@ class CommandDrawString : public SBarInfoCommand
} }
} }
protected: protected:
void RealignString()
{
x = startX;
if(script->spacingCharacter == '\0')
x -= static_cast<int> (font->StringWidth(str)+(spacing * str.Len()));
else //monospaced, so just multiplay the character size
x -= static_cast<int> ((font->GetCharWidth((int) script->spacingCharacter) + spacing) * str.Len());
}
enum StringValueType enum StringValueType
{ {
LEVELNAME, LEVELNAME,
@ -701,6 +714,7 @@ class CommandDrawString : public SBarInfoCommand
int spacing; int spacing;
FFont *font; FFont *font;
EColorRange translation; EColorRange translation;
SBarInfoCoordinate startX;
SBarInfoCoordinate x; SBarInfoCoordinate x;
SBarInfoCoordinate y; SBarInfoCoordinate y;
int cache; /// General purpose cache. int cache; /// General purpose cache.
@ -717,6 +731,7 @@ class CommandDrawString : public SBarInfoCommand
{ {
cache = actor->GetClass()->ClassIndex; cache = actor->GetClass()->ClassIndex;
str = actor->GetTag(); str = actor->GetTag();
RealignString();
} }
} }
else else
@ -1062,8 +1077,6 @@ class CommandDrawNumber : public CommandDrawString
else if(highValue != -1 && drawValue >= highValue) //high else if(highValue != -1 && drawValue >= highValue) //high
translation = highTranslation; translation = highTranslation;
x = startX;
// 10^9 is a largest we can hold in a 32-bit int. So if we go any larger we have to toss out the positions limit. // 10^9 is a largest we can hold in a 32-bit int. So if we go any larger we have to toss out the positions limit.
int maxval = length <= 9 ? (int) ceil(pow(10., length))-1 : INT_MAX; int maxval = length <= 9 ? (int) ceil(pow(10., length))-1 : INT_MAX;
if(!fillZeros || length == 1) if(!fillZeros || length == 1)
@ -1083,10 +1096,8 @@ class CommandDrawNumber : public CommandDrawString
str.Insert(0, "0"); str.Insert(0, "0");
} }
} }
if(script->spacingCharacter == '\0')
x -= static_cast<int> (font->StringWidth(str)+(spacing * str.Len())); RealignString();
else //monospaced, so just multiplay the character size
x -= static_cast<int> ((font->GetCharWidth((int) script->spacingCharacter) + spacing) * str.Len());
} }
protected: protected:
enum ValueType enum ValueType
@ -1131,8 +1142,6 @@ class CommandDrawNumber : public CommandDrawString
ValueType value; ValueType value;
const PClass *inventoryItem; const PClass *inventoryItem;
SBarInfoCoordinate startX;
friend class CommandDrawInventoryBar; friend class CommandDrawInventoryBar;
}; };