diff modules/sdl.tp @ 318:4c669942c30d

Add bindings for SDL_CreateTexture, SDL_LockTexture, SDL_SetBlendMode and SDL_GetBlendMode in SDL module
author Michael Pavone <pavone@retrodev.com>
date Thu, 19 Mar 2015 22:40:43 -0700
parents 2b045d5b673b
children ead24192ed45
line wrap: on
line diff
--- a/modules/sdl.tp	Thu Mar 19 22:39:42 2015 -0700
+++ b/modules/sdl.tp	Thu Mar 19 22:40:43 2015 -0700
@@ -71,6 +71,34 @@
 				mcall: none 1 option
 			}
 		}
+		
+		llMessage: createTexture withVars: {
+			rendOpaque <- cpointer ptr
+			format <- object ptr
+			formatn <- obj_uint32 ptr
+			access <- object ptr
+			accessn <- obj_int32 ptr
+			w <- object ptr
+			wn <- obj_int32 ptr
+			h <- object ptr
+			hn <- obj_int32 ptr
+			makeTexture <- lambda ptr
+			texOpaque <- cpointer ptr
+			tex <- object ptr
+		} andCode: :rendOpaque format access w h makeTexture {
+			formatn <- (mcall: uint32 1 format) castTo: (obj_uint32 ptr)
+			accessn <- (mcall: int32 1 access) castTo: (obj_int32 ptr)
+			wn <- (mcall: int32 1 w) castTo: (obj_int32 ptr)
+			hn <- (mcall: int32 1 h) castTo: (obj_int32 ptr)
+			texOpaque <- make_object: (addr_of: cpointer_meta) NULL 0
+			texOpaque val!: (SDL_CreateTexture: (rendOpaque val) (formatn num) (accessn num) (wn num) (hn num))
+			if: (texOpaque val) {
+				tex <- ccall: makeTexture 2 (rendOpaque castTo: (object ptr)) (texOpaque castTo: (object ptr))
+				mcall: value 2 option tex
+			} else: {
+				mcall: none 1 option
+			}
+		}
 
 		llMessage: pollEvent withVars: {
 			constructor <- lambda ptr
@@ -285,6 +313,56 @@
 		_constant: dropFile SDL_DROPFILE
 		//TODO: Add mobile/touch/gesture events
 	}
+	
+	_textureAccess <- #{
+		_constant: static SDL_TEXTUREACCESS_STATIC
+		_constant: streaming SDL_TEXTUREACCESS_STREAMING
+		_constant: target SDL_TEXTUREACCESS_TARGET
+	}
+	
+	_pixelFormats <- #{
+		_constant: unknown SDL_PIXELFORMAT_UNKNOWN
+		_constant: index1LSB SDL_PIXELFORMAT_INDEX1LSB
+		_constant: index1MSB SDL_PIXELFORMAT_INDEX1MSB
+		_constant: index4LSB SDL_PIXELFORMAT_INDEX4LSB
+		_constant: index4MSB SDL_PIXELFORMAT_INDEX4MSB
+		_constant: index8 SDL_PIXELFORMAT_INDEX8
+		_constant: rgb332 SDL_PIXELFORMAT_RGB332
+		_constant: rgb444 SDL_PIXELFORMAT_RGB444
+		_constant: rgb555 SDL_PIXELFORMAT_RGB555
+		_constant: bgr555 SDL_PIXELFORMAT_BGR555
+		_constant: argb4444 SDL_PIXELFORMAT_ARGB4444
+		_constant: bgra4444 SDL_PIXELFORMAT_BGRA4444
+		_constant: argb1555 SDL_PIXELFORMAT_ARGB1555
+		_constant: rgba5551 SDL_PIXELFORMAT_RGBA5551
+		_constant: abgr1555 SDL_PIXELFORMAT_ABGR1555
+		_constant: bgra5551 SDL_PIXELFORMAT_BGRA5551
+		_constant: rgb565 SDL_PIXELFORMAT_RGB565
+		_constant: bgr565 SDL_PIXELFORMAT_BGR565
+		_constant: rgb24 SDL_PIXELFORMAT_RGB24
+		_constant: bgr24 SDL_PIXELFORMAT_BGR24
+		_constant: rgb888 SDL_PIXELFORMAT_RGB888
+		_constant: rgbx8888 SDL_PIXELFORMAT_RGBX8888
+		_constant: bgr888 SDL_PIXELFORMAT_BGR888
+		_constant: bgrx8888 SDL_PIXELFORMAT_BGRX8888
+		_constant: argb8888 SDL_PIXELFORMAT_ARGB8888
+		_constant: rgba8888 SDL_PIXELFORMAT_RGBA8888
+		_constant: abgr8888 SDL_PIXELFORMAT_ABGR8888
+		_constant: bgra8888 SDL_PIXELFORMAT_BGRA8888
+		_constant: argb2101010 SDL_PIXELFORMAT_ARGB2101010
+		_constant: yv12 SDL_PIXELFORMAT_YV12
+		_constant: iyuv SDL_PIXELFORMAT_IYUV
+		_constant: yuy2 SDL_PIXELFORMAT_YUY2
+		_constant: uyvy SDL_PIXELFORMAT_UYVY
+		_constant: yvyu SDL_PIXELFORMAT_YVYU
+	}
+	
+	_blendModes <- #{
+		_constant: none SDL_BLENDMODE_NONE
+		_constant: blend SDL_BLENDMODE_BLEND
+		_constant: add SDL_BLENDMODE_ADD
+		_constant: mod SDL_BLENDMODE_MOD
+	}
 
 	_eventConstructors <- dict hash
 	_eventConstructors set: (_events window) :typ tstamp eventPtr {
@@ -431,6 +509,54 @@
 				intret
 			}
 
