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 : SDL_Point, SDL_Rect;
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 
23 mixin(expandEnum!SDL_RendererFlags);
24 
25 struct SDL_RendererInfo {
26     const(char)* name;
27     SDL_RendererFlags flags;
28     uint num_texture_formats;
29     uint[16] texture_formats;
30     int max_texture_width;
31     int max_texture_height;
32 }
33 
34 enum SDL_TextureAccess {
35     SDL_TEXTUREACCESS_STATIC,
36     SDL_TEXTUREACCESS_STREAMING,
37     SDL_TEXTUREACCESS_TARGET,
38 }
39 mixin(expandEnum!SDL_TextureAccess);
40 
41 enum SDL_TextureModulate {
42     SDL_TEXTUREMODULATE_NONE = 0x00000000,
43     SDL_TEXTUREMODULATE_COLOR = 0x00000001,
44     SDL_TEXTUREMODULATE_ALPHA = 0x00000002
45 }
46 mixin(expandEnum!SDL_TextureModulate);
47 
48 enum SDL_RendererFlip {
49     SDL_FLIP_NONE = 0x00000000,
50     SDL_FLIP_HORIZONTAL = 0x00000001,
51     SDL_FLIP_VERTICAL = 0x00000002,
52 }
53 mixin(expandEnum!SDL_RendererFlip);
54 
55 struct SDL_Renderer;
56 struct SDL_Texture;
57 
58 version(BindSDL_Static) {
59     extern(C) @nogc nothrow {
60         int SDL_GetNumRenderDrivers();
61         int SDL_GetRenderDriverInfo(int,SDL_RendererInfo*);
62         int SDL_CreateWindowAndRenderer(int,int,uint,SDL_Window**,SDL_Renderer**);
63         SDL_Renderer* SDL_CreateRenderer(SDL_Window*,int,SDL_RendererFlags);
64         SDL_Renderer* SDL_CreateSoftwareRenderer(SDL_Surface*);
65         SDL_Renderer* SDL_GetRenderer(SDL_Window*);
66         int SDL_GetRendererInfo(SDL_Renderer*,SDL_RendererInfo*);
67         int SDL_GetRendererOutputSize(SDL_Renderer*,int*,int*);
68         SDL_Texture* SDL_CreateTexture(SDL_Renderer*,uint,SDL_TextureAccess,int,int);
69         SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer*,SDL_Surface*);
70         int SDL_QueryTexture(SDL_Texture*,uint*,int*,int*,int*);
71         int SDL_SetTextureColorMod(SDL_Texture*,ubyte,ubyte,ubyte);
72         int SDL_GetTextureColorMod(SDL_Texture*,ubyte*,ubyte*,ubyte*);
73         int SDL_SetTextureAlphaMod(SDL_Texture*,ubyte);
74         int SDL_GetTextureAlphaMod(SDL_Texture*,ubyte*);
75         int SDL_SetTextureBlendMode(SDL_Texture*,SDL_BlendMode);
76         int SDL_GetTextureBlendMode(SDL_Texture*,SDL_BlendMode*);
77         int SDL_UpdateTexture(SDL_Texture*,const(SDL_Rect)*,const(void)*,int);
78         int SDL_LockTexture(SDL_Texture*,const(SDL_Rect)*,void**,int*);
79         void SDL_UnlockTexture(SDL_Texture*);
80         SDL_bool SDL_RenderTargetSupported(SDL_Renderer*);
81         int SDL_SetRenderTarget(SDL_Renderer*,SDL_Texture*);
82         SDL_Texture* SDL_GetRenderTarget(SDL_Renderer*);
83         int SDL_RenderSetClipRect(SDL_Renderer*,const(SDL_Rect)*);
84         void SDL_RenderGetClipRect(SDL_Renderer* renderer,SDL_Rect*);
85         int SDL_RenderSetLogicalSize(SDL_Renderer*,int,int);
86         void SDL_RenderGetLogicalSize(SDL_Renderer*,int*,int*);
87         int SDL_RenderSetViewport(SDL_Renderer*,const(SDL_Rect)*);
88         void SDL_RenderGetViewport(SDL_Renderer*,SDL_Rect*);
89         int SDL_RenderSetScale(SDL_Renderer*,float,float);
90         int SDL_RenderGetScale(SDL_Renderer*,float*,float*);
91         int SDL_SetRenderDrawColor(SDL_Renderer*,ubyte,ubyte,ubyte,ubyte);
92         int SDL_GetRenderDrawColor(SDL_Renderer*,ubyte*,ubyte*,ubyte*,ubyte*);
93         int SDL_SetRenderDrawBlendMode(SDL_Renderer*,SDL_BlendMode);
94         int SDL_GetRenderDrawBlendMode(SDL_Renderer*,SDL_BlendMode*);
95         int SDL_RenderClear(SDL_Renderer*);
96         int SDL_RenderDrawPoint(SDL_Renderer*,int,int);
97         int SDL_RenderDrawPoints(SDL_Renderer*,const(SDL_Point)*,int);
98         int SDL_RenderDrawLine(SDL_Renderer*,int,int,int,int);
99         int SDL_RenderDrawLines(SDL_Renderer*,const(SDL_Point)*,int);
100         int SDL_RenderDrawRect(SDL_Renderer*,const(SDL_Rect)*);
101         int SDL_RenderDrawRects(SDL_Renderer*,const(SDL_Rect)*,int);
102         int SDL_RenderFillRect(SDL_Renderer*,const(SDL_Rect)*);
103         int SDL_RenderFillRects(SDL_Renderer*,const(SDL_Rect)*,int);
104         int SDL_RenderCopy(SDL_Renderer*,SDL_Texture*,const(SDL_Rect)*,const(SDL_Rect*));
105         int SDL_RenderCopyEx(SDL_Renderer*,SDL_Texture*,const(SDL_Rect)*,const(SDL_Rect)*,const(double),const(SDL_Point)*,const(SDL_RendererFlip));
106         int SDL_RenderReadPixels(SDL_Renderer*,const(SDL_Rect)*,uint,void*,int);
107         void SDL_RenderPresent(SDL_Renderer*);
108         void SDL_DestroyTexture(SDL_Texture*);
109         void SDL_DestroyRenderer(SDL_Renderer*);
110         int SDL_GL_BindTexture(SDL_Texture*,float*,float*);
111         int SDL_GL_UnbindTexture(SDL_Texture*);
112 
113         static if(sdlSupport >= SDLSupport.sdl201) {
114             int SDL_UpdateYUVTexture(SDL_Texture*,const(SDL_Rect)*,const(ubyte)*,int,const(ubyte)*,int,const(ubyte)*,int);
115         }
116 
117         static if(sdlSupport >= SDLSupport.sdl204) {
118             SDL_bool SDL_RenderIsClipEnabled(SDL_Renderer*);
119         }
120 
121         static if(sdlSupport >= SDLSupport.sdl205) {
122             SDL_bool SDL_RenderGetIntegerScale(SDL_Renderer*);
123             int SDL_RenderSetIntegerScale(SDL_Renderer*,SDL_bool);
124         }
125 
126         static if(sdlSupport >= SDLSupport.sdl208) {
127             void* SDL_RenderGetMetalLayer(SDL_Renderer*);
128             void* SDL_RenderGetMetalCommandEncoder(SDL_Renderer*);
129         }
130     }
131 }
132 else {
133     extern(C) @nogc nothrow {
134         alias pSDL_GetNumRenderDrivers = int function();
135         alias pSDL_GetRenderDriverInfo = int function(int,SDL_RendererInfo*);
136         alias pSDL_CreateWindowAndRenderer = int function(int,int,uint,SDL_Window**,SDL_Renderer**);
137         alias pSDL_CreateRenderer = SDL_Renderer* function(SDL_Window*,int,SDL_RendererFlags);
138         alias pSDL_CreateSoftwareRenderer = SDL_Renderer* function(SDL_Surface*);
139         alias pSDL_GetRenderer = SDL_Renderer* function(SDL_Window*);
140         alias pSDL_GetRendererInfo = int function(SDL_Renderer*,SDL_RendererInfo*);
141         alias pSDL_GetRendererOutputSize = int function(SDL_Renderer*,int*,int*);
142         alias pSDL_CreateTexture = SDL_Texture* function(SDL_Renderer*,uint,SDL_TextureAccess,int,int);
143         alias pSDL_CreateTextureFromSurface = SDL_Texture* function(SDL_Renderer*,SDL_Surface*);
144         alias pSDL_QueryTexture = int function(SDL_Texture*,uint*,int*,int*,int*);
145         alias pSDL_SetTextureColorMod = int function(SDL_Texture*,ubyte,ubyte,ubyte);
146         alias pSDL_GetTextureColorMod = int function(SDL_Texture*,ubyte*,ubyte*,ubyte*);
147         alias pSDL_SetTextureAlphaMod = int function(SDL_Texture*,ubyte);
148         alias pSDL_GetTextureAlphaMod = int function(SDL_Texture*,ubyte*);
149         alias pSDL_SetTextureBlendMode = int function(SDL_Texture*,SDL_BlendMode);
150         alias pSDL_GetTextureBlendMode = int function(SDL_Texture*,SDL_BlendMode*);
151         alias pSDL_UpdateTexture = int function(SDL_Texture*,const(SDL_Rect)*,const(void)*,int);
152         alias pSDL_LockTexture = int function(SDL_Texture*,const(SDL_Rect)*,void**,int*);
153         alias pSDL_UnlockTexture = void function(SDL_Texture*);
154         alias pSDL_RenderTargetSupported = SDL_bool function(SDL_Renderer*);
155         alias pSDL_SetRenderTarget = int function(SDL_Renderer*,SDL_Texture*);
156         alias pSDL_GetRenderTarget = SDL_Texture* function(SDL_Renderer*);
157         alias pSDL_RenderSetClipRect = int function(SDL_Renderer*,const(SDL_Rect)*);
158         alias pSDL_RenderGetClipRect = void function(SDL_Renderer* renderer,SDL_Rect*);
159         alias pSDL_RenderSetLogicalSize = int function(SDL_Renderer*,int,int);
160         alias pSDL_RenderGetLogicalSize = void function(SDL_Renderer*,int*,int*);
161         alias pSDL_RenderSetViewport = int function(SDL_Renderer*,const(SDL_Rect)*);
162         alias pSDL_RenderGetViewport = void function(SDL_Renderer*,SDL_Rect*);
163         alias pSDL_RenderSetScale = int function(SDL_Renderer*,float,float);
164         alias pSDL_RenderGetScale = int function(SDL_Renderer*,float*,float*);
165         alias pSDL_SetRenderDrawColor = int function(SDL_Renderer*,ubyte,ubyte,ubyte,ubyte);
166         alias pSDL_GetRenderDrawColor = int function(SDL_Renderer*,ubyte*,ubyte*,ubyte*,ubyte*);
167         alias pSDL_SetRenderDrawBlendMode = int function(SDL_Renderer*,SDL_BlendMode);
168         alias pSDL_GetRenderDrawBlendMode = int function(SDL_Renderer*,SDL_BlendMode*);
169         alias pSDL_RenderClear = int function(SDL_Renderer*);
170         alias pSDL_RenderDrawPoint = int function(SDL_Renderer*,int,int);
171         alias pSDL_RenderDrawPoints = int function(SDL_Renderer*,const(SDL_Point)*,int);
172         alias pSDL_RenderDrawLine = int function(SDL_Renderer*,int,int,int,int);
173         alias pSDL_RenderDrawLines = int function(SDL_Renderer*,const(SDL_Point)*,int);
174         alias pSDL_RenderDrawRect = int function(SDL_Renderer*,const(SDL_Rect)*);
175         alias pSDL_RenderDrawRects = int function(SDL_Renderer*,const(SDL_Rect)*,int);
176         alias pSDL_RenderFillRect = int function(SDL_Renderer*,const(SDL_Rect)*);
177         alias pSDL_RenderFillRects = int function(SDL_Renderer*,const(SDL_Rect)*,int);
178         alias pSDL_RenderCopy = int function(SDL_Renderer*,SDL_Texture*,const(SDL_Rect)*,const(SDL_Rect*));
179         alias pSDL_RenderCopyEx = int function(SDL_Renderer*,SDL_Texture*,const(SDL_Rect)*,const(SDL_Rect)*,const(double),const(SDL_Point)*,const(SDL_RendererFlip));
180         alias pSDL_RenderReadPixels = int function(SDL_Renderer*,const(SDL_Rect)*,uint,void*,int);
181         alias pSDL_RenderPresent = void function(SDL_Renderer*);
182         alias pSDL_DestroyTexture = void function(SDL_Texture*);
183         alias pSDL_DestroyRenderer = void function(SDL_Renderer*);
184         alias pSDL_GL_BindTexture = int function(SDL_Texture*,float*,float*);
185         alias pSDL_GL_UnbindTexture = int function(SDL_Texture*);
186     }
187 
188     __gshared {
189         pSDL_GetNumRenderDrivers SDL_GetNumRenderDrivers;
190         pSDL_GetRenderDriverInfo SDL_GetRenderDriverInfo;
191         pSDL_CreateWindowAndRenderer SDL_CreateWindowAndRenderer;
192         pSDL_CreateRenderer SDL_CreateRenderer;
193         pSDL_CreateSoftwareRenderer SDL_CreateSoftwareRenderer;
194         pSDL_GetRenderer SDL_GetRenderer;
195         pSDL_GetRendererInfo SDL_GetRendererInfo;
196         pSDL_GetRendererOutputSize SDL_GetRendererOutputSize;
197         pSDL_CreateTexture SDL_CreateTexture;
198         pSDL_CreateTextureFromSurface SDL_CreateTextureFromSurface;
199         pSDL_QueryTexture SDL_QueryTexture;
200         pSDL_SetTextureColorMod SDL_SetTextureColorMod;
201         pSDL_GetTextureColorMod SDL_GetTextureColorMod;
202         pSDL_SetTextureAlphaMod SDL_SetTextureAlphaMod;
203         pSDL_GetTextureAlphaMod SDL_GetTextureAlphaMod;
204         pSDL_SetTextureBlendMode SDL_SetTextureBlendMode;
205         pSDL_GetTextureBlendMode SDL_GetTextureBlendMode;
206         pSDL_UpdateTexture SDL_UpdateTexture;
207         pSDL_LockTexture SDL_LockTexture;
208         pSDL_UnlockTexture SDL_UnlockTexture;
209         pSDL_RenderTargetSupported SDL_RenderTargetSupported;
210         pSDL_SetRenderTarget SDL_SetRenderTarget;
211         pSDL_GetRenderTarget SDL_GetRenderTarget;
212         pSDL_RenderSetClipRect SDL_RenderSetClipRect;
213         pSDL_RenderGetClipRect SDL_RenderGetClipRect;
214         pSDL_RenderSetLogicalSize SDL_RenderSetLogicalSize;
215         pSDL_RenderGetLogicalSize SDL_RenderGetLogicalSize;
216         pSDL_RenderSetViewport SDL_RenderSetViewport;
217         pSDL_RenderGetViewport SDL_RenderGetViewport;
218         pSDL_RenderSetScale SDL_RenderSetScale;
219         pSDL_RenderGetScale SDL_RenderGetScale;
220         pSDL_SetRenderDrawColor SDL_SetRenderDrawColor;
221         pSDL_GetRenderDrawColor SDL_GetRenderDrawColor;
222         pSDL_SetRenderDrawBlendMode SDL_SetRenderDrawBlendMode;
223         pSDL_GetRenderDrawBlendMode SDL_GetRenderDrawBlendMode;
224         pSDL_RenderClear SDL_RenderClear;
225         pSDL_RenderDrawPoint SDL_RenderDrawPoint;
226         pSDL_RenderDrawPoints SDL_RenderDrawPoints;
227         pSDL_RenderDrawLine SDL_RenderDrawLine;
228         pSDL_RenderDrawLines SDL_RenderDrawLines;
229         pSDL_RenderDrawRect SDL_RenderDrawRect;
230         pSDL_RenderDrawRects SDL_RenderDrawRects;
231         pSDL_RenderFillRect SDL_RenderFillRect;
232         pSDL_RenderFillRects SDL_RenderFillRects;
233         pSDL_RenderCopy SDL_RenderCopy;
234         pSDL_RenderCopyEx SDL_RenderCopyEx;
235         pSDL_RenderReadPixels SDL_RenderReadPixels;
236         pSDL_RenderPresent SDL_RenderPresent;
237         pSDL_DestroyTexture SDL_DestroyTexture;
238         pSDL_DestroyRenderer SDL_DestroyRenderer;
239         pSDL_GL_BindTexture SDL_GL_BindTexture;
240         pSDL_GL_UnbindTexture SDL_GL_UnbindTexture;
241     }
242 
243     static if(sdlSupport >= SDLSupport.sdl201) {
244         extern(C) @nogc nothrow {
245             alias pSDL_UpdateYUVTexture = int function(SDL_Texture*,const(SDL_Rect)*,const(ubyte)*,int,const(ubyte)*,int,const(ubyte)*,int);
246         }
247 
248         __gshared {
249             pSDL_UpdateYUVTexture SDL_UpdateYUVTexture;
250         }
251     }
252 
253     static if(sdlSupport >= SDLSupport.sdl204) {
254         extern(C) @nogc nothrow {
255             alias pSDL_RenderIsClipEnabled = SDL_bool function(SDL_Renderer*);
256         }
257 
258         __gshared {
259             pSDL_RenderIsClipEnabled SDL_RenderIsClipEnabled;
260         }
261     }
262 
263     static if(sdlSupport >= SDLSupport.sdl205) {
264         extern(C) @nogc nothrow {
265             alias pSDL_RenderGetIntegerScale = SDL_bool function(SDL_Renderer*);
266             alias pSDL_RenderSetIntegerScale = int function(SDL_Renderer*,SDL_bool);
267         }
268 
269         __gshared {
270             pSDL_RenderGetIntegerScale SDL_RenderGetIntegerScale;
271             pSDL_RenderSetIntegerScale SDL_RenderSetIntegerScale;
272         }
273     }
274 
275     static if(sdlSupport >= SDLSupport.sdl208) {
276         extern(C) @nogc nothrow {
277             alias pSDL_RenderGetMetalLayer = void* function(SDL_Renderer*);
278             alias pSDL_RenderGetMetalCommandEncoder = void* function(SDL_Renderer*);
279         }
280 
281         __gshared {
282             pSDL_RenderGetMetalLayer SDL_RenderGetMetalLayer;
283             pSDL_RenderGetMetalCommandEncoder SDL_RenderGetMetalCommandEncoder;
284         }
285     }
286 }