diff --git a/src/raylib.h b/src/raylib.h index e456f5fee..2bfde27d5 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -852,6 +852,14 @@ typedef enum { // Callbacks to be implemented by users typedef void (*TraceLogCallback)(int logType, const char *text, va_list args); +// Filesystem override implemented by users. +typedef struct FilesystemOverride { + unsigned char *(*loadFileData)(const char *fileName, unsigned int *bytesRead); + void (*saveFileData)(const char *fileName, void *data, unsigned int bytesToWrite); + char *(*loadFileText)(const char *fileName); + void (*saveFileText)(const char *fileName, char *text); +} FilesystemOverride; + #if defined(__cplusplus) extern "C" { // Prevents name mangling of functions #endif @@ -945,6 +953,7 @@ RLAPI void TakeScreenshot(const char *fileName); // Takes a scr RLAPI int GetRandomValue(int min, int max); // Returns a random value between min and max (both included) // Files management functions +RLAPI void SetFilesystemOverride(FilesystemOverride override); // Set filesystem functions override. RLAPI unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read) RLAPI void SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); // Save data to file from byte array (write) RLAPI char *LoadFileText(const char *fileName); // Load text data from file (read), returns a '\0' terminated string @@ -1157,7 +1166,7 @@ RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Col RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); // Draw circle within an image (Vector version) RLAPI void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color); // Draw rectangle within an image RLAPI void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color); // Draw rectangle within an image (Vector version) -RLAPI void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color); // Draw rectangle within an image RLAPI void ImageDrawRectangleLines(Image *dst, Rectangle rec, int thick, Color color); // Draw rectangle lines within an image RLAPI void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint); // Draw a source image within a destination image (tint applied to source) RLAPI void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) within an image (destination) diff --git a/src/utils.c b/src/utils.c index 7b1d9ee45..8e60455d9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -69,6 +69,9 @@ static int logTypeLevel = LOG_INFO; // Minimum log type leve static int logTypeExit = LOG_ERROR; // Log type that exits static TraceLogCallback logCallback = NULL; // Log callback function pointer +// Filesystem function override. +static FilesystemOverride fsOverride = { NULL, NULL, NULL, NULL }; + #if defined(PLATFORM_ANDROID) static AAssetManager *assetManager = NULL; // Android assets manager pointer static const char *internalDataPath = NULL; // Android internal data path @@ -163,6 +166,12 @@ void TraceLog(int logType, const char *text, ...) #endif // SUPPORT_TRACELOG } +// Set filesystem functions override. +void SetFilesystemOverride(FilesystemOverride override) +{ + fsOverride = override; +} + // Load data from file into a buffer unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead) { @@ -171,6 +180,13 @@ unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead) if (fileName != NULL) { + if (fsOverride.loadFileData) { + data = fsOverride.loadFileData(fileName, bytesRead); + + if (data) + return data; + } + FILE *file = fopen(fileName, "rb"); if (file != NULL) @@ -208,6 +224,11 @@ void SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite) { if (fileName != NULL) { + if (fsOverride.saveFileData) { + fsOverride.saveFileData(fileName, data, bytesToWrite); + return; + } + FILE *file = fopen(fileName, "wb"); if (file != NULL) @@ -233,6 +254,13 @@ char *LoadFileText(const char *fileName) if (fileName != NULL) { + if (fsOverride.loadFileText) { + text = fsOverride.loadFileText(fileName); + + if (text) + return text; + } + FILE *textFile = fopen(fileName, "rt"); if (textFile != NULL) @@ -274,6 +302,11 @@ void SaveFileText(const char *fileName, char *text) { if (fileName != NULL) { + if (fsOverride.saveFileText) { + fsOverride.saveFileText(fileName, text); + return; + } + FILE *file = fopen(fileName, "wt"); if (file != NULL) @@ -317,7 +350,7 @@ FILE *android_fopen(const char *fileName, const char *mode) // NOTE: AAsset provides access to read-only asset AAsset *asset = AAssetManager_open(assetManager, fileName, AASSET_MODE_UNKNOWN); - if (asset != NULL) + if (asset != NULL) { // Return pointer to file in the assets return funopen(asset, android_read, android_write, android_seek, android_close);