Merge pull request #387 from JupiterRider/master

TraceLog and TraceLogCallback fixes
This commit is contained in:
Milan Nikolic 2024-05-15 05:52:41 +02:00 committed by GitHub
commit e824a9b663
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 22 additions and 6 deletions

View file

@ -5,6 +5,7 @@ package rl
import ( import (
"fmt" "fmt"
"syscall"
"unsafe" "unsafe"
"github.com/ebitengine/purego" "github.com/ebitengine/purego"
@ -16,6 +17,15 @@ const (
requiredVersion = "5.0" requiredVersion = "5.0"
) )
var wvsprintfA uintptr
func init() {
handle, err := windows.LoadLibrary("user32.dll")
if err == nil {
wvsprintfA, _ = windows.GetProcAddress(handle, "wvsprintfA")
}
}
// loadLibrary loads the raylib dll and panics on error // loadLibrary loads the raylib dll and panics on error
func loadLibrary() uintptr { func loadLibrary() uintptr {
handle, err := windows.LoadLibrary(libname) handle, err := windows.LoadLibrary(libname)
@ -37,7 +47,14 @@ func loadLibrary() uintptr {
} }
func traceLogCallbackWrapper(fn TraceLogCallbackFun) uintptr { func traceLogCallbackWrapper(fn TraceLogCallbackFun) uintptr {
return purego.NewCallback(func(logLevel int32, text *byte) uintptr { return purego.NewCallback(func(logLevel int32, text *byte, args unsafe.Pointer) uintptr {
if wvsprintfA != 0 {
var buffer [1024]byte // Max size is 1024 (see https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-wvsprintfa)
_, _, errno := syscall.SyscallN(wvsprintfA, uintptr(unsafe.Pointer(&buffer[0])), uintptr(unsafe.Pointer(text)), uintptr(args))
if errno == 0 {
text = &buffer[0]
}
}
fn(int(logLevel), windows.BytePtrToString(text)) fn(int(logLevel), windows.BytePtrToString(text))
return 0 return 0
}) })

View file

@ -4,6 +4,7 @@
package rl package rl
import ( import (
"fmt"
"image" "image"
"image/color" "image/color"
"os" "os"
@ -121,7 +122,7 @@ var unloadRandomSequence func(sequence *int32)
var takeScreenshot func(fileName string) var takeScreenshot func(fileName string)
var setConfigFlags func(flags uint32) var setConfigFlags func(flags uint32)
var openURL func(url string) var openURL func(url string)
var traceLog func(logLevel int32, text string, args ...any) var traceLog func(logLevel int32, text string)
var setTraceLogLevel func(logLevel int32) var setTraceLogLevel func(logLevel int32)
var memAlloc func(size uint32) unsafe.Pointer var memAlloc func(size uint32) unsafe.Pointer
var memRealloc func(ptr unsafe.Pointer, size uint32) unsafe.Pointer var memRealloc func(ptr unsafe.Pointer, size uint32) unsafe.Pointer
@ -1556,7 +1557,7 @@ func OpenURL(url string) {
// TraceLog - Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...) // TraceLog - Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...)
func TraceLog(logLevel TraceLogLevel, text string, args ...any) { func TraceLog(logLevel TraceLogLevel, text string, args ...any) {
traceLog(int32(logLevel), text, args...) traceLog(int32(logLevel), fmt.Sprintf(text, args...))
} }
// SetTraceLogLevel - Set the current threshold (minimum) log level // SetTraceLogLevel - Set the current threshold (minimum) log level
@ -1580,8 +1581,6 @@ func MemFree(ptr unsafe.Pointer) {
} }
// SetTraceLogCallback - Set custom trace log // SetTraceLogCallback - Set custom trace log
//
// REVIEW NEEDED! 2023-11-15 JupiterRider: The argument list paramter isn't impelmented yet.
func SetTraceLogCallback(fn TraceLogCallbackFun) { func SetTraceLogCallback(fn TraceLogCallbackFun) {
setTraceLogCallback(traceLogCallbackWrapper(fn)) setTraceLogCallback(traceLogCallbackWrapper(fn))
} }

View file

@ -3,7 +3,7 @@
#include <stdio.h> // Required for: vprintf() #include <stdio.h> // Required for: vprintf()
#include <string.h> // Required for: strcpy(), strcat() #include <string.h> // Required for: strcpy(), strcat()
#define MAX_TRACELOG_BUFFER_SIZE 128 // As defined in utils.c from raylib #define MAX_TRACELOG_BUFFER_SIZE 256 // As defined in utils.c from raylib
void rayLogWrapperCallback(int logType, const char *text, va_list args) { void rayLogWrapperCallback(int logType, const char *text, va_list args) {
char buffer[MAX_TRACELOG_BUFFER_SIZE] = { 0 }; char buffer[MAX_TRACELOG_BUFFER_SIZE] = { 0 };