* Updated to ZDoom 4294:

- Move bitdepth check outside the loop for grayscale unpacking.
- Added ACS functions SetCVarString and SetUserCVarString.
- Make UCVarValue::String point to a constant string.
- Added ACS functions GetCVarString and GetUserCVarString.

git-svn-id: http://mancubus.net/svn/hosted/gzdoom/trunk@1578 b0f79afe-0144-0410-b225-9a4edf0717df
This commit is contained in:
gez 2013-05-28 09:41:53 +00:00
parent 9c233b2d98
commit 99c82dd7aa
5 changed files with 125 additions and 59 deletions

View file

@ -266,7 +266,7 @@ static GUID cGUID;
static char truestr[] = "true";
static char falsestr[] = "false";
char *FBaseCVar::ToString (UCVarValue value, ECVarType type)
const char *FBaseCVar::ToString (UCVarValue value, ECVarType type)
{
switch (type)
{

View file

@ -70,7 +70,7 @@ union UCVarValue
bool Bool;
int Int;
float Float;
char *String;
const char *String;
const GUID *pGUID;
};
@ -132,7 +132,7 @@ protected:
static bool ToBool (UCVarValue value, ECVarType type);
static int ToInt (UCVarValue value, ECVarType type);
static float ToFloat (UCVarValue value, ECVarType type);
static char *ToString (UCVarValue value, ECVarType type);
static const char *ToString (UCVarValue value, ECVarType type);
static const GUID *ToGUID (UCVarValue value, ECVarType type);
static UCVarValue FromBool (bool value, ECVarType type);
static UCVarValue FromInt (int value, ECVarType type);

View file

@ -1162,6 +1162,8 @@ static void UnpackPixels (int width, int bytesPerRow, int bitdepth, const BYTE *
BYTE pack;
int lastbyte;
assert(bitdepth == 1 || bitdepth == 2 || bitdepth == 4);
out = rowout + width;
in = rowin + bytesPerRow;
@ -1243,25 +1245,42 @@ static void UnpackPixels (int width, int bytesPerRow, int bitdepth, const BYTE *
break;
}
// Expand gray scale to 8bpp
if(grayscale)
// Expand grayscale to 8bpp
if (grayscale)
{
out = rowout + width;
while(--out >= rowout)
// Put the 2-bit lookup table on the stack, since it's probably already
// in a cache line.
union
{
switch(bitdepth)
uint32 bits2l;
BYTE bits2[4];
};
out = rowout + width;
switch (bitdepth)
{
case 1:
while (--out >= rowout)
{
case 1:
*out *= 0xFF;
break;
case 2:
*out |= (*out<<2)|(*out<<4)|(*out<<6);
break;
case 4:
*out |= (*out<<4);
break;
default: break;
// 1 becomes -1 (0xFF), and 0 remains untouched.
*out = 0 - *out;
}
break;
case 2:
bits2l = MAKE_ID(0x00,0x55,0xAA,0xFF);
while (--out >= rowout)
{
*out = bits2[*out];
}
break;
case 4:
while (--out >= rowout)
{
*out |= (*out << 4);
}
break;
}
}
}

View file

@ -168,9 +168,22 @@ FWorldGlobalArray ACS_GlobalArrays[NUM_GLOBALVARS];
#define LIB_ACSSTRINGS_ONTHEFLY 0x7fff
#define ACSSTRING_OR_ONTHEFLY (LIB_ACSSTRINGS_ONTHEFLY<<16)
TArray<FString>
ACS_StringsOnTheFly,
ACS_StringBuilderStack;
class OnTheFlyArray : public TArray<FString>
{
public:
// Returns a valid string identifier for this tick, or
// -1 if we ran out of room.
int Push(FString &str)
{
if (Size() >= 0x10000)
{
return -1;
}
return (int)TArray<FString>::Push(str) | ACSSTRING_OR_ONTHEFLY;
}
}
ACS_StringsOnTheFly;
TArray<FString> ACS_StringBuilderStack;
#define STRINGBUILDER_START(Builder) if (Builder.IsNotEmpty() || ACS_StringBuilderStack.Size()) { ACS_StringBuilderStack.Push(Builder); Builder = ""; }
#define STRINGBUILDER_FINISH(Builder) if (!ACS_StringBuilderStack.Pop(Builder)) { Builder = ""; }
@ -3477,6 +3490,10 @@ enum EACSFunctions
ACSF_SetCVar,
ACSF_GetUserCVar,
ACSF_SetUserCVar,
ACSF_GetCVarString,
ACSF_SetCVarString,
ACSF_GetUserCVarString,
ACSF_SetUserCVarString,
// ZDaemon
ACSF_GetTeamScore = 19620, // (int team)
@ -3577,7 +3594,7 @@ static int GetUserVariable(AActor *self, FName varname, int index)
}
// Converts fixed- to floating-point as required.
static void DoSetCVar(FBaseCVar *cvar, int value, bool force=false)
static void DoSetCVar(FBaseCVar *cvar, int value, bool is_string, bool force=false)
{
UCVarValue val;
ECVarType type;
@ -3589,7 +3606,12 @@ static void DoSetCVar(FBaseCVar *cvar, int value, bool force=false)
{
return;
}
if (cvar->GetRealType() == CVAR_Float)
if (is_string)
{
val.String = FBehavior::StaticLookupString(value);
type = CVAR_String;
}
else if (cvar->GetRealType() == CVAR_Float)
{
val.Float = FIXED2FLOAT(value);
type = CVAR_Float;
@ -3610,11 +3632,16 @@ static void DoSetCVar(FBaseCVar *cvar, int value, bool force=false)
}
// Converts floating- to fixed-point as required.
static int DoGetCVar(FBaseCVar *cvar)
static int DoGetCVar(FBaseCVar *cvar, bool is_string)
{
UCVarValue val;
if (cvar->GetRealType() == CVAR_Float)
if (is_string)
{
val = cvar->GetGenericRep(CVAR_String);
return ACS_StringsOnTheFly.Push(FString(val.String));
}
else if (cvar->GetRealType() == CVAR_Float)
{
val = cvar->GetGenericRep(CVAR_Float);
return FLOAT2FIXED(val.Float);
@ -3626,7 +3653,7 @@ static int DoGetCVar(FBaseCVar *cvar)
}
}
static int GetUserCVar(int playernum, const char *cvarname)
static int GetUserCVar(int playernum, const char *cvarname, bool is_string)
{
if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum])
{
@ -3638,10 +3665,10 @@ static int GetUserCVar(int playernum, const char *cvarname)
{
return 0;
}
return DoGetCVar(cvar);
return DoGetCVar(cvar, is_string);
}
static int GetCVar(AActor *activator, const char *cvarname)
static int GetCVar(AActor *activator, const char *cvarname, bool is_string)
{
FBaseCVar *cvar = FindCVar(cvarname, NULL);
// Either the cvar doesn't exist, or it's for a mod that isn't loaded, so return 0.
@ -3658,13 +3685,13 @@ static int GetCVar(AActor *activator, const char *cvarname)
{
return 0;
}
return GetUserCVar(int(activator->player - players), cvarname);
return GetUserCVar(int(activator->player - players), cvarname, is_string);
}
return DoGetCVar(cvar);
return DoGetCVar(cvar, is_string);
}
}
static int SetUserCVar(int playernum, const char *cvarname, int value)
static int SetUserCVar(int playernum, const char *cvarname, int value, bool is_string)
{
if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum])
{
@ -3677,7 +3704,7 @@ static int SetUserCVar(int playernum, const char *cvarname, int value)
{
return 0;
}
DoSetCVar(cvar, value);
DoSetCVar(cvar, value, is_string);
// If we are this player, then also reflect this change in the local version of this cvar.
if (playernum == consoleplayer)
@ -3687,14 +3714,14 @@ static int SetUserCVar(int playernum, const char *cvarname, int value)
// but check just to be safe.
if (cvar != NULL)
{
DoSetCVar(cvar, value, true);
DoSetCVar(cvar, value, is_string, true);
}
}
return 1;
}
static int SetCVar(AActor *activator, const char *cvarname, int value)
static int SetCVar(AActor *activator, const char *cvarname, int value, bool is_string)
{
FBaseCVar *cvar = FindCVar(cvarname, NULL);
// Only mod-created cvars may be set.
@ -3709,9 +3736,9 @@ static int SetCVar(AActor *activator, const char *cvarname, int value)
{
return 0;
}
return SetUserCVar(int(activator->player - players), cvarname, value);
return SetUserCVar(int(activator->player - players), cvarname, value, is_string);
}
DoSetCVar(cvar, value);
DoSetCVar(cvar, value, is_string);
return 1;
}
@ -4159,24 +4186,52 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
WrapWidth = argCount > 0 ? args[0] : 0;
break;
case ACSF_GetUserCVar:
if (argCount == 2)
case ACSF_GetCVarString:
if (argCount == 1)
{
return GetUserCVar(args[0], FBehavior::StaticLookupString(args[1]));
}
break;
case ACSF_SetUserCVar:
if (argCount == 3)
{
return SetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), args[2]);
return GetCVar(activator, FBehavior::StaticLookupString(args[0]), true);
}
break;
case ACSF_SetCVar:
if (argCount == 2)
{
return SetCVar(activator, FBehavior::StaticLookupString(args[0]), args[1]);
return SetCVar(activator, FBehavior::StaticLookupString(args[0]), args[1], false);
}
break;
case ACSF_SetCVarString:
if (argCount == 2)
{
return SetCVar(activator, FBehavior::StaticLookupString(args[0]), args[1], true);
}
break;
case ACSF_GetUserCVar:
if (argCount == 2)
{
return GetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), false);
}
break;
case ACSF_GetUserCVarString:
if (argCount == 2)
{
return GetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), true);
}
break;
case ACSF_SetUserCVar:
if (argCount == 3)
{
return SetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), args[2], false);
}
break;
case ACSF_SetUserCVarString:
if (argCount == 3)
{
return SetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), args[2], true);
}
break;
@ -7046,7 +7101,7 @@ scriptwait:
break;
case PCD_GETCVAR:
STACK(1) = GetCVar(activator, FBehavior::StaticLookupString(STACK(1)));
STACK(1) = GetCVar(activator, FBehavior::StaticLookupString(STACK(1)), false);
break;
case PCD_SETHUDSIZE:
@ -7430,15 +7485,7 @@ scriptwait:
case PCD_SAVESTRING:
// Saves the string
{
unsigned int str_otf = ACS_StringsOnTheFly.Push(work);
if (str_otf > 0xffff)
{
PushToStack(-1);
}
else
{
PushToStack((SDWORD)str_otf|ACSSTRING_OR_ONTHEFLY);
}
PushToStack(ACS_StringsOnTheFly.Push(work));
STRINGBUILDER_FINISH(work);
}
break;

View file

@ -3,5 +3,5 @@
// This file was automatically generated by the
// updaterevision tool. Do not edit by hand.
#define ZD_SVN_REVISION_STRING "4290"
#define ZD_SVN_REVISION_NUMBER 4290
#define ZD_SVN_REVISION_STRING "4294"
#define ZD_SVN_REVISION_NUMBER 4294