Python / Cython wrapper for SDL 1.3
2011
The most famous Python bindings for SDL is probably the PyGame project, but it’s oriented to the 1.2.x versions of the multiplatform library. There’s also PySDL by Albert Zeyer, which are automatically created from the SDL headers using a generator.
I tried to do the same for Cython, using an automated generator to parse header files and output a Cython sxd file. Sadly the tools for that are a bit green and they don’t quite work yet, so I’ve made a Cython header file handcrafted from SDL 1.3 headers containing the functions I need (There’s SDL, SDL_image and SDL_ttf functions in there). Based on it and the SDL source code it’s very easy to expand it, so contributions are most welcome.
Without further ado, SDL.pxd:
cdef extern from "SDL.h": ctypedef unsigned char Uint8 ctypedef unsigned long Uint32 ctypedef unsigned long long Uint64 ctypedef signed long long Sint64 ctypedef signed short Sint16 ctypedef unsigned short Uint16 ctypedef enum: SDL_PIXELFORMAT_ARGB8888 ctypedef enum SDL_BlendMode: SDL_BLENDMODE_NONE = 0x00000000 SDL_BLENDMODE_BLEND = 0x00000001 SDL_BLENDMODE_ADD = 0x00000002 SDL_BLENDMODE_MOD = 0x00000004 ctypedef enum SDL_TextureAccess: SDL_TEXTUREACCESS_STATIC SDL_TEXTUREACCESS_STREAMING SDL_TEXTUREACCESS_TARGET ctypedef enum SDL_RendererFlags: SDL_RENDERER_SOFTWARE = 0x00000001 SDL_RENDERER_ACCELERATED = 0x00000002 SDL_RENDERER_PRESENTVSYNC = 0x00000004 ctypedef enum SDL_bool: SDL_FALSE = 0 SDL_TRUE = 1 cdef struct SDL_Rect: int x, y int w, h ctypedef struct SDL_Point: int x, y cdef struct SDL_Color: Uint8 r Uint8 g Uint8 b Uint8 unused cdef struct SDL_Palette: int ncolors SDL_Color *colors Uint32 version int refcount cdef struct SDL_PixelFormat: Uint32 format SDL_Palette *palette Uint8 BitsPerPixel Uint8 BytesPerPixel Uint8 padding[2] Uint32 Rmask Uint32 Gmask Uint32 Bmask Uint32 Amask Uint8 Rloss Uint8 Gloss Uint8 Bloss Uint8 Aloss Uint8 Rshift Uint8 Gshift Uint8 Bshift Uint8 Ashift int refcount SDL_PixelFormat *next cdef struct SDL_BlitMap cdef struct SDL_Surface: Uint32 flags SDL_PixelFormat *format int w, h int pitch void *pixels void *userdata int locked void *lock_data SDL_Rect clip_rect SDL_BlitMap *map int refcount ctypedef enum SDL_EventType: SDL_FIRSTEVENT = 0, SDL_QUIT = 0x100 SDL_WINDOWEVENT = 0x200 SDL_SYSWMEVENT SDL_KEYDOWN = 0x300 SDL_KEYUP SDL_TEXTEDITING SDL_TEXTINPUT SDL_MOUSEMOTION = 0x400 SDL_MOUSEBUTTONDOWN SDL_MOUSEBUTTONUP SDL_MOUSEWHEEL SDL_INPUTMOTION = 0x500 SDL_INPUTBUTTONDOWN SDL_INPUTBUTTONUP SDL_INPUTWHEEL SDL_INPUTPROXIMITYIN SDL_INPUTPROXIMITYOUT SDL_JOYAXISMOTION = 0x600 SDL_JOYBALLMOTION SDL_JOYHATMOTION SDL_JOYBUTTONDOWN SDL_JOYBUTTONUP SDL_FINGERDOWN = 0x700 SDL_FINGERUP SDL_FINGERMOTION SDL_TOUCHBUTTONDOWN SDL_TOUCHBUTTONUP SDL_DOLLARGESTURE = 0x800 SDL_DOLLARRECORD SDL_MULTIGESTURE SDL_CLIPBOARDUPDATE = 0x900 SDL_EVENT_COMPAT1 = 0x7000 SDL_EVENT_COMPAT2 SDL_EVENT_COMPAT3 SDL_USEREVENT = 0x8000 SDL_LASTEVENT = 0xFFFF ctypedef enum SDL_WindowEventID: SDL_WINDOWEVENT_NONE #< Never used */ SDL_WINDOWEVENT_SHOWN #< Window has been shown */ SDL_WINDOWEVENT_HIDDEN #< Window has been hidden */ SDL_WINDOWEVENT_EXPOSED #< Window has been exposed and should be # redrawn */ SDL_WINDOWEVENT_MOVED #< Window has been moved to data1, data2 # */ SDL_WINDOWEVENT_RESIZED #< Window has been resized to data1xdata2 */ SDL_WINDOWEVENT_SIZE_CHANGED #< The window size has changed, either as a result of an API call or through the system or user changing the window size. */ SDL_WINDOWEVENT_MINIMIZED #< Window has been minimized */ SDL_WINDOWEVENT_MAXIMIZED #< Window has been maximized */ SDL_WINDOWEVENT_RESTORED #< Window has been restored to normal size # and position */ SDL_WINDOWEVENT_ENTER #< Window has gained mouse focus */ SDL_WINDOWEVENT_LEAVE #< Window has lost mouse focus */ SDL_WINDOWEVENT_FOCUS_GAINED #< Window has gained keyboard focus */ SDL_WINDOWEVENT_FOCUS_LOST #< Window has lost keyboard focus */ SDL_WINDOWEVENT_CLOSE #< The window manager requests that the # window be closed */ ctypedef enum SDL_WindowFlags: SDL_WINDOW_FULLSCREEN = 0x00000001 SDL_WINDOW_OPENGL = 0x00000002 SDL_WINDOW_SHOWN = 0x00000004 SDL_WINDOW_HIDDEN = 0x00000008 SDL_WINDOW_BORDERLESS = 0x00000010 SDL_WINDOW_RESIZABLE = 0x00000020 SDL_WINDOW_MINIMIZED = 0x00000040 SDL_WINDOW_MAXIMIZED = 0x00000080 SDL_WINDOW_INPUT_GRABBED = 0x00000100 SDL_WINDOW_INPUT_FOCUS = 0x00000200 SDL_WINDOW_MOUSE_FOCUS = 0x00000400 SDL_WINDOW_FOREIGN = 0x00000800 ctypedef enum SDL_RendererFlip: SDL_FLIP_NONE = 0x00000000 SDL_FLIP_HORIZONTAL = 0x00000001 SDL_FLIP_VERTICAL = 0x00000002 cdef struct SDL_MouseMotionEvent: Uint32 type Uint32 windowID Uint8 state Uint8 padding1 Uint8 padding2 Uint8 padding3 int x int y int xrel int yrel cdef struct SDL_MouseButtonEvent: Uint32 type Uint32 windowID Uint8 button Uint8 state Uint8 padding1 Uint8 padding2 int x int y cdef struct SDL_WindowEvent: Uint32 type Uint32 windowID Uint8 event Uint8 padding1 Uint8 padding2 Uint8 padding3 int data1 int data2 ctypedef Sint64 SDL_TouchID ctypedef Sint64 SDL_FingerID cdef struct SDL_TouchFingerEvent: Uint32 type Uint32 windowID SDL_TouchID touchId SDL_FingerID fingerId Uint8 state Uint8 padding1 Uint8 padding2 Uint8 padding3 Uint16 x Uint16 y Sint16 dx Sint16 dy Uint16 pressure cdef struct SDL_KeyboardEvent: pass cdef struct SDL_TextEditingEvent: pass cdef struct SDL_TextInputEvent: pass cdef struct SDL_MouseWheelEvent: Uint32 type Uint32 windowID int x int y cdef struct SDL_JoyAxisEvent: pass cdef struct SDL_JoyBallEvent: pass cdef struct SDL_JoyHatEvent: pass cdef struct SDL_JoyButtonEvent: pass cdef struct SDL_QuitEvent: pass cdef struct SDL_UserEvent: pass cdef struct SDL_SysWMEvent: pass cdef struct SDL_TouchFingerEvent: pass cdef struct SDL_TouchButtonEvent: pass cdef struct SDL_MultiGestureEvent: pass cdef struct SDL_DollarGestureEvent: pass cdef union SDL_Event: Uint32 type SDL_WindowEvent window SDL_KeyboardEvent key SDL_TextEditingEvent edit SDL_TextInputEvent text SDL_MouseMotionEvent motion SDL_MouseButtonEvent button SDL_MouseWheelEvent wheel SDL_JoyAxisEvent jaxis SDL_JoyBallEvent jball SDL_JoyHatEvent jhat SDL_JoyButtonEvent jbutton SDL_QuitEvent quit SDL_UserEvent user SDL_SysWMEvent syswm SDL_TouchFingerEvent tfinger SDL_TouchButtonEvent tbutton SDL_MultiGestureEvent mgesture SDL_DollarGestureEvent dgesture cdef struct SDL_RendererInfo: char *name Uint32 flags Uint32 num_texture_formats Uint32 texture_formats[16] int max_texture_width int max_texture_height ctypedef struct SDL_Texture ctypedef struct SDL_Renderer ctypedef struct SDL_Window ctypedef struct SDL_DisplayMode: Uint32 format int w int h int refresh_rate void *driverdata cdef struct SDL_RWops: long (* seek) (SDL_RWops * context, long offset,int whence) size_t(* read) ( SDL_RWops * context, void *ptr, size_t size, size_t maxnum) size_t(* write) (SDL_RWops * context, void *ptr,size_t size, size_t num) int (* close) (SDL_RWops * context) cdef SDL_Renderer * SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags) cdef SDL_Texture * SDL_CreateTexture(SDL_Renderer * renderer, Uint32 format, int access, int w, int h) cdef SDL_Texture * SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface) cdef SDL_Surface * SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) cdef int SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, SDL_Rect * srcrect, SDL_Rect * dstrect) cdef int SDL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture, SDL_Rect * srcrect, SDL_Rect * dstrect, double angle, SDL_Point *center, SDL_RendererFlip flip) cdef void SDL_RenderPresent(SDL_Renderer * renderer) cdef SDL_bool SDL_RenderTargetSupported(SDL_Renderer *renderer) cdef int SDL_SetTargetTexture(SDL_Texture *texture) cdef SDL_bool SDL_ResetTargetTexture(SDL_Renderer *renderer) cdef void SDL_DestroyTexture(SDL_Texture * texture) cdef void SDL_FreeSurface(SDL_Surface * surface) cdef int SDL_UpperBlit (SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect) cdef int SDL_LockTexture(SDL_Texture * texture, SDL_Rect * rect, void **pixels, int *pitch) cdef void SDL_UnlockTexture(SDL_Texture * texture) cdef void SDL_GetWindowSize(SDL_Window * window, int *w, int *h) cdef SDL_Window * SDL_CreateWindow(char *title, int x, int y, int w, int h, Uint32 flags) cdef int SDL_SetRenderDrawColor(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a) cdef int SDL_RenderClear(SDL_Renderer * renderer) cdef int SDL_SetTextureBlendMode(SDL_Texture * texture, SDL_BlendMode blendMode) cdef int SDL_GetTextureBlendMode(SDL_Texture * texture, SDL_BlendMode *blendMode) cdef SDL_Surface * SDL_CreateRGBSurfaceFrom(void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) cdef int SDL_Init(Uint32 flags) cdef void SDL_Quit() cdef int SDL_EnableUNICODE(int enable) cdef Uint32 SDL_GetTicks() cdef void SDL_Delay(Uint32 ms) cdef int SDL_PollEvent(SDL_Event * event) cdef SDL_RWops * SDL_RWFromFile(char *file, char *mode) cdef void SDL_FreeRW(SDL_RWops *area) cdef int SDL_GetRendererInfo(SDL_Renderer *renderer, SDL_RendererInfo *info) cdef int SDL_RenderSetViewport(SDL_Renderer * renderer, SDL_Rect * rect) cdef int SDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode * mode) cdef int SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode * mode) cdef int SDL_SetTextureColorMod(SDL_Texture * texture, Uint8 r, Uint8 g, Uint8 b) cdef int SDL_SetTextureAlphaMod(SDL_Texture * texture, Uint8 alpha) cdef char * SDL_GetError() cdef extern from "SDL_image.h": cdef SDL_Surface *IMG_Load(char *file) cdef extern from "SDL_ttf.h": ctypedef struct TTF_Font cdef int TTF_Init() cdef TTF_Font * TTF_OpenFont( char *file, int ptsize) cdef TTF_Font * TTF_OpenFontIndex( char *file, int ptsize, long index) cdef TTF_Font * TTF_OpenFontRW(SDL_RWops *src, int freesrc, int ptsize) cdef TTF_Font * TTF_OpenFontIndexRW(SDL_RWops *src, int freesrc, int ptsize, long index) #Set and retrieve the font style #define TTF_STYLE_NORMAL 0x00 #define TTF_STYLE_BOLD 0x01 #define TTF_STYLE_ITALIC 0x02 #define TTF_STYLE_UNDERLINE 0x04 #define TTF_STYLE_STRIKETHROUGH 0x08 cdef int TTF_GetFontStyle( TTF_Font *font) cdef void TTF_SetFontStyle(TTF_Font *font, int style) cdef int TTF_GetFontOutline( TTF_Font *font) cdef void TTF_SetFontOutline(TTF_Font *font, int outline) #Set and retrieve FreeType hinter settings */ #define TTF_HINTING_NORMAL 0 #define TTF_HINTING_LIGHT 1 #define TTF_HINTING_MONO 2 #define TTF_HINTING_NONE 3 cdef int TTF_GetFontHinting( TTF_Font *font) cdef void TTF_SetFontHinting(TTF_Font *font, int hinting) #Get the total height of the font - usually equal to point size cdef int TTF_FontHeight( TTF_Font *font) ## Get the offset from the baseline to the top of the font #This is a positive value, relative to the baseline. #*/ cdef int TTF_FontAscent( TTF_Font *font) ## Get the offset from the baseline to the bottom of the font # This is a negative value, relative to the baseline. # */ cdef int TTF_FontDescent( TTF_Font *font) ## Get the recommended spacing between lines of text for this font */ cdef int TTF_FontLineSkip( TTF_Font *font) ## Get/Set whether or not kerning is allowed for this font */ cdef int TTF_GetFontKerning( TTF_Font *font) cdef void TTF_SetFontKerning(TTF_Font *font, int allowed) ## Get the number of faces of the font */ cdef long TTF_FontFaces( TTF_Font *font) ## Get the font face attributes, if any */ cdef int TTF_FontFaceIsFixedWidth( TTF_Font *font) cdef char * TTF_FontFaceFamilyName( TTF_Font *font) cdef char * TTF_FontFaceStyleName( TTF_Font *font) ## Check wether a glyph is provided by the font or not */ cdef int TTF_GlyphIsProvided( TTF_Font *font, Uint16 ch) ## Get the metrics (dimensions) of a glyph # To understand what these metrics mean, here is a useful link: # http://freetype.sourceforge.net/freetype2/docs/tutorial/step2.html # */ cdef int TTF_GlyphMetrics(TTF_Font *font, Uint16 ch,int *minx, int *maxx, int *miny, int *maxy, int *advance) ## Get the dimensions of a rendered string of text */ cdef int TTF_SizeText(TTF_Font *font, char *text, int *w, int *h) cdef int TTF_SizeUTF8(TTF_Font *font, char *text, int *w, int *h) cdef int TTF_SizeUNICODE(TTF_Font *font, Uint16 *text, int *w, int *h) # Create an 8-bit palettized surface and render the given text at # fast quality with the given font and color. The 0 pixel is the # colorkey, giving a transparent background, and the 1 pixel is set # to the text color. # This function returns the new surface, or NULL if there was an error. #*/ cdef SDL_Surface * TTF_RenderText_Solid(TTF_Font *font, char *text, SDL_Color fg) cdef SDL_Surface * TTF_RenderUTF8_Solid(TTF_Font *font, char *text, SDL_Color fg) cdef SDL_Surface * TTF_RenderUNICODE_Solid(TTF_Font *font, Uint16 *text, SDL_Color fg) # Create an 8-bit palettized surface and render the given glyph at # fast quality with the given font and color. The 0 pixel is the # colorkey, giving a transparent background, and the 1 pixel is set # to the text color. The glyph is rendered without any padding or # centering in the X direction, and aligned normally in the Y direction. # This function returns the new surface, or NULL if there was an error. #*/ cdef SDL_Surface * TTF_RenderGlyph_Solid(TTF_Font *font, Uint16 ch, SDL_Color fg) # Create an 8-bit palettized surface and render the given text at # high quality with the given font and colors. The 0 pixel is background, # while other pixels have varying degrees of the foreground color. # This function returns the new surface, or NULL if there was an error. #*/ cdef SDL_Surface * TTF_RenderText_Shaded(TTF_Font *font, char *text, SDL_Color fg, SDL_Color bg) cdef SDL_Surface * TTF_RenderUTF8_Shaded(TTF_Font *font, char *text, SDL_Color fg, SDL_Color bg) cdef SDL_Surface * TTF_RenderUNICODE_Shaded(TTF_Font *font, Uint16 *text, SDL_Color fg, SDL_Color bg) # Create an 8-bit palettized surface and render the given glyph at # high quality with the given font and colors. The 0 pixel is background, # while other pixels have varying degrees of the foreground color. # The glyph is rendered without any padding or centering in the X # direction, and aligned normally in the Y direction. # This function returns the new surface, or NULL if there was an error. # cdef SDL_Surface * TTF_RenderGlyph_Shaded(TTF_Font *font, Uint16 ch, SDL_Color fg, SDL_Color bg) # Create a 32-bit ARGB surface and render the given text at high quality, # using alpha blending to dither the font with the given color. # This function returns the new surface, or NULL if there was an error. #*/ cdef SDL_Surface * TTF_RenderText_Blended(TTF_Font *font, char *text, SDL_Color fg) cdef SDL_Surface * TTF_RenderUTF8_Blended(TTF_Font *font, char *text, SDL_Color fg) cdef SDL_Surface * TTF_RenderUNICODE_Blended(TTF_Font *font, Uint16 *text, SDL_Color fg) # Create a 32-bit ARGB surface and render the given glyph at high quality, # using alpha blending to dither the font with the given color. # The glyph is rendered without any padding or centering in the X # direction, and aligned normally in the Y direction. # This function returns the new surface, or NULL if there was an error. #*/ cdef SDL_Surface * TTF_RenderGlyph_Blended(TTF_Font *font, Uint16 ch, SDL_Color fg) # For compatibility with previous versions, here are the old functions */ #define TTF_RenderText(font, text, fg, bg) \ # TTF_RenderText_Shaded(font, text, fg, bg) #define TTF_RenderUTF8(font, text, fg, bg) \ # TTF_RenderUTF8_Shaded(font, text, fg, bg) #define TTF_RenderUNICODE(font, text, fg, bg) \ # TTF_RenderUNICODE_Shaded(font, text, fg, bg) # Close an opened font file */ cdef void TTF_CloseFont(TTF_Font *font) # De-initialize the TTF engine */ cdef void TTF_Quit() # Check if the TTF engine is initialized */ cdef int TTF_WasInit() # Get the kerning size of two glyphs */ cdef int TTF_GetFontKerningSize(TTF_Font *font, int prev_index, int index)