// Copyright (c) 2014-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. #ifndef __ESDL2_H__ #define __ESDL2_H__ #include "SDL.h" // List of atoms used by this NIF. #define NIF_ATOMS(A) \ A(abgr1555) \ A(abgr32) \ A(abgr4444) \ A(abgr8888) \ A(accelerated) \ A(add) \ A(allow_high_dpi) \ A(always_on_top) \ A(app_did_enter_background) \ A(app_did_enter_foreground) \ A(app_low_memory) \ A(app_terminating) \ A(app_will_enter_background) \ A(app_will_enter_foreground) \ A(argb1555) \ A(argb2101010) \ A(argb32) \ A(argb4444) \ A(argb8888) \ A(arrow) \ A(audio) \ A(audio_device_added) \ A(audio_device_removed) \ A(bgr24) \ A(bgr555) \ A(bgr565) \ A(bgr888) \ A(bgra32) \ A(bgra4444) \ A(bgra5551) \ A(bgra8888) \ A(bgrx8888) \ A(blend) \ A(borderless) \ A(button) \ A(callback) \ A(caps) \ A(centered) \ A(charged) \ A(charging) \ A(clicks) \ A(clipboard_update) \ A(close) \ A(controller_axis_motion) \ A(controller_button_down) \ A(controller_button_up) \ A(controller_device_added) \ A(controller_device_remapped) \ A(controller_device_removed) \ A(crosshair) \ A(data1) \ A(data2) \ A(diagonal) \ A(direction) \ A(dollar_gesture) \ A(dollar_record) \ A(drop_begin) \ A(drop_complete) \ A(drop_file) \ A(drop_text) \ A(dst_alpha) \ A(dst_color) \ A(enter) \ A(error) \ A(event) \ A(events) \ A(everything) \ A(exposed) \ A(false) \ A(finger_down) \ A(finger_motion) \ A(finger_up) \ A(first) \ A(flags) \ A(flipped) \ A(focus_gained) \ A(focus_lost) \ A(foreign) \ A(format) \ A(fullscreen) \ A(fullscreen_desktop) \ A(game_controller) \ A(get) \ A(h) \ A(hand) \ A(haptic) \ A(hidden) \ A(hit_test) \ A(horizontal) \ A(ibeam) \ A(index1lsb) \ A(index1msb) \ A(index4lsb) \ A(index4msb) \ A(index8) \ A(input_focus) \ A(input_grabbed) \ A(invalid) \ A(iyuv) \ A(joy_axis_motion) \ A(joy_ball_motion) \ A(joy_button_down) \ A(joy_button_up) \ A(joy_device_added) \ A(joy_device_removed) \ A(joy_hat_motion) \ A(joystick) \ A(key_down) \ A(key_up) \ A(keymap_changed) \ A(last) \ A(leave) \ A(left) \ A(left_alt) \ A(left_ctrl) \ A(left_gui) \ A(left_shift) \ A(max_texture_height) \ A(max_texture_width) \ A(maximized) \ A(maximum) \ A(middle) \ A(minimized) \ A(minimum) \ A(mod) \ A(mode) \ A(mouse_capture) \ A(mouse_down) \ A(mouse_focus) \ A(mouse_motion) \ A(mouse_up) \ A(mouse_wheel) \ A(moved) \ A(multi_gesture) \ A(name) \ A(no) \ A(no_battery) \ A(none) \ A(normal) \ A(num) \ A(nv12) \ A(nv21) \ A(ok) \ A(on_battery) \ A(one) \ A(one_minus_dst_alpha) \ A(one_minus_dst_color) \ A(one_minus_src_alpha) \ A(one_minus_src_color) \ A(opengl) \ A(peek) \ A(popup_menu) \ A(present_vsync) \ A(pressed) \ A(quit) \ A(refresh_rate) \ A(released) \ A(render_device_reset) \ A(render_targets_reset) \ A(repeat) \ A(resizable) \ A(resized) \ A(restored) \ A(rev_substract) \ A(rgb24) \ A(rgb332) \ A(rgb444) \ A(rgb555) \ A(rgb565) \ A(rgb888) \ A(rgba32) \ A(rgba4444) \ A(rgba5551) \ A(rgba8888) \ A(rgbx8888) \ A(right) \ A(right_alt) \ A(right_ctrl) \ A(right_gui) \ A(right_shift) \ A(scancode) \ A(shown) \ A(size_all) \ A(size_changed) \ A(size_nesw) \ A(size_ns) \ A(size_nwse) \ A(size_we) \ A(skip_taskbar) \ A(software) \ A(src_alpha) \ A(src_color) \ A(state) \ A(substract) \ A(sym) \ A(syswm) \ A(take_focus) \ A(target_texture) \ A(text_editing) \ A(text_input) \ A(texture_formats) \ A(timer) \ A(timestamp) \ A(tooltip) \ A(touch) \ A(true) \ A(type) \ A(undefined) \ A(unknown) \ A(utility) \ A(uyvy) \ A(vertical) \ A(video) \ A(vulkan) \ A(w) \ A(wait) \ A(wait_arrow) \ A(which) \ A(window) \ A(window_id) \ A(windowed) \ A(x) \ A(x1) \ A(x2) \ A(xrel) \ A(y) \ A(yrel) \ A(yuy2) \ A(yv12) \ A(yvyu) \ A(zero) \ A(_nif_thread_ret_) // List of resources used by this NIF. #define NIF_RES_TYPE(r) SDL_ ## r #define NIF_RESOURCES(R) \ R(Cursor) \ R(GLContext) \ R(Renderer) \ R(Surface) \ R(Texture) \ R(Window) // List of functions defined in this NIF. #define NIF_FUNCTION_NAME(f) esdl2_ ## f #define NIF_FUNCTIONS(F) \ /* internal */ \ F(register_callback_process, 0) \ /* sdl */ \ F(init, 1) \ F(init_subsystem, 1) \ F(quit, 0) \ F(quit_subsystem, 1) \ F(set_main_ready, 0) \ F(was_init, 1) \ /* sdl_blendmode */ \ F(compose_custom_blend_mode, 6) \ /* sdl_clipboard */ \ F(get_clipboard_text, 0) \ F(has_clipboard_text, 0) \ F(set_clipboard_text, 1) \ /* sdl_cpu_info */ \ F(get_cpu_cache_line_size, 0) \ F(get_cpu_count, 0) \ F(get_system_ram, 0) \ F(has_3dnow, 0) \ F(has_altivec, 0) \ F(has_avx, 0) \ F(has_avx2, 0) \ F(has_mmx, 0) \ F(has_neon, 0) \ F(has_rdtsc, 0) \ F(has_sse, 0) \ F(has_sse2, 0) \ F(has_sse3, 0) \ F(has_sse41, 0) \ F(has_sse42, 0) \ /* sdl_cursor */ \ F(create_cursor, 6) \ F(create_color_cursor, 3) \ F(create_system_cursor, 1) \ F(get_cursor, 0) \ F(get_default_cursor, 0) \ F(set_cursor, 1) \ F(show_cursor, 1) \ /* sdl_events */ \ F(flush_event, 1) \ F(flush_events, 2) \ F(has_event, 1) \ F(has_events, 2) \ F(peep_events, 4) \ F(poll_event, 0) \ F(pump_events, 0) \ /* sdl_filesystem */ \ F(get_base_path, 0) \ F(get_pref_path, 2) \ /* sdl_gl */ \ F(gl_create_context, 1) \ F(gl_swap_window, 1) \ /* sdl_hints */ \ F(add_hint_callback, 3) \ /* sdl_keyboard */ \ F(get_key_from_name, 1) \ F(get_key_from_scancode, 1) \ F(get_key_name, 1) \ F(get_keyboard_focus, 0) \ F(get_keyboard_state, 0) \ F(get_mod_state, 0) \ F(get_scancode_from_key, 1) \ F(get_scancode_from_name, 1) \ F(get_scancode_name, 1) \ F(has_screen_keyboard_support, 0) \ F(is_screen_keyboard_shown, 1) \ F(is_text_input_active, 0) \ F(set_mod_state, 1) \ F(set_text_input_rect, 1) \ F(start_text_input, 0) \ F(stop_text_input, 0) \ /* sdl_mouse */ \ F(capture_mouse, 1) \ F(get_global_mouse_state, 0) \ F(get_mouse_focus, 0) \ F(get_mouse_state, 0) \ F(get_relative_mouse_mode, 0) \ F(get_relative_mouse_state, 0) \ F(set_relative_mouse_mode, 1) \ F(warp_mouse_global, 2) \ F(warp_mouse_in_window, 3) \ /* sdl_platform */ \ F(get_platform, 0) \ /* sdl_power */ \ F(get_power_info, 0) \ /* sdl_renderer */ \ F(create_renderer, 3) \ F(get_num_render_drivers, 0) \ F(get_render_draw_blend_mode, 1) \ F(get_render_draw_color, 1) \ F(get_render_driver_info, 1) \ F(get_render_output_size, 1) \ F(get_renderer, 1) \ F(get_renderer_info, 1) \ F(render_clear, 1) \ F(render_copy, 4) \ F(render_copy_ex, 7) \ F(render_draw_line, 5) \ F(render_draw_lines, 2) \ F(render_draw_point, 3) \ F(render_draw_points, 2) \ F(render_draw_rect, 5) \ F(render_draw_rects, 2) \ F(render_fill_rect, 5) \ F(render_fill_rects, 2) \ F(render_get_clip_rect, 1) \ F(render_get_integer_scale, 1) \ F(render_get_logical_size, 1) \ F(render_get_scale, 1) \ F(render_get_viewport, 1) \ F(render_present, 1) \ F(render_set_clip_rect, 5) \ F(render_set_integer_scale, 2) \ F(render_set_logical_size, 3) \ F(render_set_scale, 3) \ F(render_set_viewport, 5) \ F(render_target_supported, 1) \ F(set_render_draw_blend_mode, 2) \ F(set_render_draw_color, 5) \ /* sdl_surface */ \ F(img_load, 1) \ /* sdl_texture */ \ F(create_texture_from_surface, 2) \ F(get_texture_alpha_mod, 1) \ F(get_texture_blend_mode, 1) \ F(get_texture_color_mod, 1) \ F(set_texture_alpha_mod, 2) \ F(set_texture_blend_mode, 2) \ F(set_texture_color_mod, 4) \ /* sdl_version */ \ F(get_version, 0) \ F(get_revision, 0) \ /* sdl_video */ \ F(get_closest_display_mode, 2) \ F(get_current_display_mode, 1) \ F(get_current_video_driver, 0) \ F(get_desktop_display_mode, 1) \ F(get_display_bounds, 1) \ F(get_display_dpi, 1) \ F(get_display_mode, 2) \ F(get_display_name, 1) \ F(get_display_usable_bounds, 1) \ F(get_num_display_modes, 1) \ F(get_num_video_displays, 0) \ F(get_num_video_drivers, 0) \ F(get_video_driver, 1) \ F(video_init, 1) \ F(video_quit, 0) \ /* sdl_window */ \ F(create_window, 6) \ F(create_window_and_renderer, 3) \ F(get_window_brightness, 1) \ F(get_window_display_index, 1) \ F(get_window_flags, 1) \ F(get_window_grab, 1) \ F(get_window_id, 1) \ F(get_window_maximum_size, 1) \ F(get_window_minimum_size, 1) \ F(get_window_position, 1) \ F(get_window_size, 1) \ F(get_window_title, 1) \ F(hide_window, 1) \ F(maximize_window, 1) \ F(minimize_window, 1) \ F(raise_window, 1) \ F(restore_window, 1) \ F(set_window_bordered, 2) \ F(set_window_brightness, 2) \ F(set_window_fullscreen, 2) \ F(set_window_grab, 2) \ F(set_window_icon, 2) \ F(set_window_maximum_size, 3) \ F(set_window_minimum_size, 3) \ F(set_window_position, 3) \ F(set_window_size, 3) \ F(set_window_title, 2) \ F(show_window, 1) // Generated declarations for the NIF. #include "nif_helpers.h" NIF_ATOMS(NIF_ATOM_H_DECL) NIF_RESOURCES(NIF_RES_H_DECL) NIF_FUNCTIONS(NIF_FUNCTION_H_DECL) // Utility functions used across different files. NIF_ATOM_TO_ENUM_FUNCTION_DECL(atom_to_blend_mode, SDL_BlendMode) NIF_ATOM_TO_ENUM_FUNCTION_DECL(atom_to_bool, SDL_bool) NIF_ATOM_TO_ENUM_FUNCTION_DECL(atom_to_pixel_format, Uint32) NIF_ENUM_TO_ATOM_FUNCTION_DECL(blend_mode_to_atom, SDL_BlendMode) NIF_ENUM_TO_ATOM_FUNCTION_DECL(button_to_atom, Uint8) NIF_ENUM_TO_ATOM_FUNCTION_DECL(mousewheel_direction_to_atom, Uint32) NIF_ENUM_TO_ATOM_FUNCTION_DECL(pixel_format_to_atom, Uint32) NIF_ENUM_TO_ATOM_FUNCTION_DECL(window_event_to_atom, Uint8) NIF_LIST_TO_FLAGS_FUNCTION_DECL(keymod_list_to_flags, Uint16) NIF_FLAGS_TO_LIST_FUNCTION_DECL(keymod_flags_to_list, Uint16) int map_to_point(ErlNifEnv*, ERL_NIF_TERM, SDL_Point*); int map_to_rect(ErlNifEnv*, ERL_NIF_TERM, SDL_Rect*); ERL_NIF_TERM rect_to_map(ErlNifEnv*, SDL_Rect*); ERL_NIF_TERM mouse_state_to_list(ErlNifEnv*, Uint32); // -- void esdl2_windows_init(void); void esdl2_windows_insert(SDL_Window*, obj_Window*); ERL_NIF_TERM esdl2_windows_find(ErlNifEnv*, SDL_Window*); void esdl2_windows_remove(SDL_Window*); void esdl2_windows_free(void); void esdl2_renderers_init(void); void esdl2_renderers_insert(SDL_Renderer*, obj_Renderer*, obj_Window*); ERL_NIF_TERM esdl2_renderers_find(ErlNifEnv*, SDL_Renderer*); void esdl2_renderers_remove(SDL_Renderer*); void esdl2_renderers_free(void); void esdl2_cursors_init(void); void esdl2_cursors_insert(SDL_Cursor*, obj_Cursor*); ERL_NIF_TERM esdl2_cursors_find(ErlNifEnv*, SDL_Cursor*); void esdl2_cursors_remove(SDL_Cursor*); void esdl2_cursors_free(void); ErlNifPid* get_callback_process(void); #define sdl_error_tuple(env) \ enif_make_tuple2(env, \ atom_error, \ enif_make_string(env, SDL_GetError(), ERL_NIF_LATIN1) \ ); #endif