mirror of
https://github.com/ZDoom/gzdoom-last-svn.git
synced 2025-05-30 00:41:19 +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 falsestr[] = "false";
|
||||
|
||||
char *FBaseCVar::ToString (UCVarValue value, ECVarType type)
|
||||
const char *FBaseCVar::ToString (UCVarValue value, ECVarType type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
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 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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue