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  }