* 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 truestr[] = "true";
static char falsestr[] = "false"; static char falsestr[] = "false";
char *FBaseCVar::ToString (UCVarValue value, ECVarType type) const char *FBaseCVar::ToString (UCVarValue value, ECVarType type)
{ {
switch (type) switch (type)
{ {

View file

@ -70,7 +70,7 @@ union UCVarValue
bool Bool; bool Bool;
int Int; int Int;
float Float; float Float;
char *String; const char *String;
const GUID *pGUID; const GUID *pGUID;
}; };
@ -132,7 +132,7 @@ protected:
static bool ToBool (UCVarValue value, ECVarType type); static bool ToBool (UCVarValue value, ECVarType type);
static int ToInt (UCVarValue value, ECVarType type); static int ToInt (UCVarValue value, ECVarType type);
static float ToFloat (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 const GUID *ToGUID (UCVarValue value, ECVarType type);
static UCVarValue FromBool (bool value, ECVarType type); static UCVarValue FromBool (bool value, ECVarType type);
static UCVarValue FromInt (int 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; BYTE pack;
int lastbyte; int lastbyte;
assert(bitdepth == 1 || bitdepth == 2 || bitdepth == 4);
out = rowout + width; out = rowout + width;
in = rowin + bytesPerRow; in = rowin + bytesPerRow;
@ -1243,25 +1245,42 @@ static void UnpackPixels (int width, int bytesPerRow, int bitdepth, const BYTE *
break; break;
} }
// Expand gray scale to 8bpp // Expand grayscale to 8bpp
if(grayscale) if (grayscale)
{ {
out = rowout + width; // Put the 2-bit lookup table on the stack, since it's probably already
while(--out >= rowout) // in a cache line.
union
{ {
switch(bitdepth) uint32 bits2l;
BYTE bits2[4];
};
out = rowout + width;
switch (bitdepth)
{
case 1:
while (--out >= rowout)
{ {
case 1: // 1 becomes -1 (0xFF), and 0 remains untouched.
*out *= 0xFF; *out = 0 - *out;
break;
case 2:
*out |= (*out<<2)|(*out<<4)|(*out<<6);
break;
case 4:
*out |= (*out<<4);
break;
default: break;
} }
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 LIB_ACSSTRINGS_ONTHEFLY 0x7fff
#define ACSSTRING_OR_ONTHEFLY (LIB_ACSSTRINGS_ONTHEFLY<<16) #define ACSSTRING_OR_ONTHEFLY (LIB_ACSSTRINGS_ONTHEFLY<<16)
TArray<FString> class OnTheFlyArray : public TArray<FString>
ACS_StringsOnTheFly, {
ACS_StringBuilderStack; 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_START(Builder) if (Builder.IsNotEmpty() || ACS_StringBuilderStack.Size()) { ACS_StringBuilderStack.Push(Builder); Builder = ""; }
#define STRINGBUILDER_FINISH(Builder) if (!ACS_StringBuilderStack.Pop(Builder)) { Builder = ""; } #define STRINGBUILDER_FINISH(Builder) if (!ACS_StringBuilderStack.Pop(Builder)) { Builder = ""; }
@ -3477,6 +3490,10 @@ enum EACSFunctions
ACSF_SetCVar, ACSF_SetCVar,
ACSF_GetUserCVar, ACSF_GetUserCVar,
ACSF_SetUserCVar, ACSF_SetUserCVar,
ACSF_GetCVarString,
ACSF_SetCVarString,
ACSF_GetUserCVarString,
ACSF_SetUserCVarString,
// ZDaemon // ZDaemon
ACSF_GetTeamScore = 19620, // (int team) 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. // 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; UCVarValue val;
ECVarType type; ECVarType type;
@ -3589,7 +3606,12 @@ static void DoSetCVar(FBaseCVar *cvar, int value, bool force=false)
{ {
return; 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); val.Float = FIXED2FLOAT(value);
type = CVAR_Float; type = CVAR_Float;
@ -3610,11 +3632,16 @@ static void DoSetCVar(FBaseCVar *cvar, int value, bool force=false)
} }
// Converts floating- to fixed-point as required. // Converts floating- to fixed-point as required.
static int DoGetCVar(FBaseCVar *cvar) static int DoGetCVar(FBaseCVar *cvar, bool is_string)
{ {
UCVarValue val; 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); val = cvar->GetGenericRep(CVAR_Float);
return FLOAT2FIXED(val.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]) if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum])
{ {
@ -3638,10 +3665,10 @@ static int GetUserCVar(int playernum, const char *cvarname)
{ {
return 0; 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); FBaseCVar *cvar = FindCVar(cvarname, NULL);
// Either the cvar doesn't exist, or it's for a mod that isn't loaded, so return 0. // 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 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]) if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum])
{ {
@ -3677,7 +3704,7 @@ static int SetUserCVar(int playernum, const char *cvarname, int value)
{ {
return 0; 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 we are this player, then also reflect this change in the local version of this cvar.
if (playernum == consoleplayer) if (playernum == consoleplayer)
@ -3687,14 +3714,14 @@ static int SetUserCVar(int playernum, const char *cvarname, int value)
// but check just to be safe. // but check just to be safe.
if (cvar != NULL) if (cvar != NULL)
{ {
DoSetCVar(cvar, value, true); DoSetCVar(cvar, value, is_string, true);
} }
} }
return 1; 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); FBaseCVar *cvar = FindCVar(cvarname, NULL);
// Only mod-created cvars may be set. // Only mod-created cvars may be set.
@ -3709,9 +3736,9 @@ static int SetCVar(AActor *activator, const char *cvarname, int value)
{ {
return 0; 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; return 1;
} }
@ -4159,24 +4186,52 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
WrapWidth = argCount > 0 ? args[0] : 0; WrapWidth = argCount > 0 ? args[0] : 0;
break; break;
case ACSF_GetUserCVar: case ACSF_GetCVarString:
if (argCount == 2) if (argCount == 1)
{ {
return GetUserCVar(args[0], FBehavior::StaticLookupString(args[1])); return GetCVar(activator, FBehavior::StaticLookupString(args[0]), true);
}
break;
case ACSF_SetUserCVar:
if (argCount == 3)
{
return SetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), args[2]);
} }
break; break;
case ACSF_SetCVar: case ACSF_SetCVar:
if (argCount == 2) 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; break;
@ -7046,7 +7101,7 @@ scriptwait:
break; break;
case PCD_GETCVAR: case PCD_GETCVAR:
STACK(1) = GetCVar(activator, FBehavior::StaticLookupString(STACK(1))); STACK(1) = GetCVar(activator, FBehavior::StaticLookupString(STACK(1)), false);
break; break;
case PCD_SETHUDSIZE: case PCD_SETHUDSIZE:
@ -7430,15 +7485,7 @@ scriptwait:
case PCD_SAVESTRING: case PCD_SAVESTRING:
// Saves the string // Saves the string
{ {
unsigned int str_otf = ACS_StringsOnTheFly.Push(work); PushToStack(ACS_StringsOnTheFly.Push(work));
if (str_otf > 0xffff)
{
PushToStack(-1);
}
else
{
PushToStack((SDWORD)str_otf|ACSSTRING_OR_ONTHEFLY);
}
STRINGBUILDER_FINISH(work); STRINGBUILDER_FINISH(work);
} }
break; break;

View file

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