raylib_footer.odin (3424B)
1 // This footer comes from vendor:raylib. It shows how to manually add extra things to your bindings. 2 // The footer is added to this file from `input/raylib_footer.odin` automatically. 3 4 MAX_TEXTFORMAT_BUFFERS :: #config(RAYLIB_MAX_TEXTFORMAT_BUFFERS, 4) 5 MAX_TEXT_BUFFER_LENGTH :: #config(RAYLIB_MAX_TEXT_BUFFER_LENGTH, 1024) 6 7 import "core:mem" 8 import "core:fmt" 9 import "core:math/bits" 10 11 // Check if a gesture have been detected 12 IsGestureDetected :: proc "c" (gesture: Gesture) -> bool { 13 foreign lib { 14 IsGestureDetected :: proc "c" (gesture: Gestures) -> bool --- 15 } 16 return IsGestureDetected({gesture}) 17 } 18 19 // Get latest detected gesture 20 GetGestureDetected :: proc "c" () -> Gesture { 21 foreign lib { 22 GetGestureDetected :: proc "c" () -> Gestures --- 23 } 24 25 return Gesture(bits.log2(transmute(u32)(GetGestureDetected()))) 26 } 27 28 // Check if one specific window flag is enabled 29 IsWindowState :: proc "c" (flag: ConfigFlag) -> bool { 30 foreign lib { 31 IsWindowState :: proc "c" (flag: ConfigFlags) -> bool --- 32 } 33 34 return IsWindowState({flag}) 35 } 36 37 // Text formatting with variables (sprintf style) 38 TextFormat :: proc(text: cstring, args: ..any) -> cstring { 39 @static buffers: [MAX_TEXTFORMAT_BUFFERS][MAX_TEXT_BUFFER_LENGTH]byte 40 @static index: u32 41 42 buffer := buffers[index][:] 43 mem.zero_slice(buffer) 44 45 index = (index+1)%MAX_TEXTFORMAT_BUFFERS 46 47 str := fmt.bprintf(buffer[:len(buffer)-1], string(text), ..args) 48 buffer[len(str)] = 0 49 50 return cstring(raw_data(buffer)) 51 } 52 53 // Text formatting with variables (sprintf style) and allocates (must be freed with 'MemFree') 54 TextFormatAlloc :: proc(text: cstring, args: ..any) -> cstring { 55 return fmt.caprintf(string(text), ..args, allocator=MemAllocator()) 56 } 57 58 59 // Internal memory free 60 MemFree :: proc{ 61 MemFreePtr, 62 MemFreeCstring, 63 } 64 65 66 @(default_calling_convention="c") 67 foreign lib { 68 @(link_name="MemFree") 69 MemFreePtr :: proc(ptr: rawptr) --- 70 } 71 72 MemFreeCstring :: proc "c" (s: cstring) { 73 MemFreePtr(rawptr(s)) 74 } 75 76 77 MemAllocator :: proc "contextless" () -> mem.Allocator { 78 return mem.Allocator{MemAllocatorProc, nil} 79 } 80 81 MemAllocatorProc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode, 82 size, alignment: int, 83 old_memory: rawptr, old_size: int, location := #caller_location) -> (data: []byte, err: mem.Allocator_Error) { 84 switch mode { 85 case .Alloc, .Alloc_Non_Zeroed: 86 ptr := MemAlloc(c.uint(size)) 87 if ptr == nil { 88 err = .Out_Of_Memory 89 return 90 } 91 data = mem.byte_slice(ptr, size) 92 return 93 case .Free: 94 MemFree(old_memory) 95 return nil, nil 96 97 case .Resize, .Resize_Non_Zeroed: 98 ptr := MemRealloc(old_memory, c.uint(size)) 99 if ptr == nil { 100 err = .Out_Of_Memory 101 return 102 } 103 data = mem.byte_slice(ptr, size) 104 return 105 106 case .Free_All, .Query_Features, .Query_Info: 107 return nil, .Mode_Not_Implemented 108 } 109 return nil, .Mode_Not_Implemented 110 } 111 112 // RayLib 5.5 renamed Is*Ready to Is*Valid. 113 // See: https://github.com/raysan5/raylib/commit/8cbf34ddc495e2bca42245f786915c27210b0507 114 IsImageReady :: IsImageValid 115 IsTextureReady :: IsTextureValid 116 IsRenderTextureReady :: IsRenderTextureValid 117 IsFontReady :: IsFontValid 118 IsModelReady :: IsModelValid 119 IsMaterialReady :: IsMaterialValid 120 IsWaveReady :: IsWaveValid 121 IsSoundReady :: IsSoundValid 122 IsMusicReady :: IsMusicValid 123 IsAudioStreamReady :: IsAudioStreamValid 124 IsShaderReady :: IsShaderValid