// Copyright (c) 2017-2018, Loïc Hoguin // // 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" #if !SDL_VERSION_ATLEAST(2, 0, 6) #define SDL_BLENDMODE_INVALID 0x7FFFFFFF #endif #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) #if SDL_VERSION_ATLEAST(2, 0, 6) #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); } #else NIF_FUNCTION(compose_custom_blend_mode) { return atom_undefined; } #endif /* SDL_VERSION_ATLEAST(2, 0, 6) */