From d4a05e8732a8c0da93c6fb0b2b2aaa15b682acea Mon Sep 17 00:00:00 2001 From: Trent Huber Date: Thu, 10 Oct 2024 18:21:56 -0400 Subject: [PATCH] Added xpm manual for reference; implemented Raylib correctly (no more memory leaks) --- reference/xpm_manual.pdf | Bin 0 -> 66439 bytes src/simplexpm.c | 77 ++++++++++++++++----------------------- 2 files changed, 32 insertions(+), 45 deletions(-) create mode 100644 reference/xpm_manual.pdf diff --git a/reference/xpm_manual.pdf b/reference/xpm_manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..63485f47a6b2452db845aeb962e9d043b6c1b9e5 GIT binary patch literal 66439 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 z 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 literal 0 HcmV?d00001 diff --git a/src/simplexpm.c b/src/simplexpm.c index fa1f8db..8f3825a 100644 --- a/src/simplexpm.c +++ b/src/simplexpm.c @@ -180,15 +180,12 @@ Image parse_xpm_file(const char *file_path) { if (width == 0 || height == 0 || num_colors == 0 || chars_per_pixel == 0) SIMPLE_XPM_ERROR("Invalid values token"); - // NOTE: Hotspots are not implemented + // TODO: Hotspots are not implemented ssize_t x_hotspot = x_hotspot_token ? convert_token_to_num(x_hotspot_token, 10) : -1; ssize_t y_hotspot = y_hotspot_token ? convert_token_to_num(y_hotspot_token, 10) : -1; bool xpm_ext = xpm_ext_token != NULL; -// printf("width: %lu, height: %lu, ncolors: %lu, cpp: %lu, x_hotspot: %ld, y_hotspot: %ld, xpm_ext_token: %s\n", width, height, num_colors, chars_per_pixel, x_hotspot, y_hotspot, xpm_ext_token); - - // TODO: Create global tables from num_colors - char *keys = NULL; + static char *keys = NULL; keys = realloc(keys, num_colors * chars_per_pixel * sizeof(*keys)); static unsigned int *color_table = NULL; color_table = realloc(color_table, NUM_XPM_MODES * num_colors * sizeof(*color_table)); @@ -197,7 +194,6 @@ Image parse_xpm_file(const char *file_path) { for (size_t i = 0; i < num_colors; ++i) { get_next_line(&buffer, file); result = buffer; -// printf("result: %s\n", result); check_next_token(&result, "\""); if (strlen(result) < chars_per_pixel) @@ -212,7 +208,6 @@ Image parse_xpm_file(const char *file_path) { do { Xpm_Mode mode = convert_token_to_mode(get_next_token(&result)); possible_modes[mode] = true; -// printf("MODE: %d, num_modes = %d\n", mode, NUM_XPM_MODES); char *color_str; is_last_token = get_terminal_token(&result, &color_str); @@ -227,7 +222,6 @@ Image parse_xpm_file(const char *file_path) { size_t b = (hex_value & 0x000000ff) << (2 * 8); size_t a = 0xff000000; color = r | g | b | a; - printf("hex_value: %08x\h, color: 0x%08x\n", hex_value, color); break; case '%':; // HSV // TODO: Parse %HSV codes @@ -241,19 +235,6 @@ Image parse_xpm_file(const char *file_path) { } while(!is_last_token); } -// printf("["); -// for (int i = 0; i < NUM_XPM_MODES; ++i) { -// if (possible_modes[i]) { -// printf("%d: [", i); -// for (int j = 0; j < num_colors; ++j) { -// printf("0x%X ", color_table[i * num_colors + j]); -// } -// printf("], \n"); -// -// } -// } -// printf("]"); - // TODO: Be able to dynamically change modes Xpm_Mode current_mode = XPM_MODE_COLOR; if (!possible_modes[current_mode]) @@ -276,16 +257,14 @@ Image parse_xpm_file(const char *file_path) { for (int l = 0; l < num_colors; ++l) { if (strncmp(&keys[l * chars_per_pixel], temp, chars_per_pixel) == 0) { pixels[width * i + j] = color_table[current_mode * num_colors + l]; -// printf("%X, ", pixels[width * i + j]); } } } if (*result++ != '"') SIMPLE_XPM_ERROR("Pixels section is not formatted correctly"); check_next_token(&result, ","); -// printf("\n"); } - free(temp); // << TODO: Make sure to free all the other variables at some point + free(temp); if (xpm_ext) { // TODO: Parse extensions @@ -326,49 +305,57 @@ Image parse_xpm_file(const char *file_path) { int main(int argc, char **argv) { char file_path[FILE_PATH_CAP] = {0}; - Image image = {0}; + Texture2D texture = {0}; + bool have_texture = false; + char *msg = "Drag and drop .xpm files here"; // Check if a file was offered on the command line if (argc >= 2) { strncpy(file_path, argv[2], FILE_PATH_CAP); - image = parse_xpm_file(file_path); + Image image = parse_xpm_file(file_path); + if (image.width == -1) { + have_texture = false; + msg = (char *)image.data; + } else { + UnloadTexture(texture); + texture = LoadTextureFromImage(image); + have_texture = true; + } } int screenWidth = 800; int screenHeight = 600; SetTraceLogLevel(LOG_WARNING); - InitWindow(screenWidth, screenHeight, "Hello, Raylib!"); - SetTargetFPS(60); + InitWindow(screenWidth, screenHeight, "simplexpm"); + while (!WindowShouldClose()) { if (IsFileDropped()) { FilePathList file_paths = LoadDroppedFiles(); strncpy(file_path, file_paths.paths[0], FILE_PATH_CAP); UnloadDroppedFiles(file_paths); - image = parse_xpm_file(file_path); - // for (int i = 0; i < image.height; ++i) { - // for (int j = 0; j < image.width; ++j) { - // printf("0x%08x, ", ((unsigned int *)image.data)[j * image.width + i]); - // } - // printf("\n"); - // } + Image image = parse_xpm_file(file_path); + if (image.width == -1) { + have_texture = false; + msg = (char *)image.data; + } else { + UnloadTexture(texture); + texture = LoadTextureFromImage(image); + have_texture = true; + } } BeginDrawing(); ClearBackground(RAYWHITE); - - if (image.width > 0 && image.height > 0) { - // TODO: Need to debug the array of pixels?? - - Texture2D texture = LoadTextureFromImage(image); + if (have_texture) { DrawTexture(texture, screenWidth / 2 - texture.width / 2, screenHeight / 2 - texture.height / 2, WHITE); - } else if (image.width == -1 && image.height == -1) { - DrawText("Couldn't parse .xpm file provided", GetScreenWidth() / 2, GetScreenHeight() / 2, 24, RED); - // Use image.data as a string to print the error message } else { - DrawText("Drag and drop .xpm files here", GetScreenWidth() / 2, GetScreenHeight() / 2, 24, RED); + DrawText(msg, GetScreenWidth() / 2, GetScreenHeight() / 2, 24, RED); } - EndDrawing(); } + + UnloadTexture(texture); + CloseWindow(); + return 0; } -- 2.51.0