aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2018-01-07 10:45:17 +0100
committerLoïc Hoguin <[email protected]>2018-01-07 10:45:17 +0100
commit898c2ada209f3ab4e19d4b072aeef484baae27da (patch)
tree02bdbec4966eb43ddd0b67d2ffec17e8d1e8a540
parentd3c5885b7463f3019efdf2ee1fd9cdf7d85396fe (diff)
downloadesdl2-898c2ada209f3ab4e19d4b072aeef484baae27da.tar.gz
esdl2-898c2ada209f3ab4e19d4b072aeef484baae27da.tar.bz2
esdl2-898c2ada209f3ab4e19d4b072aeef484baae27da.zip
Add a bunch of sdl_renderer functions
-rw-r--r--README.asciidoc34
-rw-r--r--c_src/esdl2.h68
-rw-r--r--c_src/sdl_keyboard.c2
-rw-r--r--c_src/sdl_pixels.c61
-rw-r--r--c_src/sdl_renderer.c156
-rw-r--r--ebin/esdl2.app2
-rw-r--r--src/esdl2.erl20
-rw-r--r--src/sdl_pixels.erl28
-rw-r--r--src/sdl_renderer.erl50
9 files changed, 384 insertions, 37 deletions
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 <[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 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 <[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.
+
+-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),