1 /+
2 +            Copyright 2022 – 2023 Aya Partridge
3 +          Copyright 2018 - 2022 Michael D. Parker
4 + Distributed under the Boost Software License, Version 1.0.
5 +     (See accompanying file LICENSE_1_0.txt or copy at
6 +           http://www.boost.org/LICENSE_1_0.txt)
7 +/
8 module sdl.render;
9 
10 import bindbc.sdl.config;
11 import bindbc.sdl.codegen;
12 
13 import sdl.blendmode: SDL_BlendMode;
14 import sdl.rect;
15 import sdl.stdinc: SDL_bool;
16 import sdl.surface: SDL_Surface;
17 import sdl.video: SDL_Window;
18 import sdl.pixels: SDL_Color;
19 
20 alias SDL_RendererFlags = uint;
21 enum: SDL_RendererFlags{
22 	SDL_RENDERER_SOFTWARE       = 0x00000001,
23 	SDL_RENDERER_ACCELERATED    = 0x00000002,
24 	SDL_RENDERER_PRESENTVSYNC   = 0x00000004,
25 	SDL_RENDERER_TARGETTEXTURE  = 0x00000008,
26 }
27 
28 struct SDL_RendererInfo{
29 	const(char)* name;
30 	SDL_RendererFlags flags;
31 	uint num_texture_formats;
32 	uint[16] texture_formats;
33 	int max_texture_width;
34 	int max_texture_height;
35 }
36 
37 static if(sdlSupport >= SDLSupport.v2_0_18){
38 	struct SDL_Vertex{
39 		SDL_FPoint position;
40 		SDL_Color color;
41 		alias colour = color;
42 		SDL_FPoint tex_coord;
43 	}
44 }
45 
46 static if(sdlSupport >= SDLSupport.v2_0_12){
47 	alias SDL_ScaleMode = int;
48 	enum: SDL_ScaleMode{
49 		SDL_ScaleModeNearest,
50 		SDL_ScaleModeLinear,
51 		SDL_ScaleModeBest,
52 	}
53 }
54 
55 alias SDL_TextureAccess = int;
56 enum: SDL_TextureAccess{
57 	SDL_TEXTUREACCESS_STATIC,
58 	SDL_TEXTUREACCESS_STREAMING,
59 	SDL_TEXTUREACCESS_TARGET,
60 }
61 
62 alias SDL_TextureModulate = int;
63 enum: SDL_TextureModulate{
64 	SDL_TEXTUREMODULATE_NONE   = 0x00000000,
65 	SDL_TEXTUREMODULATE_COLOR  = 0x00000001,
66 	SDL_TEXTUREMODULATE_ALPHA  = 0x00000002,
67 	
68 	SDL_TEXTUREMODULATE_COLOUR = SDL_TEXTUREMODULATE_COLOR,
69 }
70 
71 alias SDL_RendererFlip = int;
72 enum: SDL_RendererFlip{
73 	SDL_FLIP_NONE        = 0x00000000,
74 	SDL_FLIP_HORIZONTAL  = 0x00000001,
75 	SDL_FLIP_VERTICAL    = 0x00000002,
76 }
77 
78 struct SDL_Renderer;
79 
80 struct SDL_Texture;
81 
82 mixin(joinFnBinds((){
83 	string[][] ret;
84 	ret ~= makeFnBinds([
85 		[q{int}, q{SDL_GetNumRenderDrivers}, q{}],
86 		[q{int}, q{SDL_GetRenderDriverInfo}, q{int index, SDL_RendererInfo* info}],
87 		[q{int}, q{SDL_CreateWindowAndRenderer}, q{int width, int height, uint window_flags, SDL_Window** window, SDL_Renderer** renderer}],
88 		[q{SDL_Renderer*}, q{SDL_CreateRenderer}, q{SDL_Window* window, int index, SDL_RendererFlags flags}],
89 		[q{SDL_Renderer*}, q{SDL_CreateSoftwareRenderer}, q{SDL_Surface* surface}],
90 		[q{SDL_Renderer*}, q{SDL_GetRenderer}, q{SDL_Window* window}],
91 		[q{int}, q{SDL_GetRendererInfo}, q{SDL_Renderer* renderer, SDL_RendererInfo* info}],
92 		[q{int}, q{SDL_GetRendererOutputSize}, q{SDL_Renderer* renderer, int* w, int* h}],
93 		[q{SDL_Texture*}, q{SDL_CreateTexture}, q{SDL_Renderer* renderer, uint format, SDL_TextureAccess access, int w, int h}],
94 		[q{SDL_Texture*}, q{SDL_CreateTextureFromSurface}, q{SDL_Renderer* renderer, SDL_Surface* surface}],
95 		[q{int}, q{SDL_QueryTexture}, q{SDL_Texture* texture, uint* format, SDL_TextureAccess* access, int* w, int* h}],
96 		[q{int}, q{SDL_SetTextureColorMod}, q{SDL_Texture* texture, ubyte r, ubyte g, ubyte b}],
97 		[q{int}, q{SDL_GetTextureColorMod}, q{SDL_Texture* texture, ubyte* r, ubyte* g, ubyte* b}],
98 		[q{int}, q{SDL_SetTextureAlphaMod}, q{SDL_Texture* texture, ubyte alpha}],
99 		[q{int}, q{SDL_GetTextureAlphaMod}, q{SDL_Texture* texture, ubyte* alpha}],
100 		[q{int}, q{SDL_SetTextureBlendMode}, q{SDL_Texture* texture, SDL_BlendMode blendMode}],
101 		[q{int}, q{SDL_GetTextureBlendMode}, q{SDL_Texture* texture, SDL_BlendMode* blendMode}],
102 		[q{int}, q{SDL_UpdateTexture}, q{SDL_Texture* texture, const(SDL_Rect)* rect, const(void)* pixels, int pitch}],
103 		[q{int}, q{SDL_LockTexture}, q{SDL_Texture* texture, const(SDL_Rect)* rect, void** pixels, int* pitch}],
104 		[q{void}, q{SDL_UnlockTexture}, q{SDL_Texture* texture}],
105 		[q{SDL_bool}, q{SDL_RenderTargetSupported}, q{SDL_Renderer* renderer}],
106 		[q{int}, q{SDL_SetRenderTarget}, q{SDL_Renderer* renderer, SDL_Texture* texture}],
107 		[q{SDL_Texture*}, q{SDL_GetRenderTarget}, q{SDL_Renderer* renderer}],
108 		[q{int}, q{SDL_RenderSetClipRect}, q{SDL_Renderer* renderer, const(SDL_Rect)* rect}],
109 		[q{void}, q{SDL_RenderGetClipRect}, q{SDL_Renderer* renderer, SDL_Rect* rect}],
110 		[q{int}, q{SDL_RenderSetLogicalSize}, q{SDL_Renderer* renderer, int w, int h}],
111 		[q{void}, q{SDL_RenderGetLogicalSize}, q{SDL_Renderer* renderer, int* w, int* h}],
112 		[q{int}, q{SDL_RenderSetViewport}, q{SDL_Renderer* renderer, const(SDL_Rect)* rect}],
113 		[q{void}, q{SDL_RenderGetViewport}, q{SDL_Renderer* renderer, SDL_Rect* rect}],
114 		[q{int}, q{SDL_RenderSetScale}, q{SDL_Renderer* renderer, float scaleX, float scaleY}],
115 		[q{int}, q{SDL_RenderGetScale}, q{SDL_Renderer* renderer, float* scaleX, float* scaleY}],
116 		[q{int}, q{SDL_SetRenderDrawColor}, q{SDL_Renderer* renderer, ubyte r, ubyte g, ubyte b, ubyte a}],
117 		[q{int}, q{SDL_GetRenderDrawColor}, q{SDL_Renderer* renderer, ubyte* r, ubyte* g, ubyte* b, ubyte* a}],
118 		[q{int}, q{SDL_SetRenderDrawBlendMode}, q{SDL_Renderer* renderer, SDL_BlendMode blendMode}],
119 		[q{int}, q{SDL_GetRenderDrawBlendMode}, q{SDL_Renderer* renderer, SDL_BlendMode* blendMode}],
120 		[q{int}, q{SDL_RenderClear}, q{SDL_Renderer* renderer}],
121 		[q{int}, q{SDL_RenderDrawPoint}, q{SDL_Renderer* renderer, int x, int y}],
122 		[q{int}, q{SDL_RenderDrawPoints}, q{SDL_Renderer* renderer, const(SDL_Point)* points, int count}],
123 		[q{int}, q{SDL_RenderDrawLine}, q{SDL_Renderer* renderer, int x1, int y1, int x2, int y2}],
124 		[q{int}, q{SDL_RenderDrawLines}, q{SDL_Renderer* renderer, const(SDL_Point)* points, int count}],
125 		[q{int}, q{SDL_RenderDrawRect}, q{SDL_Renderer* renderer, const(SDL_Rect)* rect}],
126 		[q{int}, q{SDL_RenderDrawRects}, q{SDL_Renderer* renderer, const(SDL_Rect)* rects, int count}],
127 		[q{int}, q{SDL_RenderFillRect}, q{SDL_Renderer* renderer, const(SDL_Rect)* rect}],
128 		[q{int}, q{SDL_RenderFillRects}, q{SDL_Renderer* renderer, const(SDL_Rect)* rects, int count}],
129 		[q{int}, q{SDL_RenderCopy}, q{SDL_Renderer* renderer, SDL_Texture* texture, const(SDL_Rect)* srcrect, const(SDL_Rect)* dstrect}],
130 		[q{int}, q{SDL_RenderCopyEx}, q{SDL_Renderer* renderer, SDL_Texture* texture, const(SDL_Rect)* srcrect, const(SDL_Rect)* dstrect, const(double) angle, const(SDL_Point)* center, const(SDL_RendererFlip) flip}],
131 		[q{int}, q{SDL_RenderReadPixels}, q{SDL_Renderer* renderer, const(SDL_Rect)* rect,uint,void*,int}],
132 		[q{void}, q{SDL_RenderPresent}, q{SDL_Renderer* renderer}],
133 		[q{void}, q{SDL_DestroyTexture}, q{SDL_Texture* texture}],
134 		[q{void}, q{SDL_DestroyRenderer}, q{SDL_Renderer* renderer}],
135 		[q{int}, q{SDL_GL_BindTexture}, q{SDL_Texture* texture, float* texw, float* texh}],
136 		[q{int}, q{SDL_GL_UnbindTexture}, q{SDL_Texture* texture}],
137 	]);
138 	static if(sdlSupport >= SDLSupport.v2_0_1){
139 		ret ~= makeFnBinds([
140 			[q{int}, q{SDL_UpdateYUVTexture}, q{SDL_Texture* texture ,const(SDL_Rect)* rect, const(ubyte)* Yplane, int Ypitch, const(ubyte)* Uplane, int Upitch, const(ubyte)* Vplane, int Vpitch}],
141 		]);
142 	}
143 	static if(sdlSupport >= SDLSupport.v2_0_4){
144 		ret ~= makeFnBinds([
145 			[q{SDL_bool}, q{SDL_RenderIsClipEnabled}, q{SDL_Renderer* renderer}],
146 		]);
147 	}
148 	static if(sdlSupport >= SDLSupport.v2_0_5){
149 		ret ~= makeFnBinds([
150 			[q{SDL_bool}, q{SDL_RenderGetIntegerScale}, q{SDL_Renderer* renderer}],
151 			[q{int}, q{SDL_RenderSetIntegerScale}, q{SDL_Renderer* renderer,SDL_bool}],
152 		]);
153 	}
154 	static if(sdlSupport >= SDLSupport.v2_0_8){
155 		ret ~= makeFnBinds([
156 			[q{void*}, q{SDL_RenderGetMetalLayer}, q{SDL_Renderer* renderer}],
157 			[q{void*}, q{SDL_RenderGetMetalCommandEncoder}, q{SDL_Renderer* renderer}],
158 		]);
159 	}
160 	static if(sdlSupport >= SDLSupport.v2_0_10){
161 		ret ~= makeFnBinds([
162 			[q{int}, q{SDL_RenderDrawPointF}, q{SDL_Renderer* renderer, float x, float y}],
163 			[q{int}, q{SDL_RenderDrawPointsF}, q{SDL_Renderer* renderer, const(SDL_FPoint)* points, int count}],
164 			[q{int}, q{SDL_RenderDrawLineF}, q{SDL_Renderer* renderer, float x1, float y1, float x2, float y2}],
165 			[q{int}, q{SDL_RenderDrawLinesF}, q{SDL_Renderer* renderer, const(SDL_FPoint)* points, int count}],
166 			[q{int}, q{SDL_RenderDrawRectF}, q{SDL_Renderer* renderer, const(SDL_FRect)* rect}],
167 			[q{int}, q{SDL_RenderDrawRectsF}, q{SDL_Renderer* renderer, const(SDL_FRect)* rects, int count}],
168 			[q{int}, q{SDL_RenderFillRectF}, q{SDL_Renderer* renderer, const(SDL_FRect)* rect}],
169 			[q{int}, q{SDL_RenderFillRectsF}, q{SDL_Renderer* renderer, const(SDL_FRect)* rects, int count}],
170 			[q{int}, q{SDL_RenderCopyF}, q{SDL_Renderer* renderer, SDL_Texture* texture, const(SDL_Rect)* srcrect, const(SDL_FRect)* dstrect}],
171 			[q{int}, q{SDL_RenderCopyExF}, q{SDL_Renderer* renderer, SDL_Texture* texture, const(SDL_Rect)* srcrect, const(SDL_FRect)* dstrect, const(double) angle, const(SDL_FPoint)* center, const(SDL_RendererFlip) flip}],
172 			[q{int}, q{SDL_RenderFlush}, q{SDL_Renderer* renderer}],
173 		]);
174 	}
175 	static if(sdlSupport >= SDLSupport.v2_0_12){
176 		ret ~= makeFnBinds([
177 			[q{int}, q{SDL_SetTextureScaleMode}, q{SDL_Texture* texture, SDL_ScaleMode scaleMode}],
178 			[q{int}, q{SDL_GetTextureScaleMode}, q{SDL_Texture* texture, SDL_ScaleMode* scaleMode}],
179 			[q{int}, q{SDL_LockTextureToSurface}, q{SDL_Texture* texture, const(SDL_Rect)* rect,SDL_Surface** surface}],
180 		]);
181 	}
182 	static if(sdlSupport >= SDLSupport.v2_0_16){
183 		ret ~= makeFnBinds([
184 			[q{int}, q{SDL_UpdateNVTexture}, q{SDL_Texture* texture, const(SDL_Rect)* rect, const(ubyte)* Yplane, int Ypitch, const(ubyte)* UVplane, int UVpitch}],
185 		]);
186 	}
187 	static if(sdlSupport >= SDLSupport.v2_0_18){
188 		ret ~= makeFnBinds([
189 			[q{int}, q{SDL_SetTextureUserData}, q{SDL_Texture* texture, void* userdata}],
190 			[q{void*}, q{SDL_GetTextureUserData}, q{SDL_Texture* texture}],
191 			[q{void}, q{SDL_RenderWindowToLogical}, q{SDL_Renderer* renderer, int windowX, int windowY, float* logicalX, float* logicalY}],
192 			[q{void}, q{SDL_RenderLogicalToWindow}, q{SDL_Renderer* renderer, float logicalX, float logicalY, int* windowX, int* windowY}],
193 			[q{int}, q{SDL_RenderGeometry}, q{SDL_Renderer* renderer, SDL_Texture* texture, const(SDL_Vertex)* vertices, int num_vertices, const(int)* indices, int num_indices}],
194 			[q{int}, q{SDL_RenderSetVSync}, q{SDL_Renderer* renderer, int vsync}],
195 		]);
196 		static if(sdlSupport >= SDLSupport.v2_0_20){
197 			ret ~= makeFnBinds([
198 				[q{int}, q{SDL_RenderGeometryRaw}, q{SDL_Renderer* renderer, SDL_Texture* texture, const(float)* xy, int xy_stride, const(SDL_Color)* color, int color_stride, const(float)* uv, int uv_stride, int num_vertices, const(void)* indices, int num_indices, int size_indices}],
199 			]);
200 		}else{
201 			ret ~= makeFnBinds([
202 				[q{int}, q{SDL_RenderGeometryRaw}, q{SDL_Renderer* renderer, SDL_Texture* texture, const(float)* xy, int xy_stride, const(int)* color, int color_stride, const(float)* uv, int uv_stride, int num_vertices, const(void)* indices, int num_indices, int size_indices}],
203 			]);
204 		}
205 	}
206 	static if(sdlSupport >= SDLSupport.v2_0_22){
207 		ret ~= makeFnBinds([
208 			[q{SDL_Window*}, q{SDL_RenderGetWindow}, q{SDL_Renderer* renderer}],
209 		]);
210 	}
211 	return ret;
212 }()));
213 
214 alias SDL_SetTextureColourMod = SDL_SetTextureColorMod;
215 alias SDL_GetTextureColourMod = SDL_GetTextureColorMod;
216 alias SDL_SetRenderDrawColour = SDL_SetRenderDrawColor;
217 alias SDL_GetRenderDrawColour = SDL_GetRenderDrawColor;