From 898c2ada209f3ab4e19d4b072aeef484baae27da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Sun, 7 Jan 2018 10:45:17 +0100 Subject: Add a bunch of sdl_renderer functions --- README.asciidoc | 34 +++++------ c_src/esdl2.h | 68 +++++++++++++++++++--- c_src/sdl_keyboard.c | 2 - c_src/sdl_pixels.c | 61 ++++++++++++++++++++ c_src/sdl_renderer.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++ ebin/esdl2.app | 2 +- src/esdl2.erl | 20 +++++++ src/sdl_pixels.erl | 28 +++++++++ src/sdl_renderer.erl | 50 +++++++++++++++-- 9 files changed, 384 insertions(+), 37 deletions(-) create mode 100644 c_src/sdl_pixels.c create mode 100644 src/sdl_pixels.erl diff --git a/README.asciidoc b/README.asciidoc index dbd6943..163e813 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -61,30 +61,25 @@ corresponding to the public headers. ** `SDL_EventState` and `SDL_GetEventState` ** `SDL_RegisterEvents` * 'SDL_hints.h': We only have a proof of concept callback system. +* 'SDL_pixels.h': Only the pixel format enum and conversion function is defined. * 'SDL_rect.h': Everything is missing except the map to point/rect conversion functions. * 'SDL_render.h': The following elements are missing: ** `SDL_TextureAccess` enum ** `SDL_TextureModulate` enum -** `SDL_GetNumRenderDrivers` -** `SDL_GetRenderDriverInfo` ** `SDL_CreateWindowAndRenderer` is currently located in `sdl_window`. Move it? -** `SDL_CreateSoftwareRenderer` -** `SDL_GetRenderer` -** `SDL_GetRendererInfo` -** `SDL_CreateTexture` -** `SDL_QueryTexture` -** `SDL_UpdateTexture` -** `SDL_UpdateYUVTexture` -** `SDL_LockTexture` -** `SDL_UnlockTexture` -** `SDL_SetRenderTarget` -** `SDL_GetRenderTarget` -** `SDL_RenderSetIntegerScale` -** `SDL_RenderGetIntegerScale` -** `SDL_RenderIsClipEnabled` -** `SDL_RenderReadPixels` -** `SDL_GL_BindTexture` -** `SDL_GL_UnbindTexture` +** `SDL_CreateSoftwareRenderer` (renderer) +** `SDL_CreateTexture` (texture) +** `SDL_QueryTexture` (texture) +** `SDL_UpdateTexture` (texture) +** `SDL_UpdateYUVTexture` (texture) +** `SDL_LockTexture` (texture) +** `SDL_UnlockTexture` (texture) +** `SDL_SetRenderTarget` (renderer) +** `SDL_GetRenderTarget` (renderer) +** `SDL_RenderIsClipEnabled` (renderer) +** `SDL_RenderReadPixels` (renderer) +** `SDL_GL_BindTexture` (gl) +** `SDL_GL_UnbindTexture` (gl) * 'SDL_stdinc.h': SDL_bool is implemented in 'sdl_bool.c'. Do we need anything else? * 'SDL_surface.h': Only surface creation (via `IMG_Load`) and destruction is implemented. Might be better to move IMG_* functions in their own space. * 'SDL_version.h': `SDL_GetRevisionNumber` must be implemented. The macros may also be useful. @@ -154,7 +149,6 @@ corresponding to the public headers. * 'SDL_haptic.h' * 'SDL_joystick.h' * 'SDL_messagebox.h' -* 'SDL_pixels.h' * 'SDL_rwops.h' (unclear if we need it) * 'SDL_shape.h' * 'SDL_system.h' diff --git a/c_src/esdl2.h b/c_src/esdl2.h index a9cf3f4..a860b7f 100644 --- a/c_src/esdl2.h +++ b/c_src/esdl2.h @@ -20,6 +20,10 @@ // 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) \ @@ -29,10 +33,24 @@ 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) \ @@ -73,6 +91,7 @@ A(finger_motion) \ A(finger_up) \ A(first) \ + A(flags) \ A(flipped) \ A(focus_gained) \ A(focus_lost) \ @@ -88,9 +107,15 @@ 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) \ @@ -109,11 +134,8 @@ A(left_ctrl) \ A(left_gui) \ A(left_shift) \ - A(ok) \ - A(one_minus_dst_alpha) \ - A(one_minus_dst_color) \ - A(one_minus_src_alpha) \ - A(one_minus_src_color) \ + A(max_texture_height) \ + A(max_texture_width) \ A(maximized) \ A(maximum) \ A(middle) \ @@ -129,26 +151,45 @@ 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(present_vsync) \ A(pressed) \ A(quit) \ A(released) \ - A(render_targets_reset) \ 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) \ @@ -173,13 +214,15 @@ A(target_texture) \ A(text_editing) \ A(text_input) \ - A(touch) \ - A(true) \ + A(texture_formats) \ A(timer) \ A(timestamp) \ + A(touch) \ + A(true) \ A(type) \ A(undefined) \ A(unknown) \ + A(uyvy) \ A(vertical) \ A(video) \ A(w) \ @@ -195,6 +238,9 @@ A(xrel) \ A(y) \ A(yrel) \ + A(yuy2) \ + A(yv12) \ + A(yvyu) \ A(zero) \ A(_nif_thread_ret_) @@ -304,7 +350,10 @@ 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) \ @@ -317,11 +366,13 @@ 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) \ @@ -386,6 +437,7 @@ NIF_ATOM_TO_ENUM_FUNCTION_DECL(atom_to_blend_mode, SDL_BlendMode) 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) diff --git a/c_src/sdl_keyboard.c b/c_src/sdl_keyboard.c index f33a69d..5c402d4 100644 --- a/c_src/sdl_keyboard.c +++ b/c_src/sdl_keyboard.c @@ -69,7 +69,6 @@ NIF_CALL_HANDLER(thread_get_key_name) name = SDL_GetKeyName((long)args[0]); enif_alloc_binary(strlen(name), &bin); - memcpy(bin.data, name, bin.size); return enif_make_binary(env, &bin); @@ -141,7 +140,6 @@ NIF_FUNCTION(get_scancode_name) name = SDL_GetScancodeName(scancode); enif_alloc_binary(strlen(name), &bin); - memcpy(bin.data, name, bin.size); return enif_make_binary(env, &bin); diff --git a/c_src/sdl_pixels.c b/c_src/sdl_pixels.c new file mode 100644 index 0000000..08c9a61 --- /dev/null +++ b/c_src/sdl_pixels.c @@ -0,0 +1,61 @@ +// Copyright (c) 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" + +#define PIXEL_FORMAT_ENUM(E) \ + E(unknown, SDL_PIXELFORMAT_UNKNOWN) \ + E(index1lsb, SDL_PIXELFORMAT_INDEX1LSB) \ + E(index1msb, SDL_PIXELFORMAT_INDEX1MSB) \ + E(index4lsb, SDL_PIXELFORMAT_INDEX4LSB) \ + E(index4msb, SDL_PIXELFORMAT_INDEX4MSB) \ + E(index8, SDL_PIXELFORMAT_INDEX8) \ + E(rgb332, SDL_PIXELFORMAT_RGB332) \ + E(rgb444, SDL_PIXELFORMAT_RGB444) \ + E(rgb555, SDL_PIXELFORMAT_RGB555) \ + E(bgr555, SDL_PIXELFORMAT_BGR555) \ + E(argb4444, SDL_PIXELFORMAT_ARGB4444) \ + E(rgba4444, SDL_PIXELFORMAT_RGBA4444) \ + E(abgr4444, SDL_PIXELFORMAT_ABGR4444) \ + E(bgra4444, SDL_PIXELFORMAT_BGRA4444) \ + E(argb1555, SDL_PIXELFORMAT_ARGB1555) \ + E(rgba5551, SDL_PIXELFORMAT_RGBA5551) \ + E(abgr1555, SDL_PIXELFORMAT_ABGR1555) \ + E(bgra5551, SDL_PIXELFORMAT_BGRA5551) \ + E(rgb565, SDL_PIXELFORMAT_RGB565) \ + E(bgr565, SDL_PIXELFORMAT_BGR565) \ + E(rgb24, SDL_PIXELFORMAT_RGB24) \ + E(bgr24, SDL_PIXELFORMAT_BGR24) \ + E(rgb888, SDL_PIXELFORMAT_RGB888) \ + E(rgbx8888, SDL_PIXELFORMAT_RGBX8888) \ + E(bgr888, SDL_PIXELFORMAT_BGR888) \ + E(bgrx8888, SDL_PIXELFORMAT_BGRX8888) \ + E(argb8888, SDL_PIXELFORMAT_ARGB8888) \ + E(rgba8888, SDL_PIXELFORMAT_RGBA8888) \ + E(abgr8888, SDL_PIXELFORMAT_ABGR8888) \ + E(bgra8888, SDL_PIXELFORMAT_BGRA8888) \ + E(argb2101010, SDL_PIXELFORMAT_ARGB2101010) \ + E(rgba32, SDL_PIXELFORMAT_RGBA32) \ + E(argb32, SDL_PIXELFORMAT_ARGB32) \ + E(bgra32, SDL_PIXELFORMAT_BGRA32) \ + E(abgr32, SDL_PIXELFORMAT_ABGR32) \ + E(yv12, SDL_PIXELFORMAT_YV12) \ + E(iyuv, SDL_PIXELFORMAT_IYUV) \ + E(yuy2, SDL_PIXELFORMAT_YUY2) \ + E(uyvy, SDL_PIXELFORMAT_UYVY) \ + E(yvyu, SDL_PIXELFORMAT_YVYU) \ + E(nv12, SDL_PIXELFORMAT_NV12) \ + E(nv21, SDL_PIXELFORMAT_NV21) + +NIF_ENUM_TO_ATOM_FUNCTION(pixel_format_to_atom, Uint32, PIXEL_FORMAT_ENUM) diff --git a/c_src/sdl_renderer.c b/c_src/sdl_renderer.c index 60bfe85..7954fd3 100644 --- a/c_src/sdl_renderer.c +++ b/c_src/sdl_renderer.c @@ -29,6 +29,7 @@ void dtor_Renderer(ErlNifEnv* env, void* obj) F(target_texture, SDL_RENDERER_TARGETTEXTURE) static NIF_LIST_TO_FLAGS_FUNCTION(list_to_renderer_flags, Uint32, RENDERER_FLAGS) +static NIF_FLAGS_TO_LIST_FUNCTION(renderer_flags_to_list, Uint32, RENDERER_FLAGS) #define FLIP_FLAGS(F) \ F(none, SDL_FLIP_NONE) \ @@ -37,6 +38,42 @@ static NIF_LIST_TO_FLAGS_FUNCTION(list_to_renderer_flags, Uint32, RENDERER_FLAGS static NIF_LIST_TO_FLAGS_FUNCTION(list_to_flip_flags, SDL_RendererFlip, FLIP_FLAGS) +static ERL_NIF_TERM renderer_info_to_map(ErlNifEnv* env, SDL_RendererInfo* info) +{ + ERL_NIF_TERM map, list; + ErlNifBinary bin; + int i; + + map = enif_make_new_map(env); + + enif_alloc_binary(strlen(info->name), &bin); + memcpy(bin.data, info->name, bin.size); + + enif_make_map_put(env, map, atom_name, + enif_make_binary(env, &bin), &map); + + enif_make_map_put(env, map, atom_flags, + renderer_flags_to_list(env, info->flags), &map); + + list = enif_make_list(env, 0); + + for (i = 0; i < info->num_texture_formats; i++) { + list = enif_make_list_cell(env, + pixel_format_to_atom(info->texture_formats[i]), + list); + } + + enif_make_map_put(env, map, atom_texture_formats, list, &map); + + enif_make_map_put(env, map, atom_max_texture_width, + enif_make_int(env, info->max_texture_width), &map); + + enif_make_map_put(env, map, atom_max_texture_height, + enif_make_int(env, info->max_texture_height), &map); + + return map; +} + // create_renderer NIF_CALL_HANDLER(thread_create_renderer) @@ -143,6 +180,34 @@ NIF_FUNCTION(get_render_draw_color) NIF_RES_GET(Renderer, renderer_res)); } +// get_render_driver_info +// +// The max_texture_* values will most likely be returned as 0 +// when using this function. The get_renderer_info will always +// have an accurate value on the other hand. + +NIF_CALL_HANDLER(thread_get_render_driver_info) +{ + SDL_RendererInfo info; + + if (SDL_GetRenderDriverInfo((long)args[0], &info)) + return sdl_error_tuple(env); + + return enif_make_tuple2(env, + atom_ok, + renderer_info_to_map(env, &info) + ); +} + +NIF_FUNCTION(get_render_driver_info) +{ + int index; + + BADARG_IF(!enif_get_int(env, argv[0], &index)); + + return nif_thread_call(env, thread_get_render_driver_info, 1, index); +} + // get_render_output_size NIF_CALL_HANDLER(thread_get_render_output_size) @@ -171,6 +236,55 @@ NIF_FUNCTION(get_render_output_size) NIF_RES_GET(Renderer, renderer_res)); } +// get_renderer + +NIF_CALL_HANDLER(thread_get_renderer) +{ + SDL_Renderer* renderer; + + renderer = SDL_GetRenderer(args[0]); + + if (!renderer) + return atom_undefined; + + return esdl2_renderers_find(env, renderer); +} + +NIF_FUNCTION(get_renderer) +{ + void* window_res; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Window, &window_res)); + + return nif_thread_call(env, thread_get_renderer, 1, + NIF_RES_GET(Window, window_res)); +} + +// get_renderer_info + +NIF_CALL_HANDLER(thread_get_renderer_info) +{ + SDL_RendererInfo info; + + if (SDL_GetRendererInfo(args[0], &info)) + return sdl_error_tuple(env); + + return enif_make_tuple2(env, + atom_ok, + renderer_info_to_map(env, &info) + ); +} + +NIF_FUNCTION(get_renderer_info) +{ + void* renderer_res; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Renderer, &renderer_res)); + + return nif_thread_call(env, thread_get_renderer_info, 1, + NIF_RES_GET(Renderer, renderer_res)); +} + // render_clear NIF_CALL_HANDLER(thread_render_clear) @@ -617,6 +731,26 @@ NIF_FUNCTION(render_get_clip_rect) NIF_RES_GET(Renderer, renderer_res)); } +// render_get_integer_scale + +NIF_CALL_HANDLER(thread_render_get_integer_scale) +{ + if (SDL_RenderGetIntegerScale(args[0])) + return atom_true; + + return atom_false; +} + +NIF_FUNCTION(render_get_integer_scale) +{ + void* renderer_res; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Renderer, &renderer_res)); + + return nif_thread_call(env, thread_render_get_integer_scale, 1, + NIF_RES_GET(Renderer, renderer_res)); +} + // render_get_logical_size NIF_CALL_HANDLER(thread_render_get_logical_size) @@ -738,6 +872,28 @@ NIF_FUNCTION(render_set_clip_rect) NIF_RES_GET(Renderer, renderer_res), x, y, w, h); } +// render_set_integer_scale + +NIF_CALL_HANDLER(thread_render_set_integer_scale) +{ + if (SDL_RenderSetIntegerScale(args[0], (long)args[1])) + return sdl_error_tuple(env); + + return atom_ok; +} + +NIF_FUNCTION(render_set_integer_scale) +{ + void* renderer_res; + SDL_bool b; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Renderer, &renderer_res)); + BADARG_IF(!atom_to_bool(env, argv[1], &b)); + + return nif_thread_call(env, thread_render_set_integer_scale, 2, + NIF_RES_GET(Renderer, renderer_res), b); +} + // render_set_logical_size NIF_CALL_HANDLER(thread_render_set_logical_size) diff --git a/ebin/esdl2.app b/ebin/esdl2.app index 093aeae..c2bd838 100644 --- a/ebin/esdl2.app +++ b/ebin/esdl2.app @@ -1,7 +1,7 @@ {application, 'esdl2', [ {description, "SDL2 Erlang NIF."}, {vsn, "0.1.0"}, - {modules, ['esdl2','esdl2_app','esdl2_callbacks','esdl2_sup','sdl','sdl_blend_mode','sdl_clipboard','sdl_cpu_info','sdl_cursor','sdl_events','sdl_filesystem','sdl_gl','sdl_hints','sdl_keyboard','sdl_keycode','sdl_mouse','sdl_platform','sdl_power','sdl_rect','sdl_renderer','sdl_surface','sdl_texture','sdl_version','sdl_window']}, + {modules, ['esdl2','esdl2_app','esdl2_callbacks','esdl2_sup','sdl','sdl_blend_mode','sdl_clipboard','sdl_cpu_info','sdl_cursor','sdl_events','sdl_filesystem','sdl_gl','sdl_hints','sdl_keyboard','sdl_keycode','sdl_mouse','sdl_pixels','sdl_platform','sdl_power','sdl_rect','sdl_renderer','sdl_surface','sdl_texture','sdl_version','sdl_window']}, {registered, [esdl2_sup]}, {applications, [kernel,stdlib]}, {mod, {esdl2_app, []}}, diff --git a/src/esdl2.erl b/src/esdl2.erl index f46ef23..435451b 100644 --- a/src/esdl2.erl +++ b/src/esdl2.erl @@ -119,7 +119,10 @@ -export([get_num_render_drivers/0]). -export([get_render_draw_blend_mode/1]). -export([get_render_draw_color/1]). +-export([get_render_driver_info/1]). -export([get_render_output_size/1]). +-export([get_renderer/1]). +-export([get_renderer_info/1]). -export([render_clear/1]). -export([render_copy/4]). -export([render_copy_ex/7]). @@ -132,11 +135,13 @@ -export([render_fill_rect/5]). -export([render_fill_rects/2]). -export([render_get_clip_rect/1]). +-export([render_get_integer_scale/1]). -export([render_get_logical_size/1]). -export([render_get_scale/1]). -export([render_get_viewport/1]). -export([render_present/1]). -export([render_set_clip_rect/5]). +-export([render_set_integer_scale/2]). -export([render_set_logical_size/3]). -export([render_set_scale/3]). -export([render_set_viewport/5]). @@ -460,9 +465,18 @@ get_render_draw_blend_mode(_) -> get_render_draw_color(_) -> erlang:nif_error({not_loaded, ?MODULE}). +get_render_driver_info(_) -> + erlang:nif_error({not_loaded, ?MODULE}). + get_render_output_size(_) -> erlang:nif_error({not_loaded, ?MODULE}). +get_renderer(_) -> + erlang:nif_error({not_loaded, ?MODULE}). + +get_renderer_info(_) -> + erlang:nif_error({not_loaded, ?MODULE}). + render_clear(_) -> erlang:nif_error({not_loaded, ?MODULE}). @@ -499,6 +513,9 @@ render_fill_rects(_, _) -> render_get_clip_rect(_) -> erlang:nif_error({not_loaded, ?MODULE}). +render_get_integer_scale(_) -> + erlang:nif_error({not_loaded, ?MODULE}). + render_get_logical_size(_) -> erlang:nif_error({not_loaded, ?MODULE}). @@ -514,6 +531,9 @@ render_present(_) -> render_set_clip_rect(_, _, _, _, _) -> erlang:nif_error({not_loaded, ?MODULE}). +render_set_integer_scale(_, _) -> + erlang:nif_error({not_loaded, ?MODULE}). + render_set_logical_size(_, _, _) -> erlang:nif_error({not_loaded, ?MODULE}). diff --git a/src/sdl_pixels.erl b/src/sdl_pixels.erl new file mode 100644 index 0000000..fef9a55 --- /dev/null +++ b/src/sdl_pixels.erl @@ -0,0 +1,28 @@ +%% Copyright (c) 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. + +-module(sdl_pixels). + +-type pixel_format() :: unknown + | index1lsb | index1msb | index4lsb | index4msb | index8 + | rgb332 | rgb444 | rgb555 | bgr555 + | argb4444 | rgba4444 | abgr4444 | bgra4444 + | argb1555 | rgba5551 | abgr1555 | bgra5551 + | rgb565 | bgr565 | rgb24 | bgr24 + | rgb888 | rgbx8888 | bgr888 | bgrx8888 + | argb8888 | rgba8888 | abgr8888 | bgra8888 + | argb2101010 + | rgba32 | argb32 | bgra32 | abgr32 + | yv12 | iyuv | yuy2 | uyvy | yvyu | nv12 | nv21. +-export_type([pixel_format/0]). diff --git a/src/sdl_renderer.erl b/src/sdl_renderer.erl index c46df8a..2601cd7 100644 --- a/src/sdl_renderer.erl +++ b/src/sdl_renderer.erl @@ -18,7 +18,6 @@ -export([copy/2]). -export([copy/4]). -export([copy/7]). --export([count_drivers/0]). -export([create/3]). -export([draw_line/3]). -export([draw_line/5]). @@ -35,7 +34,12 @@ -export([get_clip_rect/1]). -export([get_draw_blend_mode/1]). -export([get_draw_color/1]). +-export([get_driver_info/1]). +-export([get_from_window/1]). +-export([get_info/1]). +-export([get_integer_scale/1]). -export([get_logical_size/1]). +-export([get_num_drivers/0]). -export([get_output_size/1]). -export([get_scale/1]). -export([get_viewport/1]). @@ -45,6 +49,7 @@ -export([set_clip_rect/5]). -export([set_draw_blend_mode/2]). -export([set_draw_color/5]). +-export([set_integer_scale/2]). -export([set_logical_size/3]). -export([set_scale/3]). -export([set_viewport/2]). @@ -56,6 +61,14 @@ -type renderer_flag() :: software | accelerated | present_vsync | target_texture. -export_type([renderer_flag/0]). +-type renderer_info() :: #{ + name => binary(), + flags => [renderer_flag()], + texture_formats => sdl_pixels:pixel_format(), + max_texture_width => integer(), + max_texture_height => integer() +}. + -spec clear(renderer()) -> ok | sdl:error(). clear(Renderer) -> esdl2:render_clear(Renderer), @@ -81,11 +94,6 @@ copy(Renderer, Texture, SrcRect, DstRect, Angle, CenterPoint, FlipFlags) -> esdl2:render_copy_ex(Renderer, Texture, SrcRect, DstRect, Angle, CenterPoint, FlipFlags), receive {'_nif_thread_ret_', Ret} -> Ret end. --spec count_drivers() -> integer(). -count_drivers() -> - {ok, Count} = esdl2:get_num_render_drivers(), - Count. - -spec create(sdl_window:window(), integer(), [renderer_flag()]) -> {ok, renderer()} | sdl:error(). create(Window, Index, Flags) -> @@ -169,11 +177,36 @@ get_draw_color(Renderer) -> Mode end. +-spec get_driver_info(integer()) -> {ok, renderer_info()} | sdl:error(). +get_driver_info(Index) -> + esdl2:get_render_driver_info(Index), + receive {'_nif_thread_ret_', Ret} -> Ret end. + +-spec get_from_window(sdl_window:window()) -> renderer(). +get_from_window(Window) -> + esdl2:get_renderer(Window), + receive {'_nif_thread_ret_', Ret} -> Ret end. + +-spec get_info(renderer()) -> {ok, renderer_info()} | sdl:error(). +get_info(Renderer) -> + esdl2:get_renderer_info(Renderer), + receive {'_nif_thread_ret_', Ret} -> Ret end. + +-spec get_integer_scale(renderer()) -> boolean(). +get_integer_scale(Renderer) -> + esdl2:render_get_integer_scale(Renderer), + receive {'_nif_thread_ret_', Ret} -> Ret end. + -spec get_logical_size(renderer()) -> {integer(), integer()}. get_logical_size(Renderer) -> esdl2:render_get_logical_size(Renderer), receive {'_nif_thread_ret_', Ret} -> Ret end. +-spec get_num_drivers() -> integer(). +get_num_drivers() -> + {ok, Num} = esdl2:get_num_render_drivers(), + Num. + -spec get_output_size(renderer()) -> {integer(), integer()}. get_output_size(Renderer) -> esdl2:get_render_output_size(Renderer), @@ -220,6 +253,11 @@ set_draw_color(Renderer, R, G, B, A) -> esdl2:set_render_draw_color(Renderer, R, G, B, A), receive {'_nif_thread_ret_', Ret} -> Ret end. +-spec set_integer_scale(renderer(), boolean()) -> ok | sdl:error(). +set_integer_scale(Renderer, Bool) -> + esdl2:render_set_integer_scale(Renderer, Bool), + receive {'_nif_thread_ret_', Ret} -> Ret end. + -spec set_logical_size(renderer(), integer(), integer()) -> ok | sdl:error(). set_logical_size(Renderer, W, H) -> esdl2:render_set_logical_size(Renderer, W, H), -- cgit v1.2.3