Files @ r24860:fb2788d47d86
Branch filter:

Location: cpp/openttd-patchpack/source/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp

Michael Lutz
Codechange: [OSX] Only keep a total dirty rect for drawing.

When drawing an 8bpp screen buffer, palette resolving was done for each
dirty rectangle. In areas with high activity, this would mean a pixel might
have been resolved multiple times. Also, if too many individual updates
were queued, the whole screen would be refreshed, even if unnecessary.

All other drivers only keep one overall dirty rect, so do it here as well.
/* see copyright notice in squirrel.h */

#include "../../../stdafx.h"

#include <squirrel.h>
#include <math.h>
#include <sqstdmath.h>

#include "../../../safeguards.h"

#define SINGLE_ARG_FUNC(_funcname, num_ops) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
	SQFloat f; \
	sq_decreaseops(v,num_ops); \
	sq_getfloat(v,2,&f); \
	sq_pushfloat(v,(SQFloat)_funcname(f)); \
	return 1; \
}

#define TWO_ARGS_FUNC(_funcname, num_ops) static SQInteger math_##_funcname(HSQUIRRELVM v){ \
	SQFloat p1,p2; \
	sq_decreaseops(v,num_ops); \
	sq_getfloat(v,2,&p1); \
	sq_getfloat(v,3,&p2); \
	sq_pushfloat(v,(SQFloat)_funcname(p1,p2)); \
	return 1; \
}

#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
static SQInteger math_srand(HSQUIRRELVM v)
{
	SQInteger i;
	if(SQ_FAILED(sq_getinteger(v,2,&i)))
		return sq_throwerror(v,"invalid param");
	srand((unsigned int)i);
	return 0;
}

static SQInteger math_rand(HSQUIRRELVM v)
{
	sq_pushinteger(v,rand());
	return 1;
}
#endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */

static SQInteger math_abs(HSQUIRRELVM v)
{
	SQInteger n;
	sq_getinteger(v,2,&n);
	sq_pushinteger(v,(SQInteger)abs((int)n));
	return 1;
}

SINGLE_ARG_FUNC(sqrt, 100)
SINGLE_ARG_FUNC(fabs, 1)
SINGLE_ARG_FUNC(sin, 100)
SINGLE_ARG_FUNC(cos, 100)
SINGLE_ARG_FUNC(asin, 100)
SINGLE_ARG_FUNC(acos, 100)
SINGLE_ARG_FUNC(log, 100)
SINGLE_ARG_FUNC(log10, 100)
SINGLE_ARG_FUNC(tan, 100)
SINGLE_ARG_FUNC(atan, 100)
TWO_ARGS_FUNC(atan2, 100)
TWO_ARGS_FUNC(pow, 100)
SINGLE_ARG_FUNC(floor, 1)
SINGLE_ARG_FUNC(ceil, 1)
SINGLE_ARG_FUNC(exp, 100)

#define _DECL_FUNC(name,nparams,tycheck) {#name,math_##name,nparams,tycheck}
static SQRegFunction mathlib_funcs[] = {
	_DECL_FUNC(sqrt,2,".n"),
	_DECL_FUNC(sin,2,".n"),
	_DECL_FUNC(cos,2,".n"),
	_DECL_FUNC(asin,2,".n"),
	_DECL_FUNC(acos,2,".n"),
	_DECL_FUNC(log,2,".n"),
	_DECL_FUNC(log10,2,".n"),
	_DECL_FUNC(tan,2,".n"),
	_DECL_FUNC(atan,2,".n"),
	_DECL_FUNC(atan2,3,".nn"),
	_DECL_FUNC(pow,3,".nn"),
	_DECL_FUNC(floor,2,".n"),
	_DECL_FUNC(ceil,2,".n"),
	_DECL_FUNC(exp,2,".n"),
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
	_DECL_FUNC(srand,2,".n"),
	_DECL_FUNC(rand,1,NULL),
#endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */
	_DECL_FUNC(fabs,2,".n"),
	_DECL_FUNC(abs,2,".n"),
	{0,0,0,0},
};

#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif

SQRESULT sqstd_register_mathlib(HSQUIRRELVM v)
{
	SQInteger i=0;
	while(mathlib_funcs[i].name!=0)	{
		sq_pushstring(v,mathlib_funcs[i].name,-1);
		sq_newclosure(v,mathlib_funcs[i].f,0);
		sq_setparamscheck(v,mathlib_funcs[i].nparamscheck,mathlib_funcs[i].typemask);
		sq_setnativeclosurename(v,-1,mathlib_funcs[i].name);
		sq_createslot(v,-3);
		i++;
	}
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
	sq_pushstring(v,"RAND_MAX",-1);
	sq_pushinteger(v,RAND_MAX);
	sq_createslot(v,-3);
#endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */
	sq_pushstring(v,"PI",-1);
	sq_pushfloat(v,(SQFloat)M_PI);
	sq_createslot(v,-3);
	return SQ_OK;
}