naev 0.12.6
nlua_colour.c
Go to the documentation of this file.
1/*
2 * See Licensing and Copyright notice in naev.h
3 */
9
11#include <lauxlib.h>
12
13#include "naev.h"
15
16#include "nlua_colour.h"
17
18#include "nluadef.h"
19
20/* Colour metatable methods. */
21static int colL_eq( lua_State *L );
22static int colL_tostring( lua_State *L );
23static int colL_new( lua_State *L );
24static int colL_newHSV( lua_State *L );
25static int colL_alpha( lua_State *L );
26static int colL_rgb( lua_State *L );
27static int colL_rgba( lua_State *L );
28static int colL_hsv( lua_State *L );
29static int colL_setrgb( lua_State *L );
30static int colL_sethsv( lua_State *L );
31static int colL_setalpha( lua_State *L );
32static int colL_linearToGamma( lua_State *L );
33static int colL_gammaToLinear( lua_State *L );
34
35static const luaL_Reg colL_methods[] = {
36 { "__eq", colL_eq },
37 { "__tostring", colL_tostring },
38 { "new", colL_new },
39 { "newHSV", colL_newHSV },
40 { "alpha", colL_alpha },
41 { "rgb", colL_rgb },
42 { "rgba", colL_rgba },
43 { "hsv", colL_hsv },
44 { "setRGB", colL_setrgb },
45 { "setHSV", colL_sethsv },
46 { "setAlpha", colL_setalpha },
47 { "linearToGamma", colL_linearToGamma },
48 { "gammaToLinear", colL_gammaToLinear },
49 { 0, 0 } };
50
57int nlua_loadCol( nlua_env env )
58{
59 nlua_register( env, COL_METATABLE, colL_methods, 1 );
60 return 0;
61}
62
87glColour *lua_tocolour( lua_State *L, int ind )
88{
89 return (glColour *)lua_touserdata( L, ind );
90}
91
98glColour *luaL_checkcolour( lua_State *L, int ind )
99{
100 if ( lua_iscolour( L, ind ) )
101 return lua_tocolour( L, ind );
102 luaL_typerror( L, ind, COL_METATABLE );
103 return NULL;
104}
105
112glColour *lua_pushcolour( lua_State *L, glColour colour )
113{
114 glColour *c = (glColour *)lua_newuserdata( L, sizeof( glColour ) );
115 *c = colour;
116 luaL_getmetatable( L, COL_METATABLE );
117 lua_setmetatable( L, -2 );
118 return c;
119}
120
127int lua_iscolour( lua_State *L, int ind )
128{
129 int ret;
130
131 if ( lua_getmetatable( L, ind ) == 0 )
132 return 0;
133 lua_getfield( L, LUA_REGISTRYINDEX, COL_METATABLE );
134
135 ret = 0;
136 if ( lua_rawequal( L, -1, -2 ) ) /* does it have the correct mt? */
137 ret = 1;
138
139 lua_pop( L, 2 ); /* remove both metatables */
140 return ret;
141}
142
151static int colL_eq( lua_State *L )
152{
153 const glColour *c1, *c2;
154 c1 = luaL_checkcolour( L, 1 );
155 c2 = luaL_checkcolour( L, 2 );
156 lua_pushboolean( L, ( memcmp( c1, c2, sizeof( glColour ) ) == 0 ) );
157 return 1;
158}
159
167static int colL_tostring( lua_State *L )
168{
169 const glColour *col = luaL_checkcolour( L, 1 );
170 char buf[STRMAX_SHORT];
171 snprintf( buf, sizeof( buf ), "Colour( %.2f, %.2f, %.2f, %.2f )", col->r,
172 col->g, col->b, col->a );
173 lua_pushstring( L, buf );
174 return 1;
175}
176
197static int colL_new( lua_State *L )
198{
199 glColour col;
200
201 if ( lua_gettop( L ) == 0 ) {
202 col.r = col.g = col.b = col.a = 1.;
203 } else if ( lua_isnumber( L, 1 ) ) {
204 if ( lua_toboolean( L, 5 ) ) {
205 col.r = luaL_checknumber( L, 1 );
206 col.g = luaL_checknumber( L, 2 );
207 col.b = luaL_checknumber( L, 3 );
208 } else {
209 col.r = gammaToLinear( luaL_checknumber( L, 1 ) );
210 col.g = gammaToLinear( luaL_checknumber( L, 2 ) );
211 col.b = gammaToLinear( luaL_checknumber( L, 3 ) );
212 }
213 col.a = luaL_optnumber( L, 4, 1. );
214 } else if ( lua_isstring( L, 1 ) ) {
215 const glColour *col2 = col_fromName( lua_tostring( L, 1 ) );
216 if ( col2 == NULL )
217 return NLUA_ERROR( L, _( "Colour '%s' does not exist!" ),
218 lua_tostring( L, 1 ) );
219 if ( lua_toboolean( L, 3 ) ) {
220 col.r = linearToGamma( col2->r );
221 col.g = linearToGamma( col2->g );
222 col.b = linearToGamma( col2->b );
223 } else
224 col = *col2;
225 col.a = luaL_optnumber( L, 2, 1. );
226 } else if ( lua_iscolour( L, 1 ) )
227 col = *lua_tocolour( L, 1 );
228 else
229 NLUA_INVALID_PARAMETER( L, 1 );
230
231 lua_pushcolour( L, col );
232 return 1;
233}
234
251static int colL_newHSV( lua_State *L )
252{
253 glColour col;
254
255 if ( lua_isnumber( L, 1 ) ) {
256 double h, s, v;
257 h = luaL_checknumber( L, 1 );
258 s = luaL_checknumber( L, 2 );
259 v = luaL_checknumber( L, 3 );
260 col_hsv2rgb( &col, h, s, v );
261 if ( !lua_toboolean( L, 5 ) ) {
262 col.r = gammaToLinear( col.r );
263 col.g = gammaToLinear( col.g );
264 col.b = gammaToLinear( col.b );
265 }
266 col.a = luaL_optnumber( L, 4, 1. );
267 } else
268 NLUA_INVALID_PARAMETER( L, 1 );
269
270 lua_pushcolour( L, col );
271 return 1;
272}
273
285static int colL_alpha( lua_State *L )
286{
287 const glColour *col = luaL_checkcolour( L, 1 );
288 lua_pushnumber( L, col->a );
289 return 1;
290}
291
307static int colL_rgb( lua_State *L )
308{
309 const glColour *col = luaL_checkcolour( L, 1 );
310 if ( lua_toboolean( L, 2 ) ) {
311 lua_pushnumber( L, linearToGamma( col->r ) );
312 lua_pushnumber( L, linearToGamma( col->g ) );
313 lua_pushnumber( L, linearToGamma( col->b ) );
314 } else {
315 lua_pushnumber( L, col->r );
316 lua_pushnumber( L, col->g );
317 lua_pushnumber( L, col->b );
318 }
319 return 3;
320}
321
338static int colL_rgba( lua_State *L )
339{
340 const glColour *col = luaL_checkcolour( L, 1 );
341 if ( lua_toboolean( L, 2 ) ) {
342 lua_pushnumber( L, linearToGamma( col->r ) );
343 lua_pushnumber( L, linearToGamma( col->g ) );
344 lua_pushnumber( L, linearToGamma( col->b ) );
345 } else {
346 lua_pushnumber( L, col->r );
347 lua_pushnumber( L, col->g );
348 lua_pushnumber( L, col->b );
349 }
350 lua_pushnumber( L, col->a );
351 return 4;
352}
353
369static int colL_hsv( lua_State *L )
370{
371 float h, s, v, r, g, b;
372 const glColour *col = luaL_checkcolour( L, 1 );
373 if ( lua_toboolean( L, 2 ) ) {
374 r = linearToGamma( col->r );
375 g = linearToGamma( col->g );
376 b = linearToGamma( col->b );
377 } else {
378 r = col->r;
379 g = col->g;
380 b = col->b;
381 }
382 col_rgb2hsv( &h, &s, &v, r, g, b );
383 lua_pushnumber( L, h );
384 lua_pushnumber( L, s );
385 lua_pushnumber( L, v );
386 return 3;
387}
388
402static int colL_setrgb( lua_State *L )
403{
404 glColour *col = luaL_checkcolour( L, 1 );
405 col->r = luaL_checknumber( L, 2 );
406 col->g = luaL_checknumber( L, 3 );
407 col->b = luaL_checknumber( L, 4 );
408 return 0;
409}
410
424static int colL_sethsv( lua_State *L )
425{
426 float h, s, v;
427 glColour *col = luaL_checkcolour( L, 1 );
428 h = luaL_checknumber( L, 2 );
429 s = luaL_checknumber( L, 3 );
430 v = luaL_checknumber( L, 4 );
431 col_hsv2rgb( col, h, s, v );
432 return 0;
433}
434
446static int colL_setalpha( lua_State *L )
447{
448 glColour *col = luaL_checkcolour( L, 1 );
449 col->a = luaL_checknumber( L, 2 );
450 return 0;
451}
452
459static int colL_linearToGamma( lua_State *L )
460{
461 const glColour *col = luaL_checkcolour( L, 1 );
462 glColour out;
463 out.r = linearToGamma( col->r );
464 out.g = linearToGamma( col->g );
465 out.b = linearToGamma( col->b );
466 out.a = col->a;
467 lua_pushcolour( L, out );
468 return 1;
469}
470
477static int colL_gammaToLinear( lua_State *L )
478{
479 const glColour *col = luaL_checkcolour( L, 1 );
480 glColour out;
481 out.r = gammaToLinear( col->r );
482 out.g = gammaToLinear( col->g );
483 out.b = gammaToLinear( col->b );
484 out.a = col->a;
485 lua_pushcolour( L, out );
486 return 1;
487}
void col_rgb2hsv(float *H, float *S, float *V, float R, float G, float B)
Changes colour space from RGB to HSV.
Definition colour.c:125
void col_hsv2rgb(glColour *c, float h, float s, float v)
Changes colour space from HSV to RGB.
Definition colour.c:61
Header file with generic functions and naev-specifics.
static int colL_new(lua_State *L)
Creates a new colour. Colours are assumed to be in gamma colourspace by default and are converted to ...
int lua_iscolour(lua_State *L, int ind)
Checks to see if ind is a colour.
static int colL_rgb(lua_State *L)
Gets the RGB values of a colour.
static int colL_setrgb(lua_State *L)
Sets the colours values from the RGB colourspace.
static int colL_eq(lua_State *L)
Compares two colours to see if they are the same.
static int colL_hsv(lua_State *L)
Gets the HSV values of a colour.
int nlua_loadCol(nlua_env env)
Loads the colour library.
Definition nlua_colour.c:57
static int colL_tostring(lua_State *L)
Converts a colour to a string.
glColour * lua_tocolour(lua_State *L, int ind)
Lua bindings to interact with colours.
Definition nlua_colour.c:87
glColour * lua_pushcolour(lua_State *L, glColour colour)
Pushes a colour on the stack.
static int colL_sethsv(lua_State *L)
Sets the colours values from the HSV colourspace.
glColour * luaL_checkcolour(lua_State *L, int ind)
Gets colour at index or raises error if there is no colour at index.
Definition nlua_colour.c:98
static const luaL_Reg colL_methods[]
Definition nlua_colour.c:35
static int colL_linearToGamma(lua_State *L)
Converts a colour from linear to gamma corrected.
static int colL_newHSV(lua_State *L)
Creates a new colour from HSV values. Colours are assumed to be in gamma colourspace by default and a...
static int colL_setalpha(lua_State *L)
Sets the alpha of a colour.
static int colL_rgba(lua_State *L)
Gets the RGBA values of a colour.
static int colL_gammaToLinear(lua_State *L)
Converts a colour from gamma corrected to linear.
static int colL_alpha(lua_State *L)
Gets the alpha of a colour.
static const double c[]
Definition rng.c:256