+			llMessage: lockRect:with withVars: {
+				fun <- lambda ptr
+				rectOpaque <- cpointer ptr
+				pitch <- obj_int32 ptr
+				bufsize <- obj_int32 ptr
+				height <- obj_int32 ptr
+				pixels <- cpointer ptr
+				bytearr <- object ptr
+				rect <- object ptr
+				result <- int32_t
+				ret <- object ptr
+			} andCode: :rect fun {
+				rectOpaque <- (mcall: _rectPointer 1 rect) castTo: (cpointer ptr)
+				pitch <- make_object: (addr_of: obj_int32_meta) NULL 0
+				pixels <- make_object: (addr_of: cpointer_meta) NULL 0
+				//TODO: Check return value
+				result <- SDL_LockTexture: texture (rectOpaque val) (addr_of: (pixels val)) (addr_of: (pitch num))
+				if: result = 0 {
+					height <- (mcall: h 1 rect) castTo: (obj_int32 ptr) 
+					bufsize <- make_object: (addr_of: obj_int32_meta) NULL 0
+					bufsize num!: (pitch num) * (height num)
+					bytearr <- mcall: fromOpaque:withSize 3 bytearray pixels bufsize
+					ret <- ccall: fun 2 bytearr pitch
+					SDL_UnlockTexture: texture
+					//TODO: Return value?
+				} else: {
+					ret <- false
+				}
+				ret
+			}
+			
+			llMessage: blendMode! withVars: {
+				omode <- object ptr
+				mode <- obj_uint32 ptr
+			} andCode: :omode {
+				mode <- (mcall: uint32 1 omode) castTo: (obj_uint32 ptr)
+				SDL_SetTextureBlendMode: texture (mode num)
+				self
+			}
+			
+			llMessage: blendMode withVars: {
+				mode <- obj_uint32 ptr
+			} andCode: {
+				mode <-make_object: (addr_of: obj_uint32_meta) NULL 0
+				SDL_GetTextureBlendMode: texture (addr_of: (mode num))
+				mode
+			}
+
 			llMessage: destroy withVars: {} andCode: {
 				SDL_DestroyTexture: texture
 				true
@@ -451,7 +577,7 @@
 			}
 			llMessage: _ptr_init withVars: {
 				ptr <- cpointer ptr
-			} andCode: :ptr{
+			} andCode: :ptr {
 				surface <- ptr val
 				self
 			}
@@ -570,6 +696,10 @@
 									intret num!: (SDL_SetRenderDrawColor: renderer (rc num) (gc num) (bc num) (ac num))
 									intret
 								}
+								
+								createTexture:access:width:height <- :format :access :w :h {
+									_helper createTexture: opaque format access w h _makeTexture
+								}
 
 								llMessage: clear withVars: {
 									intret <- obj_int32 ptr
@@ -685,5 +815,8 @@
 		subsystems <- { _subsystems }
 		windowOpts <- { _windowOpts }
 		eventTypes <- { _events }
+		textureAccess <- { _textureAccess }
+		pixelFormats <- { _pixelFormats }
+		blendModes <- { _blendModes }
 	}
 }