/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* mlx.h :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 16:56:35 by maldavid #+# #+# */ /* Updated: 2024/12/14 16:33:17 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ // MacroLibX official repo https://github.com/seekrs/MacroLibX // MacroLibX official website https://macrolibx.kbz8.me/ #ifndef MACROLIB_X_H #define MACROLIB_X_H #include "mlx_profile.h" #ifdef __cplusplus extern "C" { #endif typedef enum mlx_event_type { MLX_KEYDOWN = 0, MLX_KEYUP = 1, MLX_MOUSEDOWN = 2, MLX_MOUSEUP = 3, MLX_MOUSEWHEEL = 4, MLX_WINDOW_EVENT = 5 } mlx_event_type; /** * @brief Descriptor structure for window creation */ typedef struct mlx_window_create_info { void* mlx_extension; const char* title; int width; int height; bool is_fullscreen; bool is_resizable; } mlx_window_create_info; /* MLX backend related functions */ /** * @brief Initializes the MLX internal application * * @return (void*) An opaque pointer to the internal MLX application or NULL (0x0) in case of error */ MLX_API void* mlx_init(); /** * @brief Caps the FPS * * @param mlx Internal MLX application * @param fps The FPS cap */ MLX_API void mlx_set_fps_goal(void* mlx, int fps); /** * @brief Destroy internal MLX application * * @param mlx Internal MLX application */ MLX_API void mlx_destroy_display(void* mlx); /* Window related functions */ /** * @brief Creates a new window * * @param mlx Internal MLX application * @param info Pointer to a descriptor structure * * @return (void*) An opaque pointer to the internal MLX window or NULL (0x0) in case of error */ MLX_API void* mlx_new_window(void* mlx, const mlx_window_create_info* info); /** * @brief Destroys internal window * * @param mlx Internal MLX application * @param win Internal window */ MLX_API void mlx_destroy_window(void* mlx, void* win); /** * @brief Sets window position * * @param mlx Internal MLX application * @param win Internal window to move * @param x New x position * @param y New y position */ MLX_API void mlx_set_window_position(void *mlx, void *win, int x, int y); /** * @brief Sets window size * * @param mlx Internal MLX application * @param win Internal window to move * @param width New width * @param height New height */ MLX_API void mlx_set_window_size(void *mlx, void *win, int width, int height); /** * @brief Sets window title * * @param mlx Internal MLX application * @param win Internal window to move * @param title New title */ MLX_API void mlx_set_window_title(void *mlx, void *win, const char* title); /** * @brief Enables/Disables window fullscreen mode * * @param mlx Internal MLX application * @param win Internal window to move * @param enable Switch or not to fullscreen */ MLX_API void mlx_set_window_fullscreen(void *mlx, void *win, bool enable); /** * @brief Gets window position * * @param mlx Internal MLX application * @param win Internal window to move * @param x Pointers to get position of the window * @param y Pointers to get position of the window */ MLX_API void mlx_get_window_position(void *mlx, void *win, int* x, int* y); /** * @brief Gets window size * * @param mlx Internal MLX application * @param win Internal window to move * @param x Pointers to get size of the window * @param y Pointers to get size of the window */ MLX_API void mlx_get_window_size(void *mlx, void *win, int* x, int* y); /** * @brief Clears the given window (resets all rendered data) * * @param mlx Internal MLX application * @param win Internal window */ MLX_API void mlx_clear_window(void* mlx, void* win, int color); /** * @brief Get the size of the screen the given window is on * * @param mlx Internal MLX application * @param win Internal window to choose screen the window is on * @param w Get width size * @param h Get height size */ MLX_API void mlx_get_screens_size(void* mlx, void* win, int* w, int* h); /* Loop related functions */ /** * @brief Gives a function to be executed at each loop turn * * @param mlx Internal MLX application * @param f The function * @param param Param to give to the function passed */ MLX_API void mlx_loop_hook(void* mlx, int (*f)(void*), void* param); /** * @brief Starts the internal main loop * * @param mlx Internal MLX application */ MLX_API void mlx_loop(void* mlx); /** * @brief Ends the internal run loop * * @param mlx Internal MLX application */ MLX_API void mlx_loop_end(void* mlx); /* Events related functions */ /** * @brief Shows mouse cursor */ MLX_API void mlx_mouse_show(); /** * @brief Hides mouse cursor */ MLX_API void mlx_mouse_hide(); /** * @brief Moves cursor to givent position * * @param mlx Internal MLX application * @param win Internal window from which cursor moves * @param x X coordinate * @param y Y coordinate */ MLX_API void mlx_mouse_move(void* mlx, void* win, int x, int y); /** * @brief Get cursor's position * * @param mlx Internal MLX application * @param x Get x coordinate * @param y Get y coordinate */ MLX_API void mlx_mouse_get_pos(void* mlx, int* x, int* y); /** * @brief Gives a function to be executed on event type * * @param mlx Internal MLX application * @param win Internal window * @param event Event type (see union on top of this file) * @param f Function to be executed * @param param Parameter given to the function */ MLX_API void mlx_on_event(void* mlx, void* win, mlx_event_type event, int (*f)(int, void*), void* param); /* Pixels drawing related functions */ /** * @brief Put a pixel in the window * * @param mlx Internal MLX application * @param win Internal window * @param x X coordinate * @param y Y coordinate * @param color Color of the pixel (coded on 4 bytes in an int, 0xRRGGBBAA) */ MLX_API void mlx_pixel_put(void* mlx, void* win, int x, int y, int color); /* Images related functions */ /** * @brief Create a new empty image * * @param mlx Internal MLX application * @param width Width of the image * @param height Height of the image * * @return (void*) An opaque pointer to the internal image or NULL (0x0) in case of error */ MLX_API void* mlx_new_image(void* mlx, int width, int height); /** * @brief Create a new image from a png/jpg/bmp file * * @param mlx Internal MLX application * @param filename Path to the png file * @param width Get the width of the image * @param heigth Get the height of the image * * @return (void*) An opaque pointer to the internal image or NULL (0x0) in case of error */ MLX_API void* mlx_new_image_from_file(void* mlx, char* filename, int* width, int* height); /** * @brief Destroys internal image * * @param mlx Internal MLX application * @param img Internal image */ MLX_API void mlx_destroy_image(void* mlx, void* img); /** * @brief Get image pixel data * * @param mlx Internal MLX application * @param img Internal image * @param x X coordinate in the image * @param y Y coordinate in the image * * @return (int) Return the pixel data * * /!\ If you run into glitches when writing or reading pixels from images /!\ * You need to add IMAGES_OPTIMIZED=false to your make mlx command * ``` * ~ git clone https://github.com/seekrs/MacroLibX.git * ~ cd MacroLibX * ~ make IMAGES_OPTIMIZED=false * ``` */ MLX_API int mlx_get_image_pixel(void* mlx, void* img, int x, int y); /** * @brief Set image pixel data * * @param mlx Internal MLX application * @param img Internal image * @param x X coordinate in the image * @param y Y coordinate in the image * @param color Color of the pixel to set * * /!\ If you run into glitches when writing or reading pixels from images /!\ * You need to add IMAGES_OPTIMIZED=false to your make mlx command * ``` * ~ git clone https://github.com/seekrs/MacroLibX.git * ~ cd MacroLibX * ~ make IMAGES_OPTIMIZED=false * ``` */ MLX_API void mlx_set_image_pixel(void* mlx, void* img, int x, int y, int color); /** * @brief Put image to the given window * * @param mlx Internal MLX application * @param win Internal window * @param img Internal image * @param x X coordinate * @param y Y coordinate */ MLX_API void mlx_put_image_to_window(void* mlx, void* win, void* img, int x, int y); /* Strings drawing related functions */ /** * @brief Put text in given window * * @param mlx Internal MLX application * @param win Internal window * @param x X coordinate * @param y Y coordinate * @param color Color of the pixel (coded on 4 bytes in an int, 0xAARRGGBB) * @param str Text to put */ MLX_API void mlx_string_put(void* mlx, void* win, int x, int y, int color, char* str); /** * @brief Loads a font to be used by `mlx_string_put` * * @param mlx Internal MLX application * @param win Internal window * @param filepath Filepath to the font or "default" to reset to the embedded font */ MLX_API void mlx_set_font(void* mlx, char* filepath); /** * @brief Loads a font to be used by `mlx_string_put` and scales it * * @param mlx Internal MLX application * @param win Internal window * @param filepath Filepath to the font or "default" to reset to the embedded font * @param scale Scale to apply to the font */ MLX_API void mlx_set_font_scale(void* mlx, char* filepath, float scale); #ifdef __cplusplus } #endif #endif