1/* Part of the SDL3 pack for SWI-Prolog. 2 3 SDL_render.h — 2D hardware-accelerated renderer, textures, drawing. 4 5 @see https://wiki.libsdl.org/SDL3/SDL_render 6*/ 7 8:- module(sdl_render, [ 9 sdl_createrenderer/3, 10 sdl_setrendervsync/2, 11 sdl_destroyrenderer/1, 12 sdl_renderclear/1, 13 sdl_rendertexture/4, 14 sdl_renderpresent/1, 15 sdl_createtexturefromsurface/3, 16 sdl_createtexture/6, 17 sdl_destroytexture/1, 18 sdl_setrenderdrawcolor/5, 19 sdl_renderrect/2, 20 sdl_renderfillrect/2, 21 sdl_updatetexture/4, 22 sdl_locktexture/4, 23 sdl_unlocktexture/1, 24 sdl_texture_access/2 25]). 26 27:- use_module(library(sdl/foreign), [ 28 sdl_createrenderer_/3, 29 sdl_setrendervsync_/2, 30 sdl_destroyrenderer/1, 31 sdl_renderclear/1, 32 sdl_rendertexture_/4, 33 sdl_renderpresent/1, 34 sdl_createtexturefromsurface_/3, 35 sdl_createtexture_/6, 36 sdl_destroytexture/1, 37 sdl_setrenderdrawcolor_/5, 38 sdl_renderrect_/2, 39 sdl_renderfillrect_/2, 40 sdl_updatetexture_/4, 41 sdl_locktexture_/4, 42 sdl_unlocktexture_/1, 43 sdl_renderer_blob_portray/2, 44 sdl_texture_blob_portray/2 45]). 46:- reexport(library(sdl/foreign), [ 47 sdl_destroyrenderer/1, 48 sdl_renderclear/1, 49 sdl_renderpresent/1, 50 sdl_destroytexture/1 51]). 52:- use_module(library(sdl/pixels), [sdl_pixel_format/2]). 53:- use_module(library(sdl/surface)). % for sdl_surface_blob type 54:- use_module(library(ptr)). 55 56:- multifile error:has_type/2. 57errorhas_type(sdl_renderer_blob, X) :- blob(X, sdl_renderer_blob). 58errorhas_type(sdl_texture_blob, X) :- blob(X, sdl_texture_blob). 59errorhas_type(sdl_texture_access, X) :- sdl_texture_access(X, _). 60 61:- multifile prolog:error_message//1. 62prologerror_message(type_error(sdl_renderer_blob, Culprit)) --> 63 [ 'sdl_renderer_blob, found ~q'-[Culprit] ]. 64prologerror_message(type_error(sdl_texture_blob, Culprit)) --> 65 [ 'sdl_texture_blob, found ~q'-[Culprit] ]. 66prologerror_message(type_error(sdl_texture_access, Culprit)) --> 67 { findall(F, sdl_texture_access(F, _), Fs) }, 68 [ 'sdl_texture_access (one of ~q), found ~q'-[Fs, Culprit] ].
94user:portray(Renderer) :- 95 blob(Renderer, sdl_renderer_blob), !, 96 sdl_renderer_blob_portray(current_output, Renderer). 97user:portray(Texture) :- 98 blob(Texture, sdl_texture_blob), !, 99 sdl_texture_blob_portray(current_output, Texture).
108sdl_createrenderer(Renderer, Window, Name) :-
109 must_be(var, Renderer),
110 must_be(sdl_window_blob, Window),
111 must_be((oneof([null]) ; string), Name),
112 sdl_createrenderer_(Renderer, Window, Name).
121sdl_setrendervsync(Renderer, VSync) :-
122 must_be(sdl_renderer_blob, Renderer),
123 must_be(integer, VSync),
124 sdl_setrendervsync_(Renderer, VSync).
132sdl_createtexturefromsurface(Texture, Renderer, Surface) :-
133 must_be(var, Texture),
134 must_be(sdl_renderer_blob, Renderer),
135 must_be(sdl_surface_blob, Surface),
136 sdl_createtexturefromsurface_(Texture, Renderer, Surface).rect(X, Y, W, H).
145sdl_rendertexture(Renderer, Texture, Srcrect, Dstrect) :-
146 must_be(sdl_renderer_blob, Renderer),
147 must_be(sdl_texture_blob, Texture),
148 maplist(
149 must_be((compound(rect(number, number, number, number)) ; oneof([null]))),
150 [Srcrect, Dstrect]),
151 sdl_rendertexture_(Renderer, Texture, Srcrect, Dstrect).
159sdl_setrenderdrawcolor(Renderer, R, G, B, A) :-
160 must_be(sdl_renderer_blob, Renderer),
161 must_be(between(0, 255), R),
162 must_be(between(0, 255), G),
163 must_be(between(0, 255), B),
164 must_be(between(0, 255), A),
165 sdl_setrenderdrawcolor_(Renderer, R, G, B, A).rect(X, Y, W, H) of numbers.
173sdl_renderrect(Renderer, Rect) :-
174 must_be(sdl_renderer_blob, Renderer),
175 must_be(compound(rect(number, number, number, number)), Rect),
176 sdl_renderrect_(Renderer, Rect).rect(X, Y, W, H) of numbers.
184sdl_renderfillrect(Renderer, Rect) :-
185 must_be(sdl_renderer_blob, Renderer),
186 must_be(compound(rect(number, number, number, number)), Rect),
187 sdl_renderfillrect_(Renderer, Rect).staticstreamingtarget198% --- texture access enum ---------------------------------------------------- 199 200sdl_texture_access(static, 0). 201sdl_texture_access(streaming, 1). 202sdl_texture_access(target, 2).
212% --- create texture --------------------------------------------------------- 213 214sdl_createtexture(Texture, Renderer, Format, Access, Width, Height) :- 215 must_be(var, Texture), 216 must_be(sdl_renderer_blob, Renderer), 217 must_be(sdl_pixel_format, Format), 218 must_be(sdl_texture_access, Access), 219 must_be(positive_integer, Width), 220 must_be(positive_integer, Height), 221 sdl_pixel_format(Format, IntFormat), 222 sdl_texture_access(Access, IntAccess), 223 sdl_createtexture_(Texture, Renderer, IntFormat, IntAccess, Width, Height).
rect(X, Y, W, H).
234sdl_updatetexture(Texture, Rect, Pixels, Pitch) :-
235 must_be(sdl_texture_blob, Texture),
236 must_be((compound(rect(number, number, number, number)) ; oneof([null])), Rect),
237 must_be(ptr_blob, Pixels),
238 must_be(integer, Pitch),
239 sdl_updatetexture_(Texture, Rect, Pixels, Pitch).
Lock a texture so it can be updated. On success Pixels is a PtrBlob to
the locked region and Pitch its row stride. Rect is null for the whole
texture, or a term rect(X, Y, W, H). Use sdl_unlocktexture/1 when done.
250sdl_locktexture(Texture, Rect, Pixels, Pitch) :-
251 must_be(sdl_texture_blob, Texture),
252 must_be((compound(rect(number, number, number, number)) ; oneof([null])), Rect),
253 must_be(var, Pixels),
254 must_be(var, Pitch),
255 sdl_locktexture_(Texture, Rect, Pixels, Pitch).
263sdl_unlocktexture(Texture) :-
264 must_be(sdl_texture_blob, Texture),
265 sdl_unlocktexture_(Texture)