1 
2 //          Copyright Michael D. Parker 2018.
3 // Distributed under the Boost Software License, Version 1.0.
4 //    (See accompanying file LICENSE_1_0.txt or copy at
5 //          http://www.boost.org/LICENSE_1_0.txt)
6 
7 module bindbc.sdl.bind.sdlrender;
8 
9 import bindbc.sdl.config;
10 import bindbc.sdl.bind.sdlblendmode : SDL_BlendMode;
11 import bindbc.sdl.bind.sdlrect;
12 import bindbc.sdl.bind.sdlstdinc : SDL_bool;
13 import bindbc.sdl.bind.sdlsurface : SDL_Surface;
14 import bindbc.sdl.bind.sdlvideo : SDL_Window;
15 
16 enum SDL_RendererFlags : uint {
17     SDL_RENDERER_SOFTWARE = 0x00000001,
18     SDL_RENDERER_ACCELERATED = 0x00000002,
19     SDL_RENDERER_PRESENTVSYNC = 0x00000004,
20     SDL_RENDERER_TARGETTEXTURE = 0x00000008,
21 }
22 mixin(expandEnum!SDL_RendererFlags);
23 
24 struct SDL_RendererInfo {
25     const(char)* name;
26     SDL_RendererFlags flags;
27     uint num_texture_formats;
28     uint[16] texture_formats;
29     int max_texture_width;
30     int max_texture_height;
31 }
32 
33 static if(sdlSupport >= SDLSupport.sdl2012) {
34     enum SDL_ScaleMode {
35         SDL_ScaleModeNearest,
36         SDL_ScaleModeLinear,
37         SDL_ScaleModeBest,
38     }
39     mixin(expandEnum!SDL_ScaleMode);
40 }
41 
42 enum SDL_TextureAccess {
43     SDL_TEXTUREACCESS_STATIC,
44     SDL_TEXTUREACCESS_STREAMING,
45     SDL_TEXTUREACCESS_TARGET,
46 }
47 mixin(expandEnum!SDL_TextureAccess);
48 
49 enum SDL_TextureModulate {
50     SDL_TEXTUREMODULATE_NONE = 0x00000000,
51     SDL_TEXTUREMODULATE_COLOR = 0x00000001,
52     SDL_TEXTUREMODULATE_ALPHA = 0x00000002
53 }
54 mixin(expandEnum!SDL_TextureModulate);
55 
56 enum SDL_RendererFlip {
57     SDL_FLIP_NONE = 0x00000000,
58     SDL_FLIP_HORIZONTAL = 0x00000001,
59     SDL_FLIP_VERTICAL = 0x00000002,
60 }
61 mixin(expandEnum!SDL_RendererFlip);
62 
63 struct SDL_Renderer;
64 struct SDL_Texture;
65 
66 static if(staticBinding) {
67     extern(C) @nogc nothrow {
68         int SDL_GetNumRenderDrivers();
69         int SDL_GetRenderDriverInfo(int,SDL_RendererInfo*);
70         int SDL_CreateWindowAndRenderer(int,int,uint,SDL_Window**,SDL_Renderer**);
71         SDL_Renderer* SDL_CreateRenderer(SDL_Window*,int,SDL_RendererFlags);
72         SDL_Renderer* SDL_CreateSoftwareRenderer(SDL_Surface*);
73         SDL_Renderer* SDL_GetRenderer(SDL_Window*);
74         int SDL_GetRendererInfo(SDL_Renderer*,SDL_RendererInfo*);
75         int SDL_GetRendererOutputSize(SDL_Renderer*,int*,int*);
76         SDL_Texture* SDL_CreateTexture(SDL_Renderer*,uint,SDL_TextureAccess,int,int);
77         SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer*,SDL_Surface*);
78         int SDL_QueryTexture(SDL_Texture*,uint*,int*,int*,int*);
79         int SDL_SetTextureColorMod(SDL_Texture*,ubyte,ubyte,ubyte);
80         int SDL_GetTextureColorMod(SDL_Texture*,ubyte*,ubyte*,ubyte*);
81         int SDL_SetTextureAlphaMod(SDL_Texture*,ubyte);
82         int SDL_GetTextureAlphaMod(SDL_Texture*,ubyte*);
83         int SDL_SetTextureBlendMode(SDL_Texture*,SDL_BlendMode);
84         int SDL_GetTextureBlendMode(SDL_Texture*,SDL_BlendMode*);
85         int SDL_UpdateTexture(SDL_Texture*,const(SDL_Rect)*,const(void)*,int);
86         int SDL_LockTexture(SDL_Texture*,const(SDL_Rect)*,void**,int*);
87         void SDL_UnlockTexture(SDL_Texture*);
88         SDL_bool SDL_RenderTargetSupported(SDL_Renderer*);
89         int SDL_SetRenderTarget(SDL_Renderer*,SDL_Texture*);
90         SDL_Texture* SDL_GetRenderTarget(SDL_Renderer*);
91         int SDL_RenderSetClipRect(SDL_Renderer*,const(SDL_Rect)*);
92         void SDL_RenderGetClipRect(SDL_Renderer* renderer,SDL_Rect*);
93         int SDL_RenderSetLogicalSize(SDL_Renderer*,int,int);
94         void SDL_RenderGetLogicalSize(SDL_Renderer*,int*,int*);
95         int SDL_RenderSetViewport(SDL_Renderer*,const(SDL_Rect)*);
96         void SDL_RenderGetViewport(SDL_Renderer*,SDL_Rect*);
97         int SDL_RenderSetScale(SDL_Renderer*,float,float);
98         int SDL_RenderGetScale(SDL_Renderer*,float*,float*);
99         int SDL_SetRenderDrawColor(SDL_Renderer*,ubyte,ubyte,ubyte,ubyte);
100         int SDL_GetRenderDrawColor(SDL_Renderer*,ubyte*,ubyte*,ubyte*,ubyte*);
101         int SDL_SetRenderDrawBlendMode(SDL_Renderer*,SDL_BlendMode);
102         int SDL_GetRenderDrawBlendMode(SDL_Renderer*,SDL_BlendMode*);
103         int SDL_RenderClear(SDL_Renderer*);
104         int SDL_RenderDrawPoint(SDL_Renderer*,int,int);
105         int SDL_RenderDrawPoints(SDL_Renderer*,const(SDL_Point)*,int);
106         int SDL_RenderDrawLine(SDL_Renderer*,int,int,int,int);
107         int SDL_RenderDrawLines(SDL_Renderer*,const(SDL_Point)*,int);
108         int SDL_RenderDrawRect(SDL_Renderer*,const(SDL_Rect)*);
109         int SDL_RenderDrawRects(SDL_Renderer*,const(SDL_Rect)*,int);
110         int SDL_RenderFillRect(SDL_Renderer*,const(SDL_Rect)*);
111         int SDL_RenderFillRects(SDL_Renderer*,const(SDL_Rect)*,int);
112         int SDL_RenderCopy(SDL_Renderer*,SDL_Texture*,const(SDL_Rect)*,const(SDL_Rect*));
113         int SDL_RenderCopyEx(SDL_Renderer*,SDL_Texture*,const(SDL_Rect)*,const(SDL_Rect)*,const(double),const(SDL_Point)*,const(SDL_RendererFlip));
114         int SDL_RenderReadPixels(SDL_Renderer*,const(SDL_Rect)*,uint,void*,int);
115         void SDL_RenderPresent(SDL_Renderer*);
116         void SDL_DestroyTexture(SDL_Texture*);
117         void SDL_DestroyRenderer(SDL_Renderer*);
118         int SDL_GL_BindTexture(SDL_Texture*,float*,float*);
119         int SDL_GL_UnbindTexture(SDL_Texture*);
120 
121         static if(sdlSupport >= SDLSupport.sdl201) {
122             int SDL_UpdateYUVTexture(SDL_Texture*,const(SDL_Rect)*,const(ubyte)*,int,const(ubyte)*,int,const(ubyte)*,int);
123         }
124         static if(sdlSupport >= SDLSupport.sdl204) {
125             SDL_bool SDL_RenderIsClipEnabled(SDL_Renderer*);
126         }
127         static if(sdlSupport >= SDLSupport.sdl205) {
128             SDL_bool SDL_RenderGetIntegerScale(SDL_Renderer*);
129             int SDL_RenderSetIntegerScale(SDL_Renderer*,SDL_bool);
130         }
131         static if(sdlSupport >= SDLSupport.sdl208) {
132             void* SDL_RenderGetMetalLayer(SDL_Renderer*);
133             void* SDL_RenderGetMetalCommandEncoder(SDL_Renderer*);
134         }
135         static if(sdlSupport >= SDLSupport.sdl2010) {
136             int SDL_RenderDrawPointF(SDL_Renderer*,float,float);
137             int SDL_RenderDrawPointsF(SDL_Renderer*,const(SDL_FPoint)*,int);
138             int SDL_RenderDrawLineF(SDL_Renderer*,float,float,float,float);
139             int SDL_RenderDrawLinesF(SDL_Renderer*,const(SDL_FPoint)*,int);
140             int SDL_RenderDrawRectF(SDL_Renderer*,const(SDL_FRect)*);
141             int SDL_RenderDrawRectsF(SDL_Renderer*,const(SDL_FRect)*,int);
142             int SDL_RenderFillRectF(SDL_Renderer*,const(SDL_FRect)*);
143             int SDL_RenderFillRectsF(SDL_Renderer*,const(SDL_FRect)*,int);
144             int SDL_RenderCopyF(SDL_Renderer*,SDL_Texture*,const(SDL_FRect)*,const(SDL_FRect)*);
145             int SDL_RenderCopyExF(SDL_Renderer*,SDL_Texture*,const(SDL_FRect)*,const(SDL_FRect)*,const(double),const(SDL_FPoint)*,const(SDL_RendererFlip));
146             int SDL_RenderFlush(SDL_Renderer*);
147         }
148         static if(sdlSupport >= SDLSupport.sdl2012) {
149             int SDL_SetTextureScaleMode(SDL_Texture*,SDL_ScaleMode);
150             int SDL_GetTextureScaleMode(SDL_Texture*,SDL_ScaleMode*);
151             int SDL_LockTextureToSurface(SDL_Texture*,const(SDL_Rect)*,SDL_Surface**);
152         }
153     }
154 }
155 else {
156     extern(C) @nogc nothrow {
157         alias pSDL_GetNumRenderDrivers = int function();
158         alias pSDL_GetRenderDriverInfo = int function(int,SDL_RendererInfo*);
159         alias pSDL_CreateWindowAndRenderer = int function(int,int,uint,SDL_Window**,SDL_Renderer**);
160         alias pSDL_CreateRenderer = SDL_Renderer* function(SDL_Window*,int,SDL_RendererFlags);
161         alias pSDL_CreateSoftwareRenderer = SDL_Renderer* function(SDL_Surface*);
162         alias pSDL_GetRenderer = SDL_Renderer* function(SDL_Window*);
163         alias pSDL_GetRendererInfo = int function(SDL_Renderer*,SDL_RendererInfo*);
164         alias pSDL_GetRendererOutputSize = int function(SDL_Renderer*,int*,int*);
165         alias pSDL_CreateTexture = SDL_Texture* function(SDL_Renderer*,uint,SDL_TextureAccess,int,int);
166         alias pSDL_CreateTextureFromSurface = SDL_Texture* function(SDL_Renderer*,SDL_Surface*);
167         alias pSDL_QueryTexture = int function(SDL_Texture*,uint*,int*,int*,int*);
168         alias pSDL_SetTextureColorMod = int function(SDL_Texture*,ubyte,ubyte,ubyte);
169         alias pSDL_GetTextureColorMod = int function(SDL_Texture*,ubyte*,ubyte*,ubyte*);
170         alias pSDL_SetTextureAlphaMod = int function(SDL_Texture*,ubyte);
171         alias pSDL_GetTextureAlphaMod = int function(SDL_Texture*,ubyte*);
172         alias pSDL_SetTextureBlendMode = int function(SDL_Texture*,SDL_BlendMode);
173         alias pSDL_GetTextureBlendMode = int function(SDL_Texture*,SDL_BlendMode*);
174         alias pSDL_UpdateTexture = int function(SDL_Texture*,const(SDL_Rect)*,const(void)*,int);
175         alias pSDL_LockTexture = int function(SDL_Texture*,const(SDL_Rect)*,void**,int*);
176         alias pSDL_UnlockTexture = void function(SDL_Texture*);
177         alias pSDL_RenderTargetSupported = SDL_bool function(SDL_Renderer*);
178         alias pSDL_SetRenderTarget = int function(SDL_Renderer*,SDL_Texture*);
179         alias pSDL_GetRenderTarget = SDL_Texture* function(SDL_Renderer*);
180         alias pSDL_RenderSetClipRect = int function(SDL_Renderer*,const(SDL_Rect)*);
181         alias pSDL_RenderGetClipRect = void function(SDL_Renderer* renderer,SDL_Rect*);
182         alias pSDL_RenderSetLogicalSize = int function(SDL_Renderer*,int,int);
183         alias pSDL_RenderGetLogicalSize = void function(SDL_Renderer*,int*,int*);
184         alias pSDL_RenderSetViewport = int function(SDL_Renderer*,const(SDL_Rect)*);
185         alias pSDL_RenderGetViewport = void function(SDL_Renderer*,SDL_Rect*);
186         alias pSDL_RenderSetScale = int function(SDL_Renderer*,float,float);
187         alias pSDL_RenderGetScale = int function(SDL_Renderer*,float*,float*);
188         alias pSDL_SetRenderDrawColor = int function(SDL_Renderer*,ubyte,ubyte,ubyte,ubyte);
189         alias pSDL_GetRenderDrawColor = int function(SDL_Renderer*,ubyte*,ubyte*,ubyte*,ubyte*);
190         alias pSDL_SetRenderDrawBlendMode = int function(SDL_Renderer*,SDL_BlendMode);
191         alias pSDL_GetRenderDrawBlendMode = int function(SDL_Renderer*,SDL_BlendMode*);
192         alias pSDL_RenderClear = int function(SDL_Renderer*);
193         alias pSDL_RenderDrawPoint = int function(SDL_Renderer*,int,int);
194         alias pSDL_RenderDrawPoints = int function(SDL_Renderer*,const(SDL_Point)*,int);
195         alias pSDL_RenderDrawLine = int function(SDL_Renderer*,int,int,int,int);
196         alias pSDL_RenderDrawLines = int function(SDL_Renderer*,const(SDL_Point)*,int);
197         alias pSDL_RenderDrawRect = int function(SDL_Renderer*,const(SDL_Rect)*);
198         alias pSDL_RenderDrawRects = int function(SDL_Renderer*,const(SDL_Rect)*,int);
199         alias pSDL_RenderFillRect = int function(SDL_Renderer*,const(SDL_Rect)*);
200         alias pSDL_RenderFillRects = int function(SDL_Renderer*,const(SDL_Rect)*,int);
201         alias pSDL_RenderCopy = int function(SDL_Renderer*,SDL_Texture*,const(SDL_Rect)*,const(SDL_Rect*));
202         alias pSDL_RenderCopyEx = int function(SDL_Renderer*,SDL_Texture*,const(SDL_Rect)*,const(SDL_Rect)*,const(double),const(SDL_Point)*,const(SDL_RendererFlip));
203         alias pSDL_RenderReadPixels = int function(SDL_Renderer*,const(SDL_Rect)*,uint,void*,int);
204         alias pSDL_RenderPresent = void function(SDL_Renderer*);
205         alias pSDL_DestroyTexture = void function(SDL_Texture*);
206         alias pSDL_DestroyRenderer = void function(SDL_Renderer*);
207         alias pSDL_GL_BindTexture = int function(SDL_Texture*,float*,float*);
208         alias pSDL_GL_UnbindTexture = int function(SDL_Texture*);
209     }
210 
211     __gshared {
212         pSDL_GetNumRenderDrivers SDL_GetNumRenderDrivers;
213         pSDL_GetRenderDriverInfo SDL_GetRenderDriverInfo;
214         pSDL_CreateWindowAndRenderer SDL_CreateWindowAndRenderer;
215         pSDL_CreateRenderer SDL_CreateRenderer;
216         pSDL_CreateSoftwareRenderer SDL_CreateSoftwareRenderer;
217         pSDL_GetRenderer SDL_GetRenderer;
218         pSDL_GetRendererInfo SDL_GetRendererInfo;
219         pSDL_GetRendererOutputSize SDL_GetRendererOutputSize;
220         pSDL_CreateTexture SDL_CreateTexture;
221         pSDL_CreateTextureFromSurface SDL_CreateTextureFromSurface;
222         pSDL_QueryTexture SDL_QueryTexture;
223         pSDL_SetTextureColorMod SDL_SetTextureColorMod;
224         pSDL_GetTextureColorMod SDL_GetTextureColorMod;
225         pSDL_SetTextureAlphaMod SDL_SetTextureAlphaMod;
226         pSDL_GetTextureAlphaMod SDL_GetTextureAlphaMod;
227         pSDL_SetTextureBlendMode SDL_SetTextureBlendMode;
228         pSDL_GetTextureBlendMode SDL_GetTextureBlendMode;
229         pSDL_UpdateTexture SDL_UpdateTexture;
230         pSDL_LockTexture SDL_LockTexture;
231         pSDL_UnlockTexture SDL_UnlockTexture;
232         pSDL_RenderTargetSupported SDL_RenderTargetSupported;
233         pSDL_SetRenderTarget SDL_SetRenderTarget;
234         pSDL_GetRenderTarget SDL_GetRenderTarget;
235         pSDL_RenderSetClipRect SDL_RenderSetClipRect;
236         pSDL_RenderGetClipRect SDL_RenderGetClipRect;
237         pSDL_RenderSetLogicalSize SDL_RenderSetLogicalSize;
238         pSDL_RenderGetLogicalSize SDL_RenderGetLogicalSize;
239         pSDL_RenderSetViewport SDL_RenderSetViewport;
240         pSDL_RenderGetViewport SDL_RenderGetViewport;
241         pSDL_RenderSetScale SDL_RenderSetScale;
242         pSDL_RenderGetScale SDL_RenderGetScale;
243         pSDL_SetRenderDrawColor SDL_SetRenderDrawColor;
244         pSDL_GetRenderDrawColor SDL_GetRenderDrawColor;
245         pSDL_SetRenderDrawBlendMode SDL_SetRenderDrawBlendMode;
246         pSDL_GetRenderDrawBlendMode SDL_GetRenderDrawBlendMode;
247         pSDL_RenderClear SDL_RenderClear;
248         pSDL_RenderDrawPoint SDL_RenderDrawPoint;
249         pSDL_RenderDrawPoints SDL_RenderDrawPoints;
250         pSDL_RenderDrawLine SDL_RenderDrawLine;
251         pSDL_RenderDrawLines SDL_RenderDrawLines;
252         pSDL_RenderDrawRect SDL_RenderDrawRect;
253         pSDL_RenderDrawRects SDL_RenderDrawRects;
254         pSDL_RenderFillRect SDL_RenderFillRect;
255         pSDL_RenderFillRects SDL_RenderFillRects;
256         pSDL_RenderCopy SDL_RenderCopy;
257         pSDL_RenderCopyEx SDL_RenderCopyEx;
258         pSDL_RenderReadPixels SDL_RenderReadPixels;
259         pSDL_RenderPresent SDL_RenderPresent;
260         pSDL_DestroyTexture SDL_DestroyTexture;
261         pSDL_DestroyRenderer SDL_DestroyRenderer;
262         pSDL_GL_BindTexture SDL_GL_BindTexture;
263         pSDL_GL_UnbindTexture SDL_GL_UnbindTexture;
264     }
265     static if(sdlSupport >= SDLSupport.sdl201) {
266         extern(C) @nogc nothrow {
267             alias pSDL_UpdateYUVTexture = int function(SDL_Texture*,const(SDL_Rect)*,const(ubyte)*,int,const(ubyte)*,int,const(ubyte)*,int);
268         }
269         __gshared {
270             pSDL_UpdateYUVTexture SDL_UpdateYUVTexture;
271         }
272     }
273     static if(sdlSupport >= SDLSupport.sdl204) {
274         extern(C) @nogc nothrow {
275             alias pSDL_RenderIsClipEnabled = SDL_bool function(SDL_Renderer*);
276         }
277         __gshared {
278             pSDL_RenderIsClipEnabled SDL_RenderIsClipEnabled;
279         }
280     }
281     static if(sdlSupport >= SDLSupport.sdl205) {
282         extern(C) @nogc nothrow {
283             alias pSDL_RenderGetIntegerScale = SDL_bool function(SDL_Renderer*);
284             alias pSDL_RenderSetIntegerScale = int function(SDL_Renderer*,SDL_bool);
285         }
286         __gshared {
287             pSDL_RenderGetIntegerScale SDL_RenderGetIntegerScale;
288             pSDL_RenderSetIntegerScale SDL_RenderSetIntegerScale;
289         }
290     }
291     static if(sdlSupport >= SDLSupport.sdl208) {
292         extern(C) @nogc nothrow {
293             alias pSDL_RenderGetMetalLayer = void* function(SDL_Renderer*);
294             alias pSDL_RenderGetMetalCommandEncoder = void* function(SDL_Renderer*);
295         }
296         __gshared {
297             pSDL_RenderGetMetalLayer SDL_RenderGetMetalLayer;
298             pSDL_RenderGetMetalCommandEncoder SDL_RenderGetMetalCommandEncoder;
299         }
300     }
301     static if(sdlSupport >= SDLSupport.sdl2010) {
302         extern(C) @nogc nothrow {
303             alias pSDL_RenderDrawPointF = int function(SDL_Renderer*,float,float);
304             alias pSDL_RenderDrawPointsF = int function(SDL_Renderer*,const(SDL_FPoint)*,int);
305             alias pSDL_RenderDrawLineF = int function(SDL_Renderer*,float,float,float,float);
306             alias pSDL_RenderDrawLinesF = int function(SDL_Renderer*,const(SDL_FPoint)*,int);
307             alias pSDL_RenderDrawRectF = int function(SDL_Renderer*,const(SDL_FRect)*);
308             alias pSDL_RenderDrawRectsF = int function(SDL_Renderer*,const(SDL_FRect)*,int);
309             alias pSDL_RenderFillRectF = int function(SDL_Renderer*,const(SDL_FRect)*);
310             alias pSDL_RenderFillRectsF = int function(SDL_Renderer*,const(SDL_FRect)*,int);
311             alias pSDL_RenderCopyF = int function(SDL_Renderer*,SDL_Texture*,const(SDL_FRect)*,const(SDL_FRect)*);
312             alias pSDL_RenderCopyExF = int function(SDL_Renderer*,SDL_Texture*,const(SDL_FRect)*,const(SDL_FRect)*,const(double),const(SDL_FPoint)*,const(SDL_RendererFlip));
313             alias pSDL_RenderFlush = int function(SDL_Renderer*);
314         }
315         __gshared {
316             pSDL_RenderDrawPointF SDL_RenderDrawPointF;
317             pSDL_RenderDrawPointsF SDL_RenderDrawPointsF;
318             pSDL_RenderDrawLineF SDL_RenderDrawLineF;
319             pSDL_RenderDrawLinesF SDL_RenderDrawLinesF;
320             pSDL_RenderDrawRectF SDL_RenderDrawRectF;
321             pSDL_RenderDrawRectsF SDL_RenderDrawRectsF;
322             pSDL_RenderFillRectF SDL_RenderFillRectF;
323             pSDL_RenderFillRectsF SDL_RenderFillRectsF;
324             pSDL_RenderCopyF SDL_RenderCopyF;
325             pSDL_RenderCopyExF SDL_RenderCopyExF;
326             pSDL_RenderFlush SDL_RenderFlush;
327         }
328     }
329     static if(sdlSupport >= SDLSupport.sdl2012) {
330         extern(C) @nogc nothrow {
331             alias pSDL_SetTextureScaleMode = int function(SDL_Texture*,SDL_ScaleMode);
332             alias pSDL_GetTextureScaleMode = int function(SDL_Texture*,SDL_ScaleMode*);
333             alias pSDL_LockTextureToSurface = int function(SDL_Texture*,const(SDL_Rect)*,SDL_Surface**);
334         }
335         __gshared {
336             pSDL_SetTextureScaleMode SDL_SetTextureScaleMode;
337             pSDL_GetTextureScaleMode SDL_GetTextureScaleMode;
338             pSDL_LockTextureToSurface SDL_LockTextureToSurface;
339         }
340     }
341 }