Files
GTASource/game/frontend/Scaleform/colour.cpp
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

314 lines
8.4 KiB
C++

//
// scaleform/colour.cpp
//
// Copyright (C) 1999-2012 Rockstar Games. All Rights Reserved.
//
#include "colour.h"
#include "frontend/hud_colour.h"
#include "frontend/Scaleform/ScaleFormMgr.h"
using namespace rage;
class CScaleformColourClass : public sfScaleformFunctionHandler
{
public:
enum Method
{
COLOURMETHOD_Ctor = sfScaleformFunctionHandler::CONSTRUCTOR_ID,
COLOURMETHOD_Colourise,
COLOURMETHOD_setHudColour,
COLOURMETHOD_ColouriseB,
COLOURMETHOD_RGBToHex,
COLOURMETHOD_HexTORGB,
COLOURMETHOD_ApplyHudColour,
COLOURMETHOD_ApplyHudColourToTF,
};
virtual ~CScaleformColourClass() {}
// One call method to handle a bunch of function calls means we don't have to create a bunch of GFxFunctionHandler subclasses
virtual void Call(const Params& params)
{
size_t method = size_t(params.pUserData);
switch(method)
{
case COLOURMETHOD_Ctor:
DoConstructor(params);
break;
case COLOURMETHOD_Colourise:
DoColourise(params);
break;
case COLOURMETHOD_setHudColour:
DoSetHudColour(params);
break;
case COLOURMETHOD_ColouriseB:
DoColouriseB(params);
break;
case COLOURMETHOD_RGBToHex:
DoRGBToHex(params);
break;
case COLOURMETHOD_HexTORGB:
DoHexToRGB(params);
break;
case COLOURMETHOD_ApplyHudColour:
DoApplyHudColour(params);
break;
case COLOURMETHOD_ApplyHudColourToTF:
DoApplyHudColourToTF(params);
break;
default:
sfErrorf("Unknown method ID %" SIZETFMT "d", method);
break;
}
}
void DoConstructor(const Params& params)
{
CHECK_NUM_SF_ARGS("Colour", 0);
}
void ApplyColorXform(GFxValue& mc, float rf, float gf, float bf)
{
GRenderer::Cxform newXform;
// 0,1,2,3 -> R,G,B,A
// Float M_[4][2]; // [RGBA][mult, add]
// mult is all 1.0f
newXform.M_[0][0] = 1.0f;
newXform.M_[1][0] = 1.0f;
newXform.M_[2][0] = 1.0f;
newXform.M_[3][0] = 1.0f;
// add is (x-255)
newXform.M_[0][1] = rf - 255.0f;
newXform.M_[1][1] = gf - 255.0f;
newXform.M_[2][1] = bf - 255.0f;
newXform.M_[3][1] = 0.0f;
mc.SetColorTransform(newXform);
}
void ApplyAlpha(GFxValue& mc, float af)
{
GFxValue::DisplayInfo dispInfo;
if (mc.GetDisplayInfo(&dispInfo))
{
dispInfo.SetAlpha(af);
mc.SetDisplayInfo(dispInfo);
}
}
void DoApplyHudColour(const Params& params)
{
CHECK_NUM_SF_ARGS("ApplyHudColour", 2);
GFxValue undefined;
GFxValue& movieClip = params.ArgCount > 0 ? params.pArgs[0] : undefined;
GFxValue& colourId = params.ArgCount > 1 ? params.pArgs[1] : undefined;
CHECK_OPT_SF_VAR(movieClip, GFxValue::VT_DisplayObject);
if(!CScaleformMgr::VerifyVarType(colourId, GFxValue::VT_Number, STRING(colourId), movieClip))
return;
if (!movieClip.IsDefined())
{
sfErrorf("%s: %s is undefined", "ApplyHudColour", "movieClip");
return;
}
eHUD_COLOURS iHudColour = (eHUD_COLOURS)(s32)colourId.GetNumber();
CRGBA colour = CHudColour::GetRGBA(iHudColour);
ApplyColorXform(movieClip, colour.GetRed(), colour.GetGreen(), colour.GetBlue());
ApplyAlpha(movieClip, colour.GetAlphaf() * 100.0f);
}
void DoApplyHudColourToTF(const Params& params)
{
CHECK_NUM_SF_ARGS("ApplyHudColourToTF", 2);
GFxValue undefined;
GFxValue& textField = params.ArgCount > 0 ? params.pArgs[0] : undefined;
GFxValue& colourId = params.ArgCount > 1 ? params.pArgs[1] : undefined;
CHECK_OPT_SF_VAR(textField, GFxValue::VT_DisplayObject);
CHECK_SF_VAR(colourId, GFxValue::VT_Number);
if (!textField.IsDefined())
{
sfErrorf("%s: %s is undefined", "ApplyHudColourToTF", "movieClip");
return;
}
eHUD_COLOURS iHudColour = (eHUD_COLOURS)(s32)colourId.GetNumber();
CRGBA colour = CHudColour::GetRGBA(iHudColour);
if(textField.IsDisplayObject())
{
u32 result = ((int)colour.GetRed() << 16) |
((int)colour.GetGreen() << 8) |
((int)colour.GetBlue());
textField.SetMember("textColor", (Double)result);
ApplyAlpha(textField, colour.GetAlphaf() * 100.0f);
}
}
void DoColourise(const Params& params)
{
if (!sfVerifyf(params.ArgCount == 1 || params.ArgCount == 2 || params.ArgCount == 4 || params.ArgCount == 5,
"Wrong number of arguments to \"%s\", expected 1, 2, 4 or 5 and got %d", "Colourise", params.ArgCount))
{
return;
}
GFxValue undefined;
GFxValue& movieClip = params.ArgCount > 0 ? params.pArgs[0] : undefined;
GFxValue& r = params.ArgCount > 1 ? params.pArgs[1] : undefined;
GFxValue& g = params.ArgCount > 2 ? params.pArgs[2] : undefined;
GFxValue& b = params.ArgCount > 3 ? params.pArgs[3] : undefined;
GFxValue& a = params.ArgCount > 4 ? params.pArgs[4] : undefined;
CHECK_OPT_SF_VAR(movieClip, GFxValue::VT_DisplayObject);
CHECK_OPT_SF_VAR(r, GFxValue::VT_Number);
CHECK_OPT_SF_VAR(g, GFxValue::VT_Number);
CHECK_OPT_SF_VAR(b, GFxValue::VT_Number);
CHECK_OPT_SF_VAR(a, GFxValue::VT_Number);
// Could make this a macro
if (!movieClip.IsDefined())
{
sfErrorf("%s: %s is undefined", "Colourise", "movieClip");
return;
}
if (r.IsNumber() && g.IsNumber() && b.IsNumber())
{
ApplyColorXform(movieClip, (float)r.GetNumber(), (float)g.GetNumber(), (float)b.GetNumber());
}
if (a.IsNumber())
{
ApplyAlpha(movieClip, (float)a.GetNumber());
}
}
void DoSetHudColour(const Params& params)
{
CHECK_NUM_SF_ARGS("setHudColour", 2);
GFxValue& hudColourEnum = params.pArgs[0];
GFxValue& colourObj = params.pArgs[1];
CHECK_OPT_SF_VAR(hudColourEnum, GFxValue::VT_Number);
CHECK_SF_VAR(colourObj, GFxValue::VT_Object);
if (!hudColourEnum.IsDefined())
{
sfDebugf1("setHudColor - hudColorEnum is undefined");
return;
}
eHUD_COLOURS iHudColour = (eHUD_COLOURS)(s32)hudColourEnum.GetNumber();
if (iHudColour > HUD_COLOUR_INVALID && iHudColour < HUD_COLOUR_MAX_COLOURS)
{
if (colourObj.IsObject() &&
colourObj.HasMember("r") &&
colourObj.HasMember("g") &&
colourObj.HasMember("b") &&
colourObj.HasMember("a"))
{
CRGBA colour = CHudColour::GetRGBA(iHudColour);
colourObj.SetMember("r", (Double)colour.GetRed());
colourObj.SetMember("g", (Double)colour.GetGreen());
colourObj.SetMember("b", (Double)colour.GetBlue());
colourObj.SetMember("a", (Double)(colour.GetAlphaf() * 100.0f));
}
}
}
void DoColouriseB(const Params& params)
{
CHECK_NUM_SF_ARGS("ColouriseB", 5);
GFxValue& movieClip = params.pArgs[0];
GFxValue& r = params.pArgs[1];
GFxValue& g = params.pArgs[2];
GFxValue& b = params.pArgs[3];
GFxValue& a = params.pArgs[4];
CHECK_SF_VAR(movieClip, GFxValue::VT_DisplayObject);
CHECK_SF_VAR(r, GFxValue::VT_Number);
CHECK_SF_VAR(g, GFxValue::VT_Number);
CHECK_SF_VAR(b, GFxValue::VT_Number);
CHECK_SF_VAR(a, GFxValue::VT_Number);
sfErrorf("ColouriseB is deprecated, don't use it!");
}
void DoRGBToHex(const Params& params)
{
CHECK_NUM_SF_ARGS("RGBToHex", 3);
GFxValue& r = params.pArgs[0];
GFxValue& g = params.pArgs[1];
GFxValue& b = params.pArgs[2];
CHECK_SF_VAR(r, GFxValue::VT_Number);
CHECK_SF_VAR(g, GFxValue::VT_Number);
CHECK_SF_VAR(b, GFxValue::VT_Number);
u32 result = ((int)r.GetNumber() << 16) |
((int)g.GetNumber() << 8) |
((int)b.GetNumber());
params.pRetVal->SetNumber((Double)result);
}
void DoHexToRGB(const Params& params)
{
CHECK_NUM_SF_ARGS("HexToRGB", 1);
GFxValue& number = params.pArgs[0];
CHECK_SF_VAR(number, GFxValue::VT_Number);
u32 hexVal = (u32)number.GetNumber();
params.pMovie->CreateObject(params.pRetVal);
params.pRetVal->SetMember("r", (Double)((hexVal >> 16) & 0xFF));
params.pRetVal->SetMember("g", (Double)((hexVal >> 8) & 0xFF));
params.pRetVal->SetMember("b", (Double)((hexVal) & 0xFF));
}
virtual void AddStaticMethods(GFxMovieView& movie, GFxValue& classObject, GFxValue& /*originalClass*/)
{
AddMethodToAsObject(movie, classObject, "Colourise", COLOURMETHOD_Colourise);
AddMethodToAsObject(movie, classObject, "setHudColour", COLOURMETHOD_setHudColour);
AddMethodToAsObject(movie, classObject, "ColouriseB", COLOURMETHOD_ColouriseB);
AddMethodToAsObject(movie, classObject, "RGBToHex", COLOURMETHOD_RGBToHex);
AddMethodToAsObject(movie, classObject, "HexTORGB", COLOURMETHOD_HexTORGB);
AddMethodToAsObject(movie, classObject, "ApplyHudColour", COLOURMETHOD_ApplyHudColour);
AddMethodToAsObject(movie, classObject, "ApplyHudColourToTF", COLOURMETHOD_ApplyHudColourToTF);
}
protected:
};
void CScaleformInstallColour(sfScaleformMovieView& sfmovie)
{
sfmovie.InstallFunctionHandler<CScaleformColourClass>("_global.com.rockstargames.ui.utils.Colour", true, false);
}