mirror of
https://github.com/ZDoom/gzdoom-last-svn.git
synced 2025-05-31 01:10:52 +00:00
* 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:
parent
9c233b2d98
commit
99c82dd7aa
5 changed files with 125 additions and 59 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
125
src/p_acs.cpp
125
src/p_acs.cpp
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue