From 2c99ac666eaeee5109137ddde13b47dd8fc9b699 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Tue, 3 May 2022 17:18:04 +0200 Subject: [PATCH] first commit --- Makefile | 39 + libft | 1 + map/map | 8 + mlx/LICENSE | 25 + mlx/Makefile | 22 + mlx/Makefile.gen | 66 + mlx/Makefile.mk | 66 + mlx/README.md | 55 + mlx/configure | 126 ++ mlx/libmlx.a | Bin 0 -> 112356 bytes mlx/libmlx_Linux.a | Bin 0 -> 112356 bytes mlx/man/man1/mlx.1 | 93 ++ mlx/man/man1/mlx_loop.1 | 141 ++ mlx/man/man1/mlx_new_image.1 | 192 +++ mlx/man/man1/mlx_new_window.1 | 79 + mlx/man/man1/mlx_pixel_put.1 | 84 + mlx/man/man3/mlx.3 | 93 ++ mlx/man/man3/mlx_loop.3 | 141 ++ mlx/man/man3/mlx_new_image.3 | 192 +++ mlx/man/man3/mlx_new_window.3 | 79 + mlx/man/man3/mlx_pixel_put.3 | 81 + mlx/mlx.h | 139 ++ mlx/mlx_clear_window.c | 21 + mlx/mlx_destroy_display.c | 18 + mlx/mlx_destroy_image.c | 31 + mlx/mlx_destroy_window.c | 38 + mlx/mlx_expose_hook.c | 22 + mlx/mlx_ext_randr.c | 104 ++ mlx/mlx_flush_event.c | 25 + mlx/mlx_get_color_value.c | 33 + mlx/mlx_get_data_addr.c | 23 + mlx/mlx_hook.c | 40 + mlx/mlx_init.c | 99 ++ mlx/mlx_int.h | 140 ++ mlx/mlx_int_anti_resize_win.c | 28 + mlx/mlx_int_do_nothing.c | 16 + mlx/mlx_int_get_visual.c | 39 + mlx/mlx_int_param_event.c | 100 ++ mlx/mlx_int_set_win_event_mask.c | 34 + mlx/mlx_int_str_to_wordtab.c | 113 ++ mlx/mlx_int_wait_first_expose.c | 23 + mlx/mlx_key_hook.c | 22 + mlx/mlx_lib_xpm.c | 96 ++ mlx/mlx_loop.c | 63 + mlx/mlx_loop_hook.c | 21 + mlx/mlx_mouse.c | 48 + mlx/mlx_mouse_hook.c | 22 + mlx/mlx_new_image.c | 159 ++ mlx/mlx_new_window.c | 62 + mlx/mlx_pixel_put.c | 26 + mlx/mlx_put_image_to_window.c | 37 + mlx/mlx_rgb.c | 764 +++++++++ mlx/mlx_screen_size.c | 13 + mlx/mlx_set_font.c | 30 + mlx/mlx_string_put.c | 26 + mlx/mlx_xpm.c | 345 ++++ mlx/mlx_xpm.c.ok | 310 ++++ mlx/obj/mlx_clear_window.o | Bin 0 -> 1648 bytes mlx/obj/mlx_destroy_display.o | Bin 0 -> 1560 bytes mlx/obj/mlx_destroy_image.o | Bin 0 -> 1992 bytes mlx/obj/mlx_destroy_window.o | Bin 0 -> 2032 bytes mlx/obj/mlx_expose_hook.o | Bin 0 -> 1400 bytes mlx/obj/mlx_flush_event.o | Bin 0 -> 1792 bytes mlx/obj/mlx_get_color_value.o | Bin 0 -> 1648 bytes mlx/obj/mlx_get_data_addr.o | Bin 0 -> 1392 bytes mlx/obj/mlx_hook.o | Bin 0 -> 1992 bytes mlx/obj/mlx_init.o | Bin 0 -> 4232 bytes mlx/obj/mlx_int_anti_resize_win.o | Bin 0 -> 1904 bytes mlx/obj/mlx_int_do_nothing.o | Bin 0 -> 1384 bytes mlx/obj/mlx_int_get_visual.o | Bin 0 -> 1808 bytes mlx/obj/mlx_int_param_event.o | Bin 0 -> 4024 bytes mlx/obj/mlx_int_set_win_event_mask.o | Bin 0 -> 1816 bytes mlx/obj/mlx_int_str_to_wordtab.o | Bin 0 -> 2568 bytes mlx/obj/mlx_int_wait_first_expose.o | Bin 0 -> 1824 bytes mlx/obj/mlx_key_hook.o | Bin 0 -> 1392 bytes mlx/obj/mlx_loop.o | Bin 0 -> 2368 bytes mlx/obj/mlx_loop_hook.o | Bin 0 -> 1376 bytes mlx/obj/mlx_mouse.o | Bin 0 -> 2808 bytes mlx/obj/mlx_mouse_hook.o | Bin 0 -> 1400 bytes mlx/obj/mlx_new_image.o | Bin 0 -> 4632 bytes mlx/obj/mlx_new_window.o | Bin 0 -> 2488 bytes mlx/obj/mlx_pixel_put.o | Bin 0 -> 2000 bytes mlx/obj/mlx_put_image_to_window.o | Bin 0 -> 2216 bytes mlx/obj/mlx_rgb.o | Bin 0 -> 38728 bytes mlx/obj/mlx_screen_size.o | Bin 0 -> 1752 bytes mlx/obj/mlx_set_font.o | Bin 0 -> 1848 bytes mlx/obj/mlx_string_put.o | Bin 0 -> 2104 bytes mlx/obj/mlx_xpm.o | Bin 0 -> 8312 bytes mlx/rgb2c.pl | 38 + mlx/test/Makefile.gen | 45 + mlx/test/Makefile.mk | 45 + mlx/test/main.c | 287 ++++ mlx/test/main.o | Bin 0 -> 63864 bytes mlx/test/mlx-test | Bin 0 -> 102256 bytes mlx/test/new_win.c | 31 + mlx/test/open.xpm | 1439 +++++++++++++++++ mlx/test/open24.xpm | 230 +++ mlx/test/open30.xpm | 1439 +++++++++++++++++ mlx/test/run_tests.sh | 94 ++ sprite/Nouveau projet (2).png:Zone.Identifier | 3 + sprite/Nouveau-projet-_1_.xpm:Zone.Identifier | 4 + sprite/Nouveau-projet-_2_.xpm:Zone.Identifier | 4 + sprite/Nouveau-projet.xpm:Zone.Identifier | 4 + sprite/back.xpm | 39 + sprite/back2.xpm | 41 + sprite/player.xpm | 11 + sprite/snow_tree.xpm | 39 + sprite/snow_tree1.xpm | 176 ++ srcs/Cub3D.h | 57 + srcs/main.c | 128 ++ srcs/utils.c | 95 ++ 111 files changed, 8962 insertions(+) create mode 100644 Makefile create mode 160000 libft create mode 100644 map/map create mode 100644 mlx/LICENSE create mode 100644 mlx/Makefile create mode 100644 mlx/Makefile.gen create mode 100644 mlx/Makefile.mk create mode 100644 mlx/README.md create mode 100644 mlx/configure create mode 100644 mlx/libmlx.a create mode 100644 mlx/libmlx_Linux.a create mode 100644 mlx/man/man1/mlx.1 create mode 100644 mlx/man/man1/mlx_loop.1 create mode 100644 mlx/man/man1/mlx_new_image.1 create mode 100644 mlx/man/man1/mlx_new_window.1 create mode 100644 mlx/man/man1/mlx_pixel_put.1 create mode 100644 mlx/man/man3/mlx.3 create mode 100644 mlx/man/man3/mlx_loop.3 create mode 100644 mlx/man/man3/mlx_new_image.3 create mode 100644 mlx/man/man3/mlx_new_window.3 create mode 100644 mlx/man/man3/mlx_pixel_put.3 create mode 100644 mlx/mlx.h create mode 100644 mlx/mlx_clear_window.c create mode 100644 mlx/mlx_destroy_display.c create mode 100644 mlx/mlx_destroy_image.c create mode 100644 mlx/mlx_destroy_window.c create mode 100644 mlx/mlx_expose_hook.c create mode 100644 mlx/mlx_ext_randr.c create mode 100644 mlx/mlx_flush_event.c create mode 100644 mlx/mlx_get_color_value.c create mode 100644 mlx/mlx_get_data_addr.c create mode 100644 mlx/mlx_hook.c create mode 100644 mlx/mlx_init.c create mode 100644 mlx/mlx_int.h create mode 100644 mlx/mlx_int_anti_resize_win.c create mode 100644 mlx/mlx_int_do_nothing.c create mode 100644 mlx/mlx_int_get_visual.c create mode 100644 mlx/mlx_int_param_event.c create mode 100644 mlx/mlx_int_set_win_event_mask.c create mode 100644 mlx/mlx_int_str_to_wordtab.c create mode 100644 mlx/mlx_int_wait_first_expose.c create mode 100644 mlx/mlx_key_hook.c create mode 100644 mlx/mlx_lib_xpm.c create mode 100644 mlx/mlx_loop.c create mode 100644 mlx/mlx_loop_hook.c create mode 100644 mlx/mlx_mouse.c create mode 100644 mlx/mlx_mouse_hook.c create mode 100644 mlx/mlx_new_image.c create mode 100644 mlx/mlx_new_window.c create mode 100644 mlx/mlx_pixel_put.c create mode 100644 mlx/mlx_put_image_to_window.c create mode 100644 mlx/mlx_rgb.c create mode 100644 mlx/mlx_screen_size.c create mode 100644 mlx/mlx_set_font.c create mode 100644 mlx/mlx_string_put.c create mode 100644 mlx/mlx_xpm.c create mode 100644 mlx/mlx_xpm.c.ok create mode 100644 mlx/obj/mlx_clear_window.o create mode 100644 mlx/obj/mlx_destroy_display.o create mode 100644 mlx/obj/mlx_destroy_image.o create mode 100644 mlx/obj/mlx_destroy_window.o create mode 100644 mlx/obj/mlx_expose_hook.o create mode 100644 mlx/obj/mlx_flush_event.o create mode 100644 mlx/obj/mlx_get_color_value.o create mode 100644 mlx/obj/mlx_get_data_addr.o create mode 100644 mlx/obj/mlx_hook.o create mode 100644 mlx/obj/mlx_init.o create mode 100644 mlx/obj/mlx_int_anti_resize_win.o create mode 100644 mlx/obj/mlx_int_do_nothing.o create mode 100644 mlx/obj/mlx_int_get_visual.o create mode 100644 mlx/obj/mlx_int_param_event.o create mode 100644 mlx/obj/mlx_int_set_win_event_mask.o create mode 100644 mlx/obj/mlx_int_str_to_wordtab.o create mode 100644 mlx/obj/mlx_int_wait_first_expose.o create mode 100644 mlx/obj/mlx_key_hook.o create mode 100644 mlx/obj/mlx_loop.o create mode 100644 mlx/obj/mlx_loop_hook.o create mode 100644 mlx/obj/mlx_mouse.o create mode 100644 mlx/obj/mlx_mouse_hook.o create mode 100644 mlx/obj/mlx_new_image.o create mode 100644 mlx/obj/mlx_new_window.o create mode 100644 mlx/obj/mlx_pixel_put.o create mode 100644 mlx/obj/mlx_put_image_to_window.o create mode 100644 mlx/obj/mlx_rgb.o create mode 100644 mlx/obj/mlx_screen_size.o create mode 100644 mlx/obj/mlx_set_font.o create mode 100644 mlx/obj/mlx_string_put.o create mode 100644 mlx/obj/mlx_xpm.o create mode 100644 mlx/rgb2c.pl create mode 100644 mlx/test/Makefile.gen create mode 100644 mlx/test/Makefile.mk create mode 100644 mlx/test/main.c create mode 100644 mlx/test/main.o create mode 100644 mlx/test/mlx-test create mode 100644 mlx/test/new_win.c create mode 100644 mlx/test/open.xpm create mode 100644 mlx/test/open24.xpm create mode 100644 mlx/test/open30.xpm create mode 100644 mlx/test/run_tests.sh create mode 100644 sprite/Nouveau projet (2).png:Zone.Identifier create mode 100644 sprite/Nouveau-projet-_1_.xpm:Zone.Identifier create mode 100644 sprite/Nouveau-projet-_2_.xpm:Zone.Identifier create mode 100644 sprite/Nouveau-projet.xpm:Zone.Identifier create mode 100644 sprite/back.xpm create mode 100644 sprite/back2.xpm create mode 100644 sprite/player.xpm create mode 100644 sprite/snow_tree.xpm create mode 100644 sprite/snow_tree1.xpm create mode 100644 srcs/Cub3D.h create mode 100644 srcs/main.c create mode 100644 srcs/utils.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..89d6dfd --- /dev/null +++ b/Makefile @@ -0,0 +1,39 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: apommier +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2022/02/13 16:27:49 by apommier #+# #+# # +# Updated: 2022/05/03 16:19:32 by apommier ### ########.fr # +# # +# **************************************************************************** # + +NAME = Cub3D +SRCS = srcs/main.c\ + srcs/utils.c +OBJS = ${SRCS:.c=.o} +CC = gcc +LIB = -L ./mlx -lmlx -lXext -lX11 -lm +CFLAGS = -Wall -Wextra +RM = rm -rf +LIBFT = ./libft + +${NAME}: ${OBJS} + @make bonus -C ${LIBFT} + @${CC} ${CFLAGS} ${OBJS} ${LIBFT}/libft.a ${LIB} -o ${NAME} + +all: ${NAME} bonus + +clean: + @${RM} ${OBJS} + @make clean -C ${LIBFT} + +fclean: clean + @${RM} ${NAME} + @make fclean -C ${LIBFT} + +re: fclean all + +.PHONY: all clean fclean re bonus \ No newline at end of file diff --git a/libft b/libft new file mode 160000 index 0000000..0e45d3f --- /dev/null +++ b/libft @@ -0,0 +1 @@ +Subproject commit 0e45d3f6bfd3991adbde539e78d2920926c174eb diff --git a/map/map b/map/map new file mode 100644 index 0000000..bd164a3 --- /dev/null +++ b/map/map @@ -0,0 +1,8 @@ +111111111 +101000001 +101000001 +100000001 +100000001 +101001001 +100001001 +111111111 \ No newline at end of file diff --git a/mlx/LICENSE b/mlx/LICENSE new file mode 100644 index 0000000..ed2de25 --- /dev/null +++ b/mlx/LICENSE @@ -0,0 +1,25 @@ +BSD 2-Clause License + +Copyright (c) 2021, Ecole 42 +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/mlx/Makefile b/mlx/Makefile new file mode 100644 index 0000000..5c418c5 --- /dev/null +++ b/mlx/Makefile @@ -0,0 +1,22 @@ +## +## Makefile for MiniLibX in /home/boulon/work/c/raytraceur/minilibx +## +## Made by Olivier Crouzet +## Login +## +## Started on Tue Oct 5 15:56:43 2004 Olivier Crouzet +## Last update Tue May 15 15:44:41 2007 Olivier Crouzet +## + +## Please use configure script + + +all : do_configure + +do_configure : + ./configure + +clean : + ./configure clean + +re : clean all diff --git a/mlx/Makefile.gen b/mlx/Makefile.gen new file mode 100644 index 0000000..041cf0e --- /dev/null +++ b/mlx/Makefile.gen @@ -0,0 +1,66 @@ +INC=/usr/include +## +## Makefile for MiniLibX in /home/boulon/work/c/raytraceur/minilibx +## +## Made by Olivier Crouzet +## Login +## +## Started on Tue Oct 5 15:56:43 2004 Olivier Crouzet +## Last update Tue May 15 15:41:20 2007 Olivier Crouzet +## + +## Please use configure script + + + +UNAME = $(shell uname) +CC = gcc +ifeq ($(UNAME),FreeBSD) + CC = clang +endif + +NAME = libmlx.a +NAME_UNAME = libmlx_$(UNAME).a + +SRC = mlx_init.c mlx_new_window.c mlx_pixel_put.c mlx_loop.c \ + mlx_mouse_hook.c mlx_key_hook.c mlx_expose_hook.c mlx_loop_hook.c \ + mlx_int_anti_resize_win.c mlx_int_do_nothing.c \ + mlx_int_wait_first_expose.c mlx_int_get_visual.c \ + mlx_flush_event.c mlx_string_put.c mlx_set_font.c \ + mlx_new_image.c mlx_get_data_addr.c \ + mlx_put_image_to_window.c mlx_get_color_value.c mlx_clear_window.c \ + mlx_xpm.c mlx_int_str_to_wordtab.c mlx_destroy_window.c \ + mlx_int_param_event.c mlx_int_set_win_event_mask.c mlx_hook.c \ + mlx_rgb.c mlx_destroy_image.c mlx_mouse.c mlx_screen_size.c \ + mlx_destroy_display.c + +OBJ_DIR = obj +OBJ = $(addprefix $(OBJ_DIR)/,$(SRC:%.c=%.o)) +CFLAGS = -O3 -I$(INC) + +all : $(NAME) + +$(OBJ_DIR)/%.o: %.c + @mkdir -p $(OBJ_DIR) + $(CC) $(CFLAGS) $(IFLAGS) -c $< -o $@ + +$(NAME) : $(OBJ) + ar -r $(NAME) $(OBJ) + ranlib $(NAME) + cp $(NAME) $(NAME_UNAME) + +check: all + @test/run_tests.sh + +show: + @printf "NAME : $(NAME)\n" + @printf "NAME_UNAME : $(NAME_UNAME)\n" + @printf "CC : $(CC)\n" + @printf "CFLAGS : $(CFLAGS)\n" + @printf "SRC :\n $(SRC)\n" + @printf "OBJ :\n $(OBJ)\n" + +clean : + rm -rf $(OBJ_DIR)/ $(NAME) $(NAME_UNAME) *~ core *.core + +.PHONY: all check show clean diff --git a/mlx/Makefile.mk b/mlx/Makefile.mk new file mode 100644 index 0000000..1bae8df --- /dev/null +++ b/mlx/Makefile.mk @@ -0,0 +1,66 @@ +## +## Makefile for MiniLibX in /home/boulon/work/c/raytraceur/minilibx +## +## Made by Olivier Crouzet +## Login +## +## Started on Tue Oct 5 15:56:43 2004 Olivier Crouzet +## Last update Tue May 15 15:41:20 2007 Olivier Crouzet +## + +## Please use configure script + + +INC =%%%% + +UNAME = $(shell uname) +CC = gcc +ifeq ($(UNAME),FreeBSD) + CC = clang +endif + +NAME = libmlx.a +NAME_UNAME = libmlx_$(UNAME).a + +SRC = mlx_init.c mlx_new_window.c mlx_pixel_put.c mlx_loop.c \ + mlx_mouse_hook.c mlx_key_hook.c mlx_expose_hook.c mlx_loop_hook.c \ + mlx_int_anti_resize_win.c mlx_int_do_nothing.c \ + mlx_int_wait_first_expose.c mlx_int_get_visual.c \ + mlx_flush_event.c mlx_string_put.c mlx_set_font.c \ + mlx_new_image.c mlx_get_data_addr.c \ + mlx_put_image_to_window.c mlx_get_color_value.c mlx_clear_window.c \ + mlx_xpm.c mlx_int_str_to_wordtab.c mlx_destroy_window.c \ + mlx_int_param_event.c mlx_int_set_win_event_mask.c mlx_hook.c \ + mlx_rgb.c mlx_destroy_image.c mlx_mouse.c mlx_screen_size.c \ + mlx_destroy_display.c + +OBJ_DIR = obj +OBJ = $(addprefix $(OBJ_DIR)/,$(SRC:%.c=%.o)) +CFLAGS = -O3 -I$(INC) + +all : $(NAME) + +$(OBJ_DIR)/%.o: %.c + @mkdir -p $(OBJ_DIR) + $(CC) $(CFLAGS) $(IFLAGS) -c $< -o $@ + +$(NAME) : $(OBJ) + ar -r $(NAME) $(OBJ) + ranlib $(NAME) + cp $(NAME) $(NAME_UNAME) + +check: all + @test/run_tests.sh + +show: + @printf "NAME : $(NAME)\n" + @printf "NAME_UNAME : $(NAME_UNAME)\n" + @printf "CC : $(CC)\n" + @printf "CFLAGS : $(CFLAGS)\n" + @printf "SRC :\n $(SRC)\n" + @printf "OBJ :\n $(OBJ)\n" + +clean : + rm -rf $(OBJ_DIR)/ $(NAME) $(NAME_UNAME) *~ core *.core + +.PHONY: all check show clean diff --git a/mlx/README.md b/mlx/README.md new file mode 100644 index 0000000..cb60744 --- /dev/null +++ b/mlx/README.md @@ -0,0 +1,55 @@ +[![Build](https://github.com/42Paris/minilibx-linux/actions/workflows/ci.yml/badge.svg)](https://github.com/42Paris/minilibx-linux/actions/workflows/ci.yml) + +This is the MinilibX, a simple X-Window (X11R6) programming API +in C, designed for students, suitable for X-beginners. + + +Contents + + - source code in C to create the mlx library + - man pages (in man/ directory) + - a test program (in test/ directory) is built + with the library + - a public include file mlx.h + - a tiny configure script to generate an appropriate Makefile.gen + +Requirements for Linux + + - MinilibX only support TrueColor visual type (8,15,16,24 or 32 bits depth) + - gcc + - make + - X11 include files (package xorg) + - XShm extension must be present (package libxext-dev) + - Utility functions from BSD systems - development files (package libbsd-dev) + - **e.g. _sudo apt-get install gcc make xorg libxext-dev libbsd-dev_ (Debian/Ubuntu)** + +Requirements for MacOS + - [Xquartz](https://www.xquartz.org/) + +```bash +➜ ~ Brew install Xquartz +➜ ~ reboot +➜ ~ xeyes # run an hello world X11 app +``` + +MlX Color Opacity / Transparency / Alpha (32 bits depth) + - 0xFF (fully transparent) or 0x00 (fully opaque) + +Compile MinilibX + + - run ./configure or make + both will make a few tests, create Makefile.gen + and then automatically run make on this generated Makefile.gen . + libmlx.a and libmlx_$(HOSTTYPE).a are created. + test/mlx-test binary is also created. + + +Install MinilibX + + - no installation script is provided. You may want to install + - libmlx.a and/or libmlx_$(HOSTTYPE).a in /usr/X11/lib or /usr/local/lib + - mlx.h in /usr/X11/include or /usr/local/include + - man/man3/mlx*.1 in /usr/X11/man/man3 or /usr/local/man/man3 + + + Olivier CROUZET - 2014-01-06 - diff --git a/mlx/configure b/mlx/configure new file mode 100644 index 0000000..18d1e4d --- /dev/null +++ b/mlx/configure @@ -0,0 +1,126 @@ +#!/usr/bin/env sh + +set -e + +BOLD="\033[1m" +RESET="\033[0m" +LIGHT_RED="\033[91m" +LIGHT_GREEN="\033[92m" +LIGHT_CYAN="\033[96m" + +logging(){ + local type=$1; shift + printf "${LIGHT_CYAN}${BOLD}configure${RESET} [%b] : %b\n" "$type" "$*" +} +log_info(){ + logging "${LIGHT_GREEN}info${RESET}" "$@" +} +log_error(){ + logging "${LIGHT_RED}error${RESET}" "$@" >&2 +} + +# find and print x11 header path +get_xlib_include_path(){ + local result="" + + for inc in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/local/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include + do + if [ -f "$inc/X11/Xlib.h" -a -f "$inc/X11/extensions/XShm.h" ]; then + result=$inc + break + fi + done + echo $result +} + +show_help(){ +cat < Makefile.gen + cat Makefile.mk | grep -v %%%% >> Makefile.gen + log_info 'Generate "test/makefile.gen" from template "test/makefile.mk"' + echo "INC=$xlib_inc" > test/Makefile.gen + cat test/Makefile.mk | grep -v %%%% >> test/Makefile.gen + + log_info 'Execute "make all" from file "makefile.gen"' + ${MAKE} -f Makefile.gen all + log_info 'Execute "make all" from file "test/makefile.gen"' + (cd test ; ${MAKE} -f Makefile.gen all ) +} + +main "$@" diff --git a/mlx/libmlx.a b/mlx/libmlx.a new file mode 100644 index 0000000000000000000000000000000000000000..0815da040bdc257f984afc1283e0c115f888b9a6 GIT binary patch literal 112356 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 TjK?o*P8q`XkLZTTx&6NZJL6(_ literal 0 HcmV?d00001 diff --git a/mlx/libmlx_Linux.a b/mlx/libmlx_Linux.a new file mode 100644 index 0000000000000000000000000000000000000000..0815da040bdc257f984afc1283e0c115f888b9a6 GIT binary patch literal 112356 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 TjK?o*P8q`XkLZTTx&6NZJL6(_ literal 0 HcmV?d00001 diff --git a/mlx/man/man1/mlx.1 b/mlx/man/man1/mlx.1 new file mode 100644 index 0000000..9ad0ac1 --- /dev/null +++ b/mlx/man/man1/mlx.1 @@ -0,0 +1,93 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Simple X-Window Interface Library for students +.SH SYNOPSYS +#include + +.nf +.I void * +.fi +.B mlx_init +(); + +.SH DESCRIPTION +MiniLibX is an easy way to create graphical software, +without any X-Window programming knowledge. It provides +simple window creation, a drawing tool, image and basic events +management. + +.SH X-WINDOW CONCEPT + +X-Window is a network-oriented graphical system for Unix. +It is based on two main parts: +.br +On one side, your software wants to draw something on the screen and/or +get keyboard & mouse entries. +.br +On the other side, the X-Server manages the screen, keyboard and mouse +(It is often refered to as a "display"). +.br +A network connection must be established between these two entities to send +drawing orders (from the software to the X-Server), and keyboard/mouse +events (from the X-Server to the software). + +.SH INCLUDE FILE +.B mlx.h +should be included for a correct use of the MiniLibX API. +It only contains function prototypes, no structure is needed. + +.SH LIBRARY FUNCTIONS +.P +First of all, you need to initialize the connection +between your software and the display. +Once this connection is established, you'll be able to +use other MiniLibX functions to send the X-Server messages, +like "I want to draw a yellow pixel in this window" or "did the +user hit a key?". +.P +The +.B mlx_init +function will create this connection. No parameters are needed, ant it will +return a +.I "void *" +identifier, used for further calls to the library routines. +.P +All other MiniLibX functions are described in the following man pages: + +.TP 20 +.B mlx_new_window +: manage windows +.TP 20 +.B mlx_pixel_put +: draw inside window +.TP 20 +.B mlx_new_image +: manipulate images +.TP 20 +.B mlx_loop +: handle keyboard or mouse events + +.SH LINKING MiniLibX +To use MiniLibX functions, you'll need to link +your software with several libraries, including the MiniLibX library itself. +To do this, simply add the following arguments at linking time: + +.B -lmlx -lXext -lX11 + +You may also need to specify the path to these libraries, using +the +.B -L +flag. + + +.SH RETURN VALUES +If +.B mlx_init() +fails to set up the connection to the X server, it will return NULL, otherwise +a non-null pointer is returned as a connection identifier. + +.SH SEE ALSO +mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3) + +.SH AUTHOR +Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/mlx/man/man1/mlx_loop.1 b/mlx/man/man1/mlx_loop.1 new file mode 100644 index 0000000..3397ce2 --- /dev/null +++ b/mlx/man/man1/mlx_loop.1 @@ -0,0 +1,141 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Handle events +.SH SYNOPSYS + +.nf +.I int +.fi +.B mlx_loop +( +.I void *mlx_ptr +); + +.nf +.I int +.fi +.B mlx_key_hook +( +.I void *win_ptr, int (*funct_ptr)(), void *param +); + +.nf +.I int +.fi +.B mlx_mouse_hook +( +.I void *win_ptr, int (*funct_ptr)(), void *param +); + +.nf +.I int +.fi +.B mlx_expose_hook +( +.I void *win_ptr, int (*funct_ptr)(), void *param +); + +.nf +.I int +.fi +.B mlx_loop_hook +( +.I void *mlx_ptr, int (*funct_ptr)(), void *param +); + +.SH X-WINDOW EVENTS + +The X-Window system is bi-directionnal. On one hand, the program sends orders to +the screen to display pixels, images, and so on. On the other hand, +it can get information from the keyboard and mouse associated to +the screen. To do so, the program receives "events" from the keyboard or the +mouse. + +.SH DESCRIPTION + +To receive events, you must use +.B mlx_loop +(). This function never returns. It is an infinite loop that waits for +an event, and then calls a user-defined function associated with this event. +A single parameter is needed, the connection identifier +.I mlx_ptr +(see the +.B mlx manual). + +You can assign different functions to the three following events: +.br +- A key is pressed +.br +- The mouse button is pressed +.br +- A part of the window should be re-drawn +(this is called an "expose" event, and it is your program's job to handle it). +.br + +Each window can define a different function for the same event. + +The three functions +.B mlx_key_hook +(), +.B mlx_mouse_hook +() and +.B mlx_expose_hook +() work exactly the same way. +.I funct_ptr +is a pointer to the function you want to be called +when an event occurs. This assignment is specific to the window defined by the +.I win_ptr +identifier. The +.I param +adress will be passed to the function everytime it is called, and should be +used to store the parameters it might need. + +The syntax for the +.B mlx_loop_hook +() function is identical to the previous ones, but the given function will be +called when no event occurs. + +When it catches an event, the MiniLibX calls the corresponding function +with fixed parameters: +.nf + + expose_hook(void *param); + key_hook(int keycode,void *param); + mouse_hook(int button,int x,int y,void *param); + loop_hook(void *param); + +.fi +These function names are arbitrary. They here are used to distinguish +parameters according to the event. These functions are NOT part of the +MiniLibX. + +.I param +is the address specified in the mlx_*_hook calls. This address is never +used nor modified by the MiniLibX. On key and mouse events, additional +information is passed: +.I keycode +tells you which key is pressed (look for the X11 include file "keysymdef.h"), +( +.I x +, +.I y +) are the coordinates of the mouse click in the window, and +.I button +tells you which mouse button was pressed. + +.SH GOING FURTHER WITH EVENTS +The MiniLibX provides a much generic access to all X-Window events. The +.I mlx.h +include define +.B mlx_hook() +in the same manner mlx_*_hook functions work. The event and mask values +will be taken from the X11 include file "X.h". + +See source code of mlx_int_param_event.c to find out how the MiniLibX will +call your own function for a specific event. + +.SH SEE ALSO +mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3) + +.SH AUTHOR +Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/mlx/man/man1/mlx_new_image.1 b/mlx/man/man1/mlx_new_image.1 new file mode 100644 index 0000000..f2160a2 --- /dev/null +++ b/mlx/man/man1/mlx_new_image.1 @@ -0,0 +1,192 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Manipulating images +.SH SYNOPSYS + +.nf +.I void * +.fi +.B mlx_new_image +( +.I void *mlx_ptr, int width, int height +); + +.nf +.I char * +.fi +.B mlx_get_data_addr +( +.I void *img_ptr, int *bits_per_pixel, int *size_line, int *endian +); + +.nf +.I int +.fi +.B mlx_put_image_to_window +( +.I void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y +); + +.nf +.I unsigned int +.fi +.B mlx_get_color_value +( +.I void *mlx_ptr, int color +); + +.nf +.I void * +.fi +.B mlx_xpm_to_image +( +.I void *mlx_ptr, char **xpm_data, int *width, int *height +); + +.nf +.I void * +.fi +.B mlx_xpm_file_to_image +( +.I void *mlx_ptr, char *filename, int *width, int *height +); + +.nf +.I int +.fi +.B mlx_destroy_image +( +.I void *mlx_ptr, void *img_ptr +); + + +.SH DESCRIPTION + +.B mlx_new_image +() creates a new image in memory. It returns a +.I void * +identifier needed to manipulate this image later. It only needs +the size of the image to be created, using the +.I width +and +.I height +parameters, and the +.I mlx_ptr +connection identifier (see the +.B mlx +manual). + +The user can draw inside the image (see below), and +can dump the image inside a specified window at any time to +display it on the screen. This is done using +.B mlx_put_image_to_window +(). Three identifiers are needed here, for the connection to the +display, the window to use, and the image (respectively +.I mlx_ptr +, +.I win_ptr +and +.I img_ptr +). The ( +.I x +, +.I y +) coordinates define where the image should be placed in the window. + +.B mlx_get_data_addr +() returns information about the created image, allowing a user +to modify it later. The +.I img_ptr +parameter specifies the image to use. The three next parameters should +be the addresses of three different valid integers. +.I bits_per_pixel +will be filled with the number of bits needed to represent a pixel color +(also called the depth of the image). +.I size_line +is the number of bytes used to store one line of the image in memory. +This information is needed to move from one line to another in the image. +.I endian +tells you wether the pixel color in the image needs to be stored in +little endian ( +.I endian +== 0), or big endian ( +.I endian +== 1). + +.B mlx_get_data_addr +returns a +.I char * +address that represents the begining of the memory area where the image +is stored. From this adress, the first +.I bits_per_pixel +bits represent the color of the first pixel in the first line of +the image. The second group of +.I bits_per_pixel +bits represent the second pixel of the first line, and so on. +Add +.I size_line +to the adress to get the begining of the second line. You can reach any +pixels of the image that way. + +.B mlx_destroy_image +destroys the given image ( +.I img_ptr +). + +.SH STORING COLOR INSIDE IMAGES + +Depending on the display, the number of bits used to store a pixel color +can change. The user usually represents a color in RGB mode, using +one byte for each component (see +.B mlx_pixel_put +manual). This must be translated to fit the +.I bits_per_pixel +requirement of the image, and make the color understandable to the X-Server. +That is the purpose of the +.B mlx_get_color_value +() function. It takes a standard RGB +.I color +parameter, and returns an +.I unsigned int +value. +The +.I bits_per_pixel +least significant bits of this value can be stored in the image. + +Keep in mind that the least significant bits position depends on the local +computer's endian. If the endian of the image (in fact the endian of +the X-Server's computer) differs from the local endian, then the value should +be transformed before being used. + +.SH XPM IMAGES + +The +.B mlx_xpm_to_image +() and +.B mlx_xpm_file_to_image +() functions will create a new image the same way. +They will fill it using the specified +.I xpm_data +or +.I filename +, depending on which function is used. +Note that MiniLibX does not use the standard +Xpm library to deal with xpm images. You may not be able to +read all types of xpm images. It however handles transparency. + +.SH RETURN VALUES +The three functions that create images, +.B mlx_new_image() +, +.B mlx_xpm_to_image() +and +.B mlx_xpm_file_to_image() +, will return NULL if an error occurs. Otherwise they return a non-null pointer +as an image identifier. + + +.SH SEE ALSO +mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_loop(3) + +.SH AUTHOR +Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/mlx/man/man1/mlx_new_window.1 b/mlx/man/man1/mlx_new_window.1 new file mode 100644 index 0000000..90f6d47 --- /dev/null +++ b/mlx/man/man1/mlx_new_window.1 @@ -0,0 +1,79 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Managing windows +.SH SYNOPSYS + +.nf +.I void * +.fi +.B mlx_new_window +( +.I void *mlx_ptr, int size_x, int size_y, char *title +); + +.nf +.I int +.fi +.B mlx_clear_window +( +.I void *mlx_ptr, void *win_ptr +); + +.nf +.I int +.fi +.B mlx_destroy_window +( +.I void *mlx_ptr, void *win_ptr +); + + +.SH DESCRIPTION +The +.B mlx_new_window +() function creates a new window on the screen, using the +.I size_x +and +.I size_y +parameters to determine its size, and +.I title +as the text that should be displayed in the window's title bar. +The +.I mlx_ptr +parameter is the connection identifier returned by +.B mlx_init +() (see the +.B mlx +man page). +.B mlx_new_window +() returns a +.I void * +window identifier that can be used by other MiniLibX calls. +Note that the MiniLibX +can handle an arbitrary number of separate windows. + +.B mlx_clear_window +() and +.B mlx_destroy_window +() respectively clear (in black) and destroy the given window. They both have +the same parameters: +.I mlx_ptr +is the screen connection identifier, and +.I win_ptr +is a window identifier. + +.SH RETURN VALUES +If +.B mlx_new_window() +fails to create a new window (for wathever reason), it will return NULL, +otherwise a non-null pointer is returned as a window identifier. +.B mlx_clear_window +and +.B mlx_destroy_window +right now return nothing. + +.SH SEE ALSO +mlx(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3) + +.SH AUTHOR +Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/mlx/man/man1/mlx_pixel_put.1 b/mlx/man/man1/mlx_pixel_put.1 new file mode 100644 index 0000000..258df58 --- /dev/null +++ b/mlx/man/man1/mlx_pixel_put.1 @@ -0,0 +1,84 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Drawing inside windows +.SH SYNOPSYS + +.nf +.I int +.fi +.B mlx_pixel_put +( +.I void *mlx_ptr, void *win_ptr, int x, int y, int color +); + +.nf +.I int +.fi +.B mlx_string_put +( +.I void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string +); + + +.SH DESCRIPTION +The +.B mlx_pixel_put +() function draws a defined pixel in the window +.I win_ptr +using the ( +.I x +, +.I y +) coordinates, and the specified +.I color +\&. The origin (0,0) is the upper left corner of the window, the x and y axis +respectively pointing right and down. The connection +identifier, +.I mlx_ptr +, is needed (see the +.B mlx +man page). + +Parameters for +.B mlx_string_put +() have the same meaning. Instead of a simple pixel, the specified +.I string +will be displayed at ( +.I x +, +.I y +). + +In both functions, it is impossible to display anything outside the +specified window, nor display in another window in front of the selected one. + +.SH COLOR MANAGEMENT +The +.I color +parameter has an integer type. The displayed color needs to be encoded +in this integer, following a defined scheme. All displayable colors +can be split in 3 basic colors: red, green and blue. Three associated +values, in the 0-255 range, represent how much of each color is mixed up +to create the original color. Theses three values must be set inside the +integer to display the right color. The three least significant bytes of +this integer are filled as shown in the picture below: + +.TS +allbox; +c s s s s +r c c c c. +Color Integer +Interpretation \[*a] R G B +Bit numbers 31..24 23..16 15..8 7..0 +.TE + +While filling the integer, make sure you avoid endian problems. Remember +that the "blue" byte should always be the least significant one. + + +.SH SEE ALSO +mlx(3), mlx_new_window(3), mlx_new_image(3), mlx_loop(3) + + +.SH AUTHOR +Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/mlx/man/man3/mlx.3 b/mlx/man/man3/mlx.3 new file mode 100644 index 0000000..9ad0ac1 --- /dev/null +++ b/mlx/man/man3/mlx.3 @@ -0,0 +1,93 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Simple X-Window Interface Library for students +.SH SYNOPSYS +#include + +.nf +.I void * +.fi +.B mlx_init +(); + +.SH DESCRIPTION +MiniLibX is an easy way to create graphical software, +without any X-Window programming knowledge. It provides +simple window creation, a drawing tool, image and basic events +management. + +.SH X-WINDOW CONCEPT + +X-Window is a network-oriented graphical system for Unix. +It is based on two main parts: +.br +On one side, your software wants to draw something on the screen and/or +get keyboard & mouse entries. +.br +On the other side, the X-Server manages the screen, keyboard and mouse +(It is often refered to as a "display"). +.br +A network connection must be established between these two entities to send +drawing orders (from the software to the X-Server), and keyboard/mouse +events (from the X-Server to the software). + +.SH INCLUDE FILE +.B mlx.h +should be included for a correct use of the MiniLibX API. +It only contains function prototypes, no structure is needed. + +.SH LIBRARY FUNCTIONS +.P +First of all, you need to initialize the connection +between your software and the display. +Once this connection is established, you'll be able to +use other MiniLibX functions to send the X-Server messages, +like "I want to draw a yellow pixel in this window" or "did the +user hit a key?". +.P +The +.B mlx_init +function will create this connection. No parameters are needed, ant it will +return a +.I "void *" +identifier, used for further calls to the library routines. +.P +All other MiniLibX functions are described in the following man pages: + +.TP 20 +.B mlx_new_window +: manage windows +.TP 20 +.B mlx_pixel_put +: draw inside window +.TP 20 +.B mlx_new_image +: manipulate images +.TP 20 +.B mlx_loop +: handle keyboard or mouse events + +.SH LINKING MiniLibX +To use MiniLibX functions, you'll need to link +your software with several libraries, including the MiniLibX library itself. +To do this, simply add the following arguments at linking time: + +.B -lmlx -lXext -lX11 + +You may also need to specify the path to these libraries, using +the +.B -L +flag. + + +.SH RETURN VALUES +If +.B mlx_init() +fails to set up the connection to the X server, it will return NULL, otherwise +a non-null pointer is returned as a connection identifier. + +.SH SEE ALSO +mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3) + +.SH AUTHOR +Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/mlx/man/man3/mlx_loop.3 b/mlx/man/man3/mlx_loop.3 new file mode 100644 index 0000000..3397ce2 --- /dev/null +++ b/mlx/man/man3/mlx_loop.3 @@ -0,0 +1,141 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Handle events +.SH SYNOPSYS + +.nf +.I int +.fi +.B mlx_loop +( +.I void *mlx_ptr +); + +.nf +.I int +.fi +.B mlx_key_hook +( +.I void *win_ptr, int (*funct_ptr)(), void *param +); + +.nf +.I int +.fi +.B mlx_mouse_hook +( +.I void *win_ptr, int (*funct_ptr)(), void *param +); + +.nf +.I int +.fi +.B mlx_expose_hook +( +.I void *win_ptr, int (*funct_ptr)(), void *param +); + +.nf +.I int +.fi +.B mlx_loop_hook +( +.I void *mlx_ptr, int (*funct_ptr)(), void *param +); + +.SH X-WINDOW EVENTS + +The X-Window system is bi-directionnal. On one hand, the program sends orders to +the screen to display pixels, images, and so on. On the other hand, +it can get information from the keyboard and mouse associated to +the screen. To do so, the program receives "events" from the keyboard or the +mouse. + +.SH DESCRIPTION + +To receive events, you must use +.B mlx_loop +(). This function never returns. It is an infinite loop that waits for +an event, and then calls a user-defined function associated with this event. +A single parameter is needed, the connection identifier +.I mlx_ptr +(see the +.B mlx manual). + +You can assign different functions to the three following events: +.br +- A key is pressed +.br +- The mouse button is pressed +.br +- A part of the window should be re-drawn +(this is called an "expose" event, and it is your program's job to handle it). +.br + +Each window can define a different function for the same event. + +The three functions +.B mlx_key_hook +(), +.B mlx_mouse_hook +() and +.B mlx_expose_hook +() work exactly the same way. +.I funct_ptr +is a pointer to the function you want to be called +when an event occurs. This assignment is specific to the window defined by the +.I win_ptr +identifier. The +.I param +adress will be passed to the function everytime it is called, and should be +used to store the parameters it might need. + +The syntax for the +.B mlx_loop_hook +() function is identical to the previous ones, but the given function will be +called when no event occurs. + +When it catches an event, the MiniLibX calls the corresponding function +with fixed parameters: +.nf + + expose_hook(void *param); + key_hook(int keycode,void *param); + mouse_hook(int button,int x,int y,void *param); + loop_hook(void *param); + +.fi +These function names are arbitrary. They here are used to distinguish +parameters according to the event. These functions are NOT part of the +MiniLibX. + +.I param +is the address specified in the mlx_*_hook calls. This address is never +used nor modified by the MiniLibX. On key and mouse events, additional +information is passed: +.I keycode +tells you which key is pressed (look for the X11 include file "keysymdef.h"), +( +.I x +, +.I y +) are the coordinates of the mouse click in the window, and +.I button +tells you which mouse button was pressed. + +.SH GOING FURTHER WITH EVENTS +The MiniLibX provides a much generic access to all X-Window events. The +.I mlx.h +include define +.B mlx_hook() +in the same manner mlx_*_hook functions work. The event and mask values +will be taken from the X11 include file "X.h". + +See source code of mlx_int_param_event.c to find out how the MiniLibX will +call your own function for a specific event. + +.SH SEE ALSO +mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3) + +.SH AUTHOR +Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/mlx/man/man3/mlx_new_image.3 b/mlx/man/man3/mlx_new_image.3 new file mode 100644 index 0000000..f2160a2 --- /dev/null +++ b/mlx/man/man3/mlx_new_image.3 @@ -0,0 +1,192 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Manipulating images +.SH SYNOPSYS + +.nf +.I void * +.fi +.B mlx_new_image +( +.I void *mlx_ptr, int width, int height +); + +.nf +.I char * +.fi +.B mlx_get_data_addr +( +.I void *img_ptr, int *bits_per_pixel, int *size_line, int *endian +); + +.nf +.I int +.fi +.B mlx_put_image_to_window +( +.I void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y +); + +.nf +.I unsigned int +.fi +.B mlx_get_color_value +( +.I void *mlx_ptr, int color +); + +.nf +.I void * +.fi +.B mlx_xpm_to_image +( +.I void *mlx_ptr, char **xpm_data, int *width, int *height +); + +.nf +.I void * +.fi +.B mlx_xpm_file_to_image +( +.I void *mlx_ptr, char *filename, int *width, int *height +); + +.nf +.I int +.fi +.B mlx_destroy_image +( +.I void *mlx_ptr, void *img_ptr +); + + +.SH DESCRIPTION + +.B mlx_new_image +() creates a new image in memory. It returns a +.I void * +identifier needed to manipulate this image later. It only needs +the size of the image to be created, using the +.I width +and +.I height +parameters, and the +.I mlx_ptr +connection identifier (see the +.B mlx +manual). + +The user can draw inside the image (see below), and +can dump the image inside a specified window at any time to +display it on the screen. This is done using +.B mlx_put_image_to_window +(). Three identifiers are needed here, for the connection to the +display, the window to use, and the image (respectively +.I mlx_ptr +, +.I win_ptr +and +.I img_ptr +). The ( +.I x +, +.I y +) coordinates define where the image should be placed in the window. + +.B mlx_get_data_addr +() returns information about the created image, allowing a user +to modify it later. The +.I img_ptr +parameter specifies the image to use. The three next parameters should +be the addresses of three different valid integers. +.I bits_per_pixel +will be filled with the number of bits needed to represent a pixel color +(also called the depth of the image). +.I size_line +is the number of bytes used to store one line of the image in memory. +This information is needed to move from one line to another in the image. +.I endian +tells you wether the pixel color in the image needs to be stored in +little endian ( +.I endian +== 0), or big endian ( +.I endian +== 1). + +.B mlx_get_data_addr +returns a +.I char * +address that represents the begining of the memory area where the image +is stored. From this adress, the first +.I bits_per_pixel +bits represent the color of the first pixel in the first line of +the image. The second group of +.I bits_per_pixel +bits represent the second pixel of the first line, and so on. +Add +.I size_line +to the adress to get the begining of the second line. You can reach any +pixels of the image that way. + +.B mlx_destroy_image +destroys the given image ( +.I img_ptr +). + +.SH STORING COLOR INSIDE IMAGES + +Depending on the display, the number of bits used to store a pixel color +can change. The user usually represents a color in RGB mode, using +one byte for each component (see +.B mlx_pixel_put +manual). This must be translated to fit the +.I bits_per_pixel +requirement of the image, and make the color understandable to the X-Server. +That is the purpose of the +.B mlx_get_color_value +() function. It takes a standard RGB +.I color +parameter, and returns an +.I unsigned int +value. +The +.I bits_per_pixel +least significant bits of this value can be stored in the image. + +Keep in mind that the least significant bits position depends on the local +computer's endian. If the endian of the image (in fact the endian of +the X-Server's computer) differs from the local endian, then the value should +be transformed before being used. + +.SH XPM IMAGES + +The +.B mlx_xpm_to_image +() and +.B mlx_xpm_file_to_image +() functions will create a new image the same way. +They will fill it using the specified +.I xpm_data +or +.I filename +, depending on which function is used. +Note that MiniLibX does not use the standard +Xpm library to deal with xpm images. You may not be able to +read all types of xpm images. It however handles transparency. + +.SH RETURN VALUES +The three functions that create images, +.B mlx_new_image() +, +.B mlx_xpm_to_image() +and +.B mlx_xpm_file_to_image() +, will return NULL if an error occurs. Otherwise they return a non-null pointer +as an image identifier. + + +.SH SEE ALSO +mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_loop(3) + +.SH AUTHOR +Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/mlx/man/man3/mlx_new_window.3 b/mlx/man/man3/mlx_new_window.3 new file mode 100644 index 0000000..90f6d47 --- /dev/null +++ b/mlx/man/man3/mlx_new_window.3 @@ -0,0 +1,79 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Managing windows +.SH SYNOPSYS + +.nf +.I void * +.fi +.B mlx_new_window +( +.I void *mlx_ptr, int size_x, int size_y, char *title +); + +.nf +.I int +.fi +.B mlx_clear_window +( +.I void *mlx_ptr, void *win_ptr +); + +.nf +.I int +.fi +.B mlx_destroy_window +( +.I void *mlx_ptr, void *win_ptr +); + + +.SH DESCRIPTION +The +.B mlx_new_window +() function creates a new window on the screen, using the +.I size_x +and +.I size_y +parameters to determine its size, and +.I title +as the text that should be displayed in the window's title bar. +The +.I mlx_ptr +parameter is the connection identifier returned by +.B mlx_init +() (see the +.B mlx +man page). +.B mlx_new_window +() returns a +.I void * +window identifier that can be used by other MiniLibX calls. +Note that the MiniLibX +can handle an arbitrary number of separate windows. + +.B mlx_clear_window +() and +.B mlx_destroy_window +() respectively clear (in black) and destroy the given window. They both have +the same parameters: +.I mlx_ptr +is the screen connection identifier, and +.I win_ptr +is a window identifier. + +.SH RETURN VALUES +If +.B mlx_new_window() +fails to create a new window (for wathever reason), it will return NULL, +otherwise a non-null pointer is returned as a window identifier. +.B mlx_clear_window +and +.B mlx_destroy_window +right now return nothing. + +.SH SEE ALSO +mlx(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3) + +.SH AUTHOR +Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/mlx/man/man3/mlx_pixel_put.3 b/mlx/man/man3/mlx_pixel_put.3 new file mode 100644 index 0000000..f4d131e --- /dev/null +++ b/mlx/man/man3/mlx_pixel_put.3 @@ -0,0 +1,81 @@ +.TH MiniLibX 3 "September 19, 2002" +.SH NAME +MiniLibX - Drawing inside windows +.SH SYNOPSYS + +.nf +.I int +.fi +.B mlx_pixel_put +( +.I void *mlx_ptr, void *win_ptr, int x, int y, int color +); + +.nf +.I int +.fi +.B mlx_string_put +( +.I void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string +); + + +.SH DESCRIPTION +The +.B mlx_pixel_put +() function draws a defined pixel in the window +.I win_ptr +using the ( +.I x +, +.I y +) coordinates, and the specified +.I color +\&. The origin (0,0) is the upper left corner of the window, the x and y axis +respectively pointing right and down. The connection +identifier, +.I mlx_ptr +, is needed (see the +.B mlx +man page). + +Parameters for +.B mlx_string_put +() have the same meaning. Instead of a simple pixel, the specified +.I string +will be displayed at ( +.I x +, +.I y +). + +In both functions, it is impossible to display anything outside the +specified window, nor display in another window in front of the selected one. + +.SH COLOR MANAGEMENT +The +.I color +parameter has an integer type. The displayed color needs to be encoded +in this integer, following a defined scheme. All displayable colors +can be split in 3 basic colors: red, green and blue. Three associated +values, in the 0-255 range, represent how much of each color is mixed up +to create the original color. Theses three values must be set inside the +integer to display the right color. The three least significant bytes of +this integer are filled as shown in the picture below: + +.nf + | 0 | R | G | B | color integer + +---+---+---+---+ +.fi + + +While filling the integer, make sure you avoid endian problems. Remember +that the "blue" byte should always be the least significant one. + + +.SH SEE ALSO +mlx(3), mlx_new_window(3), mlx_new_image(3), mlx_loop(3) + + +.SH AUTHOR +Copyright ol@ - 2002-2014 - Olivier Crouzet diff --git a/mlx/mlx.h b/mlx/mlx.h new file mode 100644 index 0000000..b323412 --- /dev/null +++ b/mlx/mlx.h @@ -0,0 +1,139 @@ +/* +** mlx.h for MinilibX in +** +** Made by Charlie Root +** Login +** +** Started on Mon Jul 31 16:37:50 2000 Charlie Root +** Last update Tue May 15 16:23:28 2007 Olivier Crouzet +*/ + +/* +** MinilibX - Please report bugs +*/ + + +/* +** FR msg - FR msg - FR msg +** +** La MinilibX utilise 2 librairies supplementaires qu'il +** est necessaire de rajouter a la compilation : +** -lmlx -lXext -lX11 +** +** La MinilibX permet le chargement des images de type Xpm. +** Notez que cette implementation est incomplete. +** Merci de communiquer tout probleme de chargement d'image +** de ce type. +*/ + + +#ifndef MLX_H + +#define MLX_H + + +void *mlx_init(); +/* +** needed before everything else. +** return (void *)0 if failed +*/ + + +/* +** Basic actions +*/ + +void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title); +/* +** return void *0 if failed +*/ +int mlx_clear_window(void *mlx_ptr, void *win_ptr); +int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color); +/* +** origin for x & y is top left corner of the window +** y down is positive +** color is 0x00RRGGBB +*/ + + +/* +** Image stuff +*/ + +void *mlx_new_image(void *mlx_ptr,int width,int height); +/* +** return void *0 if failed +** obsolete : image2 data is stored using bit planes +** void *mlx_new_image2(void *mlx_ptr,int width,int height); +*/ +char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel, + int *size_line, int *endian); +/* +** endian : 0 = sever X is little endian, 1 = big endian +** for mlx_new_image2, 2nd arg of mlx_get_data_addr is number_of_planes +*/ +int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, + int x, int y); +int mlx_get_color_value(void *mlx_ptr, int color); + + +/* +** dealing with Events +*/ + +int mlx_mouse_hook (void *win_ptr, int (*funct_ptr)(), void *param); +int mlx_key_hook (void *win_ptr, int (*funct_ptr)(), void *param); +int mlx_expose_hook (void *win_ptr, int (*funct_ptr)(), void *param); + +int mlx_loop_hook (void *mlx_ptr, int (*funct_ptr)(), void *param); +int mlx_loop (void *mlx_ptr); +int mlx_loop_end (void *mlx_ptr); + +/* +** hook funct are called as follow : +** +** expose_hook(void *param); +** key_hook(int keycode, void *param); +** mouse_hook(int button, int x,int y, void *param); +** loop_hook(void *param); +** +*/ + + +/* +** Usually asked... +*/ + +int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, + char *string); +void mlx_set_font(void *mlx_ptr, void *win_ptr, char *name); +void *mlx_xpm_to_image(void *mlx_ptr, char **xpm_data, + int *width, int *height); +void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename, + int *width, int *height); +int mlx_destroy_window(void *mlx_ptr, void *win_ptr); + +int mlx_destroy_image(void *mlx_ptr, void *img_ptr); + +int mlx_destroy_display(void *mlx_ptr); + +/* +** generic hook system for all events, and minilibX functions that +** can be hooked. Some macro and defines from X11/X.h are needed here. +*/ + +int mlx_hook(void *win_ptr, int x_event, int x_mask, + int (*funct)(), void *param); + +int mlx_do_key_autorepeatoff(void *mlx_ptr); +int mlx_do_key_autorepeaton(void *mlx_ptr); +int mlx_do_sync(void *mlx_ptr); + +int mlx_mouse_get_pos(void *mlx_ptr, void *win_ptr, int *x, int *y); +int mlx_mouse_move(void *mlx_ptr, void *win_ptr, int x, int y); +int mlx_mouse_hide(void *mlx_ptr, void *win_ptr); +int mlx_mouse_show(void *mlx_ptr, void *win_ptr); + +int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey); + +#endif /* MLX_H */ diff --git a/mlx/mlx_clear_window.c b/mlx/mlx_clear_window.c new file mode 100644 index 0000000..f621090 --- /dev/null +++ b/mlx/mlx_clear_window.c @@ -0,0 +1,21 @@ +/* +** mlx_clear_window.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Thu Sep 7 19:46:15 2000 Charlie Root +** Last update Tue Sep 25 17:11:19 2001 Charlie Root +*/ + + + +#include "mlx_int.h" + + +int mlx_clear_window(t_xvar *xvar,t_win_list *win) +{ + XClearWindow(xvar->display,win->window); + if (xvar->do_flush) + XFlush(xvar->display); +} diff --git a/mlx/mlx_destroy_display.c b/mlx/mlx_destroy_display.c new file mode 100644 index 0000000..d2970b8 --- /dev/null +++ b/mlx/mlx_destroy_display.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* mlx_destroy_display.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: mg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/10/03 18:56:35 by mg #+# #+# */ +/* Updated: 2020/10/04 01:55:35 by mg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "mlx_int.h" + +int mlx_destroy_display(t_xvar *xvar) +{ + XCloseDisplay(xvar->display); +} diff --git a/mlx/mlx_destroy_image.c b/mlx/mlx_destroy_image.c new file mode 100644 index 0000000..afd4d1a --- /dev/null +++ b/mlx/mlx_destroy_image.c @@ -0,0 +1,31 @@ +/* +** mlx_destroy_image.c for MinilibX in +** +** Made by Charlie Root +** Login +** +** Started on Tue Mar 12 10:25:15 2002 Charlie Root +** Last update Tue May 15 16:45:54 2007 Olivier Crouzet +*/ + + +#include "mlx_int.h" + + +int mlx_destroy_image(t_xvar *xvar, t_img *img) +{ + if (img->type == MLX_TYPE_SHM_PIXMAP || + img->type == MLX_TYPE_SHM) + { + XShmDetach(xvar->display, &(img->shm)); + shmdt(img->shm.shmaddr); + /* shmctl IPC_RMID already done */ + } + XDestroyImage(img->image); /* For image & shm-image. Also free img->data */ + XFreePixmap(xvar->display, img->pix); + if (img->gc) + XFreeGC(xvar->display, img->gc); + free(img); + if (xvar->do_flush) + XFlush(xvar->display); +} diff --git a/mlx/mlx_destroy_window.c b/mlx/mlx_destroy_window.c new file mode 100644 index 0000000..464790c --- /dev/null +++ b/mlx/mlx_destroy_window.c @@ -0,0 +1,38 @@ +/* +** mlx_destroy_window.c for MinilibX in +** +** Made by Charlie Root +** Login +** +** Started on Tue Mar 12 10:25:15 2002 Charlie Root +** Last update Tue May 15 16:46:08 2007 Olivier Crouzet +*/ + + +#include "mlx_int.h" + + +int mlx_destroy_window(t_xvar *xvar,t_win_list *win) +{ + t_win_list *w; + t_win_list *prev; + t_win_list first; + + first.next = xvar->win_list; + prev = &first; + w = prev->next; + while (w) + { + if (w==win) + prev->next = w->next; + else + prev = w; + w = w->next; + } + xvar->win_list = first.next; + XDestroyWindow(xvar->display,win->window); + XFreeGC(xvar->display,win->gc); + free(win); + if (xvar->do_flush) + XFlush(xvar->display); +} diff --git a/mlx/mlx_expose_hook.c b/mlx/mlx_expose_hook.c new file mode 100644 index 0000000..b00b675 --- /dev/null +++ b/mlx/mlx_expose_hook.c @@ -0,0 +1,22 @@ +/* +** mlx_expose_hook.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Thu Aug 3 11:49:06 2000 Charlie Root +** Last update Fri Feb 23 17:07:42 2001 Charlie Root +*/ + + +#include "mlx_int.h" + + + + +int mlx_expose_hook(t_win_list *win,int (*funct)(),void *param) +{ + win->hooks[Expose].hook = funct; + win->hooks[Expose].param = param; + win->hooks[Expose].mask = ExposureMask; +} diff --git a/mlx/mlx_ext_randr.c b/mlx/mlx_ext_randr.c new file mode 100644 index 0000000..34ddb91 --- /dev/null +++ b/mlx/mlx_ext_randr.c @@ -0,0 +1,104 @@ + + + +#include "mlx_int.h" + +#include +#include + +/* global for independant extension */ + +RRMode saved_mode = 0; + + +int mlx_ext_fullscreen(t_xvar *xvar, t_win_list *win, int fullscreen) +{ + XWindowAttributes watt; + int i; + int j; + XRRScreenResources *res; + XRROutputInfo *o_info; + XRRCrtcInfo *crtc; + RRMode mode_candidate; + int idx_output; + int idx_candidate; + + if (!XGetWindowAttributes(xvar->display, win->window, &watt)) + return (0); + + res = XRRGetScreenResources(xvar->display, xvar->root); + o_info = NULL; + idx_output = -1; + i = res->noutput; + while (i--) + { + o_info = XRRGetOutputInfo(xvar->display, res, res->outputs[i]); + if (o_info->connection == RR_Connected) + { + idx_output = i; + i = 0; + } + else + XRRFreeOutputInfo(o_info); + } + if (!o_info) + { + XRRFreeScreenResources(res); + return (0); + } + + idx_candidate = -1; + i = o_info->nmode; + while (i--) + { + j = res->nmode; + while (j--) + if (res->modes[j].id == o_info->modes[i]) + if (res->modes[j].width >= watt.width && res->modes[j].height >= watt.height && + (idx_candidate == -1 || res->modes[idx_candidate].width > res->modes[j].width || + res->modes[idx_candidate].height > res->modes[j].height) ) + idx_candidate = i; + } + if (idx_candidate < 0) + { + XRRFreeOutputInfo(o_info); + XRRFreeScreenResources(res); + return (0); + } + if (!fullscreen && saved_mode == -1) + idx_candidate = 0; /* if no clue, uses first mode, usually part of npreferred */ + mode_candidate = o_info->modes[idx_candidate]; + if (!fullscreen) + mode_candidate = saved_mode; + + crtc = XRRGetCrtcInfo(xvar->display, res, o_info->crtc); + saved_mode = crtc->mode; + + i = XRRSetCrtcConfig(xvar->display, res, o_info->crtc, CurrentTime, 0, 0, mode_candidate, + crtc->rotation, &res->outputs[idx_output], 1); + if (fullscreen) + printf("found mode : %d x %d\n Status %d\n", res->modes[idx_candidate].width, res->modes[idx_candidate].height, i); + else + printf("back previous mode\n"); + + XMoveWindow(xvar->display, win->window, 0, 0); + XMapRaised(xvar->display, win->window); + + if (fullscreen) + { + // XGrabPointer(xvar->display, win->window, True, 0, GrabModeAsync, GrabModeAsync, win->window, 0L, CurrentTime); + XGrabKeyboard(xvar->display, win->window, False, GrabModeAsync, GrabModeAsync, CurrentTime); + } + else + { + XUngrabPointer(xvar->display, CurrentTime); + XUngrabKeyboard(xvar->display, CurrentTime); + } + + XSync(xvar->display, False); + sleep(1); + + XRRFreeCrtcInfo(crtc); + XRRFreeOutputInfo(o_info); + XRRFreeScreenResources(res); +} diff --git a/mlx/mlx_flush_event.c b/mlx/mlx_flush_event.c new file mode 100644 index 0000000..1e586ad --- /dev/null +++ b/mlx/mlx_flush_event.c @@ -0,0 +1,25 @@ +/* +** mlx_flush_event.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Wed Aug 2 18:58:11 2000 Charlie Root +** Last update Fri Feb 23 17:08:48 2001 Charlie Root +*/ + + +#include "mlx_int.h" + + + + +int mlx_flush_event(t_xvar *xvar) +{ + XEvent ev; + + while (XPending(xvar->display)) + { + XNextEvent(xvar->display,&ev); + } +} diff --git a/mlx/mlx_get_color_value.c b/mlx/mlx_get_color_value.c new file mode 100644 index 0000000..b620970 --- /dev/null +++ b/mlx/mlx_get_color_value.c @@ -0,0 +1,33 @@ +/* +** mlx_get_color_value.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Mon Jul 31 19:01:33 2000 Charlie Root +** Last update Thu Oct 4 15:04:13 2001 Charlie Root +*/ + + +#include "mlx_int.h" + + +int mlx_get_color_value(t_xvar *xvar,int color) +{ + return(mlx_int_get_good_color(xvar,color)); +} + +int mlx_int_get_good_color(t_xvar *xvar,int color) +{ + XColor xc; + + if (xvar->depth>=24) + return (color); + xc.red = (color>>8)&0xFF00; + xc.green = color&0xFF00; + xc.blue = (color<<8)&0xFF00; + xc.pixel = ((xc.red>>(16-xvar->decrgb[1]))<decrgb[0])+ + ((xc.green>>(16-xvar->decrgb[3]))<decrgb[2])+ + ((xc.blue>>(16-xvar->decrgb[5]))<decrgb[4]); + return (xc.pixel); +} diff --git a/mlx/mlx_get_data_addr.c b/mlx/mlx_get_data_addr.c new file mode 100644 index 0000000..45e7a85 --- /dev/null +++ b/mlx/mlx_get_data_addr.c @@ -0,0 +1,23 @@ +/* +** mlx_get_data_addr.c for MiniLibX in raytraceur +** +** Made by Charlie Root +** Login +** +** Started on Mon Aug 14 15:45:57 2000 Charlie Root +** Last update Thu Sep 27 19:05:25 2001 Charlie Root +*/ + + + +#include "mlx_int.h" + + +char *mlx_get_data_addr(t_img *img,int *bits_per_pixel, + int *size_line,int *endian) +{ + *bits_per_pixel = img->bpp; + *size_line = img->size_line; + *endian = img->image->byte_order; + return (img->data); +} diff --git a/mlx/mlx_hook.c b/mlx/mlx_hook.c new file mode 100644 index 0000000..98e509a --- /dev/null +++ b/mlx/mlx_hook.c @@ -0,0 +1,40 @@ +/* +** mlx_hook.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Thu Aug 3 11:49:06 2000 Charlie Root +** Last update Fri Jan 28 17:05:28 2005 Olivier Crouzet +*/ + + +#include "mlx_int.h" + + + + +int mlx_hook(t_win_list *win, int x_event, int x_mask, + int (*funct)(),void *param) +{ + win->hooks[x_event].hook = funct; + win->hooks[x_event].param = param; + win->hooks[x_event].mask = x_mask; +} + + +int mlx_do_key_autorepeatoff(t_xvar *xvar) +{ + XAutoRepeatOff(xvar->display); +} + +int mlx_do_key_autorepeaton(t_xvar *xvar) +{ + XAutoRepeatOn(xvar->display); +} + + +int mlx_do_sync(t_xvar *xvar) +{ + XSync(xvar->display, False); +} diff --git a/mlx/mlx_init.c b/mlx/mlx_init.c new file mode 100644 index 0000000..c9d7463 --- /dev/null +++ b/mlx/mlx_init.c @@ -0,0 +1,99 @@ +/* +** mlx_init.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Mon Jul 31 16:52:42 2000 Charlie Root +** Last update Fri Jan 28 17:05:09 2005 Olivier Crouzet +*/ + + +#include "mlx_int.h" + + + +void *mlx_init() +{ + t_xvar *xvar; + + if (!(xvar = malloc(sizeof(*xvar)))) + return ((void*)0); + if ((xvar->display = XOpenDisplay("")) == 0) + { + free(xvar); + return ((void*)0); + } + xvar->screen = DefaultScreen(xvar->display); + xvar->root = DefaultRootWindow(xvar->display); + xvar->cmap = DefaultColormap(xvar->display,xvar->screen); + xvar->depth = DefaultDepth(xvar->display,xvar->screen); + if (mlx_int_get_visual(xvar)==-1) + { + printf(ERR_NO_TRUECOLOR); + exit(1); + } + xvar->win_list = 0; + xvar->loop_hook = 0; + xvar->loop_param = (void *)0; + xvar->do_flush = 1; + xvar->wm_delete_window = XInternAtom (xvar->display, "WM_DELETE_WINDOW", False); + xvar->wm_protocols = XInternAtom (xvar->display, "WM_PROTOCOLS", False); + mlx_int_deal_shm(xvar); + if (xvar->private_cmap) + xvar->cmap = XCreateColormap(xvar->display,xvar->root, + xvar->visual,AllocNone); + mlx_int_rgb_conversion(xvar); + xvar->end_loop = 0; + return (xvar); +} + + +/* +** pshm_format of -1 : Not XYBitmap|XYPixmap|ZPixmap +** alpha libX need a check of the DISPLAY env var, or shm is allowed +** in remote Xserver connections. +*/ + +int mlx_int_deal_shm(t_xvar *xvar) +{ + int use_pshm; + int bidon; + char *dpy; + char buff[33]; + + xvar->use_xshm = XShmQueryVersion(xvar->display,&bidon,&bidon,&(use_pshm)); + if (xvar->use_xshm && use_pshm) + xvar->pshm_format = XShmPixmapFormat(xvar->display); + else + xvar->pshm_format = -1; + gethostname(buff,32); + dpy = getenv(ENV_DISPLAY); + if (dpy && strlen(dpy) && *dpy!=':' && strncmp(dpy,buff,strlen(buff)) && + strncmp(dpy,LOCALHOST,strlen(LOCALHOST)) ) + { + xvar->pshm_format = -1; + xvar->use_xshm = 0; + } +} + +/* +** TrueColor Visual is needed to have *_mask correctly set +*/ + +int mlx_int_rgb_conversion(t_xvar *xvar) +{ + bzero(xvar->decrgb,sizeof(int)*6); + while (!(xvar->visual->red_mask&1)) + { xvar->visual->red_mask >>= 1; xvar->decrgb[0] ++; } + while (xvar->visual->red_mask&1) + { xvar->visual->red_mask >>= 1; xvar->decrgb[1] ++; } + while (!(xvar->visual->green_mask&1)) + { xvar->visual->green_mask >>= 1; xvar->decrgb[2] ++; } + while (xvar->visual->green_mask&1) + { xvar->visual->green_mask >>= 1; xvar->decrgb[3] ++; } + while (!(xvar->visual->blue_mask&1)) + { xvar->visual->blue_mask >>= 1; xvar->decrgb[4] ++; } + while (xvar->visual->blue_mask&1) + { xvar->visual->blue_mask >>= 1; xvar->decrgb[5] ++; } +} diff --git a/mlx/mlx_int.h b/mlx/mlx_int.h new file mode 100644 index 0000000..c49d1b7 --- /dev/null +++ b/mlx/mlx_int.h @@ -0,0 +1,140 @@ +/* +** mlx_int.h for mlx in +** +** Made by Charlie Root +** Login +** +** Started on Mon Jul 31 16:45:48 2000 Charlie Root +** Last update Wed May 25 16:44:16 2011 Olivier Crouzet +*/ + + + +/* +** Internal settings for MiniLibX +*/ + +#ifndef MLX_INT_H + +# define MLX_INT_H + +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +/* #include */ + + +# define MLX_TYPE_SHM_PIXMAP 3 +# define MLX_TYPE_SHM 2 +# define MLX_TYPE_XIMAGE 1 + +# define MLX_MAX_EVENT LASTEvent + + +# define ENV_DISPLAY "DISPLAY" +# define LOCALHOST "localhost" +# define ERR_NO_TRUECOLOR "MinilibX Error : No TrueColor Visual available.\n" +# define WARN_SHM_ATTACH "MinilibX Warning : X server can't attach shared memory.\n" + + +typedef struct s_xpm_col +{ + int name; + int col; +} t_xpm_col; + + +struct s_col_name +{ + char *name; + int color; +}; + +typedef struct s_event_list +{ + int mask; + int (*hook)(); + void *param; +} t_event_list; + + +typedef struct s_win_list +{ + Window window; + GC gc; + struct s_win_list *next; + int (*mouse_hook)(); + int (*key_hook)(); + int (*expose_hook)(); + void *mouse_param; + void *key_param; + void *expose_param; + t_event_list hooks[MLX_MAX_EVENT]; +} t_win_list; + + +typedef struct s_img +{ + XImage *image; + Pixmap pix; + GC gc; + int size_line; + int bpp; + int width; + int height; + int type; + int format; + char *data; + XShmSegmentInfo shm; +} t_img; + +typedef struct s_xvar +{ + Display *display; + Window root; + int screen; + int depth; + Visual *visual; + Colormap cmap; + int private_cmap; + t_win_list *win_list; + int (*loop_hook)(); + void *loop_param; + int use_xshm; + int pshm_format; + int do_flush; + int decrgb[6]; + Atom wm_delete_window; + Atom wm_protocols; + int end_loop; +} t_xvar; + + +int mlx_int_do_nothing(); +int mlx_get_color_value(); +int mlx_int_get_good_color(); +int mlx_int_find_in_pcm(); +int mlx_int_anti_resize_win(); +int mlx_int_wait_first_expose(); +int mlx_int_rgb_conversion(); +int mlx_int_deal_shm(); +void *mlx_int_new_xshm_image(); +char **mlx_int_str_to_wordtab(); +void *mlx_new_image(); +int shm_att_pb(); +int mlx_int_get_visual(t_xvar *xvar); +int mlx_int_set_win_event_mask(t_xvar *xvar); +int mlx_int_str_str_cote(char *str,char *find,int len); +int mlx_int_str_str(char *str,char *find,int len); + + +#endif diff --git a/mlx/mlx_int_anti_resize_win.c b/mlx/mlx_int_anti_resize_win.c new file mode 100644 index 0000000..2f20b44 --- /dev/null +++ b/mlx/mlx_int_anti_resize_win.c @@ -0,0 +1,28 @@ +/* +** mlx_int_anti_resize_win.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Tue Aug 8 14:31:05 2000 Charlie Root +** Last update Tue Sep 25 15:56:58 2001 Charlie Root +*/ + +#include "mlx_int.h" + + +int mlx_int_anti_resize_win(t_xvar *xvar,Window win,int w,int h) +{ + XSizeHints hints; + long toto; + + XGetWMNormalHints(xvar->display,win,&hints,&toto); + hints.width = w; + hints.height = h; + hints.min_width = w; + hints.min_height = h; + hints.max_width = w; + hints.max_height = h; + hints.flags = PPosition | PSize | PMinSize | PMaxSize; + XSetWMNormalHints(xvar->display,win,&hints); +} diff --git a/mlx/mlx_int_do_nothing.c b/mlx/mlx_int_do_nothing.c new file mode 100644 index 0000000..49524e4 --- /dev/null +++ b/mlx/mlx_int_do_nothing.c @@ -0,0 +1,16 @@ +/* +** mlx_int_do_nothing.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Tue Aug 8 12:58:24 2000 Charlie Root +** Last update Tue Sep 25 15:56:22 2001 Charlie Root +*/ + + + +int mlx_int_do_nothing(void *param) +{ + +} diff --git a/mlx/mlx_int_get_visual.c b/mlx/mlx_int_get_visual.c new file mode 100644 index 0000000..440a7ca --- /dev/null +++ b/mlx/mlx_int_get_visual.c @@ -0,0 +1,39 @@ +/* +** mlx_int_get_visual.c for MinilibX in +** +** Made by Charlie Root +** Login +** +** Started on Wed Oct 3 17:01:51 2001 Charlie Root +** Last update Thu Oct 4 15:00:45 2001 Charlie Root +*/ + + + +#include "mlx_int.h" + + +/* +** We need a private colormap for non-default Visual. +*/ + + +int mlx_int_get_visual(t_xvar *xvar) +{ + XVisualInfo *vi; + XVisualInfo template; + int nb_item; + + xvar->private_cmap = 0; + xvar->visual = DefaultVisual(xvar->display,xvar->screen); + if (xvar->visual->class == TrueColor) + return (0); + template.class = TrueColor; + template.depth = xvar->depth; + if (!(vi = XGetVisualInfo(xvar->display,VisualDepthMask|VisualClassMask, + &template,&nb_item)) ) + return (-1); + xvar->visual = vi->visual; + xvar->private_cmap = 1; + return (0); +} diff --git a/mlx/mlx_int_param_event.c b/mlx/mlx_int_param_event.c new file mode 100644 index 0000000..8756a22 --- /dev/null +++ b/mlx/mlx_int_param_event.c @@ -0,0 +1,100 @@ +/* +** mlx_int_param_event.c for MinilibX in +** +** Made by Charlie Root +** Login +** +** Started on Mon Jul 31 16:37:50 2000 Charlie Root +** Last update Wed Oct 6 13:14:52 2004 Olivier Crouzet +*/ + +#include "mlx_int.h" + +int mlx_int_param_undef() +{ +} + +int mlx_int_param_KeyPress(t_xvar *xvar, XEvent *ev, t_win_list *win) +{ + win->hooks[KeyPress].hook(XkbKeycodeToKeysym(xvar->display, + ev->xkey.keycode, 0, 0), + win->hooks[KeyPress].param); +} + +int mlx_int_param_KeyRelease(t_xvar *xvar, XEvent *ev, t_win_list *win) +{ + win->hooks[KeyRelease].hook(XkbKeycodeToKeysym(xvar->display, + ev->xkey.keycode, 0, 0), + win->hooks[KeyRelease].param); +} + +int mlx_int_param_ButtonPress(t_xvar *xvar, XEvent *ev, t_win_list *win) +{ + win->hooks[ButtonPress].hook(ev->xbutton.button,ev->xbutton.x,ev->xbutton.y, + win->hooks[ButtonPress].param); +} + +int mlx_int_param_ButtonRelease(t_xvar *xvar, XEvent *ev, t_win_list *win) +{ + win->hooks[ButtonRelease].hook(ev->xbutton.button, + ev->xbutton.x, ev->xbutton.y, + win->hooks[ButtonRelease].param); +} + +int mlx_int_param_MotionNotify(t_xvar *xvar, XEvent *ev, t_win_list *win) +{ + win->hooks[MotionNotify].hook(ev->xbutton.x,ev->xbutton.y, + win->hooks[MotionNotify].param); +} + +int mlx_int_param_Expose(t_xvar *xvar, XEvent *ev, t_win_list *win) +{ + if (!ev->xexpose.count) + win->hooks[Expose].hook(win->hooks[Expose].param); +} + + +int mlx_int_param_generic(t_xvar *xvar, XEvent *ev, t_win_list *win) +{ + win->hooks[ev->type].hook(win->hooks[ev->type].param); +} + +int (*(mlx_int_param_event[]))() = +{ + mlx_int_param_undef, /* 0 */ + mlx_int_param_undef, + mlx_int_param_KeyPress, + mlx_int_param_KeyRelease, /* 3 */ + mlx_int_param_ButtonPress, + mlx_int_param_ButtonRelease, + mlx_int_param_MotionNotify, /* 6 */ + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_Expose, /* 12 */ + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic, + mlx_int_param_generic +}; diff --git a/mlx/mlx_int_set_win_event_mask.c b/mlx/mlx_int_set_win_event_mask.c new file mode 100644 index 0000000..55650cd --- /dev/null +++ b/mlx/mlx_int_set_win_event_mask.c @@ -0,0 +1,34 @@ +/* +** mlx_int_set_win_event_mask.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Thu Aug 3 11:49:06 2000 Charlie Root +** Last update Fri Feb 23 17:07:42 2001 Charlie Root +*/ + + +#include "mlx_int.h" + + + + +int mlx_int_set_win_event_mask(t_xvar *xvar) +{ + t_win_list *win; + int mask; + int i; + XSetWindowAttributes xwa; + + win = xvar->win_list; + while (win) + { + xwa.event_mask = 0; + i = MLX_MAX_EVENT; + while (i--) + xwa.event_mask |= win->hooks[i].mask; + XChangeWindowAttributes(xvar->display, win->window, CWEventMask, &xwa); + win = win->next; + } +} diff --git a/mlx/mlx_int_str_to_wordtab.c b/mlx/mlx_int_str_to_wordtab.c new file mode 100644 index 0000000..7f92089 --- /dev/null +++ b/mlx/mlx_int_str_to_wordtab.c @@ -0,0 +1,113 @@ +/* +** mlx_int_str_to_wordtab.c for MinilibX in +** +** Made by Charlie Root +** Login +** +** Started on Wed Sep 13 11:36:09 2000 Charlie Root +** Last update Fri Dec 14 11:02:09 2001 Charlie Root +*/ + + +#include "mlx_int.h" + + +int mlx_int_str_str(char *str,char *find,int len) +{ + int len_f; + int pos; + char *s; + char *f; + + len_f = strlen(find); + if (len_f>len) + return (-1); + pos = 0; + while (*(str+len_f-1)) + { + s = str; + f = find; + while (*(f++) == *(s++)) + if (!*f) + return (pos); + str ++; + pos ++; + } + return (-1); +} + + + +int mlx_int_str_str_cote(char *str,char *find,int len) +{ + int len_f; + int pos; + char *s; + char *f; + int cote; + + len_f = strlen(find); + if (len_f>len) + return (-1); + cote = 0; + pos = 0; + while (*(str+len_f-1)) + { + if (*str=='"') + cote = 1-cote; + if (!cote) + { + s = str; + f = find; + while (*(f++) == *(s++)) + if (!*f) + return (pos); + } + str ++; + pos ++; + } + return (-1); +} + + +char **mlx_int_str_to_wordtab(char *str) +{ + char **tab; + int pos; + int nb_word; + int len; + + len = strlen(str); + nb_word = 0; + pos = 0; + while (pos +** +** Started on Tue Oct 17 09:26:45 2000 olivier crouzet +** Last update Fri Feb 23 17:27:10 2001 Charlie Root +*/ + + + +#include "mlx_int.h" + + + +int mlx_int_wait_first_expose(t_xvar *xvar,Window win) +{ + XEvent ev; + + XWindowEvent(xvar->display,win,ExposureMask,&ev); + XPutBackEvent(xvar->display,&ev); +} diff --git a/mlx/mlx_key_hook.c b/mlx/mlx_key_hook.c new file mode 100644 index 0000000..eea6484 --- /dev/null +++ b/mlx/mlx_key_hook.c @@ -0,0 +1,22 @@ +/* +** mlx_key_hook.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Thu Aug 3 11:49:06 2000 Charlie Root +** Last update Fri Feb 23 17:10:09 2001 Charlie Root +*/ + + +#include "mlx_int.h" + + + + +int mlx_key_hook(t_win_list *win,int (*funct)(),void *param) +{ + win->hooks[KeyRelease].hook = funct; + win->hooks[KeyRelease].param = param; + win->hooks[KeyRelease].mask = KeyReleaseMask; +} diff --git a/mlx/mlx_lib_xpm.c b/mlx/mlx_lib_xpm.c new file mode 100644 index 0000000..b8cf184 --- /dev/null +++ b/mlx/mlx_lib_xpm.c @@ -0,0 +1,96 @@ +/* +** mlx_xpm.c for minilibX in +** +** Made by Charlie Root +** Login +** +** Started on Fri Dec 8 11:07:24 2000 Charlie Root +** Last update Thu Oct 4 16:00:22 2001 Charlie Root +*/ + + +#include "mlx_int.h" + + + + +void *mlx_int_xpm_f_image(t_xvar *xvar,int *width,int *height, + int (*xpm_func)(),void *param) +{ + XImage *img1; + XImage *img2; + t_img *im2; + XpmAttributes xpm_att; + + xpm_att.visual = xvar->visual; + xpm_att.colormap = xvar->cmap; + xpm_att.depth = xvar->depth; + xpm_att.bitmap_format = ZPixmap; + xpm_att.valuemask = XpmDepth|XpmBitmapFormat|XpmVisual|XpmColormap; + if (xpm_func(xvar->display,param,&img1,&img2,&xpm_att)) + return ((void *)0); + if (img2) + XDestroyImage(img2); + + if (!(im2 = (void *)mlx_new_image(xvar,img1->width,img1->height))) + { + XDestroyImage(img1); + return ((void *)0); + } + *width = img1->width; + *height = img1->height; + if (mlx_int_egal_img(im2->image,img1)) + { + bcopy(img1->data,im2->data,img1->height*img1->bytes_per_line); + XDestroyImage(img1); + return (im2); + } + if (im2->type==MLX_TYPE_SHM_PIXMAP) + { + XFreePixmap(xvar->display,im2->pix); + im2->pix = XCreatePixmap(xvar->display,xvar->root, + *width,*height,xvar->depth); + } + if (im2->type>MLX_TYPE_XIMAGE) + { + XShmDetach(xvar->display,&(im2->shm)); + shmdt(im2->data); + } + XDestroyImage(im2->image); + im2->image = img1; + im2->data = img1->data; + im2->type = MLX_TYPE_XIMAGE; + im2->size_line = img1->bytes_per_line; + im2->bpp = img1->bits_per_pixel; + return (im2); +} + + +int mlx_int_egal_img(XImage *img1,XImage *img2) +{ + if (img1->width!=img2->width || img1->height!=img2->height || + img1->xoffset!=img2->xoffset || img1->format!=img2->format || + img1->byte_order!=img2->byte_order || + img1->bitmap_unit!=img2->bitmap_unit || + img1->bitmap_bit_order!=img2->bitmap_bit_order || + img1->bitmap_pad!=img2->bitmap_pad || img1->depth!=img2->depth || + img1->bytes_per_line!=img2->bytes_per_line || + img1->bits_per_pixel!=img2->bits_per_pixel || + img1->red_mask!=img2->red_mask || img1->green_mask!=img2->green_mask || + img1->blue_mask!=img2->blue_mask ) + return (0); + return (1); +} + + +void *mlx_xpm_file_to_image(t_xvar *xvar,char *filename, + int *width,int *height) +{ + return (mlx_int_xpm_f_image(xvar,width,height,XpmReadFileToImage,filename)); +} + + +void *mlx_xpm_to_image(t_xvar *xvar,char **data,int *width,int *height) +{ + return (mlx_int_xpm_f_image(xvar,width,height,XpmCreateImageFromData,(void *)data)); +} diff --git a/mlx/mlx_loop.c b/mlx/mlx_loop.c new file mode 100644 index 0000000..cc4e119 --- /dev/null +++ b/mlx/mlx_loop.c @@ -0,0 +1,63 @@ +/* +** mlx_loop.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Wed Aug 2 18:58:11 2000 Charlie Root +** Last update Fri Sep 30 14:47:41 2005 Olivier Crouzet +*/ + + +#include "mlx_int.h" + +extern int (*(mlx_int_param_event[]))(); + +static int win_count(t_xvar *xvar) +{ + int i; + t_win_list *win; + + i = 0; + win = xvar->win_list; + while (win) + { + win = win->next; + ++i; + } + return (i); +} + +int mlx_loop_end(t_xvar *xvar) +{ + xvar->end_loop = 1; + return (1); +} + +int mlx_loop(t_xvar *xvar) +{ + XEvent ev; + t_win_list *win; + + mlx_int_set_win_event_mask(xvar); + xvar->do_flush = 0; + while (win_count(xvar) && !xvar->end_loop) + { + while (!xvar->end_loop && (!xvar->loop_hook || XPending(xvar->display))) + { + XNextEvent(xvar->display,&ev); + win = xvar->win_list; + while (win && (win->window!=ev.xany.window)) + win = win->next; + + if (win && ev.type == ClientMessage && ev.xclient.message_type == xvar->wm_protocols && ev.xclient.data.l[0] == xvar->wm_delete_window && win->hooks[DestroyNotify].hook) + win->hooks[DestroyNotify].hook(win->hooks[DestroyNotify].param); + if (win && ev.type < MLX_MAX_EVENT && win->hooks[ev.type].hook) + mlx_int_param_event[ev.type](xvar, &ev, win); + } + XSync(xvar->display, False); + if (xvar->loop_hook) + xvar->loop_hook(xvar->loop_param); + } + return (0); +} diff --git a/mlx/mlx_loop_hook.c b/mlx/mlx_loop_hook.c new file mode 100644 index 0000000..1f8b9ed --- /dev/null +++ b/mlx/mlx_loop_hook.c @@ -0,0 +1,21 @@ +/* +** mlx_loop_hook.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Thu Aug 3 11:49:06 2000 Charlie Root +** Last update Fri Feb 23 17:11:39 2001 Charlie Root +*/ + + +#include "mlx_int.h" + + + + +int mlx_loop_hook(t_xvar *xvar,int (*funct)(),void *param) +{ + xvar->loop_hook = funct; + xvar->loop_param = param; +} diff --git a/mlx/mlx_mouse.c b/mlx/mlx_mouse.c new file mode 100644 index 0000000..ce0d4c9 --- /dev/null +++ b/mlx/mlx_mouse.c @@ -0,0 +1,48 @@ +#include "mlx_int.h" + +int mlx_mouse_move(t_xvar *xvar, t_win_list *win, int x, int y) +{ + XWarpPointer(xvar->display, None, win->window, 0, 0, 0, 0, x, y); + return (0); +} + +int mlx_mouse_hide(t_xvar *xvar, t_win_list *win) +{ + static char data[1] = {0}; + Cursor cursor; + Pixmap blank; + XColor dummy; + + blank = XCreateBitmapFromData(xvar->display, win->window, data, 1, 1); + cursor = XCreatePixmapCursor(xvar->display, blank, blank, &dummy, &dummy, 0, 0); + XDefineCursor(xvar->display, win->window, cursor); + XFreePixmap(xvar->display, blank); + XFreeCursor(xvar->display, cursor); +} + +int mlx_mouse_show(t_xvar *xvar, t_win_list *win) +{ + XUndefineCursor(xvar->display, win->window); +} + +/* +** Queries the position of the mouse pointer relative to the origin of the +** specified window and saves it to the provided location. +** +** If the pointer is not on the same screen as the specified window, both +** win_x_return and win_y_return are set to zero and the function returns 0. +*/ + +int mlx_mouse_get_pos(t_xvar *xvar, t_win_list *win, \ + int *win_x_return, int *win_y_return) +{ + Window root_return; + Window child_return; + int root_x_return; + int root_y_return; + unsigned mask_return; + + return (XQueryPointer(xvar->display, win->window, \ + &root_return, &child_return, &root_x_return, &root_y_return, \ + win_x_return, win_y_return, &mask_return)); +} diff --git a/mlx/mlx_mouse_hook.c b/mlx/mlx_mouse_hook.c new file mode 100644 index 0000000..cb567ab --- /dev/null +++ b/mlx/mlx_mouse_hook.c @@ -0,0 +1,22 @@ +/* +** mlx_mouse_hook.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Thu Aug 3 11:49:06 2000 Charlie Root +** Last update Fri Feb 23 17:11:05 2001 Charlie Root +*/ + + +#include "mlx_int.h" + + + + +int mlx_mouse_hook(t_win_list *win,int (*funct)(),void *param) +{ + win->hooks[ButtonPress].hook = funct; + win->hooks[ButtonPress].param = param; + win->hooks[ButtonPress].mask = ButtonPressMask; +} diff --git a/mlx/mlx_new_image.c b/mlx/mlx_new_image.c new file mode 100644 index 0000000..d2cbfc1 --- /dev/null +++ b/mlx/mlx_new_image.c @@ -0,0 +1,159 @@ +/* +** mlx_new_image.c for MiniLibX in raytraceur +** +** Made by Charlie Root +** Login +** +** Started on Mon Aug 14 15:29:14 2000 Charlie Root +** Last update Wed May 25 16:46:31 2011 Olivier Crouzet +*/ + + + + +#include "mlx_int.h" + +/* +** To handle X errors +*/ + +#define X_ShmAttach 1 + +int mlx_X_error; + +int shm_att_pb(Display *d,XErrorEvent *ev) +{ + if (ev->request_code==146 && ev->minor_code==X_ShmAttach) + write(2,WARN_SHM_ATTACH,strlen(WARN_SHM_ATTACH)); + mlx_X_error = 1; +} + + +/* +** Data malloc : width+32 ( bitmap_pad=32 ), *4 = *32 / 8bit +*/ + + +void *mlx_int_new_xshm_image(t_xvar *xvar,int width,int height,int format) +{ + t_img *img; + int (*save_handler)(); + + if (!(img = malloc(sizeof(*img)))) + return ((void *)0); + bzero(img,sizeof(*img)); + img->data = 0; + img->image = XShmCreateImage(xvar->display,xvar->visual,xvar->depth, + format,img->data,&(img->shm),width,height); + if (!img->image) + { + free(img); + return ((void *)0); + } + img->width = width; + img->height = height; + img->size_line = img->image->bytes_per_line; + img->bpp = img->image->bits_per_pixel; + img->format = format; + img->shm.shmid = shmget(IPC_PRIVATE,(width+32)*height*4,IPC_CREAT|0777); + if (img->shm.shmid==-1) + { + XDestroyImage(img->image); + free(img); + return ((void *)0); + } + img->data = img->shm.shmaddr = img->image->data = shmat(img->shm.shmid,0,0); + if (img->data==(void *)-1) + { + shmctl(img->shm.shmid,IPC_RMID,0); + XDestroyImage(img->image); + free(img); + return ((void *)0); + } + img->shm.readOnly = False; + mlx_X_error = 0; + save_handler = XSetErrorHandler(shm_att_pb); + if (!XShmAttach(xvar->display,&(img->shm)) || + 0&XSync(xvar->display,False) || mlx_X_error) + { + XSetErrorHandler(save_handler); + shmdt(img->data); + shmctl(img->shm.shmid,IPC_RMID,0); + XDestroyImage(img->image); + free(img); + return ((void *)0); + } + XSetErrorHandler(save_handler); + shmctl(img->shm.shmid,IPC_RMID,0); + if (xvar->pshm_format==format) + { + img->pix = XShmCreatePixmap(xvar->display,xvar->root,img->shm.shmaddr, + &(img->shm),width,height,xvar->depth); + img->type = MLX_TYPE_SHM_PIXMAP; + } + else + { + img->pix = XCreatePixmap(xvar->display,xvar->root, + width,height,xvar->depth); + img->type = MLX_TYPE_SHM; + } + if (xvar->do_flush) + XFlush(xvar->display); + return (img); +} + + + +void *mlx_int_new_image(t_xvar *xvar,int width, int height,int format) +{ + t_img *img; + + if (!(img = malloc(sizeof(*img)))) + return ((void *)0); + if (!(img->data = malloc((width+32)*height*4))) + { + free(img); + return ((void *)0); + } + bzero(img->data,(width+32)*height*4); + img->image = XCreateImage(xvar->display,xvar->visual,xvar->depth,format,0, + img->data,width,height,32,0); + if (!img->image) + { + free(img->data); + free(img); + return ((void *)0); + } + img->gc = 0; + img->size_line = img->image->bytes_per_line; + img->bpp = img->image->bits_per_pixel; + img->width = width; + img->height = height; + img->pix = XCreatePixmap(xvar->display,xvar->root,width,height,xvar->depth); + img->format = format; + img->type = MLX_TYPE_XIMAGE; + if (xvar->do_flush) + XFlush(xvar->display); + return (img); +} + + +void *mlx_new_image(t_xvar *xvar,int width, int height) +{ + t_img *img; + + if (xvar->use_xshm) + if (img = mlx_int_new_xshm_image(xvar,width,height,ZPixmap)) + return (img); + return (mlx_int_new_image(xvar,width,height,ZPixmap)); +} + +void *mlx_new_image2(t_xvar *xvar,int width, int height) +{ + t_img *img; + + if (xvar->use_xshm) + if (img = mlx_int_new_xshm_image(xvar,width,height,XYPixmap)) + return (img); + return (mlx_int_new_image(xvar,width,height,XYPixmap)); +} diff --git a/mlx/mlx_new_window.c b/mlx/mlx_new_window.c new file mode 100644 index 0000000..3f05914 --- /dev/null +++ b/mlx/mlx_new_window.c @@ -0,0 +1,62 @@ +/* +** mlx_new_window.c for MiniLibX in +** +** Made by Charlie Root +** Login +** +** Started on Mon Jul 31 17:29:02 2000 Charlie Root +** Last update Thu Oct 4 15:44:43 2001 Charlie Root +*/ + + +/* +** We do not use White/BlackPixel macro, TrueColor Visual make sure +** 0 is black & -1 is white +** +** With mlx_int_wait_first_expose, no flush is needed. +*/ + +#include "mlx_int.h" + + +void *mlx_new_window(t_xvar *xvar,int size_x,int size_y,char *title) +{ + t_win_list *new_win; + XSetWindowAttributes xswa; + XGCValues xgcv; + + xswa.background_pixel = 0; + xswa.border_pixel = -1; + xswa.colormap = xvar->cmap; + /* + xswa.event_mask = ButtonPressMask | ButtonReleaseMask | ExposureMask | + KeyPressMask | KeyReleaseMask | StructureNotifyMask; + */ + /* xswa.event_mask = ExposureMask; */ + xswa.event_mask = 0xFFFFFF; /* all events */ + if (!(new_win = malloc(sizeof(*new_win)))) + return ((void *)0); + new_win->window = XCreateWindow(xvar->display,xvar->root,0,0,size_x,size_y, + 0,CopyFromParent,InputOutput,xvar->visual, + CWEventMask|CWBackPixel|CWBorderPixel| + CWColormap,&xswa); + mlx_int_anti_resize_win(xvar,new_win->window,size_x,size_y); + XStoreName(xvar->display,new_win->window,title); + XSetWMProtocols(xvar->display, new_win->window, &(xvar->wm_delete_window), 1); + xgcv.foreground = -1; + xgcv.function = GXcopy; + xgcv.plane_mask = AllPlanes; + new_win->gc = XCreateGC(xvar->display,new_win->window, + GCFunction|GCPlaneMask|GCForeground,&xgcv); + new_win->next = xvar->win_list; + xvar->win_list = new_win; + /* + new_win->mouse_hook = mlx_int_do_nothing; + new_win->key_hook = mlx_int_do_nothing; + new_win->expose_hook = mlx_int_do_nothing; + */ + bzero(&(new_win->hooks), sizeof(new_win->hooks)); + XMapRaised(xvar->display,new_win->window); + mlx_int_wait_first_expose(xvar,new_win->window); + return (new_win); +} diff --git a/mlx/mlx_pixel_put.c b/mlx/mlx_pixel_put.c new file mode 100644 index 0000000..c411f36 --- /dev/null +++ b/mlx/mlx_pixel_put.c @@ -0,0 +1,26 @@ +/* + ** mlx_pixel_put.c for MiniLibX in + ** + ** Made by Charlie Root + ** Login + ** + ** Started on Mon Jul 31 19:01:33 2000 Charlie Root +** Last update Tue Sep 25 17:09:49 2001 Charlie Root + */ + + +#include "mlx_int.h" + + + +int mlx_pixel_put(t_xvar *xvar,t_win_list *win, + int x,int y,int color) +{ + XGCValues xgcv; + + xgcv.foreground = mlx_int_get_good_color(xvar,color); + XChangeGC(xvar->display,win->gc,GCForeground,&xgcv); + XDrawPoint(xvar->display,win->window,win->gc,x,y); + if (xvar->do_flush) + XFlush(xvar->display); +} diff --git a/mlx/mlx_put_image_to_window.c b/mlx/mlx_put_image_to_window.c new file mode 100644 index 0000000..86ba3f4 --- /dev/null +++ b/mlx/mlx_put_image_to_window.c @@ -0,0 +1,37 @@ +/* +** mlx_put_image_to_window.c for MiniLibX in raytraceur +** +** Made by Charlie Root +** Login +** +** Started on Mon Aug 14 15:55:49 2000 Charlie Root +** Last update Sun Oct 2 09:53:00 2005 Olivier Crouzet +*/ + + + +#include "mlx_int.h" + + +int mlx_put_image_to_window(t_xvar *xvar,t_win_list *win,t_img *img, + int x,int y) +{ + GC gc; + + gc = win->gc; + if (img->gc) + { + gc = img->gc; + XSetClipOrigin(xvar->display, gc, x, y); + } + if (img->type==MLX_TYPE_SHM) + XShmPutImage(xvar->display,img->pix, win->gc, img->image,0,0,0,0, + img->width,img->height,False); + if (img->type==MLX_TYPE_XIMAGE) + XPutImage(xvar->display,img->pix, win->gc, img->image,0,0,0,0, + img->width,img->height); + XCopyArea(xvar->display,img->pix,win->window, gc, + 0,0,img->width,img->height,x,y); + if (xvar->do_flush) + XFlush(xvar->display); +} diff --git a/mlx/mlx_rgb.c b/mlx/mlx_rgb.c new file mode 100644 index 0000000..0cfccf6 --- /dev/null +++ b/mlx/mlx_rgb.c @@ -0,0 +1,764 @@ +/* +** This is a generated file with rgb2c.pl and rgb.txt from +** the XFree86 distribution. +*/ + +#include "mlx_int.h" + +struct s_col_name mlx_col_name[] = +{ + { "snow" , 0xfffafa }, + { "ghost white" , 0xf8f8ff }, + { "ghostwhite" , 0xf8f8ff }, + { "white smoke" , 0xf5f5f5 }, + { "whitesmoke" , 0xf5f5f5 }, + { "gainsboro" , 0xdcdcdc }, + { "floral white" , 0xfffaf0 }, + { "floralwhite" , 0xfffaf0 }, + { "old lace" , 0xfdf5e6 }, + { "oldlace" , 0xfdf5e6 }, + { "linen" , 0xfaf0e6 }, + { "antique white" , 0xfaebd7 }, + { "antiquewhite" , 0xfaebd7 }, + { "papaya whip" , 0xffefd5 }, + { "papayawhip" , 0xffefd5 }, + { "blanched almond" , 0xffebcd }, + { "blanchedalmond" , 0xffebcd }, + { "bisque" , 0xffe4c4 }, + { "peach puff" , 0xffdab9 }, + { "peachpuff" , 0xffdab9 }, + { "navajo white" , 0xffdead }, + { "navajowhite" , 0xffdead }, + { "moccasin" , 0xffe4b5 }, + { "cornsilk" , 0xfff8dc }, + { "ivory" , 0xfffff0 }, + { "lemon chiffon" , 0xfffacd }, + { "lemonchiffon" , 0xfffacd }, + { "seashell" , 0xfff5ee }, + { "honeydew" , 0xf0fff0 }, + { "mint cream" , 0xf5fffa }, + { "mintcream" , 0xf5fffa }, + { "azure" , 0xf0ffff }, + { "alice blue" , 0xf0f8ff }, + { "aliceblue" , 0xf0f8ff }, + { "lavender" , 0xe6e6fa }, + { "lavender blush" , 0xfff0f5 }, + { "lavenderblush" , 0xfff0f5 }, + { "misty rose" , 0xffe4e1 }, + { "mistyrose" , 0xffe4e1 }, + { "white" , 0xffffff }, + { "black" , 0x0 }, + { "dark slate" , 0x2f4f4f }, + { "darkslategray" , 0x2f4f4f }, + { "dark slate" , 0x2f4f4f }, + { "darkslategrey" , 0x2f4f4f }, + { "dim gray" , 0x696969 }, + { "dimgray" , 0x696969 }, + { "dim grey" , 0x696969 }, + { "dimgrey" , 0x696969 }, + { "slate gray" , 0x708090 }, + { "slategray" , 0x708090 }, + { "slate grey" , 0x708090 }, + { "slategrey" , 0x708090 }, + { "light slate" , 0x778899 }, + { "lightslategray" , 0x778899 }, + { "light slate" , 0x778899 }, + { "lightslategrey" , 0x778899 }, + { "gray" , 0xbebebe }, + { "grey" , 0xbebebe }, + { "light grey" , 0xd3d3d3 }, + { "lightgrey" , 0xd3d3d3 }, + { "light gray" , 0xd3d3d3 }, + { "lightgray" , 0xd3d3d3 }, + { "midnight blue" , 0x191970 }, + { "midnightblue" , 0x191970 }, + { "navy" , 0x80 }, + { "navy blue" , 0x80 }, + { "navyblue" , 0x80 }, + { "cornflower blue" , 0x6495ed }, + { "cornflowerblue" , 0x6495ed }, + { "dark slate" , 0x483d8b }, + { "darkslateblue" , 0x483d8b }, + { "slate blue" , 0x6a5acd }, + { "slateblue" , 0x6a5acd }, + { "medium slate" , 0x7b68ee }, + { "mediumslateblue" , 0x7b68ee }, + { "light slate" , 0x8470ff }, + { "lightslateblue" , 0x8470ff }, + { "medium blue" , 0xcd }, + { "mediumblue" , 0xcd }, + { "royal blue" , 0x4169e1 }, + { "royalblue" , 0x4169e1 }, + { "blue" , 0xff }, + { "dodger blue" , 0x1e90ff }, + { "dodgerblue" , 0x1e90ff }, + { "deep sky" , 0xbfff }, + { "deepskyblue" , 0xbfff }, + { "sky blue" , 0x87ceeb }, + { "skyblue" , 0x87ceeb }, + { "light sky" , 0x87cefa }, + { "lightskyblue" , 0x87cefa }, + { "steel blue" , 0x4682b4 }, + { "steelblue" , 0x4682b4 }, + { "light steel" , 0xb0c4de }, + { "lightsteelblue" , 0xb0c4de }, + { "light blue" , 0xadd8e6 }, + { "lightblue" , 0xadd8e6 }, + { "powder blue" , 0xb0e0e6 }, + { "powderblue" , 0xb0e0e6 }, + { "pale turquoise" , 0xafeeee }, + { "paleturquoise" , 0xafeeee }, + { "dark turquoise" , 0xced1 }, + { "darkturquoise" , 0xced1 }, + { "medium turquoise" , 0x48d1cc }, + { "mediumturquoise" , 0x48d1cc }, + { "turquoise" , 0x40e0d0 }, + { "cyan" , 0xffff }, + { "light cyan" , 0xe0ffff }, + { "lightcyan" , 0xe0ffff }, + { "cadet blue" , 0x5f9ea0 }, + { "cadetblue" , 0x5f9ea0 }, + { "medium aquamarine" , 0x66cdaa }, + { "mediumaquamarine" , 0x66cdaa }, + { "aquamarine" , 0x7fffd4 }, + { "dark green" , 0x6400 }, + { "darkgreen" , 0x6400 }, + { "dark olive" , 0x556b2f }, + { "darkolivegreen" , 0x556b2f }, + { "dark sea" , 0x8fbc8f }, + { "darkseagreen" , 0x8fbc8f }, + { "sea green" , 0x2e8b57 }, + { "seagreen" , 0x2e8b57 }, + { "medium sea" , 0x3cb371 }, + { "mediumseagreen" , 0x3cb371 }, + { "light sea" , 0x20b2aa }, + { "lightseagreen" , 0x20b2aa }, + { "pale green" , 0x98fb98 }, + { "palegreen" , 0x98fb98 }, + { "spring green" , 0xff7f }, + { "springgreen" , 0xff7f }, + { "lawn green" , 0x7cfc00 }, + { "lawngreen" , 0x7cfc00 }, + { "green" , 0xff00 }, + { "chartreuse" , 0x7fff00 }, + { "medium spring" , 0xfa9a }, + { "mediumspringgreen" , 0xfa9a }, + { "green yellow" , 0xadff2f }, + { "greenyellow" , 0xadff2f }, + { "lime green" , 0x32cd32 }, + { "limegreen" , 0x32cd32 }, + { "yellow green" , 0x9acd32 }, + { "yellowgreen" , 0x9acd32 }, + { "forest green" , 0x228b22 }, + { "forestgreen" , 0x228b22 }, + { "olive drab" , 0x6b8e23 }, + { "olivedrab" , 0x6b8e23 }, + { "dark khaki" , 0xbdb76b }, + { "darkkhaki" , 0xbdb76b }, + { "khaki" , 0xf0e68c }, + { "pale goldenrod" , 0xeee8aa }, + { "palegoldenrod" , 0xeee8aa }, + { "light goldenrod" , 0xfafad2 }, + { "lightgoldenrodyellow" , 0xfafad2 }, + { "light yellow" , 0xffffe0 }, + { "lightyellow" , 0xffffe0 }, + { "yellow" , 0xffff00 }, + { "gold" , 0xffd700 }, + { "light goldenrod" , 0xeedd82 }, + { "lightgoldenrod" , 0xeedd82 }, + { "goldenrod" , 0xdaa520 }, + { "dark goldenrod" , 0xb8860b }, + { "darkgoldenrod" , 0xb8860b }, + { "rosy brown" , 0xbc8f8f }, + { "rosybrown" , 0xbc8f8f }, + { "indian red" , 0xcd5c5c }, + { "indianred" , 0xcd5c5c }, + { "saddle brown" , 0x8b4513 }, + { "saddlebrown" , 0x8b4513 }, + { "sienna" , 0xa0522d }, + { "peru" , 0xcd853f }, + { "burlywood" , 0xdeb887 }, + { "beige" , 0xf5f5dc }, + { "wheat" , 0xf5deb3 }, + { "sandy brown" , 0xf4a460 }, + { "sandybrown" , 0xf4a460 }, + { "tan" , 0xd2b48c }, + { "chocolate" , 0xd2691e }, + { "firebrick" , 0xb22222 }, + { "brown" , 0xa52a2a }, + { "dark salmon" , 0xe9967a }, + { "darksalmon" , 0xe9967a }, + { "salmon" , 0xfa8072 }, + { "light salmon" , 0xffa07a }, + { "lightsalmon" , 0xffa07a }, + { "orange" , 0xffa500 }, + { "dark orange" , 0xff8c00 }, + { "darkorange" , 0xff8c00 }, + { "coral" , 0xff7f50 }, + { "light coral" , 0xf08080 }, + { "lightcoral" , 0xf08080 }, + { "tomato" , 0xff6347 }, + { "orange red" , 0xff4500 }, + { "orangered" , 0xff4500 }, + { "red" , 0xff0000 }, + { "hot pink" , 0xff69b4 }, + { "hotpink" , 0xff69b4 }, + { "deep pink" , 0xff1493 }, + { "deeppink" , 0xff1493 }, + { "pink" , 0xffc0cb }, + { "light pink" , 0xffb6c1 }, + { "lightpink" , 0xffb6c1 }, + { "pale violet" , 0xdb7093 }, + { "palevioletred" , 0xdb7093 }, + { "maroon" , 0xb03060 }, + { "medium violet" , 0xc71585 }, + { "mediumvioletred" , 0xc71585 }, + { "violet red" , 0xd02090 }, + { "violetred" , 0xd02090 }, + { "magenta" , 0xff00ff }, + { "violet" , 0xee82ee }, + { "plum" , 0xdda0dd }, + { "orchid" , 0xda70d6 }, + { "medium orchid" , 0xba55d3 }, + { "mediumorchid" , 0xba55d3 }, + { "dark orchid" , 0x9932cc }, + { "darkorchid" , 0x9932cc }, + { "dark violet" , 0x9400d3 }, + { "darkviolet" , 0x9400d3 }, + { "blue violet" , 0x8a2be2 }, + { "blueviolet" , 0x8a2be2 }, + { "purple" , 0xa020f0 }, + { "medium purple" , 0x9370db }, + { "mediumpurple" , 0x9370db }, + { "thistle" , 0xd8bfd8 }, + { "snow1" , 0xfffafa }, + { "snow2" , 0xeee9e9 }, + { "snow3" , 0xcdc9c9 }, + { "snow4" , 0x8b8989 }, + { "seashell1" , 0xfff5ee }, + { "seashell2" , 0xeee5de }, + { "seashell3" , 0xcdc5bf }, + { "seashell4" , 0x8b8682 }, + { "antiquewhite1" , 0xffefdb }, + { "antiquewhite2" , 0xeedfcc }, + { "antiquewhite3" , 0xcdc0b0 }, + { "antiquewhite4" , 0x8b8378 }, + { "bisque1" , 0xffe4c4 }, + { "bisque2" , 0xeed5b7 }, + { "bisque3" , 0xcdb79e }, + { "bisque4" , 0x8b7d6b }, + { "peachpuff1" , 0xffdab9 }, + { "peachpuff2" , 0xeecbad }, + { "peachpuff3" , 0xcdaf95 }, + { "peachpuff4" , 0x8b7765 }, + { "navajowhite1" , 0xffdead }, + { "navajowhite2" , 0xeecfa1 }, + { "navajowhite3" , 0xcdb38b }, + { "navajowhite4" , 0x8b795e }, + { "lemonchiffon1" , 0xfffacd }, + { "lemonchiffon2" , 0xeee9bf }, + { "lemonchiffon3" , 0xcdc9a5 }, + { "lemonchiffon4" , 0x8b8970 }, + { "cornsilk1" , 0xfff8dc }, + { "cornsilk2" , 0xeee8cd }, + { "cornsilk3" , 0xcdc8b1 }, + { "cornsilk4" , 0x8b8878 }, + { "ivory1" , 0xfffff0 }, + { "ivory2" , 0xeeeee0 }, + { "ivory3" , 0xcdcdc1 }, + { "ivory4" , 0x8b8b83 }, + { "honeydew1" , 0xf0fff0 }, + { "honeydew2" , 0xe0eee0 }, + { "honeydew3" , 0xc1cdc1 }, + { "honeydew4" , 0x838b83 }, + { "lavenderblush1" , 0xfff0f5 }, + { "lavenderblush2" , 0xeee0e5 }, + { "lavenderblush3" , 0xcdc1c5 }, + { "lavenderblush4" , 0x8b8386 }, + { "mistyrose1" , 0xffe4e1 }, + { "mistyrose2" , 0xeed5d2 }, + { "mistyrose3" , 0xcdb7b5 }, + { "mistyrose4" , 0x8b7d7b }, + { "azure1" , 0xf0ffff }, + { "azure2" , 0xe0eeee }, + { "azure3" , 0xc1cdcd }, + { "azure4" , 0x838b8b }, + { "slateblue1" , 0x836fff }, + { "slateblue2" , 0x7a67ee }, + { "slateblue3" , 0x6959cd }, + { "slateblue4" , 0x473c8b }, + { "royalblue1" , 0x4876ff }, + { "royalblue2" , 0x436eee }, + { "royalblue3" , 0x3a5fcd }, + { "royalblue4" , 0x27408b }, + { "blue1" , 0xff }, + { "blue2" , 0xee }, + { "blue3" , 0xcd }, + { "blue4" , 0x8b }, + { "dodgerblue1" , 0x1e90ff }, + { "dodgerblue2" , 0x1c86ee }, + { "dodgerblue3" , 0x1874cd }, + { "dodgerblue4" , 0x104e8b }, + { "steelblue1" , 0x63b8ff }, + { "steelblue2" , 0x5cacee }, + { "steelblue3" , 0x4f94cd }, + { "steelblue4" , 0x36648b }, + { "deepskyblue1" , 0xbfff }, + { "deepskyblue2" , 0xb2ee }, + { "deepskyblue3" , 0x9acd }, + { "deepskyblue4" , 0x688b }, + { "skyblue1" , 0x87ceff }, + { "skyblue2" , 0x7ec0ee }, + { "skyblue3" , 0x6ca6cd }, + { "skyblue4" , 0x4a708b }, + { "lightskyblue1" , 0xb0e2ff }, + { "lightskyblue2" , 0xa4d3ee }, + { "lightskyblue3" , 0x8db6cd }, + { "lightskyblue4" , 0x607b8b }, + { "slategray1" , 0xc6e2ff }, + { "slategray2" , 0xb9d3ee }, + { "slategray3" , 0x9fb6cd }, + { "slategray4" , 0x6c7b8b }, + { "lightsteelblue1" , 0xcae1ff }, + { "lightsteelblue2" , 0xbcd2ee }, + { "lightsteelblue3" , 0xa2b5cd }, + { "lightsteelblue4" , 0x6e7b8b }, + { "lightblue1" , 0xbfefff }, + { "lightblue2" , 0xb2dfee }, + { "lightblue3" , 0x9ac0cd }, + { "lightblue4" , 0x68838b }, + { "lightcyan1" , 0xe0ffff }, + { "lightcyan2" , 0xd1eeee }, + { "lightcyan3" , 0xb4cdcd }, + { "lightcyan4" , 0x7a8b8b }, + { "paleturquoise1" , 0xbbffff }, + { "paleturquoise2" , 0xaeeeee }, + { "paleturquoise3" , 0x96cdcd }, + { "paleturquoise4" , 0x668b8b }, + { "cadetblue1" , 0x98f5ff }, + { "cadetblue2" , 0x8ee5ee }, + { "cadetblue3" , 0x7ac5cd }, + { "cadetblue4" , 0x53868b }, + { "turquoise1" , 0xf5ff }, + { "turquoise2" , 0xe5ee }, + { "turquoise3" , 0xc5cd }, + { "turquoise4" , 0x868b }, + { "cyan1" , 0xffff }, + { "cyan2" , 0xeeee }, + { "cyan3" , 0xcdcd }, + { "cyan4" , 0x8b8b }, + { "darkslategray1" , 0x97ffff }, + { "darkslategray2" , 0x8deeee }, + { "darkslategray3" , 0x79cdcd }, + { "darkslategray4" , 0x528b8b }, + { "aquamarine1" , 0x7fffd4 }, + { "aquamarine2" , 0x76eec6 }, + { "aquamarine3" , 0x66cdaa }, + { "aquamarine4" , 0x458b74 }, + { "darkseagreen1" , 0xc1ffc1 }, + { "darkseagreen2" , 0xb4eeb4 }, + { "darkseagreen3" , 0x9bcd9b }, + { "darkseagreen4" , 0x698b69 }, + { "seagreen1" , 0x54ff9f }, + { "seagreen2" , 0x4eee94 }, + { "seagreen3" , 0x43cd80 }, + { "seagreen4" , 0x2e8b57 }, + { "palegreen1" , 0x9aff9a }, + { "palegreen2" , 0x90ee90 }, + { "palegreen3" , 0x7ccd7c }, + { "palegreen4" , 0x548b54 }, + { "springgreen1" , 0xff7f }, + { "springgreen2" , 0xee76 }, + { "springgreen3" , 0xcd66 }, + { "springgreen4" , 0x8b45 }, + { "green1" , 0xff00 }, + { "green2" , 0xee00 }, + { "green3" , 0xcd00 }, + { "green4" , 0x8b00 }, + { "chartreuse1" , 0x7fff00 }, + { "chartreuse2" , 0x76ee00 }, + { "chartreuse3" , 0x66cd00 }, + { "chartreuse4" , 0x458b00 }, + { "olivedrab1" , 0xc0ff3e }, + { "olivedrab2" , 0xb3ee3a }, + { "olivedrab3" , 0x9acd32 }, + { "olivedrab4" , 0x698b22 }, + { "darkolivegreen1" , 0xcaff70 }, + { "darkolivegreen2" , 0xbcee68 }, + { "darkolivegreen3" , 0xa2cd5a }, + { "darkolivegreen4" , 0x6e8b3d }, + { "khaki1" , 0xfff68f }, + { "khaki2" , 0xeee685 }, + { "khaki3" , 0xcdc673 }, + { "khaki4" , 0x8b864e }, + { "lightgoldenrod1" , 0xffec8b }, + { "lightgoldenrod2" , 0xeedc82 }, + { "lightgoldenrod3" , 0xcdbe70 }, + { "lightgoldenrod4" , 0x8b814c }, + { "lightyellow1" , 0xffffe0 }, + { "lightyellow2" , 0xeeeed1 }, + { "lightyellow3" , 0xcdcdb4 }, + { "lightyellow4" , 0x8b8b7a }, + { "yellow1" , 0xffff00 }, + { "yellow2" , 0xeeee00 }, + { "yellow3" , 0xcdcd00 }, + { "yellow4" , 0x8b8b00 }, + { "gold1" , 0xffd700 }, + { "gold2" , 0xeec900 }, + { "gold3" , 0xcdad00 }, + { "gold4" , 0x8b7500 }, + { "goldenrod1" , 0xffc125 }, + { "goldenrod2" , 0xeeb422 }, + { "goldenrod3" , 0xcd9b1d }, + { "goldenrod4" , 0x8b6914 }, + { "darkgoldenrod1" , 0xffb90f }, + { "darkgoldenrod2" , 0xeead0e }, + { "darkgoldenrod3" , 0xcd950c }, + { "darkgoldenrod4" , 0x8b6508 }, + { "rosybrown1" , 0xffc1c1 }, + { "rosybrown2" , 0xeeb4b4 }, + { "rosybrown3" , 0xcd9b9b }, + { "rosybrown4" , 0x8b6969 }, + { "indianred1" , 0xff6a6a }, + { "indianred2" , 0xee6363 }, + { "indianred3" , 0xcd5555 }, + { "indianred4" , 0x8b3a3a }, + { "sienna1" , 0xff8247 }, + { "sienna2" , 0xee7942 }, + { "sienna3" , 0xcd6839 }, + { "sienna4" , 0x8b4726 }, + { "burlywood1" , 0xffd39b }, + { "burlywood2" , 0xeec591 }, + { "burlywood3" , 0xcdaa7d }, + { "burlywood4" , 0x8b7355 }, + { "wheat1" , 0xffe7ba }, + { "wheat2" , 0xeed8ae }, + { "wheat3" , 0xcdba96 }, + { "wheat4" , 0x8b7e66 }, + { "tan1" , 0xffa54f }, + { "tan2" , 0xee9a49 }, + { "tan3" , 0xcd853f }, + { "tan4" , 0x8b5a2b }, + { "chocolate1" , 0xff7f24 }, + { "chocolate2" , 0xee7621 }, + { "chocolate3" , 0xcd661d }, + { "chocolate4" , 0x8b4513 }, + { "firebrick1" , 0xff3030 }, + { "firebrick2" , 0xee2c2c }, + { "firebrick3" , 0xcd2626 }, + { "firebrick4" , 0x8b1a1a }, + { "brown1" , 0xff4040 }, + { "brown2" , 0xee3b3b }, + { "brown3" , 0xcd3333 }, + { "brown4" , 0x8b2323 }, + { "salmon1" , 0xff8c69 }, + { "salmon2" , 0xee8262 }, + { "salmon3" , 0xcd7054 }, + { "salmon4" , 0x8b4c39 }, + { "lightsalmon1" , 0xffa07a }, + { "lightsalmon2" , 0xee9572 }, + { "lightsalmon3" , 0xcd8162 }, + { "lightsalmon4" , 0x8b5742 }, + { "orange1" , 0xffa500 }, + { "orange2" , 0xee9a00 }, + { "orange3" , 0xcd8500 }, + { "orange4" , 0x8b5a00 }, + { "darkorange1" , 0xff7f00 }, + { "darkorange2" , 0xee7600 }, + { "darkorange3" , 0xcd6600 }, + { "darkorange4" , 0x8b4500 }, + { "coral1" , 0xff7256 }, + { "coral2" , 0xee6a50 }, + { "coral3" , 0xcd5b45 }, + { "coral4" , 0x8b3e2f }, + { "tomato1" , 0xff6347 }, + { "tomato2" , 0xee5c42 }, + { "tomato3" , 0xcd4f39 }, + { "tomato4" , 0x8b3626 }, + { "orangered1" , 0xff4500 }, + { "orangered2" , 0xee4000 }, + { "orangered3" , 0xcd3700 }, + { "orangered4" , 0x8b2500 }, + { "red1" , 0xff0000 }, + { "red2" , 0xee0000 }, + { "red3" , 0xcd0000 }, + { "red4" , 0x8b0000 }, + { "deeppink1" , 0xff1493 }, + { "deeppink2" , 0xee1289 }, + { "deeppink3" , 0xcd1076 }, + { "deeppink4" , 0x8b0a50 }, + { "hotpink1" , 0xff6eb4 }, + { "hotpink2" , 0xee6aa7 }, + { "hotpink3" , 0xcd6090 }, + { "hotpink4" , 0x8b3a62 }, + { "pink1" , 0xffb5c5 }, + { "pink2" , 0xeea9b8 }, + { "pink3" , 0xcd919e }, + { "pink4" , 0x8b636c }, + { "lightpink1" , 0xffaeb9 }, + { "lightpink2" , 0xeea2ad }, + { "lightpink3" , 0xcd8c95 }, + { "lightpink4" , 0x8b5f65 }, + { "palevioletred1" , 0xff82ab }, + { "palevioletred2" , 0xee799f }, + { "palevioletred3" , 0xcd6889 }, + { "palevioletred4" , 0x8b475d }, + { "maroon1" , 0xff34b3 }, + { "maroon2" , 0xee30a7 }, + { "maroon3" , 0xcd2990 }, + { "maroon4" , 0x8b1c62 }, + { "violetred1" , 0xff3e96 }, + { "violetred2" , 0xee3a8c }, + { "violetred3" , 0xcd3278 }, + { "violetred4" , 0x8b2252 }, + { "magenta1" , 0xff00ff }, + { "magenta2" , 0xee00ee }, + { "magenta3" , 0xcd00cd }, + { "magenta4" , 0x8b008b }, + { "orchid1" , 0xff83fa }, + { "orchid2" , 0xee7ae9 }, + { "orchid3" , 0xcd69c9 }, + { "orchid4" , 0x8b4789 }, + { "plum1" , 0xffbbff }, + { "plum2" , 0xeeaeee }, + { "plum3" , 0xcd96cd }, + { "plum4" , 0x8b668b }, + { "mediumorchid1" , 0xe066ff }, + { "mediumorchid2" , 0xd15fee }, + { "mediumorchid3" , 0xb452cd }, + { "mediumorchid4" , 0x7a378b }, + { "darkorchid1" , 0xbf3eff }, + { "darkorchid2" , 0xb23aee }, + { "darkorchid3" , 0x9a32cd }, + { "darkorchid4" , 0x68228b }, + { "purple1" , 0x9b30ff }, + { "purple2" , 0x912cee }, + { "purple3" , 0x7d26cd }, + { "purple4" , 0x551a8b }, + { "mediumpurple1" , 0xab82ff }, + { "mediumpurple2" , 0x9f79ee }, + { "mediumpurple3" , 0x8968cd }, + { "mediumpurple4" , 0x5d478b }, + { "thistle1" , 0xffe1ff }, + { "thistle2" , 0xeed2ee }, + { "thistle3" , 0xcdb5cd }, + { "thistle4" , 0x8b7b8b }, + { "gray0" , 0x0 }, + { "grey0" , 0x0 }, + { "gray1" , 0x30303 }, + { "grey1" , 0x30303 }, + { "gray2" , 0x50505 }, + { "grey2" , 0x50505 }, + { "gray3" , 0x80808 }, + { "grey3" , 0x80808 }, + { "gray4" , 0xa0a0a }, + { "grey4" , 0xa0a0a }, + { "gray5" , 0xd0d0d }, + { "grey5" , 0xd0d0d }, + { "gray6" , 0xf0f0f }, + { "grey6" , 0xf0f0f }, + { "gray7" , 0x121212 }, + { "grey7" , 0x121212 }, + { "gray8" , 0x141414 }, + { "grey8" , 0x141414 }, + { "gray9" , 0x171717 }, + { "grey9" , 0x171717 }, + { "gray10" , 0x1a1a1a }, + { "grey10" , 0x1a1a1a }, + { "gray11" , 0x1c1c1c }, + { "grey11" , 0x1c1c1c }, + { "gray12" , 0x1f1f1f }, + { "grey12" , 0x1f1f1f }, + { "gray13" , 0x212121 }, + { "grey13" , 0x212121 }, + { "gray14" , 0x242424 }, + { "grey14" , 0x242424 }, + { "gray15" , 0x262626 }, + { "grey15" , 0x262626 }, + { "gray16" , 0x292929 }, + { "grey16" , 0x292929 }, + { "gray17" , 0x2b2b2b }, + { "grey17" , 0x2b2b2b }, + { "gray18" , 0x2e2e2e }, + { "grey18" , 0x2e2e2e }, + { "gray19" , 0x303030 }, + { "grey19" , 0x303030 }, + { "gray20" , 0x333333 }, + { "grey20" , 0x333333 }, + { "gray21" , 0x363636 }, + { "grey21" , 0x363636 }, + { "gray22" , 0x383838 }, + { "grey22" , 0x383838 }, + { "gray23" , 0x3b3b3b }, + { "grey23" , 0x3b3b3b }, + { "gray24" , 0x3d3d3d }, + { "grey24" , 0x3d3d3d }, + { "gray25" , 0x404040 }, + { "grey25" , 0x404040 }, + { "gray26" , 0x424242 }, + { "grey26" , 0x424242 }, + { "gray27" , 0x454545 }, + { "grey27" , 0x454545 }, + { "gray28" , 0x474747 }, + { "grey28" , 0x474747 }, + { "gray29" , 0x4a4a4a }, + { "grey29" , 0x4a4a4a }, + { "gray30" , 0x4d4d4d }, + { "grey30" , 0x4d4d4d }, + { "gray31" , 0x4f4f4f }, + { "grey31" , 0x4f4f4f }, + { "gray32" , 0x525252 }, + { "grey32" , 0x525252 }, + { "gray33" , 0x545454 }, + { "grey33" , 0x545454 }, + { "gray34" , 0x575757 }, + { "grey34" , 0x575757 }, + { "gray35" , 0x595959 }, + { "grey35" , 0x595959 }, + { "gray36" , 0x5c5c5c }, + { "grey36" , 0x5c5c5c }, + { "gray37" , 0x5e5e5e }, + { "grey37" , 0x5e5e5e }, + { "gray38" , 0x616161 }, + { "grey38" , 0x616161 }, + { "gray39" , 0x636363 }, + { "grey39" , 0x636363 }, + { "gray40" , 0x666666 }, + { "grey40" , 0x666666 }, + { "gray41" , 0x696969 }, + { "grey41" , 0x696969 }, + { "gray42" , 0x6b6b6b }, + { "grey42" , 0x6b6b6b }, + { "gray43" , 0x6e6e6e }, + { "grey43" , 0x6e6e6e }, + { "gray44" , 0x707070 }, + { "grey44" , 0x707070 }, + { "gray45" , 0x737373 }, + { "grey45" , 0x737373 }, + { "gray46" , 0x757575 }, + { "grey46" , 0x757575 }, + { "gray47" , 0x787878 }, + { "grey47" , 0x787878 }, + { "gray48" , 0x7a7a7a }, + { "grey48" , 0x7a7a7a }, + { "gray49" , 0x7d7d7d }, + { "grey49" , 0x7d7d7d }, + { "gray50" , 0x7f7f7f }, + { "grey50" , 0x7f7f7f }, + { "gray51" , 0x828282 }, + { "grey51" , 0x828282 }, + { "gray52" , 0x858585 }, + { "grey52" , 0x858585 }, + { "gray53" , 0x878787 }, + { "grey53" , 0x878787 }, + { "gray54" , 0x8a8a8a }, + { "grey54" , 0x8a8a8a }, + { "gray55" , 0x8c8c8c }, + { "grey55" , 0x8c8c8c }, + { "gray56" , 0x8f8f8f }, + { "grey56" , 0x8f8f8f }, + { "gray57" , 0x919191 }, + { "grey57" , 0x919191 }, + { "gray58" , 0x949494 }, + { "grey58" , 0x949494 }, + { "gray59" , 0x969696 }, + { "grey59" , 0x969696 }, + { "gray60" , 0x999999 }, + { "grey60" , 0x999999 }, + { "gray61" , 0x9c9c9c }, + { "grey61" , 0x9c9c9c }, + { "gray62" , 0x9e9e9e }, + { "grey62" , 0x9e9e9e }, + { "gray63" , 0xa1a1a1 }, + { "grey63" , 0xa1a1a1 }, + { "gray64" , 0xa3a3a3 }, + { "grey64" , 0xa3a3a3 }, + { "gray65" , 0xa6a6a6 }, + { "grey65" , 0xa6a6a6 }, + { "gray66" , 0xa8a8a8 }, + { "grey66" , 0xa8a8a8 }, + { "gray67" , 0xababab }, + { "grey67" , 0xababab }, + { "gray68" , 0xadadad }, + { "grey68" , 0xadadad }, + { "gray69" , 0xb0b0b0 }, + { "grey69" , 0xb0b0b0 }, + { "gray70" , 0xb3b3b3 }, + { "grey70" , 0xb3b3b3 }, + { "gray71" , 0xb5b5b5 }, + { "grey71" , 0xb5b5b5 }, + { "gray72" , 0xb8b8b8 }, + { "grey72" , 0xb8b8b8 }, + { "gray73" , 0xbababa }, + { "grey73" , 0xbababa }, + { "gray74" , 0xbdbdbd }, + { "grey74" , 0xbdbdbd }, + { "gray75" , 0xbfbfbf }, + { "grey75" , 0xbfbfbf }, + { "gray76" , 0xc2c2c2 }, + { "grey76" , 0xc2c2c2 }, + { "gray77" , 0xc4c4c4 }, + { "grey77" , 0xc4c4c4 }, + { "gray78" , 0xc7c7c7 }, + { "grey78" , 0xc7c7c7 }, + { "gray79" , 0xc9c9c9 }, + { "grey79" , 0xc9c9c9 }, + { "gray80" , 0xcccccc }, + { "grey80" , 0xcccccc }, + { "gray81" , 0xcfcfcf }, + { "grey81" , 0xcfcfcf }, + { "gray82" , 0xd1d1d1 }, + { "grey82" , 0xd1d1d1 }, + { "gray83" , 0xd4d4d4 }, + { "grey83" , 0xd4d4d4 }, + { "gray84" , 0xd6d6d6 }, + { "grey84" , 0xd6d6d6 }, + { "gray85" , 0xd9d9d9 }, + { "grey85" , 0xd9d9d9 }, + { "gray86" , 0xdbdbdb }, + { "grey86" , 0xdbdbdb }, + { "gray87" , 0xdedede }, + { "grey87" , 0xdedede }, + { "gray88" , 0xe0e0e0 }, + { "grey88" , 0xe0e0e0 }, + { "gray89" , 0xe3e3e3 }, + { "grey89" , 0xe3e3e3 }, + { "gray90" , 0xe5e5e5 }, + { "grey90" , 0xe5e5e5 }, + { "gray91" , 0xe8e8e8 }, + { "grey91" , 0xe8e8e8 }, + { "gray92" , 0xebebeb }, + { "grey92" , 0xebebeb }, + { "gray93" , 0xededed }, + { "grey93" , 0xededed }, + { "gray94" , 0xf0f0f0 }, + { "grey94" , 0xf0f0f0 }, + { "gray95" , 0xf2f2f2 }, + { "grey95" , 0xf2f2f2 }, + { "gray96" , 0xf5f5f5 }, + { "grey96" , 0xf5f5f5 }, + { "gray97" , 0xf7f7f7 }, + { "grey97" , 0xf7f7f7 }, + { "gray98" , 0xfafafa }, + { "grey98" , 0xfafafa }, + { "gray99" , 0xfcfcfc }, + { "grey99" , 0xfcfcfc }, + { "gray100" , 0xffffff }, + { "grey100" , 0xffffff }, + { "dark grey" , 0xa9a9a9 }, + { "darkgrey" , 0xa9a9a9 }, + { "dark gray" , 0xa9a9a9 }, + { "darkgray" , 0xa9a9a9 }, + { "dark blue" , 0x8b }, + { "darkblue" , 0x8b }, + { "dark cyan" , 0x8b8b }, + { "darkcyan" , 0x8b8b }, + { "dark magenta" , 0x8b008b }, + { "darkmagenta" , 0x8b008b }, + { "dark red" , 0x8b0000 }, + { "darkred" , 0x8b0000 }, + { "light green" , 0x90ee90 }, + { "lightgreen" , 0x90ee90 }, + { "none", -1 }, + { 0, 0 } +}; diff --git a/mlx/mlx_screen_size.c b/mlx/mlx_screen_size.c new file mode 100644 index 0000000..835730d --- /dev/null +++ b/mlx/mlx_screen_size.c @@ -0,0 +1,13 @@ +#include "mlx_int.h" + +int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey) +{ + XWindowAttributes xwAttr; + Status ret; + t_xvar *xvar; + + xvar = mlx_ptr; + ret = XGetWindowAttributes(xvar->display, xvar->root, &xwAttr); + (*sizex) = xwAttr.width; + (*sizey) = xwAttr.height; +} diff --git a/mlx/mlx_set_font.c b/mlx/mlx_set_font.c new file mode 100644 index 0000000..111e3b8 --- /dev/null +++ b/mlx/mlx_set_font.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* mlx_set_font.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: amalliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/09/30 13:30:47 by amalliar #+# #+# */ +/* Updated: 2020/09/30 17:08:36 by amalliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "mlx_int.h" + +/* +** Allows to specify the font that will be used by mlx_string_put. +** +** Note: only fixed-width bitmap fonts are supported by Xlib, refer to xfontsel +** utility to get valid font names for this function. +*/ + +void mlx_set_font(t_xvar *xvar, t_win_list *win, char *name) +{ + static Font font = 0; + + if (font) + XUnloadFont(xvar->display, font); + font = XLoadFont(xvar->display, name); + XSetFont(xvar->display, win->gc, font); +} diff --git a/mlx/mlx_string_put.c b/mlx/mlx_string_put.c new file mode 100644 index 0000000..8492a09 --- /dev/null +++ b/mlx/mlx_string_put.c @@ -0,0 +1,26 @@ +/* + ** mlx_string_put.c for MiniLibX in + ** + ** Made by Charlie Root + ** Login + ** + ** Started on Mon Jul 31 19:01:33 2000 Charlie Root +** Last update Tue Sep 25 17:11:47 2001 Charlie Root + */ + + +#include "mlx_int.h" + + + +int mlx_string_put(t_xvar *xvar,t_win_list *win, + int x,int y,int color,char *string) +{ + XGCValues xgcv; + + xgcv.foreground = mlx_int_get_good_color(xvar,color); + XChangeGC(xvar->display,win->gc,GCForeground,&xgcv); + XDrawString(xvar->display,win->window,win->gc,x,y,string,strlen(string)); + if (xvar->do_flush) + XFlush(xvar->display); +} diff --git a/mlx/mlx_xpm.c b/mlx/mlx_xpm.c new file mode 100644 index 0000000..688cc94 --- /dev/null +++ b/mlx/mlx_xpm.c @@ -0,0 +1,345 @@ +/* + ** xpm-read.c for MinilibX in + ** + ** Made by Charlie Root + ** Login + ** + ** Started on Tue Dec 11 15:25:27 2001 olivier crouzet + ** Last update Sat Oct 1 14:56:13 2005 Olivier Crouzet + */ + + +#include "mlx_int.h" + +extern struct s_col_name mlx_col_name[]; + + +#define RETURN { if (colors) free(colors); if (tab) free(tab); \ + tab = (void *)0; if (colors_direct) free(colors_direct); \ + if (img) {XDestroyImage(img->image); \ + XFreePixmap(xvar->display,img->pix);free(img);} \ + return ((void *)0);} + + + + +char *mlx_int_get_line(char *ptr,int *pos,int size) +{ + int pos2; + int pos3; + int pos4; + + if ((pos2 = mlx_int_str_str(ptr+*pos,"\"",size-*pos))==-1) + return ((char *)0); + if ((pos3 = mlx_int_str_str(ptr+*pos+pos2+1,"\"",size-*pos-pos2-1))==-1) + return ((char *)0); + *(ptr+*pos+pos2) = 0; + *(ptr+*pos+pos2+1+pos3) = 0; + pos4 = *pos+pos2+1; + *pos += pos2+pos3+2; + return (ptr+pos4); +} + + +unsigned int strlcpy_is_not_posix(char *dest, char *src, unsigned int size) +{ + unsigned count; + unsigned i; + + count = 0; + while (src[count] != '\0') + ++count; + i = 0; + while (src[i] != '\0' && i < (size - 1)) + { + dest[i] = src[i]; + ++i; + } + dest[i] = '\0'; + return (count); +} + +char *mlx_int_static_line(char **xpm_data,int *pos,int size) +{ + static char *copy = 0; + static int len = 0; + int len2; + char *str; + + str = xpm_data[(*pos)++]; + if ((len2 = strlen(str))>len) + { + if (copy) + free(copy); + if (!(copy = malloc(len2+1))) + return ((char *)0); + len = len2; + } + strlcpy_is_not_posix(copy, str, len2); + + return (copy); +} + + +int mlx_int_get_col_name(char *str,int size) +{ + int result; + + result = 0; + while (size--) + result = (result<<8)+*(str++); + + return (result); +} + +int mlx_int_get_text_rgb(char *name, char *end) +{ + int i; + char buff[64]; + + if (*name == '#') + return (strtol(name+1,0,16)); + if (end) + { + snprintf(buff, 64, "%s %s", name, end); + name = buff; + } + i = 0; + while (mlx_col_name[i].name) + { + if (!strcasecmp(mlx_col_name[i].name, name)) + return (mlx_col_name[i].color); + i ++; + } + return (0); +} + + +int mlx_int_xpm_set_pixel(t_img *img, char *data, int opp, int col, int x) +{ + int dec; + + dec = opp; + while (dec--) + { + if (img->image->byte_order) + *(data+x*opp+dec) = col&0xFF; + else + *(data+x*opp+opp-dec-1) = col&0xFF; + col >>= 8; + } +} + + +void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)()) +{ + int pos; + char *line; + char **tab; + char *data; + char *clip_data; + int nc; + int opp; + int cpp; + int col; + int rgb_col; + int col_name; + int method; + int x; + int i; + int j; + t_img *img; + t_xpm_col *colors; + int *colors_direct; + int width; + int height; + XImage *clip_img; + XGCValues xgcv; + Pixmap clip_pix; + + colors = 0; + colors_direct = 0; + img = 0; + tab = 0; + pos = 0; + if (!(line = f(info,&pos,info_size)) || + !(tab = mlx_int_str_to_wordtab(line)) || !(width = atoi(tab[0])) || + !(height = atoi(tab[1])) || !(nc = atoi(tab[2])) || + !(cpp = atoi(tab[3])) ) + RETURN; + free(tab); + tab = 0; + + method = 0; + if (cpp<=2) + { + method = 1; + if (!(colors_direct = malloc((cpp==2?65536:256)*sizeof(int)))) + RETURN; + } + else + if (!(colors = malloc(nc*sizeof(*colors)))) + RETURN; + + clip_data = 0; + + i = nc; + while (i--) + { + if (!(line = f(info,&pos,info_size)) || + !(tab = mlx_int_str_to_wordtab(line+cpp)) ) + RETURN; + j = 0; + while (tab[j] && strcmp(tab[j++],"c")); + + if (!tab[j]) + RETURN; + rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]); + /* + if ((rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]))==-1) + { + if (!(clip_data = malloc(4*width*height)) || ok, nice size .. + !(clip_img = XCreateImage(xvar->display, xvar->visual, + 1, XYPixmap, 0, clip_data, + width, height, 8, (width+7)/8)) ) + RETURN; + memset(clip_data, 0xFF, 4*width*height); + } + */ + if (method) + colors_direct[mlx_int_get_col_name(line,cpp)] = rgb_col; + // rgb_col>=0?mlx_get_color_value(xvar, rgb_col):rgb_col; + else + { + colors[i].name = mlx_int_get_col_name(line,cpp); + colors[i].col = rgb_col; //rgb_col>=0?mlx_get_color_value(xvar,rgb_col):rgb_col; + } + free(tab); + tab = (void *)0; + } + + if (!(img = mlx_new_image(xvar,width,height))) + RETURN; + opp = img->bpp/8; + + + i = height; + data = img->data; + while (i--) + { + if (!(line = f(info,&pos,info_size))) + RETURN; + x = 0; + while (xsize_line; + } + /* + if (clip_data) + { + if (!(clip_pix = XCreatePixmap(xvar->display, xvar->root, + width, height, 1)) ) + RETURN; + img->gc = XCreateGC(xvar->display, clip_pix, 0, &xgcv); + XPutImage(xvar->display, clip_pix, img->gc, clip_img, + 0, 0, 0, 0, width, height); + XFreeGC(xvar->display, img->gc); + xgcv.clip_mask = clip_pix; + xgcv.function = GXcopy; + xgcv.plane_mask = AllPlanes; + img->gc = XCreateGC(xvar->display, xvar->root, GCClipMask|GCFunction| + GCPlaneMask, &xgcv); + XSync(xvar->display, False); + XDestroyImage(clip_img); + } + */ + if (colors) + free(colors); + if (colors_direct) + free(colors_direct); + return (img); +} + + +int mlx_int_file_get_rid_comment(char *ptr, int size) +{ + int com_begin; + int com_end; + + while ((com_begin = mlx_int_str_str_cote(ptr,"/*",size))!=-1) + { + com_end = mlx_int_str_str(ptr+com_begin+2,"*/",size-com_begin-2); + memset(ptr+com_begin,' ',com_end+4); + } + while ((com_begin = mlx_int_str_str_cote(ptr,"//",size))!=-1) + { + com_end = mlx_int_str_str(ptr+com_begin+2,"\n",size-com_begin-2); + memset(ptr+com_begin,' ',com_end+3); + } +} + + +void *mlx_xpm_file_to_image(t_xvar *xvar,char *file,int *width,int *height) +{ + int fd; + int size; + char *ptr; + t_img *img; + + fd = -1; + if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 || + (ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))== + (void *)MAP_FAILED) + { + if (fd>=0) + close(fd); + return ((void *)0); + } + mlx_int_file_get_rid_comment(ptr, size); + if (img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line)) + { + *width = img->width; + *height = img->height; + } + munmap(ptr,size); + close(fd); + return (img); +} + +void *mlx_xpm_to_image(t_xvar *xvar,char **xpm_data,int *width,int *height) +{ + t_img *img; + + if (img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line)) + { + *width = img->width; + *height = img->height; + } + return (img); +} diff --git a/mlx/mlx_xpm.c.ok b/mlx/mlx_xpm.c.ok new file mode 100644 index 0000000..225ea3c --- /dev/null +++ b/mlx/mlx_xpm.c.ok @@ -0,0 +1,310 @@ +/* +** xpm-read.c for MinilibX in +** +** Made by Charlie Root +** Login +** +** Started on Tue Dec 11 15:25:27 2001 olivier crouzet +** Last update Sat Oct 1 14:40:55 2005 Olivier Crouzet +*/ + + +#include "mlx_int.h" + +extern struct s_col_name mlx_col_name[]; + + +#define RETURN { if (colors) free(colors); if (tab) free(tab); \ + if (colors_direct) free(colors_direct); \ + if (img) {XDestroyImage(img->image); \ + XFreePixmap(xvar->display,img->pix);free(img);} \ + return ((void *)0);} + + + + +char *mlx_int_get_line(char *ptr,int *pos,int size) +{ + int pos2; + int pos3; + int pos4; + + if ((pos2 = mlx_int_str_str(ptr+*pos,"\"",size-*pos))==-1) + return ((char *)0); + if ((pos3 = mlx_int_str_str(ptr+*pos+pos2+1,"\"",size-*pos-pos2-1))==-1) + return ((char *)0); + *(ptr+*pos+pos2) = 0; + *(ptr+*pos+pos2+1+pos3) = 0; + pos4 = *pos+pos2+1; + *pos += pos2+pos3+2; + return (ptr+pos4); +} + + + +char *mlx_int_static_line(char **xpm_data,int *pos,int size) +{ + static char *copy = 0; + static int len = 0; + int len2; + char *str; + + str = xpm_data[(*pos)++]; + if ((len2 = strlen(str))>len) + { + if (copy) + free(copy); + if (!(copy = malloc(len2+1))) + return ((char *)0); + len = len2; + } + /* strcpy(copy,str); */ + strlcpy(copy, str, len2+1); + return (copy); +} + + +int mlx_int_get_col_name(char *str,int size) +{ + int result; + + result = 0; + while (size--) + result = (result<<8)+*(str++); + return (result); +} + +int mlx_int_get_text_rgb(char *name) +{ + int i; + + if (*name == '#') + return (strtol(name+1,0,16)); + i = 0; + while (mlx_col_name[i].name) + { + if (!strcasecmp(mlx_col_name[i].name, name)) + return (mlx_col_name[i].color); + i ++; + } + return (0); +} + + +int mlx_int_xpm_set_pixel(t_img *img, char *data, int opp, int col, int x) +{ + int dec; + + dec = opp; + while (dec--) + { + if (img->image->byte_order) + *(data+x*opp+dec) = col&0xFF; + else + *(data+x*opp+opp-dec-1) = col&0xFF; + col >>= 8; + } +} + + +void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)()) +{ + int pos; + char *line; + char **tab; + char *data; + char *clip_data; + int nc; + int opp; + int cpp; + int col; + int rgb_col; + int col_name; + int method; + int x; + int i; + int j; + t_img *img; + t_xpm_col *colors; + int *colors_direct; + int width; + int height; + XImage *clip_img; + XGCValues xgcv; + Pixmap clip_pix; + + colors = 0; + colors_direct = 0; + img = 0; + tab = 0; + pos = 0; + if (!(line = f(info,&pos,info_size)) || + !(tab = mlx_int_str_to_wordtab(line)) || !(width = atoi(tab[0])) || + !(height = atoi(tab[1])) || !(nc = atoi(tab[2])) || + !(cpp = atoi(tab[3])) ) + RETURN; + free(tab); + tab = 0; + + method = 0; + if (cpp<=2) + { + method = 1; + if (!(colors_direct = malloc((cpp==2?65536:256)*sizeof(int)))) + RETURN; + } + else + if (!(colors = malloc(nc*sizeof(*colors)))) + RETURN; + + clip_data = 0; + + i = nc; + while (i--) + { + if (!(line = f(info,&pos,info_size)) || + !(tab = mlx_int_str_to_wordtab(line+cpp)) ) + RETURN; + j = 0; + while (tab[j] && strcmp(tab[j++],"c")); + if (!tab[j]) + RETURN; + + if ((rgb_col = mlx_int_get_text_rgb(tab[j]))==-1) + { + if (!(clip_data = malloc(4*width*height)) || /* ok, nice size .. */ + !(clip_img = XCreateImage(xvar->display, xvar->visual, + 1, XYPixmap, 0, clip_data, + width, height, 8, (width+7)/8)) ) + RETURN; + memset(clip_data, 0xFF, 4*width*height); + } + + if (method) + colors_direct[mlx_int_get_col_name(line,cpp)] = + rgb_col>=0?mlx_get_color_value(xvar, rgb_col):rgb_col; + else + { + colors[i].name = mlx_int_get_col_name(line,cpp); + colors[i].col = rgb_col>=0?mlx_get_color_value(xvar,rgb_col):rgb_col; + } + free(tab); + } + + if (!(img = mlx_new_image(xvar,width,height))) + RETURN; + opp = img->bpp/8; + + + i = height; + data = img->data; + while (i--) + { + if (!(line = f(info,&pos,info_size))) + RETURN; + x = 0; + while (xsize_line; + } + if (clip_data) + { + if (!(clip_pix = XCreatePixmap(xvar->display, xvar->root, + width, height, 1)) ) + RETURN; + img->gc = XCreateGC(xvar->display, clip_pix, 0, &xgcv); + XPutImage(xvar->display, clip_pix, img->gc, clip_img, + 0, 0, 0, 0, width, height); + XFreeGC(xvar->display, img->gc); + xgcv.clip_mask = clip_pix; + xgcv.function = GXcopy; + xgcv.plane_mask = AllPlanes; + img->gc = XCreateGC(xvar->display, xvar->root, GCClipMask|GCFunction| + GCPlaneMask, &xgcv); + XSync(xvar->display, False); + XDestroyImage(clip_img); + } + if (colors) + free(colors); + if (colors_direct) + free(colors_direct); + return (img); +} + + +int mlx_int_file_get_rid_comment(char *ptr, int size) +{ + int com_begin; + int com_end; + + while ((com_begin = mlx_int_str_str_cote(ptr,"/*",size))!=-1) + { + com_end = mlx_int_str_str(ptr+com_begin+2,"*/",size-com_begin-2); + memset(ptr+com_begin,' ',com_end+4); + } + while ((com_begin = mlx_int_str_str_cote(ptr,"//",size))!=-1) + { + com_end = mlx_int_str_str(ptr+com_begin+2,"\n",size-com_begin-2); + memset(ptr+com_begin,' ',com_end+3); + } +} + + +void *mlx_xpm_file_to_image(t_xvar *xvar,char *file,int *width,int *height) +{ + int fd; + int size; + char *ptr; + t_img *img; + + fd = -1; + if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 || + (ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))== + (void *)MAP_FAILED) + { + if (fd>=0) + close(fd); + return ((void *)0); + } + mlx_int_file_get_rid_comment(ptr, size); + if (img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line)) + { + *width = img->width; + *height = img->height; + } + munmap(ptr,size); + close(fd); + return (img); +} + +void *mlx_xpm_to_image(t_xvar *xvar,char **xpm_data,int *width,int *height) +{ + t_img *img; + + if (img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line)) + { + *width = img->width; + *height = img->height; + } + return (img); +} diff --git a/mlx/obj/mlx_clear_window.o b/mlx/obj/mlx_clear_window.o new file mode 100644 index 0000000000000000000000000000000000000000..82d9a24946db39d20fb218c2f37b9839d0c9eea7 GIT binary patch literal 1648 zcmbtTPiqrV5T8wI8{3#f@gP)mFG>scu~CuIf~Jj0770ddtA!%VCS6T2*_8c5QxAF& z50Z-)!H?ia@EGvR=uPpaLY;a0Ub=bNUh2T?%>3T`-kUe`_D!W;O=%iP(cmr|M-l}v z(#L*@yCpaWS@@N|@_WO4|HmBMF$ed)(aNCw=-n`!-uarpS^{&hy7Qgq*UIG;ePOE^ zxEaM{jB-*RTp!Eyde0C=D z0Smv37%9mjeJZ)a+ticUT&6O2KbIjSQRvQ7@bf5XF`d{Eszp{a&Pwy@$1#f1Fg*!! zeC7l^x!yGI$~cAkaUoVGzdK^rP^piqtRj$vnDVlA`T?+AJFtN@eIHn>*X=qkVs0;R7{09~Kd@UbMf}1I z*}m7?cf8;b7~jEZThBea>x_>4A4f+ry*2eEln^74bBm(M8O`GY^`;~fgzZyfP>jgH zELu88zMxA2zbqtFJ25V~D*qq9*nzVE literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_destroy_display.o b/mlx/obj/mlx_destroy_display.o new file mode 100644 index 0000000000000000000000000000000000000000..15f0a4dfb200a9db1f6190acf40cab570df14976 GIT binary patch literal 1560 zcmbtT!EVz)5FIy#76_uCN+1;>pAZPTawvzYhc;CE(aKCJu`3T&F;>O-?#ksg5v;-1KV)oF$(Z?;l!@z zW*sg=6@Fg1_3QD6o$oo+X*RdqJNv!KNKM?DCpLt)UYq1@?cD=Ucn|Mt7#5MRg6kZv z&eMIs^q&c<;38Qq6gY36gEL)m)~ZX(AMs*@-_(0mt^cOzEsOBus4S*Z`ck?B-(sFs z$!|T6kynB9r@^g_2VRVi2kjL@&!g^piN2Bg96Dk^*OBJyT)-Q2Vb(6ERMcu}swr zM4mwogM&1TWq$tueq2mIvtxI*ju;8|q3}-Ed<{3KHgyirdQ%tWhW0O_rgONSjNjI{ zJ&C^N*@|+QavvSa`LFyMaw(^W%M?DJ@|(ivv);l@w#~Sy=@_;h`vmvs@0pt+^qKFX zZ3@?qu^t+f)8>ED0rtCW{ws_t>)*4I{t=h?+`qE3>F6)?L2>ni>EF44%jOei_YNWW arg>d*4AJm0auuyI{!rgPI*u$1oBs!C>un|g literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_destroy_image.o b/mlx/obj/mlx_destroy_image.o new file mode 100644 index 0000000000000000000000000000000000000000..65c71b09daec945ca90a75e8bf7c13c18fa41dce GIT binary patch literal 1992 zcmbu8-)qxQ6vt27>FR!@RTK&n?UPP$q18Re#M!QElSy&atul~N(=A)3Oe@WDT4ps;^sq98Jqp~5^Txwp;I_C>#Na?bhOd+xotKVGD>8Nbg5Tt1kFPR1#~ z+ksA;u)_q5!U!CMF8s>N%^wSL^S9ji8f<088~gsop>H!Ux6&Xt_l|OptW9Z^5dloEn$Y)B|cI4J=`Q7FXHqvX=ytT% z1MvN*yM@-$>m-QtRUWSj*nf4LQ5Jxc-O%QPeR!}Br`ti1_un=_B7wYkeGRY0Ma!TYP>R-z`2r_fy!&V|Tv;cjAh@eeYn~AR65xw+>kn zbwiB#{&8HyfX4LJN7zI;-jR84J-z#0=VwD~#+Vw6^neDUY_`flG0~RN_JuTnLY0IxoBr5ZLVu8UHxv&j z5lA+B@#vr6kt4?%^-fGYc=V=$#2Dj6O>k!SJ-Xd)FFMI)WQjV^Bl2ozd3-s2&%o zHZ$s@yA5TMYM+n%`N5GLqYKp+0Dn;YRC`0ULwe`EdQA1Ck7^H)t4CBvp{_!gyHtya zUr+|Q2XZskz8PMREbKPa5vrS$=IC{E6{<+L-{HD~jg{2f_TeFHY*wtKzG8Qy9f?OG zQ-QH$MlCC9ASepA1aTs$8fkFrrYMM$;|!w)x5o$H8TjIJNzz3~0~yR~*ahZYPahIj z-RBza@A15Zjh+O4nT>ryANBh7x@Nro7w%c_VNchqUavpm^@Y8ja9;}Iun|Z5n550& z*>#ieCv5`&+>R%UoUgJ~rXj}|^?;fEIPweSGraIf)hH%+K*mXvgc2(T5VFYu@;7t?|w*A*h<(n^{L znOcnq*-EJ-mw}ZliY&lenJ|7Q%b%20VZB;em#fMq5sVIULCROtCAm50e?$S$;v2Ew z;1Do0e&5Wj{ca7z0KV%GFJOM3J)t_wd%@#8{O0=^zs9)z#a+T;2eacFP=h`HRUZT` z_7vf>8lNBgTaC}p{S*xH*jg8Lf)2H_!0=z96iAThA__o)l`lX;flfkv6evX`q%_gVcWgKbd_LKGlA!=P zbR8XkgN_!7A}v3Gp8%pkG%#b&n!U{>1&p+QGjHe3%_aDDJZnQ6&sM%Qvwu;0o4PR+fs>Th&%WwTdNA%nNU>)JntB z;Wtls3o}foCGpdXtAMKy*ZTJ@z_ypfxwyziGXUq{2RKQ=86O%LJjH&*Pw?Jn#{U70 z*b8@0-E!QnH$XEOmtY9pd^&?f*G*5+$x-A&|KDWF5B!6t8|btV3_lrj=4TG}l8Q{4 zVJs{4Fx(Y2u$Zh)k;~DEI!-0x{XqFu5V49ftZPrnM1k1$l@FpC#~^B95Xc5{jZjH} z&ovh-zqZTqPNOB7QP`A`+6NKIJzvOr<#*%Ss|)H9cIW>Hf5Dn(nW05jVAO=C#eh@a^1H+@rs(a>Vjlg~WzN^|z=Mu4@eYyZ)OyW#>rIjy`k>ur0Phj0 ihOH;gemjy}bN@*S3}ZTHhSBS$FYtxzz@J7?^wV9 literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_flush_event.o b/mlx/obj/mlx_flush_event.o new file mode 100644 index 0000000000000000000000000000000000000000..2ee5e70dda88f766066c11ece2c84587cc769f61 GIT binary patch literal 1792 zcmbtUUuzRV5T8q;tu;-f^&wEvfPbiHmqZ1%f+megjuP8y8z@LUF3BY+`B#!VX?;+N zRS13Q_wY*u^uceSUqDb4srVu))S1n0a=Bh!^apb@^V^x(-PzrHp3I~?iUJY}+=0F) zS%8kWZ^yV9gK_Y~kBKwCvde1wx4QlH1M&rR*LPtW4Yj><{vGOQM{R%nGC6T}hi9p~ zx7GHyPh_LX^~;X+S>5eM7u3t$bjz=9zomlF&ZD(AJPy){#B6vvo3rYs6^=&OH5QqP zTHK93yBcAU>z4!#;KS4)$`O?GLKZx@1>)p3PN7Xuo<0O+GpJ1YM@IK><5!S7%|`$# zq?3W*D^ENSdf}Z9>?@uJV}Vd25R3;#dJeVO?CP?#nnqP; zCN2|LK{s_^xmF8UzEP{us#(2Z8Vv913}3YHOLdEFG#eX6)7%2aD;Q<1*wkxAZ_58M z!kA2V)p?U*$PwhZcfG@BJcR?)o0tp`dY>ADP`e7oP}4l}28INGQSi>2|5}VY71gkV z-YeDo*Ze5vQq2g89ddrEZ-<;;>RB9=wmt5>-Lcuu*m)eI*DBi8i=cJ>p zTzcuhQE!d@0U;nBOAnrHy=X2vvw1Il*{qj>1CN>cX1ni`o7=!j%_gw2@4AkMnCEkc;W{idxm|uP{HhnSM&LJ` zfNuf|oVv}NTH$G6yN+yjbUlky+KJ@LSfb=dp{1f-Q{^H$#Fu+3W51=5(3GpnWpoTY zN9A8dF4dI#k7g{gKgCs%{iVKvL20Xbm(swL+-1aQd)1wwI&*@bB}WnZR#l#$L#avr zeZjZXWVDm~4aDd#vGAz!O%#-KIe|gCr{td%$!WbQ^iK3Qgg%KF)kyLQOTHaKur2!E XAx9BWZh)LdD~)dmusX=>8%h3Oo|3op literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_get_data_addr.o b/mlx/obj/mlx_get_data_addr.o new file mode 100644 index 0000000000000000000000000000000000000000..752866173872a0c1f3c8d2f6bc822254b0176e75 GIT binary patch literal 1392 zcmbtS%}OId5U$C%ChH3RutLBf@w6^zGx6u*K?X!8hh-0fAjlFX$rwQ=2{Ro?Jh(>< zbMY~J3}G+(2tJ03H!r(YN%h!iqldMi=d1df&OH0> zz;$67KEdP6(o^CU`jd&5?`O(MHgWTPtDJbwFYtDEw~H%>)lO4(iX}&E2xqO-8HA0QE={y;IwiQ`C-7#-vKl)-J$s>U9Oq_502?g>9&jk>D9YZ zd&kN#kaBhVfohZRGATzGh94 zQ31`W+Ybz=rm4T>By%oPe}sATs$I@k@W2PnGw~6T&Z+c@AJ>~C_w+$~7y?WoQVmm2 foOyR7`OW?5esyCyrRLBZr_b>ZX{4D$$JGA=?+{uL literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_hook.o b/mlx/obj/mlx_hook.o new file mode 100644 index 0000000000000000000000000000000000000000..7e8d7ea20ba5ae92a962f267653e351e9cea6439 GIT binary patch literal 1992 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 N^4k>Rn|F#k|1WuI&!+$Y literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_int_do_nothing.o b/mlx/obj/mlx_int_do_nothing.o new file mode 100644 index 0000000000000000000000000000000000000000..cd98d2cd6ba816847d63aeb279fcf24d7ac72647 GIT binary patch literal 1384 zcmbVKJ4*vW5T46LjSujFh!Bxjsi4cnM`Iy@5Yvc-AlOK_#4{0dckylm(L(=%r9Z_| zu<@r@Dt0zHlkA+EH6l2$H}icv-|Woo-j??FQkDg57VN?|Vius0`i=|TumBS<4)2qT zA5Ty&7I$(hN7Z&9+qt|WHifgEZ+Bt-X2TKA)~cepN*aSHTtm3Z2S1WjgSx1}Pm-(UR6vvUO()_jU%FKgv5b1Y z!IAVj62z%1T@ckc22l%r-wTk#6Fq^~wjN8jcA;=RXp2@9w!BDQfrz}OE4)VKEOLF1 zyZFD)qLl8^{G$a`GWjnG)7#Q*2?6Q(eeqt21H)6UZp#QVxc;kOLoL;GaOuY9)4pze zKKpIln^B#b}y>Y zc}0w(r#@NF{GhW*@=PDJ*Peqh^i;#t6KCEXNgmYss{}MtbizzyG)T`sq@HB<0#pA5 D5l&Oy literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_int_get_visual.o b/mlx/obj/mlx_int_get_visual.o new file mode 100644 index 0000000000000000000000000000000000000000..10e832807f610a0c8cea8245413d6a200ade3b60 GIT binary patch literal 1808 zcmbtTPiqrV5T8w=tu@BA770`&hbSr9B~cOS!6wbWr-T-4Dg~8wlWv>R{3*$cq#m>q zL_#e189ewIJcv{jdi4tkJ%|W;5pOEgneBUKv)x>DV40cUo8Qdrn|Y7Yxr|3qK#Bs_ zpyx>x;Dfhk$1O7s$G{Iij-UCN$fskU=2_<#Ykw;(v99lI1S41{6<&;O?_|jVR!pj_ zJI&ti4l(c3FNAdC@pen~u}(6`uXK}RY%3S`v#oqsedEXTom4pDLyc*|6c6mlHlJW! z*hxmHL*lV6)>vZa_bWC}viAE@sdZhvQTJNc{3D?YL~R= zWUOhqv4UT8G7~$!}S#>(%8N=z4=2#WlTHTGN+})iS_} zXpm-3gZfR|g!00M)0Rp+Byijl+LfMYjg1O73ZON3eP5TPRX59q#?2N7ZOPyUXoW@t zv|_DNF{_AGYuwau_a?30guha4YU}mdx>@HNpjjErlD=FwDrT?de^?>p((XAoBaRq} zoa4TCaAxCpKzA0G0YV4GYDR@Wf|}~cjS33wW3hm_I zMci$EOkAj(6U~pfk}q+$+Ei*&)R%qGn>ymcC(JoJgy5C+hEMfviVuB~;foh1Zu3D(@j>4*@nN8d;!6=B{{P8;y5s3RGTf^NZvOxO z&j0`Cod2Ahd*9CHbA6Er6D`7CV7Dzn8QZ@9wr+9NVhI*!ez-oJ1Q`}|xc9r()@jMCx0 zU+3H3bZ<(tDXrmr?BX8#gMJI1FKvHf!uDI!>7e^#;!uY1`A?;9oU&Jci6uTeJ8Anb z+WvtlGsIC^$oQ6;k})?xF&tBO}ilN2g|+6|ZTeQ|2>f>R7tT&GhoqDKmBa3Br7k ze)vtoa}PYDV^ge;u>e^V9&87Cf<@ju$s(;}f;AiffD=C5a4< z9d9z5CiWOf^edBokmM1NE2KY>Fu}OZ1 zN$LbFk@d6RyJ7v&&>I75CaU(&s3>F#Yf)bH-91qj+YNz4*}WQmpN8+<#UBQ;Uz)$z zyC;cbjj)Nm%7Tvm7D8x(JD?-4amtw3$G3>D6Bm1Vk$6Cy?%@Ganc z{t7Bw4`*Mb}MduK^^)fcd0ik{OWe|MTf-+b zT-;|kA36Vw%$$Wg)#May)XZ|V z=#-gRtS&CX4b99-)pJewP&wA{oZ=a>Pgj~|tzNCUb#I9hxbuY)T#l_X8E{E^ zluQ=cj#w|*Vn2jCz6bH{v;-h&&?`DcHr{2JDn|Ao$;XMSUl<=L zHU3$M#i7*rfW|kJc^Kd;w=@`G>z|(2qhAw-=(<*kDU7aFclZelt@ zjzg!=WxoM+LDZ@G7J%baX}FyfNs2diNKX;-7x)cOFsB-yqWF$*B&o*Nfrr&^gI>A; z#bNyriFk2-!p6psBqoKnO$)|%W>`Fad4`oLMt_I{O2HJ9e@leL*XX7G4o*U9YW&{` C9eUsZ literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_int_set_win_event_mask.o b/mlx/obj/mlx_int_set_win_event_mask.o new file mode 100644 index 0000000000000000000000000000000000000000..b3da1482669aafb8c9850a8bfdb5c6df4feaeb36 GIT binary patch literal 1816 zcmbtT&1(};5TAT#(+{^%JOnCr4^b-GCD9&i1<5vT@+zq=eMv#*^?S=9<}{;Yf6QlVk&=xf3G2AISJOb9bga7AEa$q?Ha6()#iS0suR# z+-y4+4q_VfEoo!c9J$!3VfK^e*Y)Vuy+!r@JIfQ2@%V&1vXC(=)RdzU<%$v+jhdDk zeRMgZM8+;~81wq^1o0fhlf1bAUVtrziRYe1nUUw=E$}pgo}q!Bz$P|m46!qo1>hy) z2`Tv8t4g6~K2?&N{-pHE<6Z5OLw}4gohje*_NYQbQ|Ns8%fX|2Nx zLaG@hU7<#Uf|Apz4oaq82PIoAm+^_9RI1caa5qP-t8qPFF_o2Cb;YRBHBhV!MnPMu z>1E@f=6^^s#|vlc+EF1R8~G_xo*EY_ik$2HM!K?Ajsb&mCnZ z+eq|JKp7O6t218a@$`(Q4q} eJA~jhe^7%dHsa~_k&`I7#TPhO+V|`T&iFrVoxN=U literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_int_str_to_wordtab.o b/mlx/obj/mlx_int_str_to_wordtab.o new file mode 100644 index 0000000000000000000000000000000000000000..b97fcebed9beeb31857deb46bec0fca0019012ea GIT binary patch literal 2568 zcmbtU|7%-S6u&R8bLm>&i&`;QvB8O~vOW5?3hflh>yqZSW)5r%ldgp1Ew!>FEy;cK z3uO(Y9Xv3z;4l3X{L!DPzb$Fknm9yof@~la6s)#CIK&E7jOV=Ex4gbZ5j}9S>;A$fhc7V4ulV+&F=cJ25)n+Zq^$szA7+}ZphpooRq9)L_Nk#5j#^Vz-nq`cN zE)T$k?Js}HP8YU?gN+^bA_83&XRj5{for)z0v}_)|MR7_;&p-QHCp~bw2~NtJt2kV zI}id2p;n{C5dry8{oZh~qf=f#8_fUN%DiR;bin8>&I=cXyHx*TsQYgB*HpO2`?KwV z6xCwOGuV-+a38(dPZsxkvm9JLVEsdS1uHvbc2t80+dC{~S>MK&ls@Ko-t&Yc{|zxD1qv;mamgQ&d;=2X+6!jNeQ!4Ny>`NO*4iSHUz2=cHW#E29ShlDy!le}6RcY8!3t%W?OJz@YrZ2F=Rw@-hRC0f-wis4Em zj-P{S*|DEbit7)dM=y)>XjW0wX8N5Z4AQEea^ zjuEh=k{P#iOrK`SBVc1|l8&cR(>mmX@^oEUoxrC5fj>czmA}CyyZ|70r=9*EIB*GU z_C5)C04V71!~+O|pqaZ^>!|f@;C6kNUASFeqU7e&P%zLeTh~+eESpTl6_%W1M7bJg zaiS!0Iil#(>2xv!SO#jOz#Bc2V{!c&U%!(vl$q@GOft*niDK=LoQh3m>S-1EQkRp4S?JusYN$H)Dh!mriCJkEpB#+-iN{mcA^frNh%xBD&!0?tigZr9I- z6EMN}ZoZcnnFh0jDMNupK@?<>gN9iT(Z3V literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_int_wait_first_expose.o b/mlx/obj/mlx_int_wait_first_expose.o new file mode 100644 index 0000000000000000000000000000000000000000..d23f47114f51cac994fc7118c0f41af07b2ec833 GIT binary patch literal 1824 zcmbVM&1(}u6n~pk8*3V)cqmjQ2bGF;NU9)I)TAZpQlc%kp+zafCfS_kQnd=FOXZn$Bhdh5?EUxCK2; zp#UF)Jvr%$Nf?DN{5)~)ckVSj16VRUf6VQ#AJAy-+%B3sLl-7U?z}kv4tZkF?0hmi zUp}LZ4mZrsHz{`QMe}kupcOW^-%^&u-h;I_t`E%3&Q8ZBa`{$Gv|@=kyUOB|iI%G- zo=nAA{Msc6Q+A>uTv1#{aLwJ#K>%QnFm;U6C=(fv?}5>d8sp*N&@LYQ3Swtm3xG{L z9f`gSWFlkFgY%K^Mj$g18JmqnQ;|^WxODSn)Wae8vF~RL`gWN1rgqmK6?9M2kC7IH zqyK|0K0E*q4Zx{O{d5-9Q`$b=ULbZI7xmRkcM$Ny?+?IB18}HT+Pqv7eA6lmzFuxR zg4^vz-LY9=unqWJc3~!!O4_}Qa_B_w znQ|UBK7p~6Gmc9qRiEg>YnKSC|1QQ+^;s(O3H&SN=|R>m`^-m-n&BxcIAP# XNYO~9J3vmN!t-?#XG(v9bTYXUTgm3DWnPWNEw;(5^>{T5kK5C6bZ2YQWqG_BOxxwCs-%axpZuIPCsRsc1m z9bz=0(M@`8!-BfY?L4r6`)w>rk2^IE?8N3auzU~zD|oK!l#wfY++p}k>jAe5B@v&M ztE}RC702gwV7_y1GpCq4^=;P)kN(#*hiZB|y@Ls{Yo`w)raq~*gaPU0f0Ap*($SD| zRa?d&isP^PHPq6c77o?q`LwQ@JYV8AE=pg`Yp8+Z>$xdhqhHqZ_82#XCMHk<-BmTJ zllIj0_aaHZm##m;Jo?QEkuRYo3Y`_i2qM)f^^)&*Hc4J-LTj}FMiFTbT~D0;b|iTb Z=j;DR(3BF|6wdwhQPGeyktadde*yg-RsaA1 literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_loop.o b/mlx/obj/mlx_loop.o new file mode 100644 index 0000000000000000000000000000000000000000..d5ae22db60131546b3b01e5244308026aaa46ef7 GIT binary patch literal 2368 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 literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_mouse_hook.o b/mlx/obj/mlx_mouse_hook.o new file mode 100644 index 0000000000000000000000000000000000000000..b768a1f16b6543c370c2c8b48609c2658104e4bd GIT binary patch literal 1400 zcmbVKJ4*vW5T5g*#s?V1LhwPXRM6$(qp^^HXi|uU5U`POiKhX*oZRg}w9r!0rSmUX z+G#0R*!mOv35t!_=*(sJ+*_lC1H0eMxAX1J?C!&D$HKip{G#gvZNkoKrX+ps>Eanw>3G!a5JLIg2eZYatg#VeWj90T!JDr{;fPXa+_QV!D7#)5IOUq>9kD7T z3AsyFIMh+1D;Au(+^zr%xZlQ_^tjXD!1ir!1FHl9u&U>}P93?r#~p^xwGeQ-dL-h* zddNDKOtTwwY5aANaQG$SVGi<0z#!)Ne8`wv6vX#Pp|Bo5q0j@?XidJ?Usj zxvI@zkjC*}{XA-EPYZ`?@_brXO`b1t1sA2S<~7wo@%7vdT%+HXczcXnLX#CJfqGSq z>ZCn&{f$V{`_lEhm`A@lFY+b4i$cc)(T7NNO1;*q aiSwr^P)yJ literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_new_image.o b/mlx/obj/mlx_new_image.o new file mode 100644 index 0000000000000000000000000000000000000000..76afc9d3729f5044441fe812e13994666f1feb73 GIT binary patch literal 4632 zcmbtYYit`u5Z=UTV-j)>C4hm7T%`a(YAqWIq?96GY{zF|XdrRp@^T#K@+h_w&KK%H zUs94vD>tPeA@Ku=A`t%&zYyY`sD=D$g^=h^s1Rxi1wjOqikF$$+fBBY91>!sz1{tG z=9}4>x%J5hW67@Cni?Wn4Y`l3tOQEPOUlYT%%)+YkS6l8@21}?UFyxGS|vNk3pK=Q zT3CnsNOEH6m_GHr_q`67e_RU>efCaxl5g>`BBoEB^q%mw9zqoPv_5T@meS}KTCYZb z`3RX(^i+>d|M)l!bD;Dyh6G*EXXbp1la@F40B3QWB!| z87zbtLH8< zqZ*Be>B7{ds&D!ya3)dlg+32m)M>KK%l7pO%yg0*?A4Ggy13-NZ$0C?oBM7n3@CQ=Y~f0AB$^l|Mm?Q!i1Edx0KZNZ+X91Pm3vYAAs zUZ)Gy?*1gL#zIvlaN+HtfUk8LPXhY3y$i1n`C6ldfFoD}iAtZIq)X@UCC3OMENX(*wK3rtcBJrTtd-L&vUCaOpJ0SR zFG{~lEJWLyL5yGxp(Q^EoQbxn_VH-G4N3@-3Q^ZUv>nSC!hh|fNqUxt{=~|GMf~Jl zUuziZY+sw5jwC%F3w^`LFT8KZXZc-8RpPo%|ANxF?p@5beIQtRnI(81!Qm)9r_&$V zK0_B@`ny^c`D5{3lMns=H$L3A`E=lWV6-@zA00@meOa?OS{zpIQPXP4FrPL|HJ2^k zYN=Vv%H~GY(n!`c2GxR57&9jW4TQuak$cqk)WAg1novW*z#W0$me2%Sh7Q~w3>Y!uv@y>}qm?CiMImED}u(j9&sd?sMQd4fOx$(++?=f%{@r`^hf#aakJg9id zAWXM%ybeRyr8GZR+o|}EdO8(#wl1c$A6b`Bf``{fl#Z$Tq|)7^q?1a2N=bJr-JT6K z4N6B;32I6^h=W?E(%h+dqm8wFN;;+VKdhuR1uucepuf!Rv|{MM&e7VK;-B@z6!l0Q z5FB0?QG!$JYokiXLrS<)(ZK*%t~DBz_NYXDe`CUd#2VQd{^a~Rj=(>Q{6{>Xd${hA z2H{(zai^Gq7@mDA`UCC1=-C>ppGZ|lma40FFh|^wW7D&oy~{T|EZdi3xbm>fs}A8^5^UGNuO@Z&D{8!k9r-)s5*z6(C@f`96QpK`&!1RUep zkMBA(_AbKs6ZEzG`OO8dgHlGGL;T`l?+(ar;P___oD}lqOwrhz87*XojX;hBl93=O zjTAC)FJ{IE*nT==nC6&CGV$cjPA!?)+11q(>&^6Poyk~+>@`O%gUO8+Eyh(weMU%f z*?fL1N76kbg@|cnEhB+;(7>=^;gGdp)39P_K+hHj^M=W!HFhn-bh4O3xtx_JX`7;Z zv|PxJBRFW0A=5BOx+_0X8j-AU5j>o5%J!$g{gIuyECiPa$O^|17X!mO9LjG=! zquoXc-yz}hxw<4C{EZSkyCfWABJe>8$Gb=1dmQ`%FH7<=|BQrRC-J;4;eH7}BjGa7 zR}y}`B>%mH%l!C*jSb^=19ahMi-g}O;X5RJqlE95@S7z3RSB2#ds@O`zg`W&bB#@K+?fm`1 zxVWcCpfp*qvI8($rag{`nQ7#+0m~>`Bruq@vLrB2Dv^LWh6@xA1v*F|H&!SZMGz^D zSw;Xp&9;=_d+$lU9xhG<#?7&D!?Y$r6$y=z%#fKa82kYLb5KDakLLV^4g-eGj|rBV z^RCAnqexhi!Rc}MLS>ET3*Tw9BfcoGX0Y7?9dRy(5Nm0NU4ip7h$Yz!GvsvBchWf5 zct0ZN@r{QVL7BL8dI vMireGWRNEo?|$TP>LaH!_W+SHZa~}Q@ZYh7Z_Ty!{rrENXBo@N!>Rud@DFq4 literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_new_window.o b/mlx/obj/mlx_new_window.o new file mode 100644 index 0000000000000000000000000000000000000000..05716a064e2582ef81d15b3daa383a7a7730399a GIT binary patch literal 2488 zcmb`H-HRJl6u@sj+QxM|NoyYh6^RgK#des{g0K%|C&_GX%JhSFMk0hugq$XO9;bx#4(_$*+~yoPOs2`b|(n?{?E`ku|dB1<}_xr2^Y2uwN$~w>e{e)f854GmfmWB zTY{y-%2bK6Uo>V)=%?htJ^B&OR)Sgg5)T(c``)Hh>C@gWb&t^-o49Wp+g?^KE6d6Y zivE=wNs9UWY-Xms(rr22j4X-Iiqc8B>$>u*&q$(l>M0+?a^j#V&;y{wb7c}GWPl7; zj&jU1By#N{iS$yD5Z6va=i3 z9}7L1_)q+=Mx$cxE{rntVkB^w1Klx#McywllGqP{#N6E-?K%qX(ZD+0Jp}eRDAr?K zo&ylZPfy_51deqJ%VSO8*C%i`fxkb2e=>oSW}~OK%yoUe-l|&bVr2{vy{MhfDVlzM ze*TiWpf4ynP1Q-$Xf&(}S<2g{;h2kVtQ%QxIl9qu>bh-q>eoz6OO`G+j6Xm)#&g9#XMO$YqT#K^^RE`=2dVt^n&0?PSpfaBTYycXb(1b7D8DDWP*>N@xlJ6D^Iu>#hyJ-f~ zpa*mQ*LWFXF{cC?6h1%Z4+@{3+ga%3?clgOVK8Lu8DRKY;yDV+mLH!9LTK~-<9G!c zICMPzz90V@AL!fhc)Xus_4~uGAFmVE4`X>e=V5c>R6Tz|+x|N6?mrX~k8HelfXEUq b3gotDhF?G3(8oI*7N77BG(15gG9LdgKl*7s literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_pixel_put.o b/mlx/obj/mlx_pixel_put.o new file mode 100644 index 0000000000000000000000000000000000000000..76acbb4632befe8cb5162683b2548cca5771e7c6 GIT binary patch literal 2000 zcmbW1OKTHR6vuBKwXwF-_*eugb{174+9A;j(u!pA97?doHWJV>Op<9+n`A;VgQ*L( z_`o3wU3THlh2OzdKyjxlzd%Np1i6 zFmxpI+0;w$(as*qrM3}}+H;b*EA70;+LD=^3euq*3>hS4?mJMhjRs^rW<@TB3u;F5yShM;9`<%pM%4l*A!v@=~tJP&UZPb=t|7#$95!^YhJewL2C zL!ah?ue~WQ^vajy_!s^R7k)Z4&viWB`y*U9!SNy&igUp@7f7F=GFOLZ;wL}%-3EQG zCx&ZftL<0$tgq{582QMt!_eZx19)Hn$6f2UlMtS=t<%~YV3W{rpPhCMfE&*a;CBXa zWdJV^;G|k<$@TS?T9NC9E)@G?B4@G-aWN||q|-~OWqDbQXH&A3vtHBXH5HnsmE@vU z(HbP5C@Zx!HIpFuWJ7tds6h_Nrz=LYOk}yKE5!}DSl*CVmGufN$Fdpf@vh;8__yD+ z1sfl=an;7hZ2XOlb2k3g#>Z`(ryTA%-u0dd&CRN=6o}B&8(m*!y@py*1YK?EL?|h` zLWDxINra+St*Y>$LQT_E0p8BE^`$gks~JMQq1DxfzDWeDf?AeW8%mXZNpI?-^mq{A zTXEjx7%((;@4C_9J2n9Wxc4!ZK>ap-N-Y|XfX8{*3kXqufpX`|`$or|4r|!$G6Y!j zsQM^qv1SCC-PrtC-)?Mv=4WA$_3e45-JnbEJg{MCeRl}r5Y_Y0w;S6(#tP8ERHyzr z)#q6v^-lc?aJTadAOvIQgy)A^rf1x3Zq(tw9qkGA_%@G2bLx>f&khg?Qn-nM&1ks; Sg8xZ3Jx|wv@S~s#r~W@J2il?l literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_put_image_to_window.o b/mlx/obj/mlx_put_image_to_window.o new file mode 100644 index 0000000000000000000000000000000000000000..ba86b1207d2aa4abdcd62f2ffdc946f194df3703 GIT binary patch literal 2216 zcmbu9&uD3#g+{{hz?dkg|9ap2T{phrMl5Iv-b)}2|u=WLwyr5)*I=6&9LXD9E6 zzfbAukw5^11>keooe2t1I;|aM zy)C^Y3^R$u1!+3J(5_i+DHfH_$>uDLOS;4*K3i+5@o*dsRVq*Y+}+1>xX+=<=~4JT!!R9s$od zhWSyj=E*>rj?l{0dRs;3Mn%$ZiAQf|yP%S+`N6cY8un$k3jxKOHQ+g66^Lt!^c zSK6%-e1?6I(H)+^@gAQHS&bkX@ktzlKP8Ap{16Vo-xEY5&Tt5Rg8yg{4|}+TF&Vxe zceoS!Be&M7R&fEn)$I9_h?-`lC|l;L1@eueRRnpV)dG33UagunWVO0w%J?SFwyfgf zcYMB7Ys-yhyU&LmU-%2S zC}MBkPkzuR_e*5-YeDzOYY(_y@o4gNtn;-b-i4C3|B6z{!CQUrX%k{}&jQsRFy#Go+vlk5N{{@$A BCY%5O literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_rgb.o b/mlx/obj/mlx_rgb.o new file mode 100644 index 0000000000000000000000000000000000000000..8a5fbd1e08985a4655e1c81af1962901a5fdabbe GIT binary patch literal 38728 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 literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_screen_size.o b/mlx/obj/mlx_screen_size.o new file mode 100644 index 0000000000000000000000000000000000000000..1eb8bb42482525e20b99c30ab93e25fea98483ab GIT binary patch literal 1752 zcmbtT&1(};5T8w|jWx#jaR^i-hpH9rBT)}hP?M%f))FkV4Hcv;o8+Yl%}3dNp=l3F zQN)mo$NmML{SylM7wE;Kc=F&yL=X|`%;vpjv)x{F;4w45`FQhY<~_?6asf>PMH<|P zp{7uPz2HzzIbsUVKp1|Uz5KhV_kJ$xy^s3tw>>oJ{jHGRe^Al;V^^k0@4c9Mg*>^h z_r83k*#7)fsFx)c?gjP!z+BO94E#G`efK>jO71^dd*=i|K9iY^PZvv_mgvNj33i($ zW|AF8O+LMqV2L}|B~1B|#_&Y(oWPTRRD=M)K4Iz^7f~kCc9uZvMzzWCc<41g{3c?T z91B2|cs3G!8JLg6o(C5qZ?(X~iAXFHiKZi=^l9nl%czHA@cqEg81(Hh)uyT&jS4!i z8O2Bo!pWncgO4ABhmOIiOQUoF)$^`8on9bz4G;CzOZO1)!*W!Uu{ z&dLt5&V?HVBVSmYOBamATy8nLVyvX+3Rwdl=eby|w<_(ev=COk)DheU!?1-}-Z09w z4Wnw-8-ogyvQU~m4eZasfJ!br?84&`$9ZRVKTwH0$9Zq zCa{ui11q?YAbJxeJE$v?}cB&0rpobFMZ6_fZ?iF-HtjkJ3i@0A$33Hcayqb@mVw~+3okit+-^b?*iKB7mn-@>YrpxTyn)!|CC-rfpU7|e@O>j zIZE!0Uqjq)eo@&_H7A-M#j1FP``t}frQ}2JN=|?3lutZi-q|4pUHPCgDK3)f4v}*x P`NdC5P=4=2e{cL>qFA2L literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_set_font.o b/mlx/obj/mlx_set_font.o new file mode 100644 index 0000000000000000000000000000000000000000..39f04a36c7eecb5478b930bc788f99d28aa7ab61 GIT binary patch literal 1848 zcmbtU-D?v;5TEN+8*6)wB3P(s9z+!Fa`6M9LQVRSUhQe2X`rI@xU^Rb=A$GRNPW-; zQ4IA#eCnSg;)CF;e}hzf5>bi@b>^~@Y}f0P1Dl!o&HQF(cjxkS+RgPC2Cx_~4qcB? zfL*g|XCgBLgD?Q!hfe>>F3z?-6`a-&XX_e;@=oiw^ZaMyqO*0wZGGM$%-L!r&~;kx z?kzj5Lj+~-e<8ItbY_a;H>13-9|=R5nVcL;oi7v{m9UXY+v19_N7IeSO+UG83;XH? z2}kL@_?yHhZl;x!)h5@M&K2*3jAoRxglGi43G zFz2k)v)%{&)^OHJ&RU7NqcSa4(Vg|ex4pQa8GEDD8+W&#Wnv{==xm09CzJ#e4l7>Q zG@-BSD3%E-yBjd0+w1ydoy2uq=|8$7#LnWPo^%;QAP%280Ka_z4&_qQs|TUCR;`3$ z1tMkdL&2MI=O?nRH=oPprx(4&?1Ve*!IE3`S98dMrF;;!jY6fwplq0X#5sv>_0L{g z=v*Z90t2`hzfK^Ep6|BdDBnVx^T!o@P{C6Yr#iGcBI=vv&@Y0hhqbm|XR8*Jd=UoC z5X7n<`XGw+I*65Oxg6jrMWq@B0%v}-9{MYfr2nwe5F54XMoyv^ha)=2LxDcz@RPov^Luy;mK@)^l%RjK1!DGlc#J$w^7g zO7Fjj0jjCNEN%Y&{{bvd#Lj*WwtkSVETsysUxI>%ms>ayljZD za*YT}ZlSBSsd*DNbOQJZHue;4M07u_3yYl(Tw&33zdj`P+-r!6-u1>Iu_UaDF9k(> zCrpBsA)aXwy+N@@7Ciy6Ga$MHVsrQ?>*j3m4C~3aU8hl(;|b$8@UJ*n<)UAGkYVH^ zjfWxSO*MFP4UW5cP&y#&s8}c6GhnAdasR935&$PYQiCUIaJ2?stig>MoMh5VYQZ!X zvh!-*GNoh{AZj!=8jxe^Xe2Too=_*`KrF1%q=l@h&g-DL+?<-srE>;J1XEgeUXKO| zv`p(+k_Z{vt#R6(BqC|6kRmEfrzIEFWNJ~psV$^oVIY^whMpkam_NH^!TX4UcefRk z^C^TN$lE|UUqJ|hTm)Mmk&M%kvg zXXt57GW8{sNOPL05oxwiAW|}y$>>>N*_^3M@D}^&_p^9DYe{({m)8w*nMkyQo>Ffb zT1MZS@_!r;6yqDKegS@9DEz*bqr-Qz3kGm+{5*l#59|qUvbY5-&ck0$C*x-suYR$P z51!?+Qfkh@FZTS`dLPu{y1by3!so~Sm4dk_+zwRubb$Tz@q|j~kUInn|7GwVRf?C@ zdnzILeE&F}1qV~B>&IAqo+mO}T|W)n>HP8tLHIf0`C%=u=iF&-tShnkx0uB@d&Hq0 hS@qcgA_)f9F{lvMZjT%TWct)KmU?B!S2{{=5L`&j@0 literal 0 HcmV?d00001 diff --git a/mlx/obj/mlx_xpm.o b/mlx/obj/mlx_xpm.o new file mode 100644 index 0000000000000000000000000000000000000000..e49a68edfe75a12e48320bf80201064a480ace3b GIT binary patch literal 8312 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 Ak^lez literal 0 HcmV?d00001 diff --git a/mlx/rgb2c.pl b/mlx/rgb2c.pl new file mode 100644 index 0000000..9ef39a0 --- /dev/null +++ b/mlx/rgb2c.pl @@ -0,0 +1,38 @@ +#!/usr/bin/perl +# +## rgb2c.pl for MiniLibX in /home/boulon/work/c/raytraceur/minilibx +## +## Made by Olivier Crouzet +## Login +## +## Started on Tue Oct 5 16:33:46 2004 Olivier Crouzet +## Last update Tue Oct 5 16:36:11 2004 Olivier Crouzet +## + + +# +# Generate a .c file with encoded colors, from the XFree86 rgb.txt file. +# + +open(RGB, "/usr/X11/lib/X11/rgb.txt"); + + +printf("/*\n** This is a generated file with rgb2c.pl and rgb.txt from\n"); +printf("** the XFree86 distribution.\n*/\n\n"); +printf("struct s_col_name mlx_col_name[] =\n{\n"); + +while () +{ + @tab = split; + if ($tab[0] ne "!") + { + $color = $tab[3]; + if ("$tab[4]" ne "") + { + $color = "$tab[3] $tab[4]"; + } + printf(" { \"%s\" , 0x%x },\n", $color, $tab[0]*65536+$tab[1]*256+$tab[2]); + } +} + +printf(" { 0, 0 }\n};\n"); diff --git a/mlx/test/Makefile.gen b/mlx/test/Makefile.gen new file mode 100644 index 0000000..df8ed9b --- /dev/null +++ b/mlx/test/Makefile.gen @@ -0,0 +1,45 @@ +INC=/usr/include + + +INCLIB=$(INC)/../lib + +UNAME := $(shell uname) + +CFLAGS= -I$(INC) -O3 -I.. -g + +NAME= mlx-test +SRC = main.c +OBJ = $(SRC:%.c=%.o) + +LFLAGS = -L.. -lmlx -L$(INCLIB) -lXext -lX11 -lm + +ifeq ($(UNAME), Darwin) + # mac + CC = clang +else ifeq ($(UNAME), FreeBSD) + # FreeBSD + CC = clang +else + #Linux and others... + CC = gcc + LFLAGS += -lbsd +endif + +all: $(NAME) + +$(NAME): $(OBJ) + $(CC) -o $(NAME) $(OBJ) $(LFLAGS) + +show: + @printf "UNAME : $(UNAME)\n" + @printf "NAME : $(NAME)\n" + @printf "CC : $(CC)\n" + @printf "CFLAGS : $(CFLAGS)\n" + @printf "LFLAGS : $(LFLAGS)\n" + @printf "SRC :\n $(SRC)\n" + @printf "OBJ :\n $(OBJ)\n" + +clean: + rm -f $(NAME) $(OBJ) *~ core *.core + +re: clean all diff --git a/mlx/test/Makefile.mk b/mlx/test/Makefile.mk new file mode 100644 index 0000000..256235b --- /dev/null +++ b/mlx/test/Makefile.mk @@ -0,0 +1,45 @@ + +INC=%%%% + +INCLIB=$(INC)/../lib + +UNAME := $(shell uname) + +CFLAGS= -I$(INC) -O3 -I.. -g + +NAME= mlx-test +SRC = main.c +OBJ = $(SRC:%.c=%.o) + +LFLAGS = -L.. -lmlx -L$(INCLIB) -lXext -lX11 -lm + +ifeq ($(UNAME), Darwin) + # mac + CC = clang +else ifeq ($(UNAME), FreeBSD) + # FreeBSD + CC = clang +else + #Linux and others... + CC = gcc + LFLAGS += -lbsd +endif + +all: $(NAME) + +$(NAME): $(OBJ) + $(CC) -o $(NAME) $(OBJ) $(LFLAGS) + +show: + @printf "UNAME : $(UNAME)\n" + @printf "NAME : $(NAME)\n" + @printf "CC : $(CC)\n" + @printf "CFLAGS : $(CFLAGS)\n" + @printf "LFLAGS : $(LFLAGS)\n" + @printf "SRC :\n $(SRC)\n" + @printf "OBJ :\n $(OBJ)\n" + +clean: + rm -f $(NAME) $(OBJ) *~ core *.core + +re: clean all diff --git a/mlx/test/main.c b/mlx/test/main.c new file mode 100644 index 0000000..578eaae --- /dev/null +++ b/mlx/test/main.c @@ -0,0 +1,287 @@ + +#include "mlx.h" +#include "mlx_int.h" + +#define WIN1_SX 242 +#define WIN1_SY 242 +#define IM1_SX 42 +#define IM1_SY 42 +#define IM3_SX 242 +#define IM3_SY 242 + +void *mlx; +void *win1; +void *win2; +void *win3; +void *im1; +void *im2; +void *im3; +void *im4; +int bpp1; +int bpp2; +int bpp3; +int bpp4; +int sl1; +int sl2; +int sl3; +int sl4; +int endian1; +int endian2; +int endian3; +int endian4; +char *data1; +char *data2; +char *data3; +char *data4; +int xpm1_x; +int xpm1_y; + +int local_endian; + +int color_map_1(void *win,int w,int h); +int color_map_2(unsigned char *data,int bpp,int sl,int w,int h,int endian, int type); + +int expose_win1(void *p) +{ + mlx_put_image_to_window(mlx,win1,im3,0,0); +} + +int expose_win2(void *p) +{ + mlx_put_image_to_window(mlx,win2,im4,0,0); + mlx_put_image_to_window(mlx,win2,im2,0,0); +} + +int key_win1(int key,void *p) +{ + printf("Key in Win1 : %d\n",key); + if (key==0xFF1B) + exit(0); +} + +int key_win2(int key,void *p) +{ + printf("Key in Win2 : %d\n",key); + if (key==0xFF1B) + exit(0); +} + +int key_win3(int key,void *p) +{ + printf("Key in Win3 : %d\n",key); + if (key==0xFF1B) + mlx_destroy_window(mlx,win3); +} + +int mouse_win1(int button,int x,int y, void *p) +{ + printf("Mouse in Win1, button %d at %dx%d.\n",button,x,y); +} + +int mouse_win2(int button,int x,int y, void *p) +{ + printf("Mouse in Win2, button %d at %dx%d.\n",button,x,y); +} + +int mouse_win3(int x,int y, void *p) +{ + printf("Mouse moving in Win3, at %dx%d.\n",x,y); +} + + +int main() +{ + int a; + + printf("MinilibX Test Program\n"); + a = 0x11223344; + if (((unsigned char *)&a)[0] == 0x11) + local_endian = 1; + else + local_endian = 0; + printf(" => Local Endian : %d\n",local_endian); + + printf(" => Connection ..."); + if (!(mlx = mlx_init())) + { + printf(" !! KO !!\n"); + exit(1); + } + printf("OK (use_xshm %d pshm_format %d)\n",((t_xvar *)mlx)->use_xshm,((t_xvar *)mlx)->pshm_format); + + printf(" => Window1 %dx%d \"Title 1\" ...",WIN1_SX,WIN1_SY); + if (!(win1 = mlx_new_window(mlx,WIN1_SX,WIN1_SY,"Title1"))) + { + printf(" !! KO !!\n"); + exit(1); + } + printf("OK\n"); + + printf(" => Colormap sans event ..."); + color_map_1(win1,WIN1_SX,WIN1_SY); + printf("OK\n"); + sleep(2); + + printf(" => Clear Window ..."); + mlx_clear_window(mlx,win1); + printf("OK\n"); + sleep(2); + + printf(" => Image1 ZPixmap %dx%d ...",IM1_SX,IM1_SY); + if (!(im1 = mlx_new_image(mlx,IM1_SX,IM1_SY))) + { + printf(" !! KO !!\n"); + exit(1); + } + data1 = mlx_get_data_addr(im1,&bpp1,&sl1,&endian1); + printf("OK (bpp1: %d, sizeline1: %d endian: %d type: %d)\n",bpp1,sl1,endian1, + ((t_img *)im1)->type); + + printf(" => Fill Image1 ..."); + color_map_2(data1,bpp1,sl1,IM1_SX,IM1_SY,endian1, 1); + printf("OK (pixmap : %d)\n",(int)((t_img *)im1)->pix); + + printf(" => Put Image1 ..."); + mlx_put_image_to_window(mlx,win1,im1,20,20); + printf("OK\n"); + sleep(2); + + printf(" => Destroy Image1 ... "); + mlx_destroy_image(mlx, im1); + printf("OK\n"); + sleep(2); + + printf(" => Image3 ZPixmap %dx%d ...",IM3_SX,IM3_SY); + if (!(im3 = mlx_new_image(mlx,IM3_SX,IM3_SY))) + { + printf(" !! KO !!\n"); + exit(1); + } + data3 = mlx_get_data_addr(im3,&bpp3,&sl3,&endian3); + printf("OK (bpp3 %d, sizeline3 %d endian3 %d type %d)\n",bpp3,sl3,endian3, + ((t_img *)im3)->type); + + printf(" => Fill Image3 ..."); + color_map_2(data3,bpp3,sl3,IM3_SX,IM3_SY,endian3, 1); + printf("OK (pixmap : %d)\n",(int)((t_img *)im3)->pix); + + printf(" => Put Image3 ..."); + mlx_put_image_to_window(mlx,win1,im3,20,20); + printf("OK\n"); + sleep(2); + + printf(" => String ..."); + mlx_string_put(mlx,win1,5,WIN1_SY/2,0xFF99FF,"String output"); + mlx_string_put(mlx,win1,15,WIN1_SY/2+20,0x00FFFF,"MinilibX test"); + printf("OK\n"); + sleep(2); + + printf(" => Xpm from file ..."); + if (!(im2 = mlx_xpm_file_to_image(mlx,"open.xpm",&xpm1_x,&xpm1_y))) + { + printf(" !! KO !!\n"); + exit(1); + } + data2 = mlx_get_data_addr(im2,&bpp2,&sl2,&endian2); + printf("OK (xpm %dx%d)(img bpp2: %d, sizeline2: %d endian: %d type: %d)\n", + xpm1_x,xpm1_y,bpp2,sl2,endian2,((t_img *)im2)->type); + sleep(2); + + printf(" => Put xpm ..."); + mlx_put_image_to_window(mlx,win1,im2,0,0); + mlx_put_image_to_window(mlx,win1,im2,100,100); + printf("OK\n"); + sleep(2); + + printf(" => 2nd window,"); + win2 = mlx_new_window(mlx,WIN1_SX,WIN1_SY,"Title2"); + if (!(im4 = mlx_new_image(mlx,IM3_SX, IM3_SY))) + { + printf(" !! KO !!\n"); + exit(1); + } + data4 = mlx_get_data_addr(im4,&bpp4,&sl4,&endian4); + color_map_2(data4,bpp4,sl4,IM3_SX,IM3_SY,endian4, 2); + + printf(" 3rd window, Installing hooks ..."); + win3 = mlx_new_window(mlx,WIN1_SX,WIN1_SY,"Title3"); + mlx_expose_hook(win1,expose_win1,0); + mlx_mouse_hook(win1,mouse_win1,0); + mlx_key_hook(win1,key_win1,0); + mlx_expose_hook(win2,expose_win2,0); + mlx_mouse_hook(win2,mouse_win2,0); + mlx_key_hook(win2,key_win2,0); + mlx_key_hook(win3,key_win3,0); + + mlx_hook(win3, MotionNotify, PointerMotionMask, mouse_win3, 0); + + printf("OK\nNow in Loop. Just play. Esc in 3 to destroy, 1&2 to quit.\n"); + + mlx_loop(mlx); +} + + +int color_map_1(void *win,int w,int h) +{ + int x; + int y; + int color; + + x = w; + while (x--) + { + y = h; + while (y--) + { + color = (x*255)/w+((((w-x)*255)/w)<<16)+(((y*255)/h)<<8); + mlx_pixel_put(mlx,win,x,y,color); + } + } +} + + +int color_map_2(unsigned char *data,int bpp,int sl,int w,int h,int endian, int type) +{ + int x; + int y; + int opp; + int dec; + int color; + int color2; + unsigned char *ptr; + + opp = bpp/8; + printf("(opp : %d) ",opp); + y = h; + while (y--) + { + ptr = data+y*sl; + x = w; + while (x--) + { + if (type==2) + color = (y*255)/w+((((w-x)*255)/w)<<16) + +(((y*255)/h)<<8); + else + color = (x*255)/w+((((w-x)*255)/w)<<16)+(((y*255)/h)<<8); + color2 = mlx_get_color_value(mlx,color); + dec = opp; + while (dec--) + if (endian==local_endian) + { + if (endian) + *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[4-opp+dec]; + else + *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[dec]; + } + else + { + if (endian) + *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[opp-1-dec]; + else + *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[3-dec]; + } + } + } + +} diff --git a/mlx/test/main.o b/mlx/test/main.o new file mode 100644 index 0000000000000000000000000000000000000000..0af73ccf7a09f036aed67fe0e3b2c65c34cf4324 GIT binary patch literal 63864 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 V@v+8f=0xSQKd>dzRQpxd`G1M177G9X literal 0 HcmV?d00001 diff --git a/mlx/test/mlx-test b/mlx/test/mlx-test new file mode 100644 index 0000000000000000000000000000000000000000..48a7fed53a26ab8f352d1e5902bdbae386ba15b9 GIT binary patch literal 102256 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 c #2D3031", +", c #D7E1E7", +"' c #4D5157", +") c #8997A5", +"! c #282E31", +"~ c #333B41", +"{ c #A5C6DB", +"] c #718C9B", +"^ c #000000", +"/ c #181B1F", +"( c #262828", +"_ c #D2DEE7", +": c #B8C5D0", +"< c #151719", +"[ c #08090B", +"} c #272B30", +"| c #2D3037", +"1 c #26282C", +"2 c #1A1D1F", +"3 c #B1CADB", +"4 c #56646E", +"5 c #080809", +"6 c #080A0C", +"7 c #1E2126", +"8 c #98B7C9", +"9 c #A2CAE2", +"0 c #7FA1B5", +"a c #06080A", +"b c #252729", +"c c #A7ADB2", +"d c #272B2E", +"e c #1E2023", +"f c #C8D8E5", +"g c #C9DDED", +"h c #8996A3", +"i c #6B7782", +"j c #C7DFF0", +"k c #CCE0F0", +"l c #AFC1CF", +"m c #47535B", +"n c #B0D3E8", +"o c #7E99A9", +"p c #738493", +"q c #97B4C7", +"r c #53606A", +"s c #6E8996", +"t c #A1CBE3", +"u c #9CC6DE", +"v c #90B5CB", +"w c #171D22", +"x c #1E2629", +"y c #020202", +"z c #ABB3BA", +"A c #BBC4C8", +"B c #222323", +"C c #141617", +"D c #5D6164", +"E c #ACB5BC", +"F c #676D74", +"G c #BDD4E5", +"H c #B3D1E7", +"I c #B0D1E7", +"J c #728A99", +"K c #94AEBF", +"L c #B1D1E7", +"M c #505C64", +"N c #7B98A9", +"O c #A1CBE0", +"P c #99C3D9", +"Q c #475863", +"R c #A0C9DE", +"S c #9CC6DA", +"T c #9ECAE1", +"U c #9CC5DD", +"V c #9AC4DC", +"W c #263137", +"X c #3C4A55", +"Y c #658190", +"Z c #66686B", +"` c #7D8085", +" . c #363839", +".. c #797E81", +"+. c #D2DBE1", +"@. c #DDE9F4", +"#. c #CADEEF", +"$. c #778593", +"%. c #AED0E5", +"&. c #9EC9DE", +"*. c #9EC8DF", +"=. c #9BC1D8", +"-. c #9EC8DE", +";. c #6B8596", +">. c #9BC5DC", +",. c #9BC6DF", +"'. c #9CC5DC", +"). c #688595", +"!. c #6B8698", +"~. c #9CC4DC", +"{. c #9BC4DC", +"]. c #9DC5DD", +"^. c #647D8C", +"/. c #485864", +"(. c #161A1D", +"_. c #36444C", +":. c #95BDD5", +"<. c #566E7E", +"[. c #A4AAAD", +"}. c #E9F2F7", +"|. c #DEEAF6", +"1. c #B5D4E9", +"2. c #A9CFE3", +"3. c #90B3C9", +"4. c #9FCAE1", +"5. c #9BC4DD", +"6. c #7490A2", +"7. c #99C2DB", +"8. c #81A5BA", +"9. c #9CC5DE", +"0. c #98C1DA", +"a. c #5F7889", +"b. c #96BFD8", +"c. c #44545F", +"d. c #565A5E", +"e. c #DFE6EC", +"f. c #E6EEF7", +"g. c #D6E4F2", +"h. c #BFD6E9", +"i. c #A9CCE3", +"j. c #9FC8DD", +"k. c #9DC6DD", +"l. c #9CC4DD", +"m. c #7D9FB0", +"n. c #98C0D6", +"o. c #9AC5DD", +"p. c #97BFD8", +"q. c #9BC5DF", +"r. c #2D3840", +"s. c #626567", +"t. c #E7ECF5", +"u. c #E1EAF5", +"v. c #CEE3F3", +"w. c #B7D6EA", +"x. c #A4CBE0", +"y. c #8AAFC5", +"z. c #647F90", +"A. c #648092", +"B. c #89B0C7", +"C. c #9CC6DF", +"D. c #5D7486", +"E. c #7B9BAF", +"F. c #84A8BF", +"G. c #9BC5DD", +"H. c #96BED5", +"I. c #4B5D69", +"J. c #9BC5DE", +"K. c #536B77", +"L. c #2E3B41", +"M. c #1B2124", +"N. c #3F4F58", +"O. c #4D5152", +"P. c #E7EEF3", +"Q. c #E2EAF5", +"R. c #CEE2F2", +"S. c #BAD5E9", +"T. c #9DC2D7", +"U. c #5C7281", +"V. c #232A31", +"W. c #08090A", +"X. c #121418", +"Y. c #131619", +"Z. c #131719", +"`. c #87ACC3", +" + c #7B9BAE", +".+ c #87ADC3", +"++ c #8FB5CB", +"@+ c #678295", +"#+ c #96C0D8", +"$+ c #607787", +"%+ c #6B8595", +"&+ c #96C1DB", +"*+ c #6A8595", +"=+ c #35424A", +"-+ c #7090A1", +";+ c #15191C", +">+ c #2D3033", +",+ c #DDE5EB", +"'+ c #D2E3F1", +")+ c #BAD7EB", +"!+ c #A9CFE5", +"~+ c #272F35", +"{+ c #1C2227", +"]+ c #4F697B", +"^+ c #6B8FA9", +"/+ c #759CB6", +"(+ c #7BA0BB", +"_+ c #80A5BC", +":+ c #88B0C8", +"<+ c #96C3DB", +"[+ c #8FB6CD", +"}+ c #80A1B3", +"|+ c #556876", +"1+ c #96BFD7", +"2+ c #566B77", +"3+ c #93B8CD", +"4+ c #637A8D", +"5+ c #9DC6DE", +"6+ c #8FB4CA", +"7+ c #55697A", +"8+ c #6F8F9F", +"9+ c #91BDD5", +"0+ c #283239", +"a+ c #050406", +"b+ c #767B80", +"c+ c #BDC6CE", +"d+ c #D4E5F3", +"e+ c #C1D7EA", +"f+ c #A7CDE4", +"g+ c #9FC9DE", +"h+ c #668596", +"i+ c #6D90AA", +"j+ c #5C7994", +"k+ c #60849F", +"l+ c #6286A1", +"m+ c #688CA8", +"n+ c #7298B2", +"o+ c #82A8C2", +"p+ c #8FBAD5", +"q+ c #96C2DB", +"r+ c #89ADC4", +"s+ c #96BED6", +"t+ c #99C2DA", +"u+ c #6C899A", +"v+ c #92BBD2", +"w+ c #9AC4DD", +"x+ c #5B717D", +"y+ c #9EC6DE", +"z+ c #8BB1C9", +"A+ c #718EA0", +"B+ c #94C3DB", +"C+ c #536B78", +"D+ c #3E505F", +"E+ c #4E6373", +"F+ c #2C333C", +"G+ c #070708", +"H+ c #040404", +"I+ c #1A1C1E", +"J+ c #202326", +"K+ c #050606", +"L+ c #23292E", +"M+ c #A1C0D4", +"N+ c #9FC9DD", +"O+ c #97C2DB", +"P+ c #80A8C1", +"Q+ c #668AA6", +"R+ c #4B5D72", +"S+ c #4C647A", +"T+ c #5F80A0", +"U+ c #60859E", +"V+ c #678AA6", +"W+ c #739BB5", +"X+ c #85AEC7", +"Y+ c #92BDD7", +"Z+ c #96BFD5", +"`+ c #627B8A", +" @ c #89B1C9", +".@ c #2B353C", +"+@ c #7597B2", +"@@ c #779CB8", +"#@ c #52697C", +"$@ c #1D2328", +"%@ c #445663", +"&@ c #5E7A8D", +"*@ c #252F37", +"=@ c #090909", +"-@ c #859BB2", +";@ c #859DB8", +">@ c #6E8396", +",@ c #252C33", +"'@ c #9CC4D7", +")@ c #92C0D9", +"!@ c #79A0BA", +"~@ c #6487A3", +"{@ c #566979", +"]@ c #8CB0C2", +"^@ c #51697C", +"/@ c #60849D", +"(@ c #6D8EAC", +"_@ c #7BA0BC", +":@ c #8AB4CE", +"<@ c #95C2DB", +"[@ c #9AC5DC", +"}@ c #95C1DA", +"|@ c #607B8C", +"1@ c #597488", +"2@ c #7EA6BF", +"3@ c #597587", +"4@ c #455664", +"5@ c #668598", +"6@ c #82A9C4", +"7@ c #617F92", +"8@ c #1A2328", +"9@ c #2B3137", +"0@ c #728FAC", +"a@ c #51657B", +"b@ c #6B8AA8", +"c@ c #8EAEC7", +"d@ c #A8C8E2", +"e@ c #92BDD6", +"f@ c #769DBA", +"g@ c #526E87", +"h@ c #7490A0", +"i@ c #A6CDE4", +"j@ c #97BFD4", +"k@ c #55697D", +"l@ c #6286A0", +"m@ c #7399B3", +"n@ c #84ACC5", +"o@ c #92BFD9", +"p@ c #99C4DC", +"q@ c #94C0DA", +"r@ c #4F6575", +"s@ c #7DA5BF", +"t@ c #7FA2BC", +"u@ c #8FB6CE", +"v@ c #95C3DB", +"w@ c #8EB8D2", +"x@ c #6A879D", +"y@ c #111318", +"z@ c #252A30", +"A@ c #81868C", +"B@ c #A5ABAD", +"C@ c #70767C", +"D@ c #38434F", +"E@ c #637F9B", +"F@ c #516980", +"G@ c #799AB5", +"H@ c #A5C3D9", +"I@ c #93BDD6", +"J@ c #779EBA", +"K@ c #445A6B", +"L@ c #93B5C9", +"M@ c #B6D3E8", +"N@ c #AECFE4", +"O@ c #95BDD2", +"P@ c #52687A", +"Q@ c #6486A3", +"R@ c #7092B0", +"S@ c #90BCD6", +"T@ c #97C4DC", +"U@ c #A0C9E0", +"V@ c #99C5DD", +"W@ c #86AEC6", +"X@ c #8FBAD4", +"Y@ c #91BDD6", +"Z@ c #7094AC", +"`@ c #2A353E", +" # c #0B0E10", +".# c #888D90", +"+# c #787D82", +"@# c #465360", +"## c #56697F", +"$# c #A6CADD", +"%# c #5A7382", +"&# c #6C8CAA", +"*# c #A5BED3", +"=# c #A7CAE0", +"-# c #94C1DA", +";# c #7EA4BF", +"># c #415160", +",# c #9DC3D5", +"'# c #B3CFE1", +")# c #AAC3D4", +"!# c #A8CDE4", +"~# c #89ACBE", +"{# c #567088", +"]# c #6C91AC", +"^# c #81A7C2", +"/# c #96C4DC", +"(# c #85A9BD", +"_# c #708C9B", +":# c #5A6E7B", +"<# c #6C8695", +"[# c #97C3DB", +"}# c #8BB5CE", +"|# c #425461", +"1# c #63819E", +"2# c #415465", +"3# c #0B0D0E", +"4# c #607387", +"5# c #687D8C", +"6# c #B8D6E9", +"7# c #7893A2", +"8# c #576F85", +"9# c #A7BACF", +"0# c #B0CEE5", +"a# c #98C4DC", +"b# c #88B1CA", +"c# c #36444E", +"d# c #8FA0AD", +"e# c #73818D", +"f# c #596D81", +"g# c #B4D0E4", +"h# c #A3CDE2", +"i# c #658296", +"j# c #6A8DAB", +"k# c #7BA5C0", +"l# c #94BAD2", +"m# c #6D899B", +"n# c #99C3DC", +"o# c #8EB9D2", +"p# c #7AA0BA", +"q# c #6C8FAB", +"r# c #6484A1", +"s# c #1F252C", +"t# c #121619", +"u# c #7E96B0", +"v# c #7A8A96", +"w# c #BCD7EA", +"x# c #A0C5D9", +"y# c #3C4B57", +"z# c #A9BACD", +"A# c #BCD5E8", +"B# c #84A6BA", +"C# c #8EA1AE", +"D# c #CFD1D4", +"E# c #ECF6FA", +"F# c #ABB7C2", +"G# c #556F84", +"H# c #57626A", +"I# c #5C7078", +"J# c #6C8AA7", +"K# c #80A6C0", +"L# c #91B8D0", +"M# c #94BFD8", +"N# c #87B0CA", +"O# c #7CA2BB", +"P# c #7097AF", +"Q# c #495E6F", +"R# c #0C0E11", +"S# c #3A3F43", +"T# c #8AA3BB", +"U# c #778592", +"V# c #C0D8EB", +"W# c #B3D5E9", +"X# c #404A53", +"Y# c #B2C2D3", +"Z# c #96A1AC", +"`# c #9DB2C3", +" $ c #AEBECE", +".$ c #EDEFF3", +"+$ c #F7FAFC", +"@$ c #B6BFC7", +"#$ c #556E85", +"$$ c #121314", +"%$ c #2B2E2F", +"&$ c #555A5E", +"*$ c #3B4C5B", +"=$ c #6F8EA4", +"-$ c #92BED8", +";$ c #9DC7DF", +">$ c #87ACC1", +",$ c #546A78", +"'$ c #516874", +")$ c #4E6570", +"!$ c #4D6271", +"~$ c #4C6271", +"{$ c #4E677A", +"]$ c #38454E", +"^$ c #6C7278", +"/$ c #86A1B6", +"($ c #5C656C", +"_$ c #A4B0BA", +":$ c #555D64", +"<$ c #657178", +"[$ c #A6B0B5", +"}$ c #939CA1", +"|$ c #D4E4F1", +"1$ c #A0BACE", +"2$ c #B9C7D7", +"3$ c #F6F7F9", +"4$ c #C6CED1", +"5$ c #506A7C", +"6$ c #060607", +"7$ c #676A6B", +"8$ c #91999F", +"9$ c #7CA3BE", +"0$ c #96BCD4", +"a$ c #5B717E", +"b$ c #4B5F6C", +"c$ c #455864", +"d$ c #5B717F", +"e$ c #81A5B9", +"f$ c #98C4DD", +"g$ c #93BFD8", +"h$ c #87B1CA", +"i$ c #7BA1BC", +"j$ c #5A7489", +"k$ c #222A33", +"l$ c #838A92", +"m$ c #9DADBC", +"n$ c #ECF0F5", +"o$ c #F1F9FB", +"p$ c #818A8D", +"q$ c #4A5155", +"r$ c #6A6F72", +"s$ c #7E898F", +"t$ c #E6F1F7", +"u$ c #CADCED", +"v$ c #A0B7CC", +"w$ c #C6D1DF", +"x$ c #AFB3B4", +"y$ c #5F707D", +"z$ c #CBCFD1", +"A$ c #F4F5F6", +"B$ c #66737F", +"C$ c #87B2CB", +"D$ c #90B7CD", +"E$ c #596E7B", +"F$ c #586F7E", +"G$ c #8BB0C8", +"H$ c #91BED6", +"I$ c #83ADC7", +"J$ c #6D8EA7", +"K$ c #3F5161", +"L$ c #2D3A45", +"M$ c #1F2020", +"N$ c #BDC5CC", +"O$ c #E0EDF5", +"P$ c #BBCAD8", +"Q$ c #E1E4E7", +"R$ c #5E6368", +"S$ c #5B5F62", +"T$ c #D9E7F3", +"U$ c #A4C3D6", +"V$ c #89A3B3", +"W$ c #7B91A1", +"X$ c #627990", +"Y$ c #42505A", +"Z$ c #CACCCE", +"`$ c #F9F9F9", +" % c #FDFDFD", +".% c #BCBEC0", +"+% c #5C7689", +"@% c #8DB9D3", +"#% c #8FB5CC", +"$% c #536471", +"%% c #98C1D9", +"&% c #91BED7", +"*% c #81AAC5", +"=% c #597386", +"-% c #41535F", +";% c #6486A2", +">% c #4D667D", +",% c #070809", +"'% c #44484E", +")% c #BEC8D0", +"!% c #8096A6", +"~% c #516473", +"{% c #A9ACAF", +"]% c #8B8F91", +"^% c #A8B3BD", +"/% c #C5DAEB", +"(% c #9FC8E1", +"_% c #8FBCD6", +":% c #81A8C2", +"<% c #6C90AC", +"[% c #56728C", +"}% c #585B5F", +"|% c #CBCDCD", +"1% c #C1C3C6", +"2% c #4F565F", +"3% c #82ABC3", +"4% c #93BCD3", +"5% c #95BED7", +"6% c #8EB9D3", +"7% c #5B788B", +"8% c #627E91", +"9% c #7FA7C1", +"0% c #6C91AB", +"a% c #546F87", +"b% c #6F7376", +"c% c #D5E2EF", +"d% c #A9C4D8", +"e% c #81A1BA", +"f% c #333940", +"g% c #5F6B76", +"h% c #C0D5E8", +"i% c #AACCE2", +"j% c #8EB8D3", +"k% c #7FA5BF", +"l% c #7095B0", +"m% c #4E697E", +"n% c #07090A", +"o% c #0D0F10", +"p% c #7193A6", +"q% c #96C3DC", +"r% c #8EBCD7", +"s% c #91BDD7", +"t% c #8FBBD6", +"u% c #7699AD", +"v% c #4D626F", +"w% c #252D33", +"x% c #101215", +"y% c #0C0D0E", +"z% c #0A0C0E", +"A% c #06090A", +"B% c #7F8488", +"C% c #D7E3F1", +"D% c #B6D0E4", +"E% c #A3C2D7", +"F% c #596872", +"G% c #A9BED0", +"H% c #B4D0E5", +"I% c #9EC8DC", +"J% c #8FB9D4", +"K% c #85ADC7", +"L% c #7FA4BE", +"M% c #4B606F", +"N% c #4E6372", +"O% c #89B6D0", +"P% c #92C1DA", +"Q% c #9DC7DD", +"R% c #95C0DA", +"S% c #94BED8", +"T% c #8BB8D1", +"U% c #7AA0B9", +"V% c #4E667A", +"W% c #344151", +"X% c #0C0D0F", +"Y% c #8A8F92", +"Z% c #D4E6F5", +"`% c #BCD5E9", +" & c #8599A5", +".& c #939DA6", +"+& c #C4DAEB", +"@& c #89A6B9", +"#& c #7D9FB5", +"$& c #98C3DC", +"%& c #95C0D9", +"&& c #7CA2B9", +"*& c #7697AE", +"=& c #698498", +"-& c #7394A8", +";& c #9EC7DF", +">& c #8DB1C4", +",& c #6B8594", +"'& c #50636C", +")& c #50626C", +"!& c #7F9FB1", +"~& c #93B8D0", +"{& c #627A88", +"]& c #90B6CC", +"^& c #93BDD7", +"/& c #87AFC9", +"(& c #7291A7", +"_& c #384651", +":& c #121618", +"<& c #12171B", +"[& c #4F6986", +"}& c #597998", +"|& c #324052", +"1& c #969CA1", +"2& c #D6E6F5", +"3& c #C6DCEE", +"4& c #505A64", +"5& c #82929F", +"6& c #99ABBB", +"7& c #A1B9CA", +"8& c #87A0B0", +"9& c #718EA1", +"0& c #8DB2C9", +"a& c #8BAEC4", +"b& c #586D7D", +"c& c #97C0D9", +"d& c #8DB3C9", +"e& c #95B8CD", +"f& c #9DC0D6", +"g& c #6F8B9C", +"h& c #354249", +"i& c #464E54", +"j& c #8A98A5", +"k& c #AABAC7", +"l& c #86939E", +"m& c #41494F", +"n& c #4A5861", +"o& c #97C1DA", +"p& c #5E7888", +"q& c #5C7482", +"r& c #88ACC2", +"s& c #91BFD7", +"t& c #799CB5", +"u& c #47596A", +"v& c #0D0F12", +"w& c #1A2127", +"x& c #56778D", +"y& c #688BA9", +"z& c #5D7F9E", +"A& c #547391", +"B& c #0E1013", +"C& c #9DA6AB", +"D& c #C8DCED", +"E& c #7A8996", +"F& c #B5CEE0", +"G& c #BCDBEC", +"H& c #B9D5EA", +"I& c #8BA2B2", +"J& c #6C8A9D", +"K& c #97BFD7", +"L& c #3E4E59", +"M& c #92B5CB", +"N& c #535F68", +"O& c #454F56", +"P& c #6F7C87", +"Q& c #ABC0D1", +"R& c #C7DCEE", +"S& c #C5DBED", +"T& c #C2D7EA", +"U& c #BFD8EA", +"V& c #BCD7EB", +"W& c #62717B", +"X& c #5B6F7B", +"Y& c #95C3DC", +"Z& c #8BB2C9", +"`& c #485761", +" * c #42525F", +".* c #6686A1", +"+* c #587896", +"@* c #1B2129", +"#* c #5C7A94", +"$* c #7DA2BD", +"%* c #84AEC7", +"&* c #749BB5", +"** c #5C7E9C", +"=* c #27343F", +"-* c #A4A9B2", +";* c #D9E7F4", +">* c #C8DBEC", +",* c #B1C8DA", +"'* c #5D6C76", +")* c #A8C5D8", +"!* c #A6BDD0", +"~* c #B9D6EA", +"{* c #B9D4E9", +"]* c #8198A8", +"^* c #8AADC3", +"/* c #8CB1CA", +"(* c #96C2D8", +"_* c #A3C7DF", +":* c #ADCDE3", +"<* c #ABD0E4", +"[* c #ADCFE3", +"}* c #AACEE4", +"|* c #A4CDE3", +"1* c #A1CBE1", +"2* c #A3CCE3", +"3* c #A2C9DF", +"4* c #41515A", +"5* c #81A2B5", +"6* c #94C0D7", +"7* c #5E7789", +"8* c #526777", +"9* c #516777", +"0* c #6B8CA5", +"a* c #759CBA", +"b* c #658AA5", +"c* c #587798", +"d* c #1B242B", +"e* c #0E1110", +"f* c #101214", +"g* c #202931", +"h* c #59758E", +"i* c #799FBB", +"j* c #84B1CA", +"k* c #86ACC6", +"l* c #354758", +"m* c #A0A6AE", +"n* c #DAE6F2", +"o* c #C4DCEE", +"p* c #B4D2E8", +"q* c #3E4A53", +"r* c #698091", +"s* c #5D7581", +"t* c #A3CAE0", +"u* c #A6CFE5", +"v* c #A5CCE5", +"w* c #718A9C", +"x* c #98C3DB", +"y* c #83ABC7", +"z* c #2E3B46", +"A* c #33414A", +"B* c #678398", +"C* c #8AB3CE", +"D* c #93BED7", +"E* c #97C4DB", +"F* c #42525E", +"G* c #88ACC0", +"H* c #789EB9", +"I* c #7A9FBB", +"J* c #7EA2BD", +"K* c #779DB5", +"L* c #577081", +"M* c #5B7B9B", +"N* c #1D2229", +"O* c #547390", +"P* c #54728D", +"Q* c #6082A0", +"R* c #688EA9", +"S* c #6689A7", +"T* c #6086A0", +"U* c #6285A1", +"V* c #6B8DAA", +"W* c #718FAB", +"X* c #3E5568", +"Y* c #969DA1", +"Z* c #DBE8F4", +"`* c #95ACBD", +" = c #758B9A", +".= c #A4C9DE", +"+= c #698190", +"@= c #667E8A", +"#= c #7D99AA", +"$= c #7B9BAD", +"%= c #6F8C9A", +"&= c #536976", +"*= c #84ADC6", +"== c #6D92AD", +"-= c #62829E", +";= c #43576A", +">= c #2F3B46", +",= c #5C788A", +"'= c #86AFC8", +")= c #93BED8", +"!= c #93BAD5", +"~= c #93BAD2", +"{= c #92BCD4", +"]= c #7EA2B6", +"^= c #3D4D56", +"/= c #485B67", +"(= c #7596A9", +"_= c #8CBBD4", +":= c #90BCD5", +"<= c #91BFD9", +"[= c #789BAD", +"}= c #465B6A", +"|= c #59789A", +"1= c #5D7F9D", +"2= c #5E839C", +"3= c #59799A", +"4= c #415569", +"5= c #2D3A46", +"6= c #2E3B49", +"7= c #4A647C", +"8= c #587690", +"9= c #39485A", +"0= c #7F8589", +"a= c #D9E8F5", +"b= c #CCDEEE", +"c= c #8597A5", +"d= c #B3D2E3", +"e= c #9BB3C4", +"f= c #B2CEE1", +"g= c #B2D1E7", +"h= c #ABCFE6", +"i= c #94B7CB", +"j= c #495C6A", +"k= c #688498", +"l= c #617B8A", +"m= c #85ADC8", +"n= c #78A0B9", +"o= c #62819B", +"p= c #2E3843", +"q= c #485A6C", +"r= c #67889C", +"s= c #8AB5CF", +"t= c #8EB9D1", +"u= c #6C899B", +"v= c #6E91A7", +"w= c #678399", +"x= c #6888A1", +"y= c #323E48", +"z= c #5B7585", +"A= c #98C5DD", +"B= c #83ACC1", +"C= c #2D373F", +"D= c #4B637C", +"E= c #567694", +"F= c #26313C", +"G= c #15191F", +"H= c #4D647A", +"I= c #252F39", +"J= c #5D6163", +"K= c #DDE9F5", +"L= c #CEDFEE", +"M= c #8898A5", +"N= c #B0CBDC", +"O= c #BFDAEC", +"P= c #BFDBEC", +"Q= c #BBDAEC", +"R= c #BAD7EA", +"S= c #6B808F", +"T= c #7297B0", +"U= c #8CB8D1", +"V= c #95C1D9", +"W= c #91BCD6", +"X= c #86AEC8", +"Y= c #7496B3", +"Z= c #6587A2", +"`= c #384958", +" - c #323F4B", +".- c #546A7C", +"+- c #6C88A1", +"@- c #779AB1", +"#- c #658297", +"$- c #3B4A58", +"%- c #33404B", +"&- c #202830", +"*- c #577287", +"=- c #86B1CC", +"-- c #86ACC0", +";- c #6E8797", +">- c #9CC7DF", +",- c #92BCD5", +"'- c #91BCD5", +")- c #8EB6CE", +"!- c #344453", +"~- c #263039", +"{- c #364452", +"]- c #2B3643", +"^- c #2A2D2E", +"/- c #E1EBF4", +"(- c #D2E4F3", +"_- c #A0B2C3", +":- c #8094A1", +"<- c #BAD8EB", +"[- c #B8D6EA", +"}- c #485A6A", +"|- c #789FB9", +"1- c #90BBD3", +"2- c #94C4DC", +"3- c #88B3CD", +"4- c #7A9EB9", +"5- c #698BA8", +"6- c #4D677C", +"7- c #151A1E", +"8- c #1A2125", +"9- c #171C21", +"0- c #1D2329", +"a- c #1D262E", +"b- c #486073", +"c- c #6A8CAA", +"d- c #7CA2BE", +"e- c #90BDD7", +"f- c #9AC5DE", +"g- c #7493A2", +"h- c #708B99", +"i- c #8CB7D1", +"j- c #7494AB", +"k- c #68889F", +"l- c #6A8FA5", +"m- c #7BA2BC", +"n- c #171D21", +"o- c #1D262F", +"p- c #212B36", +"q- c #09090B", +"r- c #BBC2C9", +"s- c #D4E4F2", +"t- c #C1D9EB", +"u- c #44515A", +"v- c #92B5C9", +"w- c #6B8795", +"x- c #4E687E", +"y- c #7EA6C0", +"z- c #91BED8", +"A- c #93BFD9", +"B- c #8CB5D0", +"C- c #7DA4BE", +"D- c #6F92AE", +"E- c #6687A5", +"F- c #526C85", +"G- c #415669", +"H- c #384655", +"I- c #6589A4", +"J- c #6E92AE", +"K- c #80A8C2", +"L- c #92BCD6", +"M- c #91BFD8", +"N- c #799AAF", +"O- c #6A8796", +"P- c #81AAC3", +"Q- c #577187", +"R- c #1F2930", +"S- c #192027", +"T- c #1B2227", +"U- c #0D1010", +"V- c #0E1012", +"W- c #070709", +"X- c #5C6062", +"Y- c #DCE8F3", +"Z- c #C4DCEF", +"`- c #9BB3C6", +" ; c #3A424F", +".; c #313A44", +"+; c #35424C", +"@; c #374655", +"#; c #6E91AD", +"$; c #87B2CC", +"%; c #799EBA", +"&; c #618298", +"*; c #7095AF", +"=; c #435663", +"-; c #80A7C0", +";; c #95C4DC", +">; c #779CB3", +",; c #526D7E", +"'; c #516A7A", +"); c #526B7B", +"!; c #465764", +"~; c #34414E", +"{; c #5C7E9A", +"]; c #2B3741", +"^; c #4B657F", +"/; c #5C7D9C", +"(; c #557088", +"_; c #0F0F10", +":; c #B9C2CA", +"<; c #CCDFEF", +"[; c #B4CDE1", +"}; c #8DAEC8", +"|; c #6F93AE", +"1; c #678CA6", +"2; c #6E92AF", +"3; c #81A8C1", +"4; c #8FBBD5", +"5; c #8DB9D2", +"6; c #6D8FA2", +"7; c #586F82", +"8; c #394851", +"9; c #86B0C6", +"0; c #85AFC8", +"a; c #6F94AF", +"b; c #698DA8", +"c; c #6889A7", +"d; c #5E7E9F", +"e; c #475D75", +"f; c #2E3C4A", +"g; c #5D7E9D", +"h; c #405465", +"i; c #36393B", +"j; c #D7E5F1", +"k; c #A4C5DC", +"l; c #668496", +"m; c #7595AB", +"n; c #7798AE", +"o; c #97C2DA", +"p; c #789DB3", +"q; c #8BB1C8", +"r; c #93C0D9", +"s; c #8BB5CF", +"t; c #85AFC9", +"u; c #82AAC6", +"v; c #5F7C95", +"w; c #1E252C", +"x; c #54728E", +"y; c #587899", +"z; c #5A7B9B", +"A; c #2D3843", +"B; c #798086", +"C; c #D1E3F1", +"D; c #B7D3E8", +"E; c #7E98AB", +"F; c #181C1F", +"G; c #46525F", +"H; c #80A1B8", +"I; c #99C3DB", +"J; c #85ACC2", +"K; c #21272D", +"L; c #0A0B0D", +"M; c #53718C", +"N; c #577797", +"O; c #1B2229", +"P; c #0D0E0F", +"Q; c #B3BDC4", +"R; c #CADDED", +"S; c #B4D3E7", +"T; c #2B3339", +"U; c #2F3840", +"V; c #7899AC", +"W; c #93C1D9", +"X; c #8FBCD5", +"Y; c #8BB6D1", +"Z; c #8DB8D2", +"`; c #92BFD8", +" > c #678092", +".> c #547089", +"+> c #5C7F9B", +"@> c #1F262E", +"#> c #202223", +"$> c #B1BECB", +"%> c #C3D9EB", +"&> c #7B8D99", +"*> c #708B9A", +"=> c #85ABC1", +"-> c #7FA3BA", +";> c #92BBD3", +">> c #7CA0B4", +",> c #97BDD4", +"'> c #657E8F", +")> c #93BDD4", +"!> c #88ADC7", +"~> c #6F94AE", +"{> c #526A7E", +"]> c #65849B", +"^> c #799DBB", +"/> c #84AFC9", +"(> c #8FB9D2", +"_> c #323C45", +":> c #516C84", +"<> c #658AA4", +"[> c #5B7C9B", +"}> c #2E3A49", +"|> c #2A3038", +"1> c #252D3A", +"2> c #1B1E20", +"3> c #ADBFCF", +"4> c #C0D6E7", +"5> c #B0CDE2", +"6> c #8EB3C9", +"7> c #526975", +"8> c #6B899D", +"9> c #597183", +"0> c #90BAD5", +"a> c #94C2DA", +"b> c #82ABC5", +"c> c #495E6E", +"d> c #82A8C3", +"e> c #81A4BA", +"f> c #7594A5", +"g> c #87ABC3", +"h> c #4D6573", +"i> c #6689A6", +"j> c #526E85", +"k> c #243037", +"l> c #607B96", +"m> c #7699B6", +"n> c #789EB5", +"o> c #303D48", +"p> c #7498B4", +"q> c #7094AF", +"r> c #597792", +"s> c #242F39", +"t> c #1A1D25", +"u> c #374553", +"v> c #4D677D", +"w> c #14191E", +"x> c #040505", +"y> c #171A1D", +"z> c #8A9FAD", +"A> c #BCD9EC", +"B> c #B5D3E7", +"C> c #A2CAE1", +"D> c #9DC7DE", +"E> c #9EC7DD", +"F> c #3B4A57", +"G> c #455867", +"H> c #98C2DB", +"I> c #85B0CC", +"J> c #7496B2", +"K> c #4C606F", +"L> c #6E8EA3", +"M> c #7EA0B6", +"N> c #91BBD3", +"O> c #8DB7D1", +"P> c #90BAD4", +"Q> c #96C1DA", +"R> c #3B4853", +"S> c #688AA5", +"T> c #4C657A", +"U> c #1B2026", +"V> c #2B3C44", +"W> c #5F7A90", +"X> c #587284", +"Y> c #536978", +"Z> c #88B1CC", +"`> c #759AB8", +" , c #617E9A", +"., c #556F85", +"+, c #20272E", +"@, c #323D48", +"#, c #333E4A", +"$, c #060707", +"%, c #4A5159", +"&, c #ACC3D5", +"*, c #ACCFE5", +"=, c #5A6874", +"-, c #AACDE1", +";, c #9CC6DC", +">, c #35414C", +",, c #769AB2", +"', c #80AAC5", +"), c #6F92AB", +"!, c #38464F", +"~, c #7EA4B9", +"{, c #97C3DC", +"], c #7A9FB6", +"^, c #3F505C", +"/, c #6D8DA6", +"(, c #1E282E", +"_, c #080909", +":, c #090A0C", +"<, c #344452", +"[, c #3B4857", +"}, c #7799AE", +"|, c #8DB6D1", +"1, c #66869E", +"2, c #3D4957", +"3, c #536C84", +"4, c #353F4C", +"5, c #111215", +"6, c #65727E", +"7, c #A6BCCD", +"8, c #5D6972", +"9, c #AED0E6", +"0, c #99C5DC", +"a, c #8DB5D0", +"b, c #8DB5CE", +"c, c #90BBD5", +"d, c #84AAC5", +"e, c #8EBBD5", +"f, c #80A7C1", +"g, c #6C8DA2", +"h, c #85AFC6", +"i, c #61839B", +"j, c #374352", +"k, c #576D83", +"l, c #80A6C1", +"m, c #81A4BB", +"n, c #111315", +"o, c #111418", +"p, c #4C6378", +"q, c #33424C", +"r, c #37454D", +"s, c #8DB4CF", +"t, c #7397B3", +"u, c #3A495A", +"v, c #0D0F13", +"w, c #27303A", +"x, c #272E36", +"y, c #0F1012", +"z, c #90A4B2", +"A, c #A8CBE2", +"B, c #91BCD4", +"C, c #80ABC3", +"D, c #567083", +"E, c #67899D", +"F, c #94C2DB", +"G, c #95C1DB", +"H, c #779CB2", +"I, c #60849E", +"J, c #64849F", +"K, c #1A1F22", +"L, c #405061", +"M, c #79A1BD", +"N, c #324051", +"O, c #6183A1", +"P, c #6B8FAD", +"Q, c #6485A2", +"R, c #34444F", +"S, c #060606", +"T, c #2D3339", +"U, c #B2CBDF", +"V, c #94BCD5", +"W, c #7DA2BA", +"X, c #3F5264", +"Y, c #5A7991", +"Z, c #7195B3", +"`, c #7BA5BD", +" ' c #81AAC6", +".' c #88B2CC", +"+' c #8EBBD4", +"@' c #8AB2CC", +"#' c #82ADC7", +"$' c #7092A5", +"%' c #95C2DA", +"&' c #41525F", +"*' c #6387A3", +"=' c #475F72", +"-' c #21282F", +";' c #5B7288", +">' c #0D0F11", +",' c #0B0E11", +"'' c #212C36", +")' c #26323C", +"!' c #161B20", +"~' c #55616D", +"{' c #9BB9D0", +"]' c #799EB6", +"^' c #27313A", +"/' c #1A222B", +"(' c #5D7E99", +"_' c #6587A4", +":' c #6789A6", +"<' c #6B8EAB", +"[' c #628097", +"}' c #6D8B9D", +"|' c #769AAF", +"1' c #6E91A9", +"2' c #6C8EAD", +"3' c #6E91AF", +"4' c #3C4D59", +"5' c #8BB1CB", +"6' c #232D32", +"7' c #13171B", +"8' c #232B32", +"9' c #839AAF", +"0' c #789BB3", +"a' c #283138", +"b' c #0C0E0F", +"c' c #242B33", +"d' c #3D4D5B", +"e' c #435768", +"f' c #4B6176", +"g' c #283137", +"h' c #8DB4CC", +"i' c #41535E", +"j' c #405362", +"k' c #3C4F60", +"l' c #3C4E5B", +"m' c #2B353E", +"n' c #526876", +"o' c #92BAD3", +"p' c #1B1F23", +"q' c #31383F", +"r' c #7F9CB6", +"s' c #21292F", +"t' c #29333F", +"u' c #1F252E", +"v' c #090A0E", +"w' c #4D626E", +"x' c #96BDD3", +"y' c #191D20", +"z' c #13181B", +"A' c #80A4BC", +"B' c #1B2027", +"C' c #5D7182", +"D' c #2C383F", +"E' c #364857", +"F' c #1A2028", +"G' c #333F49", +"H' c #7FA2B5", +"I' c #4A5E6E", +"J' c #232E35", +"K' c #252D35", +"L' c #2F3A41", +"M' c #0A0B0E", +"N' c #14191D", +"O' c #5A717F", +"P' c #212931", +"Q' c #222B34", +"R' c #101216", +"S' c #21272B", +" ", +" ", +" ", +" . ", +" + ", +" @ # $ % ", +" & * = - ; ", +" > , ' ) ! ~ { ] ", +" ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a ", +" b c d e f g h i j k l m n o p q r s t u v w x ", +" y z A B C D E F G H I J K L M N O P Q R S T U U V W X Y ", +" Z ` ...+.@.#.$.%.O &.*.=.-.;.>.,.'.).!.~.~.~.{.].^./.(._.:.<. ", +" b [.}.|.#.1.2.3.4.{.~.~.~.~.5.6.5.~.7.8.{.~.~.~.~.9.0.a.b.].c. ", +" d.e.f.g.h.i.j.k.{.~.~.~.~.l.~.m.% n.~.o.{.{.~.~.~.~.p.V 9.~.q.r. ", +" s.t.u.v.w.x.u y.z.A.B.5.~.~.5.C.D.E.F.~.~.G.~.~.~.G.H.I.J.~.~.J.K.L. M.N. ", +" O.P.Q.R.S.T.U.V.W.X.Y.Z.`.~.~.5. +.+++@+U ~.~.~.~.~.#+$+%+,.~.~.G.&+*+=+-+;+ ", +" >+,+Q.'+)+!+~+{+]+^+/+(+_+:+<+~.[+}+U 9.|+5.~.~.~.~.1+2+3+4+5+~.].6+7+8+9+0+ ", +" a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+5.U ~.U r+s+~.~.~.t+u+v+w+x+y+~.z+A+t+B+C+D+E+ F+G+ ", +" H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+V ~.~.~.~.U ~.~.~.o.9.{.Z+`+9.~.~.~.V @.@+@@@#@ $@%@&@*@ ", +" =@-@;@>@,@'@'.)@!@~@{@]@^@/@l+(@_@:@<@~.~.~.U {.~.~.~.{.~.~.{.[@~.~.~.~.}@|@1@2@3@4@5@6@7@8@ ", +" 9@0@a@b@c@d@-.e@f@g@h@i@j@k@l@V+m@n@o@p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.q@r@s@t@u@v@w@x@y@ ", +"z@A@B@C@D@E@X F@G@H@R I@J@K@L@M@N@O@P@Q@R@o+S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.9.U@V@W@X@<+V Y@Z@`@ # ", +" .#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.U (#_#:#<#p@{.[#}#|#1#2# ", +" 3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.l#m#9.{.~.n#o#p#q#r#s# ", +" t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#% J#K#S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.L#0.l.~.~.{.M#N#O#P#Q#R# ", +" S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$-$a#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.o.o.;$9.G.~.>$,$'$)$!$~${$]$ ", +" ^$/$($_$:$<$[$}$|$1$2$3$4$5$6$7$8$9$:+<+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.G.0$a$b$c$d$e$f$g$h$i$j$k$ ", +" [ l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$M#p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.;$D$E$F$G$H$I$J$K$L$ ", +" M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%<+{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.#%$%%%p@&%*%=%-%;%>%,% ", +" '%)%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%3%-$T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.4%5%U p@6%7%8%9%0%a%y ", +" b%c%d%e%f%g%h%i%G.[#j%k%l%m%n%o%p%@%q%{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.~.~.~.~.~.V G.}@r%s%t%u%v%w%M.x%y%z%A% ", +" B%C%D%E%F%G%H%I%V o.<@J%K%L%M%N%O%P%p@~.~.~.~.~.~.~.~.~.U ~.~.U 9.Q%{.~.~.~.~.~.{.%%U {.~.~.{.v@R%S%T%U%V%W% X%$ ", +" Y%Z%`% &.&+&@&#&U ~.{.$&%&&&*&=&-&T@~.~.~.~.~.~.~.~.~.~.~.;&>&,&'&)&!&5+~.~.~.~.{.~&{&]&9.~.p@^&/&(&_&:& <&[&}&|& ", +" 1&2&3&4&5&6&7&8&9&l.~.{.V 0&a&b&c&~.~.~.~.~.~.~.5.d&e&f&g&h&i&j&k&l&m&n&~.~.G.~.~.~.o&p&q&r&s&t&u&v& w&x&y&z&A&B& ", +" C&2&D&E&F&G&G&H&I&J&U ~.~.U K&L&,.~.~.~.~.~.~.~.U M&N&O&P&Q&R&S&T&U&V&W&X&].{.~.~.{./#Y&Z&`& *.*+*@* (.#*$*%*&***=* ", +" -*;*>*,*'*)*!*~*{*]*^*~.5.{.5./*U ~.~.~.~.~.~.{.[#(*_*:*<*[*[*}*|*1*2*3*4*5*U ~.~.6*7*8*9*0*a*b*c*d*e*f*g*h*i*%*j*k*<%l* ", +" m*n*o*p*q*r*s*t*u*v*w*1+~.~.~.~.~.~.~.~.~.~.~.x*y*z*A*B*C*D*E*V U ~.G.~.:.F*G*l.{.R%X+H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X* ", +" Y*Z*D&`* =.=+=@=#=$=%=&={.~.~.~.~.~.~.~.~.~.~.<+*===-=;=>=,='=)=[#p@!=~={=]=^=/=(=a#&%_=:=<=-#[=}=k$|=1=2=3=4=5=6=7=8=9= ", +" 0=a=b=c=d=e=f=g=h=i=j=k=l=5.~.~.~.~.~.~.~.~.~.V -$m=n===o=p=q=r=s=t=:+u=v=w=x=y=z=A=J.V U ~.V [#B=C=D=1=E=F= G=H=I= ", +" J=K=L=M=N=O=P=Q=R=S=T=U=V=5.U ~.~.~.~.~.~.~.~.~.{.x*W=X=Y=Z=`= -.-+-@-#-$-%-&-*-=---;->-9.x*)=,-'-)-c.!-~- {-]- ", +" ^-/-(-_-:-<-<-[-%.}-|-1-T@~.{.~.~.~.~.~.~.~.~.~.~.V 2-^&3-4-5-6-7-8-9-0-a-b-c-d-e-f-g-h-V@i-j-k-l-T=m-7@n- o-p- ", +" q-r-s-t-u-v-!+2*w-x-y-z-V ~.~.~.~.~.~.~.~.~.~.~.~.~.~./#A-B-C-D-E-F-G-H-I-J-K-L-<@M-W=N-O-P-Q-R-<&S-T-U-V- W- ", +" X-Y-Z-`- ;.;+;@;#;$;q+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~./#v@W=N#%;&;*;=;-;s=-#;;>;,;';);!;~;{;];^;/;(;H+ ", +" _;:;<;[;};|;1;2;3;4;{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.T@-#5;6;7;8;9;[#V <+0;a;b;c;E-d;e;f;|=g;h; ", +" i;j;V#k;F.l;m;n;o;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.{.p@S@s=p;q;~.~.{.r;s;t;u;~$v;w;x;y;z;A; ", +" H+B;C;D;E;F;G;H;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.U ~.~.V E*E*V ~.~.~.{.T@/#I;J;K;L;M;y;N;O; ", +" P;Q;R;S;T;U;~.{.~.~.~.~.~.~.~.~.l.U {.p@~.~.{.V ~.~.5+V;].~.~.~.~.{.{.p@W;X;Y;Z;`;/# >W..>+>N;@> ", +" #>$>%>&>*>G.~.~.~.~.~.~.~.~.{.`.=>V=->;>~.n##&>>T@,>'>].~.~.~.~.~.)>!>i$~>{>]>^>/>(>_>:><>[>}> |>1> ", +" 2>3>4>5>U@U ~.~.~.~.~.~.~.{.6>7>8>9>0>a#a>b>c>d>e>f>~.~.~.V ~.~.g>h>i>1=j>,%k>l>m>n>o>p>q>r>s>t>u>v>w> ", +" x>y>z>A>B>C>5+D>E>~.~.~.~.{.%&F>G>3;s%{.H>I>J>K>L>M>~.V N>O>P>x*Q>R>S>T>U> X%V>W>X>Y>Z>P-`> ,.,+, ", +" @,#,$,%,&,1.*,=,-,;,{.p@V {.X@>,,,Z;V ~.5.`;',),!,~,~.{,],^,/,/&-$F$(,_, :,<,[,},<@|,1,2, ", +" B&3,4, 5,6,7,8,9,0,`;a,b,B+c,d,s=<+~.~.~.a#e,f,g,h,V -#9$i,j,k,l,m,n, o,p,q,r,s,t,u,v, ", +" w,x, y,z,A,B,C,D,E,o@F,G,<+~.~.~.~.~.;;P>j%}@p@H,]#I,J,K,L,M,=+ N,O,P,Q,R,S, ", +" T,U,V,W,X,Y,Z,`, '.'+'x*~.{.O+@%@'#'$'%'a#&'*'='-' ~;;'>' ,''')'!' ", +" ~'{']'^'/'('_'_':'<'['}'{.V |'1'2'3'4'5'}@6'7' 8'K; ", +" v&9'0'a' b'c'd'e'f'1@g'h'G.i'j'k'l'm'n'o'p' y ", +" q'r's' t'u'H+ v'w'x'y' z'A'B' ", +" C'D' E'F' G'H' I'J' ", +" K'L' M' N'O' P'Q' ", +" R' S' ", +" ", +" ", +" ", +" "}; diff --git a/mlx/test/open24.xpm b/mlx/test/open24.xpm new file mode 100644 index 0000000..f363254 --- /dev/null +++ b/mlx/test/open24.xpm @@ -0,0 +1,230 @@ +/* XPM */ +static char *open[] = { +/* width height num_colors chars_per_pixel */ +" 45 55 168 2", +/* colors */ +".. s None c None", +".# c #450304", +".a c #ce7e7c", +".b c #b94344", +".c c #b65254", +".d c #780204", +".e c #b04c4c", +".f c #b00204", +".g c #8a8a64", +".h c #969a24", +".i c #b6b60c", +".j c #cac614", +".k c #cece34", +".l c #cace54", +".m c #caca94", +".n c #c24e4c", +".o c #aa0204", +".p c #9e4244", +".q c #bc0204", +".r c #a40204", +".s c #9e262c", +".t c #8c3a3c", +".u c #5c1414", +".v c #5b0204", +".w c #700204", +".x c #722214", +".y c #b52624", +".z c #8e3234", +".A c #b60204", +".B c #c20204", +".C c #860204", +".D c #560304", +".E c #800204", +".F c #9e0204", +".G c #920204", +".H c #620204", +".I c #a41314", +".J c #996a6c", +".K c #920d09", +".L c #c80204", +".M c #690204", +".N c #980204", +".O c #984c4c", +".P c #e2dedc", +".Q c #ae5e5c", +".R c #bc6a6c", +".S c #a21a1c", +".T c #8a0a04", +".U c #671e1c", +".V c #941b1c", +".W c #b8b4b4", +".X c #e8e6e4", +".Y c #ccb4b4", +".Z c #c07c7c", +".0 c #f3f2eb", +".1 c #b49696", +".2 c #521614", +".3 c #9e5a5c", +".4 c #d4d4d4", +".5 c #a7a5a1", +".6 c #dec4c4", +".7 c #e4d6d4", +".8 c #f4f2f4", +".9 c #cccac4", +"#. c #9a161c", +"## c #8c0204", +"#a c #862c2c", +"#b c #7e5e5c", +"#c c #a39694", +"#d c #6b6667", +"#e c #322624", +"#f c #b09e9c", +"#g c #b23234", +"#h c #500304", +"#i c #222224", +"#j c #2e322c", +"#k c #925c5c", +"#l c #721a1c", +"#m c #6e6e6c", +"#n c #0a0a0c", +"#o c #b2b2b4", +"#p c #8e6264", +"#q c #884444", +"#r c #8c5c5c", +"#s c #121214", +"#t c #b2aeac", +"#u c #c21e1c", +"#v c #6e0e0c", +"#w c #623e3c", +"#x c #b64e4c", +"#y c #bc3634", +"#z c #624e1c", +"#A c #6e727c", +"#B c #824e4c", +"#C c #8b8d87", +"#D c #a09674", +"#E c #766844", +"#F c #7a663c", +"#G c #828c90", +"#H c #beb6a4", +"#I c #3a0204", +"#J c #8e9298", +"#K c #562529", +"#L c #7c3838", +"#M c #bab294", +"#N c #7e4644", +"#O c #929a9c", +"#P c #762a2c", +"#Q c #a60e0c", +"#R c #ae1e1c", +"#S c #460a0c", +"#T c #a6aaa4", +"#U c #6a4a4c", +"#V c #784c50", +"#W c #761214", +"#X c #9e1e1c", +"#Y c #988c90", +"#Z c #821e1c", +"#0 c #7a1618", +"#1 c #7a6e74", +"#2 c #7e7a77", +"#3 c #808688", +"#4 c #828284", +"#5 c #828279", +"#6 c #827a64", +"#7 c #7e765c", +"#8 c #864a34", +"#9 c #825a44", +"a. c #766e54", +"a# c #7e7e74", +"aa c #806464", +"ab c #7e724c", +"ac c #766634", +"ad c #765a2c", +"ae c #8e7e54", +"af c #a69e8c", +"ag c #c7c2ac", +"ah c #9a2a1c", +"ai c #aa3a3c", +"aj c #979894", +"ak c #70684c", +"al c #62522c", +"am c #6e5e3c", +"an c #92866c", +"ao c #968e6c", +"ap c #826e54", +"aq c #84765c", +"ar c #86522c", +"as c #7e4624", +"at c #7e3614", +"au c #6e5254", +"av c #712e2c", +"aw c #7a5654", +"ax c #82727c", +"ay c #a63634", +"az c #8a6a6c", +"aA c #863534", +"aB c #5c1a18", +"aC c #6a2c2c", +"aD c #5e0e14", +"aE c #868684", +"aF c #922624", +"aG c #901614", +"aH c #c21614", +"aI c #520e0c", +"aJ c #805654", +"aK c #b00c0c", +"aL c #c2221c", +/* pixels */ +"..........................................................................................", +"..........................................................................................", +".....................................#.a.#................................................", +"...................................#.b.c.#.#.#.#...........#.d............................", +".................................#.e.f.f.#.g.h.i.j.k.l.m...f.n............................", +".................................d.f.o.f.#.#.#.d.d.#.#.#...f.f.d..........................", +".................................p.q.q.r.s.t.u.v.w.x.d.d.#.d.r.y.d........................", +".................................z.A.B.q.C.D.E.F.G.E.H.E.I.F.q.A.d........................", +".................................J.G.f.G.w.K.f.L.B.B.r.M.f.B.L.A.d........................", +".................................d.w.N.M.O.P.Q.B.B.o.R.S.E.q.q.T.d........................", +".................................d.U.M.V.W.X.Y.q.B.Z.0.1.E.r.N.d..........................", +".................................d.2.r.3.4.5.6.A.f.7.8.9#.###a.#..........................", +"................................#b.d.L#c#d#e#f.N.V.5#d.4#g.E.d............................", +"...............................d#h.r.L#f#i#j#k.M#l#m#n#o.b.r.d............................", +"...............................d#h##.q#g#p#q##.q.N#r#s#t#u.q#v.#..........................", +"..............#j................#w.w.C.r.q##.r.B.f.T#x#y.L.r.M.d..........................", +"............#j#z#j#A#A#j.........d.D.r.M.C.f.r.r.r.q.B.C.N.E#B............................", +"..........#j#C#D#E#z#F#G#j.......d.d.#.G##.w.M.M.C.C.d.G.r.u.d............................", +"....................#E#H#C#j.........d#I.w.F.f.o.o.o.N.M.#.d..............................", +"......................#E#j#J#j......#K.M.#.#.v.w.M.v.##h.H#L.d............................", +"..........................#M#j.......v.F.q.r.d.w.w.C.E.M.v.M#N.d..........................", +"..........................#E#O#j#j#K##.f.L.L.L.B.q.f##.M.v.w.w#P.d.#...d.d................", +"............................#C#E.#.v.o.B.L.L.q.q.q.q.N.M.D#h.M.N.r#Q#R#S.H.J.#............", +"............................#j#T#U.C.q.q.o.G.F.f.q.A.N.d.v.v##.o.q.L.r.C.A###k............", +"..............................#C#V.N.A.N.f.q.F.C.E.f.F.E.H#n#W.K.I#X#a.z.V.q.d#p.d........", +"................................#Y.r.K#Z.K.q.A.G.w#0#b#1#2#3#4#5#5#6#6#7#8.q.G#9..........", +"..................#j#oa..5#j..#J#Ja##4#4aa.o.A##.E.xabacadae#Daf#M#Magah.r.qai.#..........", +"................aja#akalamanaoapaqaaarasat.r.o.E.w.T.T.E.H.#...........#.d.d.#............", +"...........E....#j#j#C#M#j#n#naa#V.O.f.N.F.q.G.d.w.r.C.d.H.#...............#..............", +"...........#.F.F.J#n#n#n#n#n#nauav#p.q.N.d.d.w.M.F.F.E.d.U................................", +".........E.F.E.E.d.z#n.d#n#n#naw.Uax.r##.d.w.D.M.r.N.E.w.d................................", +".........E.F.......d.Fay.E.F#naz.2#A.D#h.r.f.w##.r##.d.H.M................................", +".........F.#...........E.E.F.baAaB#A.#.E.f.r.w.N.N.E.waC.#................................", +".........F.#...............d.F.E#K#d.H.G.F.G.w.N##.d.D.#..................................", +".........F.#....................#Aau.v.E##.w.E.E.w.H.d.......d..av.d......................", +".........E.#..................#j#GaC.M.H.M.d.d.w.H.#.d.d.#aC.w.C##.E.d....................", +"...........F.................5#O...#aD.w.d.w.H.D.M######.G.F.o.f.o.N.3....................", +"...........F.E...........5aEakak.....#.##h#h.v.N.o.f.q.L.L.L.L.L.q.faF....................", +"...........E.E......#E#C.5aq#j.....#.v.N.F.d.N.r.F.r.F#Q.I.o.q.L.L.L.y....................", +".............E.....................#.E.B.qaG.d.d.d.....#.#.....d#x.b......................", +".............E.F...................E.w.L.LaG.#............................................", +"...............E.E.................EaA.q.qaG.#............................................", +"...............E.F.E.................E.r.r#Z.#............................................", +".................E.F.E...............E.G.NaA..............................................", +".................E#uaH.................w.dav..............................................", +"...................E.E.............EaI.M.w.v.#............................................", +"...................................E.D.d.E.waJ............................................", +".....................................C.N.N##.M............................................", +"..................................#W.f.q.A.f.G#q..........................................", +".....................................q.L.L.L.q.V.#........................................", +"...................................#.daK.q.qaL.d..........................................", +".......................................#.#.#..............................................", +"..........................................................................................", +"..........................................................................................", +".........................................................................................." +}; diff --git a/mlx/test/open30.xpm b/mlx/test/open30.xpm new file mode 100644 index 0000000..87be371 --- /dev/null +++ b/mlx/test/open30.xpm @@ -0,0 +1,1439 @@ +/* XPM */ +static char * open30_2_xpm[] = { +"64 64 1372 2", +" c None", +". c #08090D", +"+ c #1A1E23", +"@ c #1F2124", +"# c #060809", +"$ c #1A1E21", +"% c #4F606C", +"& c #3D4145", +"* c #868D93", +"= c #454E56", +"- c #627481", +"; c #667C8A", +"> c #2D3031", +", c #D7E1E7", +"' c #4D5157", +") c #8997A5", +"! c #282E31", +"~ c #333B41", +"{ c #A5C6DB", +"] c #718C9B", +"^ c #000000", +"/ c #181B1F", +"( c #262828", +"_ c #D2DEE7", +": c #B8C5D0", +"< c #151719", +"[ c #08090B", +"} c #272B30", +"| c #2D3037", +"1 c #26282C", +"2 c #1A1D1F", +"3 c #B1CADB", +"4 c #56646E", +"5 c #080809", +"6 c #080A0C", +"7 c #1E2126", +"8 c #98B7C9", +"9 c #A2CAE2", +"0 c #7FA1B5", +"a c #06080A", +"b c #252729", +"c c #A7ADB2", +"d c #272B2E", +"e c #1E2023", +"f c #C8D8E5", +"g c #C9DDED", +"h c #8996A3", +"i c #6B7782", +"j c #C7DFF0", +"k c #CCE0F0", +"l c #AFC1CF", +"m c #47535B", +"n c #B0D3E8", +"o c #7E99A9", +"p c #738493", +"q c #97B4C7", +"r c #53606A", +"s c #6E8996", +"t c #A1CBE3", +"u c #9CC6DE", +"v c #90B5CB", +"w c #171D22", +"x c #1E2629", +"y c #020202", +"z c #ABB3BA", +"A c #BBC4C8", +"B c #222323", +"C c #141617", +"D c #5D6164", +"E c #ACB5BC", +"F c #676D74", +"G c #BDD4E5", +"H c #B3D1E7", +"I c #B0D1E7", +"J c #728A99", +"K c #94AEBF", +"L c #B1D1E7", +"M c #505C64", +"N c #7B98A9", +"O c #A1CBE0", +"P c #99C3D9", +"Q c #475863", +"R c #A0C9DE", +"S c #9CC6DA", +"T c #9ECAE1", +"U c #9CC5DD", +"V c #9AC4DC", +"W c #263137", +"X c #3C4A55", +"Y c #658190", +"Z c #66686B", +"` c #7D8085", +" . c #363839", +".. c #797E81", +"+. c #D2DBE1", +"@. c #DDE9F4", +"#. c #CADEEF", +"$. c #778593", +"%. c #AED0E5", +"&. c #9EC9DE", +"*. c #9EC8DF", +"=. c #9BC1D8", +"-. c #9EC8DE", +";. c #6B8596", +">. c #9BC5DC", +",. c #9BC6DF", +"'. c #9CC5DC", +"). c #688595", +"!. c #6B8698", +"~. c #9CC4DC", +"{. c #9BC4DC", +"]. c #9DC5DD", +"^. c #647D8C", +"/. c #485864", +"(. c #161A1D", +"_. c #36444C", +":. c #95BDD5", +"<. c #566E7E", +"[. c #A4AAAD", +"}. c #E9F2F7", +"|. c #DEEAF6", +"1. c #B5D4E9", +"2. c #A9CFE3", +"3. c #90B3C9", +"4. c #9FCAE1", +"5. c #9BC4DD", +"6. c #7490A2", +"7. c #99C2DB", +"8. c #81A5BA", +"9. c #9CC5DE", +"0. c #98C1DA", +"a. c #5F7889", +"b. c #96BFD8", +"c. c #44545F", +"d. c #565A5E", +"e. c #DFE6EC", +"f. c #E6EEF7", +"g. c #D6E4F2", +"h. c #BFD6E9", +"i. c #A9CCE3", +"j. c #9FC8DD", +"k. c #9DC6DD", +"l. c #9CC4DD", +"m. c #7D9FB0", +"n. c #98C0D6", +"o. c #9AC5DD", +"p. c #97BFD8", +"q. c #9BC5DF", +"r. c #2D3840", +"s. c #626567", +"t. c #E7ECF5", +"u. c #E1EAF5", +"v. c #CEE3F3", +"w. c #B7D6EA", +"x. c #A4CBE0", +"y. c #8AAFC5", +"z. c #647F90", +"A. c #648092", +"B. c #89B0C7", +"C. c #9CC6DF", +"D. c #5D7486", +"E. c #7B9BAF", +"F. c #84A8BF", +"G. c #9BC5DD", +"H. c #96BED5", +"I. c #4B5D69", +"J. c #9BC5DE", +"K. c #536B77", +"L. c #2E3B41", +"M. c #1B2124", +"N. c #3F4F58", +"O. c #4D5152", +"P. c #E7EEF3", +"Q. c #E2EAF5", +"R. c #CEE2F2", +"S. c #BAD5E9", +"T. c #9DC2D7", +"U. c #5C7281", +"V. c #232A31", +"W. c #08090A", +"X. c #121418", +"Y. c #131619", +"Z. c #131719", +"`. c #87ACC3", +" + c #7B9BAE", +".+ c #87ADC3", +"++ c #8FB5CB", +"@+ c #678295", +"#+ c #96C0D8", +"$+ c #607787", +"%+ c #6B8595", +"&+ c #96C1DB", +"*+ c #6A8595", +"=+ c #35424A", +"-+ c #7090A1", +";+ c #15191C", +">+ c #2D3033", +",+ c #DDE5EB", +"'+ c #D2E3F1", +")+ c #BAD7EB", +"!+ c #A9CFE5", +"~+ c #272F35", +"{+ c #1C2227", +"]+ c #4F697B", +"^+ c #6B8FA9", +"/+ c #759CB6", +"(+ c #7BA0BB", +"_+ c #80A5BC", +":+ c #88B0C8", +"<+ c #96C3DB", +"[+ c #8FB6CD", +"}+ c #80A1B3", +"|+ c #556876", +"1+ c #96BFD7", +"2+ c #566B77", +"3+ c #93B8CD", +"4+ c #637A8D", +"5+ c #9DC6DE", +"6+ c #8FB4CA", +"7+ c #55697A", +"8+ c #6F8F9F", +"9+ c #91BDD5", +"0+ c #283239", +"a+ c #050406", +"b+ c #767B80", +"c+ c #BDC6CE", +"d+ c #D4E5F3", +"e+ c #C1D7EA", +"f+ c #A7CDE4", +"g+ c #9FC9DE", +"h+ c #668596", +"i+ c #6D90AA", +"j+ c #5C7994", +"k+ c #60849F", +"l+ c #6286A1", +"m+ c #688CA8", +"n+ c #7298B2", +"o+ c #82A8C2", +"p+ c #8FBAD5", +"q+ c #96C2DB", +"r+ c #89ADC4", +"s+ c #96BED6", +"t+ c #99C2DA", +"u+ c #6C899A", +"v+ c #92BBD2", +"w+ c #9AC4DD", +"x+ c #5B717D", +"y+ c #9EC6DE", +"z+ c #8BB1C9", +"A+ c #718EA0", +"B+ c #94C3DB", +"C+ c #536B78", +"D+ c #3E505F", +"E+ c #4E6373", +"F+ c #2C333C", +"G+ c #070708", +"H+ c #040404", +"I+ c #1A1C1E", +"J+ c #202326", +"K+ c #050606", +"L+ c #23292E", +"M+ c #A1C0D4", +"N+ c #9FC9DD", +"O+ c #97C2DB", +"P+ c #80A8C1", +"Q+ c #668AA6", +"R+ c #4B5D72", +"S+ c #4C647A", +"T+ c #5F80A0", +"U+ c #60859E", +"V+ c #678AA6", +"W+ c #739BB5", +"X+ c #85AEC7", +"Y+ c #92BDD7", +"Z+ c #96BFD5", +"`+ c #627B8A", +" @ c #89B1C9", +".@ c #2B353C", +"+@ c #7597B2", +"@@ c #779CB8", +"#@ c #52697C", +"$@ c #1D2328", +"%@ c #445663", +"&@ c #5E7A8D", +"*@ c #252F37", +"=@ c #090909", +"-@ c #859BB2", +";@ c #859DB8", +">@ c #6E8396", +",@ c #252C33", +"'@ c #9CC4D7", +")@ c #92C0D9", +"!@ c #79A0BA", +"~@ c #6487A3", +"{@ c #566979", +"]@ c #8CB0C2", +"^@ c #51697C", +"/@ c #60849D", +"(@ c #6D8EAC", +"_@ c #7BA0BC", +":@ c #8AB4CE", +"<@ c #95C2DB", +"[@ c #9AC5DC", +"}@ c #95C1DA", +"|@ c #607B8C", +"1@ c #597488", +"2@ c #7EA6BF", +"3@ c #597587", +"4@ c #455664", +"5@ c #668598", +"6@ c #82A9C4", +"7@ c #617F92", +"8@ c #1A2328", +"9@ c #2B3137", +"0@ c #728FAC", +"a@ c #51657B", +"b@ c #6B8AA8", +"c@ c #8EAEC7", +"d@ c #A8C8E2", +"e@ c #92BDD6", +"f@ c #769DBA", +"g@ c #526E87", +"h@ c #7490A0", +"i@ c #A6CDE4", +"j@ c #97BFD4", +"k@ c #55697D", +"l@ c #6286A0", +"m@ c #7399B3", +"n@ c #84ACC5", +"o@ c #92BFD9", +"p@ c #99C4DC", +"q@ c #94C0DA", +"r@ c #4F6575", +"s@ c #7DA5BF", +"t@ c #7FA2BC", +"u@ c #8FB6CE", +"v@ c #95C3DB", +"w@ c #8EB8D2", +"x@ c #6A879D", +"y@ c #111318", +"z@ c #252A30", +"A@ c #81868C", +"B@ c #A5ABAD", +"C@ c #70767C", +"D@ c #38434F", +"E@ c #637F9B", +"F@ c #516980", +"G@ c #799AB5", +"H@ c #A5C3D9", +"I@ c #93BDD6", +"J@ c #779EBA", +"K@ c #445A6B", +"L@ c #93B5C9", +"M@ c #B6D3E8", +"N@ c #AECFE4", +"O@ c #95BDD2", +"P@ c #52687A", +"Q@ c #6486A3", +"R@ c #7092B0", +"S@ c #90BCD6", +"T@ c #97C4DC", +"U@ c #A0C9E0", +"V@ c #99C5DD", +"W@ c #86AEC6", +"X@ c #8FBAD4", +"Y@ c #91BDD6", +"Z@ c #7094AC", +"`@ c #2A353E", +" # c #0B0E10", +".# c #888D90", +"+# c #787D82", +"@# c #465360", +"## c #56697F", +"$# c #A6CADD", +"%# c #5A7382", +"&# c #6C8CAA", +"*# c #A5BED3", +"=# c #A7CAE0", +"-# c #94C1DA", +";# c #7EA4BF", +"># c #415160", +",# c #9DC3D5", +"'# c #B3CFE1", +")# c #AAC3D4", +"!# c #A8CDE4", +"~# c #89ACBE", +"{# c #567088", +"]# c #6C91AC", +"^# c #81A7C2", +"/# c #96C4DC", +"(# c #85A9BD", +"_# c #708C9B", +":# c #5A6E7B", +"<# c #6C8695", +"[# c #97C3DB", +"}# c #8BB5CE", +"|# c #425461", +"1# c #63819E", +"2# c #415465", +"3# c #0B0D0E", +"4# c #607387", +"5# c #687D8C", +"6# c #B8D6E9", +"7# c #7893A2", +"8# c #576F85", +"9# c #A7BACF", +"0# c #B0CEE5", +"a# c #98C4DC", +"b# c #88B1CA", +"c# c #36444E", +"d# c #8FA0AD", +"e# c #73818D", +"f# c #596D81", +"g# c #B4D0E4", +"h# c #A3CDE2", +"i# c #658296", +"j# c #6A8DAB", +"k# c #7BA5C0", +"l# c #94BAD2", +"m# c #6D899B", +"n# c #99C3DC", +"o# c #8EB9D2", +"p# c #7AA0BA", +"q# c #6C8FAB", +"r# c #6484A1", +"s# c #1F252C", +"t# c #121619", +"u# c #7E96B0", +"v# c #7A8A96", +"w# c #BCD7EA", +"x# c #A0C5D9", +"y# c #3C4B57", +"z# c #A9BACD", +"A# c #BCD5E8", +"B# c #84A6BA", +"C# c #8EA1AE", +"D# c #CFD1D4", +"E# c #ECF6FA", +"F# c #ABB7C2", +"G# c #556F84", +"H# c #57626A", +"I# c #5C7078", +"J# c #6C8AA7", +"K# c #80A6C0", +"L# c #91B8D0", +"M# c #94BFD8", +"N# c #87B0CA", +"O# c #7CA2BB", +"P# c #7097AF", +"Q# c #495E6F", +"R# c #0C0E11", +"S# c #3A3F43", +"T# c #8AA3BB", +"U# c #778592", +"V# c #C0D8EB", +"W# c #B3D5E9", +"X# c #404A53", +"Y# c #B2C2D3", +"Z# c #96A1AC", +"`# c #9DB2C3", +" $ c #AEBECE", +".$ c #EDEFF3", +"+$ c #F7FAFC", +"@$ c #B6BFC7", +"#$ c #556E85", +"$$ c #121314", +"%$ c #2B2E2F", +"&$ c #555A5E", +"*$ c #3B4C5B", +"=$ c #6F8EA4", +"-$ c #92BED8", +";$ c #9DC7DF", +">$ c #87ACC1", +",$ c #546A78", +"'$ c #516874", +")$ c #4E6570", +"!$ c #4D6271", +"~$ c #4C6271", +"{$ c #4E677A", +"]$ c #38454E", +"^$ c #6C7278", +"/$ c #86A1B6", +"($ c #5C656C", +"_$ c #A4B0BA", +":$ c #555D64", +"<$ c #657178", +"[$ c #A6B0B5", +"}$ c #939CA1", +"|$ c #D4E4F1", +"1$ c #A0BACE", +"2$ c #B9C7D7", +"3$ c #F6F7F9", +"4$ c #C6CED1", +"5$ c #506A7C", +"6$ c #060607", +"7$ c #676A6B", +"8$ c #91999F", +"9$ c #7CA3BE", +"0$ c #96BCD4", +"a$ c #5B717E", +"b$ c #4B5F6C", +"c$ c #455864", +"d$ c #5B717F", +"e$ c #81A5B9", +"f$ c #98C4DD", +"g$ c #93BFD8", +"h$ c #87B1CA", +"i$ c #7BA1BC", +"j$ c #5A7489", +"k$ c #222A33", +"l$ c #838A92", +"m$ c #9DADBC", +"n$ c #ECF0F5", +"o$ c #F1F9FB", +"p$ c #818A8D", +"q$ c #4A5155", +"r$ c #6A6F72", +"s$ c #7E898F", +"t$ c #E6F1F7", +"u$ c #CADCED", +"v$ c #A0B7CC", +"w$ c #C6D1DF", +"x$ c #AFB3B4", +"y$ c #5F707D", +"z$ c #CBCFD1", +"A$ c #F4F5F6", +"B$ c #66737F", +"C$ c #87B2CB", +"D$ c #90B7CD", +"E$ c #596E7B", +"F$ c #586F7E", +"G$ c #8BB0C8", +"H$ c #91BED6", +"I$ c #83ADC7", +"J$ c #6D8EA7", +"K$ c #3F5161", +"L$ c #2D3A45", +"M$ c #1F2020", +"N$ c #BDC5CC", +"O$ c #E0EDF5", +"P$ c #BBCAD8", +"Q$ c #E1E4E7", +"R$ c #5E6368", +"S$ c #5B5F62", +"T$ c #D9E7F3", +"U$ c #A4C3D6", +"V$ c #89A3B3", +"W$ c #7B91A1", +"X$ c #627990", +"Y$ c #42505A", +"Z$ c #CACCCE", +"`$ c #F9F9F9", +" % c #FDFDFD", +".% c #BCBEC0", +"+% c #5C7689", +"@% c #8DB9D3", +"#% c #8FB5CC", +"$% c #536471", +"%% c #98C1D9", +"&% c #91BED7", +"*% c #81AAC5", +"=% c #597386", +"-% c #41535F", +";% c #6486A2", +">% c #4D667D", +",% c #070809", +"'% c #44484E", +")% c #BEC8D0", +"!% c #8096A6", +"~% c #516473", +"{% c #A9ACAF", +"]% c #8B8F91", +"^% c #A8B3BD", +"/% c #C5DAEB", +"(% c #9FC8E1", +"_% c #8FBCD6", +":% c #81A8C2", +"<% c #6C90AC", +"[% c #56728C", +"}% c #585B5F", +"|% c #CBCDCD", +"1% c #C1C3C6", +"2% c #4F565F", +"3% c #82ABC3", +"4% c #93BCD3", +"5% c #95BED7", +"6% c #8EB9D3", +"7% c #5B788B", +"8% c #627E91", +"9% c #7FA7C1", +"0% c #6C91AB", +"a% c #546F87", +"b% c #6F7376", +"c% c #D5E2EF", +"d% c #A9C4D8", +"e% c #81A1BA", +"f% c #333940", +"g% c #5F6B76", +"h% c #C0D5E8", +"i% c #AACCE2", +"j% c #8EB8D3", +"k% c #7FA5BF", +"l% c #7095B0", +"m% c #4E697E", +"n% c #07090A", +"o% c #0D0F10", +"p% c #7193A6", +"q% c #96C3DC", +"r% c #8EBCD7", +"s% c #91BDD7", +"t% c #8FBBD6", +"u% c #7699AD", +"v% c #4D626F", +"w% c #252D33", +"x% c #101215", +"y% c #0C0D0E", +"z% c #0A0C0E", +"A% c #06090A", +"B% c #7F8488", +"C% c #D7E3F1", +"D% c #B6D0E4", +"E% c #A3C2D7", +"F% c #596872", +"G% c #A9BED0", +"H% c #B4D0E5", +"I% c #9EC8DC", +"J% c #8FB9D4", +"K% c #85ADC7", +"L% c #7FA4BE", +"M% c #4B606F", +"N% c #4E6372", +"O% c #89B6D0", +"P% c #92C1DA", +"Q% c #9DC7DD", +"R% c #95C0DA", +"S% c #94BED8", +"T% c #8BB8D1", +"U% c #7AA0B9", +"V% c #4E667A", +"W% c #344151", +"X% c #0C0D0F", +"Y% c #8A8F92", +"Z% c #D4E6F5", +"`% c #BCD5E9", +" & c #8599A5", +".& c #939DA6", +"+& c #C4DAEB", +"@& c #89A6B9", +"#& c #7D9FB5", +"$& c #98C3DC", +"%& c #95C0D9", +"&& c #7CA2B9", +"*& c #7697AE", +"=& c #698498", +"-& c #7394A8", +";& c #9EC7DF", +">& c #8DB1C4", +",& c #6B8594", +"'& c #50636C", +")& c #50626C", +"!& c #7F9FB1", +"~& c #93B8D0", +"{& c #627A88", +"]& c #90B6CC", +"^& c #93BDD7", +"/& c #87AFC9", +"(& c #7291A7", +"_& c #384651", +":& c #121618", +"<& c #12171B", +"[& c #4F6986", +"}& c #597998", +"|& c #324052", +"1& c #969CA1", +"2& c #D6E6F5", +"3& c #C6DCEE", +"4& c #505A64", +"5& c #82929F", +"6& c #99ABBB", +"7& c #A1B9CA", +"8& c #87A0B0", +"9& c #718EA1", +"0& c #8DB2C9", +"a& c #8BAEC4", +"b& c #586D7D", +"c& c #97C0D9", +"d& c #8DB3C9", +"e& c #95B8CD", +"f& c #9DC0D6", +"g& c #6F8B9C", +"h& c #354249", +"i& c #464E54", +"j& c #8A98A5", +"k& c #AABAC7", +"l& c #86939E", +"m& c #41494F", +"n& c #4A5861", +"o& c #97C1DA", +"p& c #5E7888", +"q& c #5C7482", +"r& c #88ACC2", +"s& c #91BFD7", +"t& c #799CB5", +"u& c #47596A", +"v& c #0D0F12", +"w& c #1A2127", +"x& c #56778D", +"y& c #688BA9", +"z& c #5D7F9E", +"A& c #547391", +"B& c #0E1013", +"C& c #9DA6AB", +"D& c #C8DCED", +"E& c #7A8996", +"F& c #B5CEE0", +"G& c #BCDBEC", +"H& c #B9D5EA", +"I& c #8BA2B2", +"J& c #6C8A9D", +"K& c #97BFD7", +"L& c #3E4E59", +"M& c #92B5CB", +"N& c #535F68", +"O& c #454F56", +"P& c #6F7C87", +"Q& c #ABC0D1", +"R& c #C7DCEE", +"S& c #C5DBED", +"T& c #C2D7EA", +"U& c #BFD8EA", +"V& c #BCD7EB", +"W& c #62717B", +"X& c #5B6F7B", +"Y& c #95C3DC", +"Z& c #8BB2C9", +"`& c #485761", +" * c #42525F", +".* c #6686A1", +"+* c #587896", +"@* c #1B2129", +"#* c #5C7A94", +"$* c #7DA2BD", +"%* c #84AEC7", +"&* c #749BB5", +"** c #5C7E9C", +"=* c #27343F", +"-* c #A4A9B2", +";* c #D9E7F4", +">* c #C8DBEC", +",* c #B1C8DA", +"'* c #5D6C76", +")* c #A8C5D8", +"!* c #A6BDD0", +"~* c #B9D6EA", +"{* c #B9D4E9", +"]* c #8198A8", +"^* c #8AADC3", +"/* c #8CB1CA", +"(* c #96C2D8", +"_* c #A3C7DF", +":* c #ADCDE3", +"<* c #ABD0E4", +"[* c #ADCFE3", +"}* c #AACEE4", +"|* c #A4CDE3", +"1* c #A1CBE1", +"2* c #A3CCE3", +"3* c #A2C9DF", +"4* c #41515A", +"5* c #81A2B5", +"6* c #94C0D7", +"7* c #5E7789", +"8* c #526777", +"9* c #516777", +"0* c #6B8CA5", +"a* c #759CBA", +"b* c #658AA5", +"c* c #587798", +"d* c #1B242B", +"e* c #0E1110", +"f* c #101214", +"g* c #202931", +"h* c #59758E", +"i* c #799FBB", +"j* c #84B1CA", +"k* c #86ACC6", +"l* c #354758", +"m* c #A0A6AE", +"n* c #DAE6F2", +"o* c #C4DCEE", +"p* c #B4D2E8", +"q* c #3E4A53", +"r* c #698091", +"s* c #5D7581", +"t* c #A3CAE0", +"u* c #A6CFE5", +"v* c #A5CCE5", +"w* c #718A9C", +"x* c #98C3DB", +"y* c #83ABC7", +"z* c #2E3B46", +"A* c #33414A", +"B* c #678398", +"C* c #8AB3CE", +"D* c #93BED7", +"E* c #97C4DB", +"F* c #42525E", +"G* c #88ACC0", +"H* c #789EB9", +"I* c #7A9FBB", +"J* c #7EA2BD", +"K* c #779DB5", +"L* c #577081", +"M* c #5B7B9B", +"N* c #1D2229", +"O* c #547390", +"P* c #54728D", +"Q* c #6082A0", +"R* c #688EA9", +"S* c #6689A7", +"T* c #6086A0", +"U* c #6285A1", +"V* c #6B8DAA", +"W* c #718FAB", +"X* c #3E5568", +"Y* c #969DA1", +"Z* c #DBE8F4", +"`* c #95ACBD", +" = c #758B9A", +".= c #A4C9DE", +"+= c #698190", +"@= c #667E8A", +"#= c #7D99AA", +"$= c #7B9BAD", +"%= c #6F8C9A", +"&= c #536976", +"*= c #84ADC6", +"== c #6D92AD", +"-= c #62829E", +";= c #43576A", +">= c #2F3B46", +",= c #5C788A", +"'= c #86AFC8", +")= c #93BED8", +"!= c #93BAD5", +"~= c #93BAD2", +"{= c #92BCD4", +"]= c #7EA2B6", +"^= c #3D4D56", +"/= c #485B67", +"(= c #7596A9", +"_= c #8CBBD4", +":= c #90BCD5", +"<= c #91BFD9", +"[= c #789BAD", +"}= c #465B6A", +"|= c #59789A", +"1= c #5D7F9D", +"2= c #5E839C", +"3= c #59799A", +"4= c #415569", +"5= c #2D3A46", +"6= c #2E3B49", +"7= c #4A647C", +"8= c #587690", +"9= c #39485A", +"0= c #7F8589", +"a= c #D9E8F5", +"b= c #CCDEEE", +"c= c #8597A5", +"d= c #B3D2E3", +"e= c #9BB3C4", +"f= c #B2CEE1", +"g= c #B2D1E7", +"h= c #ABCFE6", +"i= c #94B7CB", +"j= c #495C6A", +"k= c #688498", +"l= c #617B8A", +"m= c #85ADC8", +"n= c #78A0B9", +"o= c #62819B", +"p= c #2E3843", +"q= c #485A6C", +"r= c #67889C", +"s= c #8AB5CF", +"t= c #8EB9D1", +"u= c #6C899B", +"v= c #6E91A7", +"w= c #678399", +"x= c #6888A1", +"y= c #323E48", +"z= c #5B7585", +"A= c #98C5DD", +"B= c #83ACC1", +"C= c #2D373F", +"D= c #4B637C", +"E= c #567694", +"F= c #26313C", +"G= c #15191F", +"H= c #4D647A", +"I= c #252F39", +"J= c #5D6163", +"K= c #DDE9F5", +"L= c #CEDFEE", +"M= c #8898A5", +"N= c #B0CBDC", +"O= c #BFDAEC", +"P= c #BFDBEC", +"Q= c #BBDAEC", +"R= c #BAD7EA", +"S= c #6B808F", +"T= c #7297B0", +"U= c #8CB8D1", +"V= c #95C1D9", +"W= c #91BCD6", +"X= c #86AEC8", +"Y= c #7496B3", +"Z= c #6587A2", +"`= c #384958", +" - c #323F4B", +".- c #546A7C", +"+- c #6C88A1", +"@- c #779AB1", +"#- c #658297", +"$- c #3B4A58", +"%- c #33404B", +"&- c #202830", +"*- c #577287", +"=- c #86B1CC", +"-- c #86ACC0", +";- c #6E8797", +">- c #9CC7DF", +",- c #92BCD5", +"'- c #91BCD5", +")- c #8EB6CE", +"!- c #344453", +"~- c #263039", +"{- c #364452", +"]- c #2B3643", +"^- c #2A2D2E", +"/- c #E1EBF4", +"(- c #D2E4F3", +"_- c #A0B2C3", +":- c #8094A1", +"<- c #BAD8EB", +"[- c #B8D6EA", +"}- c #485A6A", +"|- c #789FB9", +"1- c #90BBD3", +"2- c #94C4DC", +"3- c #88B3CD", +"4- c #7A9EB9", +"5- c #698BA8", +"6- c #4D677C", +"7- c #151A1E", +"8- c #1A2125", +"9- c #171C21", +"0- c #1D2329", +"a- c #1D262E", +"b- c #486073", +"c- c #6A8CAA", +"d- c #7CA2BE", +"e- c #90BDD7", +"f- c #9AC5DE", +"g- c #7493A2", +"h- c #708B99", +"i- c #8CB7D1", +"j- c #7494AB", +"k- c #68889F", +"l- c #6A8FA5", +"m- c #7BA2BC", +"n- c #171D21", +"o- c #1D262F", +"p- c #212B36", +"q- c #09090B", +"r- c #BBC2C9", +"s- c #D4E4F2", +"t- c #C1D9EB", +"u- c #44515A", +"v- c #92B5C9", +"w- c #6B8795", +"x- c #4E687E", +"y- c #7EA6C0", +"z- c #91BED8", +"A- c #93BFD9", +"B- c #8CB5D0", +"C- c #7DA4BE", +"D- c #6F92AE", +"E- c #6687A5", +"F- c #526C85", +"G- c #415669", +"H- c #384655", +"I- c #6589A4", +"J- c #6E92AE", +"K- c #80A8C2", +"L- c #92BCD6", +"M- c #91BFD8", +"N- c #799AAF", +"O- c #6A8796", +"P- c #81AAC3", +"Q- c #577187", +"R- c #1F2930", +"S- c #192027", +"T- c #1B2227", +"U- c #0D1010", +"V- c #0E1012", +"W- c #070709", +"X- c #5C6062", +"Y- c #DCE8F3", +"Z- c #C4DCEF", +"`- c #9BB3C6", +" ; c #3A424F", +".; c #313A44", +"+; c #35424C", +"@; c #374655", +"#; c #6E91AD", +"$; c #87B2CC", +"%; c #799EBA", +"&; c #618298", +"*; c #7095AF", +"=; c #435663", +"-; c #80A7C0", +";; c #95C4DC", +">; c #779CB3", +",; c #526D7E", +"'; c #516A7A", +"); c #526B7B", +"!; c #465764", +"~; c #34414E", +"{; c #5C7E9A", +"]; c #2B3741", +"^; c #4B657F", +"/; c #5C7D9C", +"(; c #557088", +"_; c #0F0F10", +":; c #B9C2CA", +"<; c #CCDFEF", +"[; c #B4CDE1", +"}; c #8DAEC8", +"|; c #6F93AE", +"1; c #678CA6", +"2; c #6E92AF", +"3; c #81A8C1", +"4; c #8FBBD5", +"5; c #8DB9D2", +"6; c #6D8FA2", +"7; c #586F82", +"8; c #394851", +"9; c #86B0C6", +"0; c #85AFC8", +"a; c #6F94AF", +"b; c #698DA8", +"c; c #6889A7", +"d; c #5E7E9F", +"e; c #475D75", +"f; c #2E3C4A", +"g; c #5D7E9D", +"h; c #405465", +"i; c #36393B", +"j; c #D7E5F1", +"k; c #A4C5DC", +"l; c #668496", +"m; c #7595AB", +"n; c #7798AE", +"o; c #97C2DA", +"p; c #789DB3", +"q; c #8BB1C8", +"r; c #93C0D9", +"s; c #8BB5CF", +"t; c #85AFC9", +"u; c #82AAC6", +"v; c #5F7C95", +"w; c #1E252C", +"x; c #54728E", +"y; c #587899", +"z; c #5A7B9B", +"A; c #2D3843", +"B; c #798086", +"C; c #D1E3F1", +"D; c #B7D3E8", +"E; c #7E98AB", +"F; c #181C1F", +"G; c #46525F", +"H; c #80A1B8", +"I; c #99C3DB", +"J; c #85ACC2", +"K; c #21272D", +"L; c #0A0B0D", +"M; c #53718C", +"N; c #577797", +"O; c #1B2229", +"P; c #0D0E0F", +"Q; c #B3BDC4", +"R; c #CADDED", +"S; c #B4D3E7", +"T; c #2B3339", +"U; c #2F3840", +"V; c #7899AC", +"W; c #93C1D9", +"X; c #8FBCD5", +"Y; c #8BB6D1", +"Z; c #8DB8D2", +"`; c #92BFD8", +" > c #678092", +".> c #547089", +"+> c #5C7F9B", +"@> c #1F262E", +"#> c #202223", +"$> c #B1BECB", +"%> c #C3D9EB", +"&> c #7B8D99", +"*> c #708B9A", +"=> c #85ABC1", +"-> c #7FA3BA", +";> c #92BBD3", +">> c #7CA0B4", +",> c #97BDD4", +"'> c #657E8F", +")> c #93BDD4", +"!> c #88ADC7", +"~> c #6F94AE", +"{> c #526A7E", +"]> c #65849B", +"^> c #799DBB", +"/> c #84AFC9", +"(> c #8FB9D2", +"_> c #323C45", +":> c #516C84", +"<> c #658AA4", +"[> c #5B7C9B", +"}> c #2E3A49", +"|> c #2A3038", +"1> c #252D3A", +"2> c #1B1E20", +"3> c #ADBFCF", +"4> c #C0D6E7", +"5> c #B0CDE2", +"6> c #8EB3C9", +"7> c #526975", +"8> c #6B899D", +"9> c #597183", +"0> c #90BAD5", +"a> c #94C2DA", +"b> c #82ABC5", +"c> c #495E6E", +"d> c #82A8C3", +"e> c #81A4BA", +"f> c #7594A5", +"g> c #87ABC3", +"h> c #4D6573", +"i> c #6689A6", +"j> c #526E85", +"k> c #243037", +"l> c #607B96", +"m> c #7699B6", +"n> c #789EB5", +"o> c #303D48", +"p> c #7498B4", +"q> c #7094AF", +"r> c #597792", +"s> c #242F39", +"t> c #1A1D25", +"u> c #374553", +"v> c #4D677D", +"w> c #14191E", +"x> c #040505", +"y> c #171A1D", +"z> c #8A9FAD", +"A> c #BCD9EC", +"B> c #B5D3E7", +"C> c #A2CAE1", +"D> c #9DC7DE", +"E> c #9EC7DD", +"F> c #3B4A57", +"G> c #455867", +"H> c #98C2DB", +"I> c #85B0CC", +"J> c #7496B2", +"K> c #4C606F", +"L> c #6E8EA3", +"M> c #7EA0B6", +"N> c #91BBD3", +"O> c #8DB7D1", +"P> c #90BAD4", +"Q> c #96C1DA", +"R> c #3B4853", +"S> c #688AA5", +"T> c #4C657A", +"U> c #1B2026", +"V> c #2B3C44", +"W> c #5F7A90", +"X> c #587284", +"Y> c #536978", +"Z> c #88B1CC", +"`> c #759AB8", +" , c #617E9A", +"., c #556F85", +"+, c #20272E", +"@, c #323D48", +"#, c #333E4A", +"$, c #060707", +"%, c #4A5159", +"&, c #ACC3D5", +"*, c #ACCFE5", +"=, c #5A6874", +"-, c #AACDE1", +";, c #9CC6DC", +">, c #35414C", +",, c #769AB2", +"', c #80AAC5", +"), c #6F92AB", +"!, c #38464F", +"~, c #7EA4B9", +"{, c #97C3DC", +"], c #7A9FB6", +"^, c #3F505C", +"/, c #6D8DA6", +"(, c #1E282E", +"_, c #080909", +":, c #090A0C", +"<, c #344452", +"[, c #3B4857", +"}, c #7799AE", +"|, c #8DB6D1", +"1, c #66869E", +"2, c #3D4957", +"3, c #536C84", +"4, c #353F4C", +"5, c #111215", +"6, c #65727E", +"7, c #A6BCCD", +"8, c #5D6972", +"9, c #AED0E6", +"0, c #99C5DC", +"a, c #8DB5D0", +"b, c #8DB5CE", +"c, c #90BBD5", +"d, c #84AAC5", +"e, c #8EBBD5", +"f, c #80A7C1", +"g, c #6C8DA2", +"h, c #85AFC6", +"i, c #61839B", +"j, c #374352", +"k, c #576D83", +"l, c #80A6C1", +"m, c #81A4BB", +"n, c #111315", +"o, c #111418", +"p, c #4C6378", +"q, c #33424C", +"r, c #37454D", +"s, c #8DB4CF", +"t, c #7397B3", +"u, c #3A495A", +"v, c #0D0F13", +"w, c #27303A", +"x, c #272E36", +"y, c #0F1012", +"z, c #90A4B2", +"A, c #A8CBE2", +"B, c #91BCD4", +"C, c #80ABC3", +"D, c #567083", +"E, c #67899D", +"F, c #94C2DB", +"G, c #95C1DB", +"H, c #779CB2", +"I, c #60849E", +"J, c #64849F", +"K, c #1A1F22", +"L, c #405061", +"M, c #79A1BD", +"N, c #324051", +"O, c #6183A1", +"P, c #6B8FAD", +"Q, c #6485A2", +"R, c #34444F", +"S, c #060606", +"T, c #2D3339", +"U, c #B2CBDF", +"V, c #94BCD5", +"W, c #7DA2BA", +"X, c #3F5264", +"Y, c #5A7991", +"Z, c #7195B3", +"`, c #7BA5BD", +" ' c #81AAC6", +".' c #88B2CC", +"+' c #8EBBD4", +"@' c #8AB2CC", +"#' c #82ADC7", +"$' c #7092A5", +"%' c #95C2DA", +"&' c #41525F", +"*' c #6387A3", +"=' c #475F72", +"-' c #21282F", +";' c #5B7288", +">' c #0D0F11", +",' c #0B0E11", +"'' c #212C36", +")' c #26323C", +"!' c #161B20", +"~' c #55616D", +"{' c #9BB9D0", +"]' c #799EB6", +"^' c #27313A", +"/' c #1A222B", +"(' c #5D7E99", +"_' c #6587A4", +":' c #6789A6", +"<' c #6B8EAB", +"[' c #628097", +"}' c #6D8B9D", +"|' c #769AAF", +"1' c #6E91A9", +"2' c #6C8EAD", +"3' c #6E91AF", +"4' c #3C4D59", +"5' c #8BB1CB", +"6' c #232D32", +"7' c #13171B", +"8' c #232B32", +"9' c #839AAF", +"0' c #789BB3", +"a' c #283138", +"b' c #0C0E0F", +"c' c #242B33", +"d' c #3D4D5B", +"e' c #435768", +"f' c #4B6176", +"g' c #283137", +"h' c #8DB4CC", +"i' c #41535E", +"j' c #405362", +"k' c #3C4F60", +"l' c #3C4E5B", +"m' c #2B353E", +"n' c #526876", +"o' c #92BAD3", +"p' c #1B1F23", +"q' c #31383F", +"r' c #7F9CB6", +"s' c #21292F", +"t' c #29333F", +"u' c #1F252E", +"v' c #090A0E", +"w' c #4D626E", +"x' c #96BDD3", +"y' c #191D20", +"z' c #13181B", +"A' c #80A4BC", +"B' c #1B2027", +"C' c #5D7182", +"D' c #2C383F", +"E' c #364857", +"F' c #1A2028", +"G' c #333F49", +"H' c #7FA2B5", +"I' c #4A5E6E", +"J' c #232E35", +"K' c #252D35", +"L' c #2F3A41", +"M' c #0A0B0E", +"N' c #14191D", +"O' c #5A717F", +"P' c #212931", +"Q' c #222B34", +"R' c #101216", +"S' c #21272B", +" ", +" ", +" ", +" . ", +" + ", +" @ # $ % ", +" & * = - ; ", +" > , ' ) ! ~ { ] ", +" ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a ", +" b c d e f g h i j k l m n o p q r s t u v w x ", +" y z A B C D E F G H I J K L M N O P Q R S T U U V W X Y ", +" Z ` ...+.@.#.$.%.O &.*.=.-.;.>.,.'.).!.~.~.~.{.].^./.(._.:.<. ", +" b [.}.|.#.1.2.3.4.{.~.~.~.~.5.6.5.~.7.8.{.~.~.~.~.9.0.a.b.].c. ", +" d.e.f.g.h.i.j.k.{.~.~.~.~.l.~.m.% n.~.o.{.{.~.~.~.~.p.V 9.~.q.r. ", +" s.t.u.v.w.x.u y.z.A.B.5.~.~.5.C.D.E.F.~.~.G.~.~.~.G.H.I.J.~.~.J.K.L. M.N. ", +" O.P.Q.R.S.T.U.V.W.X.Y.Z.`.~.~.5. +.+++@+U ~.~.~.~.~.#+$+%+,.~.~.G.&+*+=+-+;+ ", +" >+,+Q.'+)+!+~+{+]+^+/+(+_+:+<+~.[+}+U 9.|+5.~.~.~.~.1+2+3+4+5+~.].6+7+8+9+0+ ", +" a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+5.U ~.U r+s+~.~.~.t+u+v+w+x+y+~.z+A+t+B+C+D+E+ F+G+ ", +" H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+V ~.~.~.~.U ~.~.~.o.9.{.Z+`+9.~.~.~.V @.@+@@@#@ $@%@&@*@ ", +" =@-@;@>@,@'@'.)@!@~@{@]@^@/@l+(@_@:@<@~.~.~.U {.~.~.~.{.~.~.{.[@~.~.~.~.}@|@1@2@3@4@5@6@7@8@ ", +" 9@0@a@b@c@d@-.e@f@g@h@i@j@k@l@V+m@n@o@p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.q@r@s@t@u@v@w@x@y@ ", +"z@A@B@C@D@E@X F@G@H@R I@J@K@L@M@N@O@P@Q@R@o+S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.9.U@V@W@X@<+V Y@Z@`@ # ", +" .#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.U (#_#:#<#p@{.[#}#|#1#2# ", +" 3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.l#m#9.{.~.n#o#p#q#r#s# ", +" t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#% J#K#S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.L#0.l.~.~.{.M#N#O#P#Q#R# ", +" S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$-$a#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.o.o.;$9.G.~.>$,$'$)$!$~${$]$ ", +" ^$/$($_$:$<$[$}$|$1$2$3$4$5$6$7$8$9$:+<+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.G.0$a$b$c$d$e$f$g$h$i$j$k$ ", +" [ l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$M#p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.;$D$E$F$G$H$I$J$K$L$ ", +" M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%<+{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.#%$%%%p@&%*%=%-%;%>%,% ", +" '%)%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%3%-$T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.4%5%U p@6%7%8%9%0%a%y ", +" b%c%d%e%f%g%h%i%G.[#j%k%l%m%n%o%p%@%q%{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.~.~.~.~.~.V G.}@r%s%t%u%v%w%M.x%y%z%A% ", +" B%C%D%E%F%G%H%I%V o.<@J%K%L%M%N%O%P%p@~.~.~.~.~.~.~.~.~.U ~.~.U 9.Q%{.~.~.~.~.~.{.%%U {.~.~.{.v@R%S%T%U%V%W% X%$ ", +" Y%Z%`% &.&+&@&#&U ~.{.$&%&&&*&=&-&T@~.~.~.~.~.~.~.~.~.~.~.;&>&,&'&)&!&5+~.~.~.~.{.~&{&]&9.~.p@^&/&(&_&:& <&[&}&|& ", +" 1&2&3&4&5&6&7&8&9&l.~.{.V 0&a&b&c&~.~.~.~.~.~.~.5.d&e&f&g&h&i&j&k&l&m&n&~.~.G.~.~.~.o&p&q&r&s&t&u&v& w&x&y&z&A&B& ", +" C&2&D&E&F&G&G&H&I&J&U ~.~.U K&L&,.~.~.~.~.~.~.~.U M&N&O&P&Q&R&S&T&U&V&W&X&].{.~.~.{./#Y&Z&`& *.*+*@* (.#*$*%*&***=* ", +" -*;*>*,*'*)*!*~*{*]*^*~.5.{.5./*U ~.~.~.~.~.~.{.[#(*_*:*<*[*[*}*|*1*2*3*4*5*U ~.~.6*7*8*9*0*a*b*c*d*e*f*g*h*i*%*j*k*<%l* ", +" m*n*o*p*q*r*s*t*u*v*w*1+~.~.~.~.~.~.~.~.~.~.~.x*y*z*A*B*C*D*E*V U ~.G.~.:.F*G*l.{.R%X+H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X* ", +" Y*Z*D&`* =.=+=@=#=$=%=&={.~.~.~.~.~.~.~.~.~.~.<+*===-=;=>=,='=)=[#p@!=~={=]=^=/=(=a#&%_=:=<=-#[=}=k$|=1=2=3=4=5=6=7=8=9= ", +" 0=a=b=c=d=e=f=g=h=i=j=k=l=5.~.~.~.~.~.~.~.~.~.V -$m=n===o=p=q=r=s=t=:+u=v=w=x=y=z=A=J.V U ~.V [#B=C=D=1=E=F= G=H=I= ", +" J=K=L=M=N=O=P=Q=R=S=T=U=V=5.U ~.~.~.~.~.~.~.~.~.{.x*W=X=Y=Z=`= -.-+-@-#-$-%-&-*-=---;->-9.x*)=,-'-)-c.!-~- {-]- ", +" ^-/-(-_-:-<-<-[-%.}-|-1-T@~.{.~.~.~.~.~.~.~.~.~.~.V 2-^&3-4-5-6-7-8-9-0-a-b-c-d-e-f-g-h-V@i-j-k-l-T=m-7@n- o-p- ", +" q-r-s-t-u-v-!+2*w-x-y-z-V ~.~.~.~.~.~.~.~.~.~.~.~.~.~./#A-B-C-D-E-F-G-H-I-J-K-L-<@M-W=N-O-P-Q-R-<&S-T-U-V- W- ", +" X-Y-Z-`- ;.;+;@;#;$;q+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~./#v@W=N#%;&;*;=;-;s=-#;;>;,;';);!;~;{;];^;/;(;H+ ", +" _;:;<;[;};|;1;2;3;4;{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.T@-#5;6;7;8;9;[#V <+0;a;b;c;E-d;e;f;|=g;h; ", +" i;j;V#k;F.l;m;n;o;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.{.p@S@s=p;q;~.~.{.r;s;t;u;~$v;w;x;y;z;A; ", +" H+B;C;D;E;F;G;H;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.U ~.~.V E*E*V ~.~.~.{.T@/#I;J;K;L;M;y;N;O; ", +" P;Q;R;S;T;U;~.{.~.~.~.~.~.~.~.~.l.U {.p@~.~.{.V ~.~.5+V;].~.~.~.~.{.{.p@W;X;Y;Z;`;/# >W..>+>N;@> ", +" #>$>%>&>*>G.~.~.~.~.~.~.~.~.{.`.=>V=->;>~.n##&>>T@,>'>].~.~.~.~.~.)>!>i$~>{>]>^>/>(>_>:><>[>}> |>1> ", +" 2>3>4>5>U@U ~.~.~.~.~.~.~.{.6>7>8>9>0>a#a>b>c>d>e>f>~.~.~.V ~.~.g>h>i>1=j>,%k>l>m>n>o>p>q>r>s>t>u>v>w> ", +" x>y>z>A>B>C>5+D>E>~.~.~.~.{.%&F>G>3;s%{.H>I>J>K>L>M>~.V N>O>P>x*Q>R>S>T>U> X%V>W>X>Y>Z>P-`> ,.,+, ", +" @,#,$,%,&,1.*,=,-,;,{.p@V {.X@>,,,Z;V ~.5.`;',),!,~,~.{,],^,/,/&-$F$(,_, :,<,[,},<@|,1,2, ", +" B&3,4, 5,6,7,8,9,0,`;a,b,B+c,d,s=<+~.~.~.a#e,f,g,h,V -#9$i,j,k,l,m,n, o,p,q,r,s,t,u,v, ", +" w,x, y,z,A,B,C,D,E,o@F,G,<+~.~.~.~.~.;;P>j%}@p@H,]#I,J,K,L,M,=+ N,O,P,Q,R,S, ", +" T,U,V,W,X,Y,Z,`, '.'+'x*~.{.O+@%@'#'$'%'a#&'*'='-' ~;;'>' ,''')'!' ", +" ~'{']'^'/'('_'_':'<'['}'{.V |'1'2'3'4'5'}@6'7' 8'K; ", +" v&9'0'a' b'c'd'e'f'1@g'h'G.i'j'k'l'm'n'o'p' y ", +" q'r's' t'u'H+ v'w'x'y' z'A'B' ", +" C'D' E'F' G'H' I'J' ", +" K'L' M' N'O' P'Q' ", +" R' S' ", +" ", +" ", +" ", +" "}; diff --git a/mlx/test/run_tests.sh b/mlx/test/run_tests.sh new file mode 100644 index 0000000..d33cd5e --- /dev/null +++ b/mlx/test/run_tests.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env sh + +# This very basic script simulate user inputs for the CI +# Feel free to update, improve or remove it if proper +# intergration tests and/or unit tests are added. + +set -e + +BOLD="\033[1m" +RESET="\033[0m" +LIGHT_RED="\033[91m" +LIGHT_GREEN="\033[92m" +LIGHT_CYAN="\033[96m" + +logging(){ + local type=$1; shift + printf "${LIGHT_CYAN}${BOLD}run_tests${RESET} [%b] : %b\n" "$type" "$*" +} +log_info(){ + logging "${LIGHT_GREEN}info${RESET}" "$@" +} +log_error(){ + logging "${LIGHT_RED}error${RESET}" "$@" >&2 + exit 1 +} + + +PID="" + +# to properly kill child process executed in background on exit +at_exit() { + status=$? + [ $status -eq 0 ] && log_info "Seem all went well" && exit 0 + # Code for non-zero exit: + if ! kill -s TERM "$PID" 2>/dev/null || ! wait "$PID" ; then + log_error "Pid [$PID] died with status $status " + fi + log_error "Something went wrong. Pid [$PID] has been killed. Status code $status" +} +# to properly quit from ctrl+c (SIGINT Signal) +sigint_handler(){ + kill -s TERM "$PID" + wait + log_info "Tests abort" + exit 1 +} + +# look at test/main.c and run ./mlx-test to understand what this function does +test_default_main(){ + ${MAKE} -f Makefile.gen all + ./mlx-test & + PID="$!" + log_info "./mlx-test running in background, pid:" $PID + + i=25 # waiting 25s mlx-test to be ready for inputs. + while [ $i -gt 0 ]; do + if ! ps -p $PID > /dev/null ; then + wait $PID + fi + log_info "countdown" $i + sleep 1 + i=$((i - 1)) + done + log_info "Ready to \"just play\" using xdotool" + wid1=$(xdotool search --name Title1) + wid2=$(xdotool search --name Title2) + wid3=$(xdotool search --name Title3) + + xdotool windowfocus $wid3 + log_info "Focus Win3: Testing move mouse 100 100" + xdotool mousemove 100 100 + log_info "Focus Win3: Testing move mouse 200 200" + xdotool mousemove 200 200 + log_info "Focus Win3: Pressing escape to destroy window \"Win3\"" + xdotool key Escape + + log_info "Focus Win2: Pressing escape to stop program" + xdotool windowfocus $wid2 + xdotool key Escape +} + +main(){ + case $(uname) in + FreeBSD) MAKE=gmake ;; + *) MAKE=make ;; + esac + cd $(dirname $0) + trap at_exit EXIT + trap sigint_handler INT + + test_default_main +} + +main "$@" diff --git a/sprite/Nouveau projet (2).png:Zone.Identifier b/sprite/Nouveau projet (2).png:Zone.Identifier new file mode 100644 index 0000000..ac5aebd --- /dev/null +++ b/sprite/Nouveau projet (2).png:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=https://www.photopea.com/ diff --git a/sprite/Nouveau-projet-_1_.xpm:Zone.Identifier b/sprite/Nouveau-projet-_1_.xpm:Zone.Identifier new file mode 100644 index 0000000..eafbb5c --- /dev/null +++ b/sprite/Nouveau-projet-_1_.xpm:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://convertio.co/ +HostUrl=https://s122.convertio.me/p/okLgAQyWaXH3BPAVt8iwfw/56be0757b02ebc3b426877866a2d5391/Nouveau-projet-_1_.xpm diff --git a/sprite/Nouveau-projet-_2_.xpm:Zone.Identifier b/sprite/Nouveau-projet-_2_.xpm:Zone.Identifier new file mode 100644 index 0000000..c0b0f58 --- /dev/null +++ b/sprite/Nouveau-projet-_2_.xpm:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://convertio.co/ +HostUrl=https://s167.convertio.me/p/yeHxKzYHMsgzX63ZlmVYcg/c44fd54ef093950da76fa0aecf3d2964/Nouveau-projet-_2_.xpm diff --git a/sprite/Nouveau-projet.xpm:Zone.Identifier b/sprite/Nouveau-projet.xpm:Zone.Identifier new file mode 100644 index 0000000..1b1d476 --- /dev/null +++ b/sprite/Nouveau-projet.xpm:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://convertio.co/ +HostUrl=https://s112.convertio.me/p/r871wFIJih4QPAabVzANrg/56be0757b02ebc3b426877866a2d5391/Nouveau-projet.xpm diff --git a/sprite/back.xpm b/sprite/back.xpm new file mode 100644 index 0000000..5c5a341 --- /dev/null +++ b/sprite/back.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static char *bb1113caba2a4396da9abfa5b6bd9e69XybgBMHJ8j6bcKH6[] = { +/* columns rows colors chars-per-pixel */ +"32 32 1 1 ", +" c white", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/sprite/back2.xpm b/sprite/back2.xpm new file mode 100644 index 0000000..b232879 --- /dev/null +++ b/sprite/back2.xpm @@ -0,0 +1,41 @@ +/* XPM */ +static char *_49dd254199246a1977f20555a1f9063nPJ1VTqEOaIleAR1[] = { +/* columns rows colors chars-per-pixel */ +"32 32 3 1 ", +" c #6E924D", +". c #4D733E", +"X c #87B055", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" . ", +" . . ", +" . ", +" ", +" ", +" X ", +" XX ", +" X XX X ", +" X X.XX ", +" X X .XX. ", +" X X .. ", +" X ", +" ", +" ", +" X ", +" X X ", +" X ", +" ", +" ", +" ", +" . ", +" . . ", +" . ", +" X ", +" X X ", +" X X ", +" X " +}; diff --git a/sprite/player.xpm b/sprite/player.xpm new file mode 100644 index 0000000..8424355 --- /dev/null +++ b/sprite/player.xpm @@ -0,0 +1,11 @@ +/* XPM */ +static char *_e3cb0cf605640f8cfaeebccffd9d135vy2vdFXbHJ5SKHnn[] = { +/* columns rows colors chars-per-pixel */ +"4 4 1 1 ", +" c #10F00B", +/* pixels */ +" ", +" ", +" ", +" " +}; diff --git a/sprite/snow_tree.xpm b/sprite/snow_tree.xpm new file mode 100644 index 0000000..cf84aaf --- /dev/null +++ b/sprite/snow_tree.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static char *_cbafb9a07c3469ffcea1686de5f8991nVqbqFhPdwVvKnWZ[] = { +/* columns rows colors chars-per-pixel */ +"32 32 1 1 ", +" c #3B3737", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/sprite/snow_tree1.xpm b/sprite/snow_tree1.xpm new file mode 100644 index 0000000..5da8414 --- /dev/null +++ b/sprite/snow_tree1.xpm @@ -0,0 +1,176 @@ +/* XPM */ +static char *ed1556952fcd432ffcab70bbc17ab48bTGW28QFGniQVrKcD[] = { +/* columns rows colors chars-per-pixel */ +"32 32 138 2 ", +" c #6E924D", +". c #91AC78", +"X c #DCE5D4", +"o c white", +"O c #7D9E69", +"+ c #F3F6FE", +"@ c #D7E4FD", +"# c #85A36A", +"$ c #628B4D", +"% c #54925A", +"& c #EAF1FE", +"* c #789C78", +"= c #C4D9D5", +"- c #63A05C", +"; c #BFCFBE", +": c #97B28D", +"> c #4D9262", +", c #71A876", +"< c #6FA958", +"1 c #98C09B", +"2 c #619E7B", +"3 c #CCDFD9", +"4 c #ECF2FE", +"5 c #A1BBBE", +"6 c #5B864D", +"7 c #BACCB8", +"8 c #C0D6D4", +"9 c #7DA87D", +"0 c #E0E9FD", +"q c #C8DCD9", +"w c #D0E1E5", +"e c #55846A", +"r c #3E734E", +"t c #42734A", +"y c #7CA89B", +"u c #87B770", +"i c #6AA55A", +"p c #47865A", +"a c #4B8D5F", +"s c #427A53", +"d c #6C9578", +"f c #4B8355", +"g c #E3EEE6", +"h c #D4E5D9", +"j c #7FB186", +"k c #94BE98", +"l c #ADC4BF", +"z c #588B6F", +"x c #497A4E", +"c c #7FAFA0", +"v c #B9D2D8", +"b c #A6C6C5", +"n c #69A37B", +"m c #458258", +"M c #C5D3B8", +"N c #48875B", +"B c #B8CBB7", +"V c #468358", +"C c #437E55", +"Z c #78AC88", +"A c #8BAB95", +"S c #BACDBF", +"D c #87B055", +"F c #84A58C", +"G c #F7F9FF", +"H c #BFD8C6", +"J c #6F9A7C", +"K c #91B69C", +"L c #95B6BA", +"P c #4F7E4E", +"I c #BCCFD3", +"U c #DFECD6", +"Y c #A5C6BF", +"T c #93B1B6", +"R c #C7D7E1", +"E c #407851", +"W c #668D4D", +"Q c #517F4E", +"! c #83A594", +"~ c #608C78", +"^ c #769D94", +"/ c #709C7D", +"( c #B6CBD3", +") c #8FBC81", +"_ c #B8D3C0", +"` c #D6E5E5", +"' c #6BA487", +"] c #7AA498", +"[ c #86AA91", +"{ c #9CB593", +"} c #447F56", +"| c #498B5D", +" . c #87AD93", +".. c #B2C7B8", +"X. c #B5CEBD", +"o. c #72A180", +"O. c #68A45A", +"+. c #9FBAB7", +"@. c #94BEA1", +"#. c #5D896A", +"$. c #74A091", +"%. c #C3D8E4", +"&. c #CBDBFC", +"*. c #62917B", +"=. c #65977F", +"-. c #74A583", +";. c #7AAC99", +":. c #D1E1E2", +">. c #BFD6D8", +",. c #B7D2C6", +"<. c #88B5A0", +"1. c #99BEBE", +"2. c #58995F", +"3. c #46784E", +"4. c #78A796", +"5. c #424643", +"6. c #45283C", +"7. c #4D733E", +"8. c #695D3C", +"9. c #663931", +"0. c #522F38", +"q. c #5A783F", +"w. c #628245", +"e. c #526D39", +"r. c #4D6636", +"t. c #563A36", +"y. c #494E38", +"u. c #535B34", +"i. c #5E3534", +"p. c #4A2B3A", +"a. c #4D2C39", +"s. c #55703B", +"d. c #668848", +"f. c #5C4B33", +"g. c #584035", +"h. c #6D8E45", +"j. c #5E7B3B", +"k. c #618044", +/* pixels */ +" ", +" . X o O ", +" . o + @ + # ", +" $ % & o o o o # ", +" * + = - + o o ; ", +" : > , < 1 2 3 4 5 6 ", +" 7 8 9 0 q w 0 e r t ", +" y u i p p p a > s d ", +" f g h j k g o o l 0 z x ", +" p c v b n > v 5 m m s 6 ", +" M o > m m N > > > > N s x ", +" B o - > V C C V > Z n A S 6 ", +" D F G H - > J A K > o o v L P ", +" D x I G H U Y T R & & T V E r W ", +" D D Q o ! ~ ^ y > > p r C m m / r 6 ", +" D D Q ( o ) > > > > > > > _ o 5 r 6 ", +" D Q s c 0 n ` o 4 2 > ' ] ] r [ { ", +" r r s } | ' c 2 > > | p ...5 x ", +" ..X.N Y ` h _ o.} | O._ 4 N E r ", +" +.o @.r ~ ^ #.$.T %.0 &.*.C s r D ", +" =.+ & -.r r r r r p p ..X.Y > r D D ", +" f ;.:.3 Z Z >.,.n <.& & 1.2.p r D ", +" 3.C 4.' > > p > > > > p r r $ ", +" 6 r s } E r r r r r r r W ", +" x r 5.6.6.6.6 ", +" 7. 8.9.0.0.0.q. ", +" 7. 7. w.e.r.t.9.9.0.0.y.r.r.q. ", +" 7. w.r.r.u.y.9.i.0.p.a.u.r.r.s. ", +" d.r.r.r.f.0.a.6.6.g.r.r.r.h. ", +" d.s.r.u.r.r.r.r.y.r.j.k.D ", +" d.k.k.k.k.k. D D ", +" D " +}; diff --git a/srcs/Cub3D.h b/srcs/Cub3D.h new file mode 100644 index 0000000..1d8a199 --- /dev/null +++ b/srcs/Cub3D.h @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* Cub3D.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/02/13 16:30:59 by apommier #+# #+# */ +/* Updated: 2022/05/03 16:48:27 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef CUB3D_H +# define CUB3D_H + +# include "../mlx/mlx.h" +# include "../mlx/mlx_int.h" +# include "../libft/libft.h" +# include +# include +# include +# include +# include +# include + +# define PI 3.14159265359 + +typedef struct map_information{ + char **map; + int floor; + int sky; +} map_info; + +typedef struct player_position +{ + float x; + float y; + float angle; + float vx; + float vy; +} player; + +typedef struct s_data { + void *mlx; + void *mlx_win; + char **map; + player player; +} t_data; + +void print_ray(t_data *img); +int key_press(int code, t_data *img); +int quit_game(t_data *img); +void ft_error(char *error_msg); +void print_player(player player, t_data *img); +void print_map(char **map, t_data *img); + +#endif \ No newline at end of file diff --git a/srcs/main.c b/srcs/main.c new file mode 100644 index 0000000..1b88a20 --- /dev/null +++ b/srcs/main.c @@ -0,0 +1,128 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/02/13 16:42:55 by apommier #+# #+# */ +/* Updated: 2022/05/03 17:13:33 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "Cub3D.h" + +void print_ray(t_data *img) +{ + int i = -1; + while (++i < 15) + { + mlx_pixel_put(img->mlx, img->mlx_win, (img->player.x + (img->player.vx / 5) * i) + 2, (img->player.y + (img->player.vy / 5) * i) + 2, 255); + } +} + +char **set_map(char **argv) +{ + char **map_tab; + char *map; + char *del; + char *swap; + int fd; + + map = 0; + fd = open(argv[1], O_RDONLY); + if (fd == -1) + ft_error("Error: Open call fail"); + swap = get_next_line(fd); + while (swap) + { + del = map; + map = ft_strjoin(map, swap); + free(swap); + swap = get_next_line(fd); + free(del); + } + close(fd); + map_tab = ft_split(map, '\n'); + free(map); + if (!map_tab) + ft_error("Error: Map file is empty"); + return (map_tab); +} + +void print_case(char type, t_data *img, int y, int x) +{ + int *buffer = 0; + int img_width; + int img_height; + + if (type == '1') + buffer = mlx_xpm_file_to_image(img->mlx, "./sprite/snow_tree.xpm", + &img_width, &img_height); + else + buffer = mlx_xpm_file_to_image(img->mlx, "./sprite/back.xpm", + &img_width, &img_height); + if (!buffer) + ft_error("no buffer"); + mlx_put_image_to_window(img->mlx, img->mlx_win, buffer, x, y); + mlx_destroy_image(img->mlx, buffer); +} + +void print_map(char **map, t_data *img) +{ + int i; + int j; + int x = 0; + int y = 0; + + i = 0; + j = 0; + while (map[j]) + { + x = 0; + i = 0; + while (map[j][i]) + { + print_case(map[j][i], img, (j * 32) + y, (i * 32) + x); + i++; + x++; + } + j++; + y++; + } +} + +void print_player(player player, t_data *img) +{ + int *buffer = 0; + int img_width; + int img_height; + + buffer = mlx_xpm_file_to_image(img->mlx, "./sprite/player.xpm", + &img_width, &img_height); + mlx_put_image_to_window(img->mlx, img->mlx_win, buffer, player.x, player.y); + mlx_destroy_image(img->mlx, buffer); +} + +int main(int argc, char **argv) +{ + t_data img; + + if (argc != 2) + ft_error("Error: bad number of arguments"); + img.mlx = mlx_init(); + if (!img.mlx) + ft_error("Error: mlx_init fail"); + img.map = set_map(argv); + img.mlx_win = mlx_new_window(img.mlx, 1024, 512, "Cub3D"); + img.player.x = 250; + img.player.y = 250; + img.player.vx = PI / 2; + img.player.vy = PI / 2; + img.player.angle = 0; + print_map(img.map, &img); + print_player(img.player, &img); + mlx_hook(img.mlx_win, 2, 1L << 0, &key_press, &img); + mlx_hook(img.mlx_win, 17, 0L, &quit_game, &img); + mlx_loop(img.mlx); +} diff --git a/srcs/utils.c b/srcs/utils.c new file mode 100644 index 0000000..1620e1a --- /dev/null +++ b/srcs/utils.c @@ -0,0 +1,95 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/02/13 23:37:02 by apommier #+# #+# */ +/* Updated: 2022/05/03 17:02:42 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "Cub3D.h" + +int quit_game(t_data *img) +{ + mlx_destroy_window(img->mlx, img->mlx_win); + mlx_destroy_display(img->mlx); + if (img->mlx) + free(img->mlx); + free_double(img->map); + exit(0); +} + +void ft_error(char *error_msg) +{ + /*int i; + + i = 0;*/ + ft_putstr_fd(error_msg, 2); + exit(1); +} + +int is_good(t_data *img, int type) +{ + printf("touche= %c\n", type); + printf("vx= %f vy= %f\n", img->player.vx, img->player.vy); + printf("player: x= %f y= %f\n", img->player.x, img->player.y); + if (type == 'w') + { + img->player.x += img->player.vx; + img->player.y += img->player.vy; + } + else if (type == 's') + { + img->player.x -= img->player.vx; + img->player.y -= img->player.vy; + } + else if (type == 'a') + { + img->player.x += img->player.vx * 5; + //img->player.y -= img->player.vy; + } + else if (type == 'd') + { + img->player.x -= img->player.vx * 5; + //img->player.y += img->player.vy; + } + else if (type == 65361)//fleche gauche + { + img->player.angle -=0.1; + if (img->player.angle < 0) + img->player.angle += 2 * PI; + img->player.vx = cos(img->player.angle) * 5; + img->player.vy = sin(img->player.angle) * 5; + } + else if (type == 65363)//fleche droite + { + img->player.angle +=0.1; + if (img->player.angle > 2 * PI) + img->player.angle -= 2 * PI; + img->player.vx = cos(img->player.angle) * 5; + img->player.vy = sin(img->player.angle) * 5; + } + else + return (0); + printf("after player: x= %f y= %f\n", img->player.x, img->player.y); + return (1); +} + +int key_press(int code, t_data *img) +{ + if (code == 65307) + quit_game(img); + else + { + is_good(img, code); + //printf("code = %d\n", code); + //mlx_clear_window(img->mlx, img->mlx_win); + print_map(img->map, img); + print_player(img->player, img); + print_ray(img); + } + return (1); +}