code.witches.io/go/sdl2@v0.1.1/render.go (about) 1 package sdl 2 3 // #include <SDL2/SDL_render.h> 4 import "C" 5 import ( 6 "unsafe" 7 8 "code.witches.io/go/sdl2/internal" 9 ) 10 11 type RendererFlags uint32 12 13 const ( 14 RendererSoftware RendererFlags = 1 << iota 15 RendererAccelerated 16 RendererPresentVSync 17 RendererTargetTexture 18 ) 19 20 type TextureAccess uint32 21 22 const ( 23 TextureAccessStatic TextureAccess = iota 24 TextureAccessStreaming 25 TextureAccessTarget 26 ) 27 28 type TextureModulate uint32 29 30 const ( 31 TextureModulateNone TextureModulate = iota 32 TextureModulateColor 33 TextureModulateAlpha 34 ) 35 36 type RendererFlip uint32 37 38 const ( 39 FlipNone RendererFlip = iota 40 FlipHorizontal 41 FlipVertical 42 ) 43 44 type Renderer C.struct_SDL_Renderer 45 46 func CreateRenderer(window *Window, index int, flags RendererFlags) (*Renderer, error) { 47 nativeRenderer := C.SDL_CreateRenderer((*C.struct_SDL_Window)(window), C.int(index), C.Uint32(flags)) 48 if nativeRenderer == nil { 49 return nil, GetError() 50 } 51 return (*Renderer)(nativeRenderer), nil 52 } 53 54 func (r *Renderer) Destroy() { 55 C.SDL_DestroyRenderer((*C.struct_SDL_Renderer)(r)) 56 } 57 58 func (r *Renderer) GetDrawColor() (red, green, blue, alpha uint8, err error) { 59 if C.SDL_GetRenderDrawColor((*C.struct_SDL_Renderer)(r), (*C.Uint8)(unsafe.Pointer(&red)), (*C.Uint8)(unsafe.Pointer(&green)), (*C.Uint8)(unsafe.Pointer(&blue)), (*C.Uint8)(unsafe.Pointer(&alpha))) != 0 { 60 return 0, 0, 0, 0, GetError() 61 } 62 return red, green, blue, alpha, nil 63 } 64 65 func (r *Renderer) Clear() error { 66 if C.SDL_RenderClear((*C.struct_SDL_Renderer)(r)) != 0 { 67 return GetError() 68 } 69 return nil 70 } 71 72 func (r *Renderer) Copy(texture *Texture, srcRect, dstRect *Rect) error { 73 srcR := srcRect.toInternal() 74 dstR := dstRect.toInternal() 75 if C.SDL_RenderCopy((*C.struct_SDL_Renderer)(r), (*C.struct_SDL_Texture)(texture), (*C.struct_SDL_Rect)(unsafe.Pointer(srcR)), (*C.struct_SDL_Rect)(unsafe.Pointer(dstR))) != 0 { 76 return GetError() 77 } 78 return nil 79 } 80 81 func (r *Renderer) CopyEx(texture *Texture, srcRect, dstRect *Rect, angle float64, center *Point, flip RendererFlip) error { 82 nativeRenderer := (*C.struct_SDL_Renderer)(r) 83 nativeTexture := (*C.struct_SDL_Texture)(texture) 84 nativeSrcRect := (*C.struct_SDL_Rect)(unsafe.Pointer(srcRect.toInternal())) 85 nativeDstRect := (*C.struct_SDL_Rect)(unsafe.Pointer(dstRect.toInternal())) 86 nativeAngle := C.double(angle) 87 nativeCenter := (*C.struct_SDL_Point)(unsafe.Pointer(center.toInternal())) 88 nativeFlip := (C.SDL_RendererFlip)(flip) 89 if C.SDL_RenderCopyEx(nativeRenderer, nativeTexture, nativeSrcRect, nativeDstRect, nativeAngle, nativeCenter, nativeFlip) != 0 { 90 return GetError() 91 } 92 return nil 93 } 94 95 func (r *Renderer) DrawLine(x1, y1, x2, y2 int) error { 96 if C.SDL_RenderDrawLine((*C.struct_SDL_Renderer)(r), C.int(x1), C.int(y1), C.int(x2), C.int(y2)) != 0 { 97 return GetError() 98 } 99 return nil 100 } 101 102 func (r *Renderer) DrawLines(points []*Point) error { 103 p := make([]*internal.Point, len(points)) 104 for i, point := range points { 105 p[i] = point.toInternal() 106 } 107 if C.SDL_RenderDrawLines((*C.struct_SDL_Renderer)(r), (*C.struct_SDL_Point)(unsafe.Pointer(&p[0])), C.int(len(p))) != 0 { 108 return GetError() 109 } 110 return nil 111 } 112 113 func (r *Renderer) DrawPoint(x, y int) error { 114 if C.SDL_RenderDrawPoint((*C.struct_SDL_Renderer)(r), C.int(x), C.int(y)) != 0 { 115 return GetError() 116 } 117 return nil 118 } 119 120 func (r *Renderer) DrawPoints(points []*Point) error { 121 p := make([]*internal.Point, len(points)) 122 for i, point := range points { 123 p[i] = point.toInternal() 124 } 125 if C.SDL_RenderDrawPoints((*C.struct_SDL_Renderer)(r), (*C.struct_SDL_Point)(unsafe.Pointer(&p[0])), C.int(len(p))) != 0 { 126 return GetError() 127 } 128 return nil 129 } 130 131 func (r *Renderer) DrawRect(rect *Rect) error { 132 if C.SDL_RenderDrawRect((*C.struct_SDL_Renderer)(r), (*C.struct_SDL_Rect)(unsafe.Pointer(rect.toInternal()))) != 0 { 133 return GetError() 134 } 135 return nil 136 } 137 138 func (r *Renderer) DrawRects(rects []*Rect) error { 139 rs := make([]*internal.Rect, len(rects)) 140 for i, rect := range rects { 141 rs[i] = rect.toInternal() 142 } 143 if C.SDL_RenderDrawRects((*C.struct_SDL_Renderer)(r), (*C.struct_SDL_Rect)(unsafe.Pointer(&rs[0])), C.int(len(rs))) != 0 { 144 return GetError() 145 } 146 return nil 147 } 148 149 func (r *Renderer) FillRect(rect *Rect) error { 150 if C.SDL_RenderFillRect((*C.struct_SDL_Renderer)(r), (*C.struct_SDL_Rect)(unsafe.Pointer(rect.toInternal()))) != 0 { 151 return GetError() 152 } 153 return nil 154 } 155 156 func (r *Renderer) FillRects(rects []*Rect) error { 157 rs := make([]*internal.Rect, len(rects)) 158 for i, rect := range rects { 159 rs[i] = rect.toInternal() 160 } 161 if C.SDL_RenderFillRects((*C.struct_SDL_Renderer)(r), (*C.struct_SDL_Rect)(unsafe.Pointer(&rs[0])), C.int(len(rs))) != 0 { 162 return GetError() 163 } 164 return nil 165 } 166 167 func (r *Renderer) Present() { 168 C.SDL_RenderPresent((*C.struct_SDL_Renderer)(r)) 169 } 170 171 func (r *Renderer) SetDrawColor(red, green, blue, alpha uint8) error { 172 if C.SDL_SetRenderDrawColor((*C.struct_SDL_Renderer)(r), C.Uint8(red), C.Uint8(green), C.Uint8(blue), C.Uint8(alpha)) != 0 { 173 return GetError() 174 } 175 return nil 176 } 177 178 type Texture C.struct_SDL_Texture 179 180 func (r *Renderer) CreateTextureFromSurface(surface *Surface) (*Texture, error) { 181 nativeTexture := C.SDL_CreateTextureFromSurface((*C.struct_SDL_Renderer)(r), (*C.struct_SDL_Surface)(surface)) 182 if nativeTexture == nil { 183 return nil, GetError() 184 } 185 return (*Texture)(nativeTexture), nil 186 } 187 188 func (t *Texture) Destroy() { 189 C.SDL_DestroyTexture((*C.struct_SDL_Texture)(t)) 190 } 191 192 func GetNumRenderDrivers() (int, error) { 193 num := int(C.SDL_GetNumRenderDrivers()) 194 if num < 0 { 195 return 0, GetError() 196 } 197 return num, nil 198 } 199 200 type RendererInfo struct { 201 name *C.char 202 Flags RendererFlags 203 NumTextureFormats uint32 204 TextureFormats [16]PixelFormat 205 MaxTextureWidth int32 206 MaxTextureHeight int32 207 Name string 208 } 209 210 func GetRendererInfo(renderer *Renderer, info *RendererInfo) error { 211 if C.SDL_GetRendererInfo((*C.struct_SDL_Renderer)(renderer), (*C.struct_SDL_RendererInfo)(unsafe.Pointer(info))) != 0 { 212 return GetError() 213 } 214 info.Name = C.GoString(info.name) 215 return nil 216 } 217 218 func GetRenderDriverInfo(index int, info *RendererInfo) error { 219 if C.SDL_GetRenderDriverInfo(C.int(index), (*C.struct_SDL_RendererInfo)(unsafe.Pointer(info))) != 0 { 220 return GetError() 221 } 222 info.Name = C.GoString(info.name) 223 return nil 224 }