From f4bf7ea6b78af266636a49399c01cb3f63723c93 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Tue, 4 Apr 2023 15:41:45 +0200 Subject: [PATCH] working on xpm implementation --- Makefile | 4 +-- includes/mlx.h | 4 ++- src/core/application.cpp | 12 +++++++- src/core/application.h | 3 +- src/core/bridge.cpp | 52 +++++++++++++++++++------------- src/utils/xpm_reader.h | 64 ++++++++++++++++++++++++++++++++++++++++ test/main.c | 32 +++++++++++++++++++- test/run.sh | 2 +- 8 files changed, 145 insertions(+), 28 deletions(-) create mode 100644 src/utils/xpm_reader.h diff --git a/Makefile b/Makefile index 110ba17..4ac0111 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: maldavid +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/10/04 16:43:41 by maldavid #+# #+# # -# Updated: 2023/03/31 12:19:47 by maldavid ### ########.fr # +# Updated: 2023/04/04 13:09:06 by maldavid ### ########.fr # # # # **************************************************************************** # @@ -29,7 +29,7 @@ ifeq ($(TOOLCHAIN), gcc) endif CXXFLAGS = -std=c++17 -O3 -fPIC -INCLUDES = -I./includes -I./src -I./third_party +INCLUDES = -I./includes -I./src -I./third_party -I/nfs/homes/maldavid/.xmake/packages/l/libsdl/2.26.4/8dfbcb8049e744a597cd5333e1b399cd/include ifeq ($(DEBUG), true) CXXFLAGS += -g diff --git a/includes/mlx.h b/includes/mlx.h index 8da3d67..88c30c8 100644 --- a/includes/mlx.h +++ b/includes/mlx.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 16:56:35 by maldavid #+# #+# */ -/* Updated: 2023/04/03 10:49:01 by maldavid ### ########.fr */ +/* Updated: 2023/04/04 13:43:42 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,6 +42,8 @@ int mlx_destroy_image(void* mlx, void* img); void* mlx_png_file_to_image(void* mlx, char* filename, int* width, int* height); void* mlx_jpg_file_to_image(void* mlx, char* filename, int* width, int* height); void* mlx_bmp_file_to_image(void* mlx, char* filename, int* width, int* height); +void* mlx_xpm_file_to_image(void* mlx, char* filename, int* width, int* height); +void* mlx_xpm_to_image(void* mlx, char** xpm_data, int* width, int* height); int mlx_clear_window(void* mlx, void* win); diff --git a/src/core/application.cpp b/src/core/application.cpp index dcc8a18..0fdf0fb 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 22:10:52 by maldavid #+# #+# */ -/* Updated: 2023/04/02 23:49:03 by maldavid ### ########.fr */ +/* Updated: 2023/04/04 14:54:12 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,7 @@ #include #include #include // for LSBFirst +#include namespace mlx::core { @@ -61,6 +62,15 @@ namespace mlx::core return map; } + void* Application::newXpmTexture(char** data, int* w, int* h) + { + std::shared_ptr texture = std::make_shared(); + texture->create(pixels.get(), width, height, VK_FORMAT_R8G8B8A8_UNORM); + TextureID id = _texture_lib.addTextureToLibrary(texture); + _texture_ids.push_back(id); + return &_texture_ids.back(); + } + void Application::destroyTexture(void* ptr) { vkDeviceWaitIdle(Render_Core::get().getDevice().get()); diff --git a/src/core/application.h b/src/core/application.h index daa6a39..8e104da 100644 --- a/src/core/application.h +++ b/src/core/application.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 21:49:46 by maldavid #+# #+# */ -/* Updated: 2023/04/03 11:18:41 by maldavid ### ########.fr */ +/* Updated: 2023/04/04 13:43:04 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,6 +47,7 @@ namespace mlx::core inline void pixelPut(void* win_ptr, int x, int y, int color) const noexcept; void* newTexture(int w, int h); + void* newXpmTexture(char** data, int* w, int* h); void* newStbTexture(char* file, int* w, int* h); // stb textures are format managed by stb image (png, jpg, bpm, ...) char* mapTexture(void* img_ptr, int* bits_per_pixel, int* size_line, int* endian); inline void texturePut(void* win_ptr, void* img, int x, int y); diff --git a/src/core/bridge.cpp b/src/core/bridge.cpp index c389455..207de52 100644 --- a/src/core/bridge.cpp +++ b/src/core/bridge.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 17:35:20 by maldavid #+# #+# */ -/* Updated: 2023/04/03 14:18:50 by maldavid ### ########.fr */ +/* Updated: 2023/04/04 13:44:12 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,9 +57,9 @@ extern "C" return SDL_ShowCursor(SDL_DISABLE); } - int mlx_mouse_move(void* mlx, void* win_ptr, int x, int y) + int mlx_mouse_move(void* mlx, void* win, int x, int y) { - static_cast(mlx)->mouseMove(win_ptr, x, y); + static_cast(mlx)->mouseMove(win, x, y); return 0; } @@ -86,24 +86,24 @@ extern "C" return static_cast(mlx)->newTexture(width, height); } - char* mlx_get_data_addr(void* mlx, void* img_ptr, int* bits_per_pixel, int* size_line, int* endian) + char* mlx_get_data_addr(void* mlx, void* img, int* bits_per_pixel, int* size_line, int* endian) { - return static_cast(mlx)->mapTexture(img_ptr, bits_per_pixel, size_line, endian); + return static_cast(mlx)->mapTexture(img, bits_per_pixel, size_line, endian); } - int mlx_put_image_to_window(void* mlx_ptr, void* win_ptr, void* img_ptr, int x, int y) + int mlx_put_image_to_window(void* mlx, void* win, void* img, int x, int y) { - static_cast(mlx_ptr)->texturePut(win_ptr, img_ptr, x, y); + static_cast(mlx)->texturePut(win, img, x, y); return 0; } - int mlx_destroy_image(void* mlx_ptr, void* img_ptr) + int mlx_destroy_image(void* mlx, void* img) { - static_cast(mlx_ptr)->destroyTexture(img_ptr); + static_cast(mlx)->destroyTexture(img); return 0; } - void* mlx_png_file_to_image(void* mlx_ptr, char* filename, int* width, int* height) + void* mlx_png_file_to_image(void* mlx, char* filename, int* width, int* height) { std::filesystem::path file(filename); if(file.extension() != ".png") @@ -111,10 +111,10 @@ extern "C" mlx::core::error::report(e_kind::error, "PNG loader : not a png file '%s'", filename); return nullptr; } - return static_cast(mlx_ptr)->newStbTexture(filename, width, height); + return static_cast(mlx)->newStbTexture(filename, width, height); } - void* mlx_jpg_file_to_image(void* mlx_ptr, char* filename, int* width, int* height) + void* mlx_jpg_file_to_image(void* mlx, char* filename, int* width, int* height) { std::filesystem::path file(filename); if(file.extension() != ".jpg" && file.extension() != ".jpeg") @@ -122,10 +122,10 @@ extern "C" mlx::core::error::report(e_kind::error, "PNG loader : not a jpg file '%s'", filename); return nullptr; } - return static_cast(mlx_ptr)->newStbTexture(filename, width, height); + return static_cast(mlx)->newStbTexture(filename, width, height); } - void* mlx_bmp_file_to_image(void* mlx_ptr, char* filename, int* width, int* height) + void* mlx_bmp_file_to_image(void* mlx, char* filename, int* width, int* height) { std::filesystem::path file(filename); if(file.extension() != ".bmp" && file.extension() != ".dib") @@ -133,24 +133,34 @@ extern "C" mlx::core::error::report(e_kind::error, "PNG loader : not a jpg file '%s'", filename); return nullptr; } - return static_cast(mlx_ptr)->newStbTexture(filename, width, height); + return static_cast(mlx)->newStbTexture(filename, width, height); } - int mlx_pixel_put(void* mlx, void* win_ptr, int x, int y, int color) + void* mlx_xpm_file_to_image(void* mlx, char* filename, int* width, int* height) { - static_cast(mlx)->pixelPut(win_ptr, x, y, color); + //return static_cast(mlx)->newXpmTexture(filename, width, height); + } + + void* mlx_xpm_to_image(void* mlx, char** xpm_data, int* width, int* height) + { + return static_cast(mlx)->newXpmTexture(xpm_data, width, height); + } + + int mlx_pixel_put(void* mlx, void* win, int x, int y, int color) + { + static_cast(mlx)->pixelPut(win, x, y, color); return 0; } - int mlx_clear_window(void* mlx_ptr, void* win_ptr) + int mlx_clear_window(void* mlx, void* win) { - static_cast(mlx_ptr)->clearGraphicsSupport(win_ptr); + static_cast(mlx)->clearGraphicsSupport(win); return 0; } - int mlx_destroy_window(void* mlx, void* win_ptr) + int mlx_destroy_window(void* mlx, void* win) { - static_cast(mlx)->destroyGraphicsSupport(win_ptr); + static_cast(mlx)->destroyGraphicsSupport(win); return 0; } diff --git a/src/utils/xpm_reader.h b/src/utils/xpm_reader.h new file mode 100644 index 0000000..df98aeb --- /dev/null +++ b/src/utils/xpm_reader.h @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* xpm_reader.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maldavid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/04/04 14:55:09 by maldavid #+# #+# */ +/* Updated: 2023/04/04 15:39:16 by maldavid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +/** + * https://github.com/clckwrkbdgr/libchthon + * This xpm reader is a modified version of libchthon one + * because xmp readers are as rare as the sun in Scotland. + */ + +#ifndef __MLX_XPM_READER__ +#define __MLX_XPM_READER__ + +#include +#include +#include +#include + +namespace mlx +{ + struct XPMData + { + XPMData(); + }; + + typedef uint32_t Color; + typedef uint8_t ColorComponent; + + Color from_rgb(ColorComponent r, ColorComponent g, ColorComponent b); + uint8_t get_red(Color color); + uint8_t get_green(Color color); + uint8_t get_blue(Color color); + bool is_transparent(Color color); + Color rgb_to_argb(Color color); + + class Pixmap + { + public: + Pixmap(uint32_t w = 1, uint32_t h = 1, uint32_t palette_size = 1); + + void load(const std::vector& xpm_lines); + + Map pixels; + std::vector palette; + + private: + uint32_t _color_count; + uint32_t _row_count; + std::vector _interspaces; + std::vector _colors; + std::vector _values_interspaces; + std::vector>> _colors_interspaces; + }; +} + +#endif diff --git a/test/main.c b/test/main.c index e03379b..d5064eb 100644 --- a/test/main.c +++ b/test/main.c @@ -6,13 +6,39 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 17:55:21 by maldavid #+# #+# */ -/* Updated: 2023/04/03 00:05:08 by maldavid ### ########.fr */ +/* Updated: 2023/04/04 14:54:04 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ #include #include "../includes/mlx.h" +static char * exemple_xpm[] = { +"24 20 3 1", +" c None", +". c #3A32E4", +"+ c #E43232", +" ", +" .. ", +" .... ", +" ......++++++++ ", +" .........+++++++ ", +" ..........+++++++ ", +" ............++++++ ", +" .............++++++ ", +" ..............++++ ", +" +.............+++ ", +" ++.............++ ", +" +++.............+ ", +" +++++............. ", +" ++++++.............. ", +" ++++++++............ ", +" +++++++++........... ", +" +++++++++......... ", +" ++++++++++....... ", +" ++++++++++..... ", +" +++++++++ ... "}; + typedef struct s_mlx { void *mlx; @@ -71,10 +97,13 @@ int main(void) int w; int h; void *img; + void *pic; mlx.mlx = mlx_init(); mlx.win = mlx_new_window(mlx.mlx, 400, 400, "My window"); mlx.logo = mlx_png_file_to_image(mlx.mlx, "42_logo.png", &w, &h); + pic = mlx_xpm_to_image(mlx.mlx, exemple_xpm, &w, &h); + mlx_put_image_to_window(mlx.mlx, mlx.win, pic, 20, 20); mlx_pixel_put(mlx.mlx, mlx.win, 200, 10, 0xFFFF00FF); mlx_put_image_to_window(mlx.mlx, mlx.win, mlx.logo, 200, 200); img = create_image(&mlx); @@ -82,6 +111,7 @@ int main(void) mlx_loop_hook(mlx.mlx, update, &mlx); mlx_loop(mlx.mlx); mlx_destroy_image(mlx.mlx, img); + mlx_destroy_image(mlx.mlx, pic); mlx_destroy_image(mlx.mlx, mlx.logo); mlx_destroy_window(mlx.mlx, mlx.win); mlx_destroy_display(mlx.mlx); diff --git a/test/run.sh b/test/run.sh index f3c908d..1b2a692 100755 --- a/test/run.sh +++ b/test/run.sh @@ -1 +1 @@ -clang main.c ../libmlx.so -lSDL2 -g && ./a.out +clang main.c ../libmlx.so `/nfs/homes/maldavid/.xmake/packages/l/libsdl/2.26.4/8dfbcb8049e744a597cd5333e1b399cd/bin/sdl2-config --cflags --libs` -g && ./a.out