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;