Mercurial > repos > tabletprog
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 } } }