diff options
Diffstat (limited to 'c_src/sdl_blend_mode.c')
-rw-r--r-- | c_src/sdl_blend_mode.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/c_src/sdl_blend_mode.c b/c_src/sdl_blend_mode.c new file mode 100644 index 0000000..be83aaf --- /dev/null +++ b/c_src/sdl_blend_mode.c @@ -0,0 +1,84 @@ +// Copyright (c) 2017, Loïc Hoguin <[email protected]> +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#include "esdl2.h" + +#define BLEND_MODE_ENUM(E) \ + E(none, SDL_BLENDMODE_NONE) \ + E(blend, SDL_BLENDMODE_BLEND) \ + E(add, SDL_BLENDMODE_ADD) \ + E(mod, SDL_BLENDMODE_MOD) \ + E(invalid, SDL_BLENDMODE_INVALID) + +NIF_ATOM_TO_ENUM_FUNCTION(atom_to_blend_mode, SDL_BlendMode, BLEND_MODE_ENUM) +NIF_ENUM_TO_ATOM_FUNCTION(blend_mode_to_atom, SDL_BlendMode, BLEND_MODE_ENUM) + +#define BLEND_OPERATION_ENUM(E) \ + E(add, SDL_BLENDOPERATION_ADD) \ + E(substract, SDL_BLENDOPERATION_SUBTRACT) \ + E(rev_substract, SDL_BLENDOPERATION_REV_SUBTRACT) \ + E(minimum, SDL_BLENDOPERATION_MINIMUM) \ + E(maximum, SDL_BLENDOPERATION_MAXIMUM) + +static NIF_ATOM_TO_ENUM_FUNCTION(atom_to_blend_operation, SDL_BlendOperation, BLEND_OPERATION_ENUM) + +#define BLEND_FACTOR_ENUM(E) \ + E(zero, SDL_BLENDFACTOR_ZERO) \ + E(one, SDL_BLENDFACTOR_ONE) \ + E(src_color, SDL_BLENDFACTOR_SRC_COLOR) \ + E(one_minus_src_color, SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR) \ + E(src_alpha, SDL_BLENDFACTOR_SRC_ALPHA) \ + E(one_minus_src_alpha, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA) \ + E(dst_color, SDL_BLENDFACTOR_DST_COLOR) \ + E(one_minus_dst_color, SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR) \ + E(dst_alpha, SDL_BLENDFACTOR_DST_ALPHA) \ + E(one_minus_dst_alpha, SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA) + +static NIF_ATOM_TO_ENUM_FUNCTION(atom_to_blend_factor, SDL_BlendFactor, BLEND_FACTOR_ENUM) + +// compose_custom_blend_mode + +NIF_CALL_HANDLER(thread_compose_custom_blend_mode) +{ + SDL_BlendMode mode; + ERL_NIF_TERM term; + + mode = SDL_ComposeCustomBlendMode( + (long)args[0], (long)args[1], (long)args[2], + (long)args[3], (long)args[4], (long)args[5]); + + term = blend_mode_to_atom(mode); + + if (!enif_is_identical(term, atom_undefined)) + return term; + + return enif_make_int(env, mode); +} + +NIF_FUNCTION(compose_custom_blend_mode) +{ + SDL_BlendFactor srcColorFactor, dstColorFactor, srcAlphaFactor, dstAlphaFactor; + SDL_BlendOperation colorOp, alphaOp; + + BADARG_IF(!atom_to_blend_factor(env, argv[0], &srcColorFactor)); + BADARG_IF(!atom_to_blend_factor(env, argv[1], &dstColorFactor)); + BADARG_IF(!atom_to_blend_operation(env, argv[2], &colorOp)); + BADARG_IF(!atom_to_blend_factor(env, argv[3], &srcAlphaFactor)); + BADARG_IF(!atom_to_blend_factor(env, argv[4], &dstAlphaFactor)); + BADARG_IF(!atom_to_blend_operation(env, argv[5], &alphaOp)); + + return nif_thread_call(env, thread_compose_custom_blend_mode, 6, + srcColorFactor, dstColorFactor, colorOp, + srcAlphaFactor, dstAlphaFactor, alphaOp); +} |