├── .gitignore ├── 0introducao.c ├── 1desenha_limpa.c ├── 2inicia_finaliza.c ├── 3imagem_xpm.c ├── 4hooks.c ├── 5ocultos.c ├── 6testes.c ├── CONTRIBUTING.md ├── FUNCOES.md ├── LICENSE ├── README.md ├── fluxograma.png └── pikachu.xpm /.gitignore: -------------------------------------------------------------------------------- 1 | a.out 2 | *.gch 3 | *.o 4 | -------------------------------------------------------------------------------- /0introducao.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #define ESC 65307 6 | 7 | typedef struct struct_ponteiros { 8 | void *mlx; 9 | void *janela; 10 | } tipo_ponteiros; 11 | 12 | int checa_teclas(int tecla, tipo_ponteiros *ponteiros) { 13 | if (tecla == ESC) { 14 | printf("Fechando a janela e encerrando o programa...\n"); 15 | mlx_destroy_window(ponteiros->mlx, ponteiros->janela); 16 | mlx_destroy_display(ponteiros->mlx); 17 | free(ponteiros->mlx); 18 | exit(0); 19 | } 20 | else 21 | printf("Voce pressionou a tecla: %c\n", tecla); 22 | return (0); 23 | } 24 | 25 | int main() { 26 | tipo_ponteiros ponteiros; 27 | void *ponteiro_da_mlx; 28 | void *ponteiro_da_janela; 29 | 30 | ponteiro_da_mlx = mlx_init(); 31 | 32 | ponteiro_da_janela = mlx_new_window(ponteiro_da_mlx, 400, 300, "Janela"); 33 | 34 | ponteiros.mlx = ponteiro_da_mlx; 35 | ponteiros.janela = ponteiro_da_janela; 36 | 37 | mlx_key_hook(ponteiros.janela, checa_teclas, &ponteiros); 38 | mlx_loop(ponteiro_da_mlx); 39 | } -------------------------------------------------------------------------------- /1desenha_limpa.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | typedef struct s_data 6 | { 7 | void *mlx; 8 | void *win; 9 | } t_data; 10 | 11 | void draw(t_data *data) 12 | { 13 | for (int i = 0; i < 300; i++) 14 | { 15 | mlx_pixel_put(data->mlx, data->win, i, i, 0x00FF0000); 16 | usleep(2000); 17 | mlx_pixel_put(data->mlx, data->win, i, 250, 0x0000FF00); 18 | usleep(2000); 19 | mlx_pixel_put(data->mlx, data->win, 250, i, 0x000000FF); 20 | } 21 | } 22 | 23 | int main(void) 24 | { 25 | t_data data; 26 | int clear = 42; 27 | 28 | data.mlx = mlx_init(); 29 | data.win = mlx_new_window(data.mlx, 300, 300, "RGB"); 30 | while (1) 31 | { 32 | mlx_string_put(data.mlx, data.win, 100, 90, 0x00FFFFFF, "Desenhando..."); 33 | draw(&data); 34 | mlx_string_put(data.mlx, data.win, 50, 200, 0x00FFFFFF, "Limpando em 3 segundos..."); 35 | sleep(3); 36 | clear = mlx_clear_window(data.mlx, data.win); 37 | printf("Clear: %d | Janela limpa!\n", clear); 38 | sleep(3); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /2inicia_finaliza.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | typedef struct s_data 7 | { 8 | void *mlx; 9 | void *win; 10 | } t_data; 11 | 12 | int main(void) 13 | { 14 | void *mlx = 0x0; 15 | void *win = 0x0; 16 | int display = 42; 17 | int window = 42; 18 | 19 | while (1) 20 | { 21 | mlx = mlx_init(); 22 | if (!mlx) 23 | printf("mlx_init falhou\n"); 24 | win = mlx_new_window(mlx, 400, 100, "Sistema de autodestruicao ativado"); 25 | if (!win) 26 | printf("mlx_new_window falhou\n"); 27 | printf("Conexão e janela criadas\n"); 28 | sleep(3); 29 | window = mlx_destroy_window(mlx, win); 30 | win = NULL; 31 | printf("window: %d | Janela destruída\n", window); 32 | sleep(3); 33 | display = mlx_destroy_display(mlx); 34 | free(mlx); 35 | mlx = NULL; 36 | printf("display: %d | Conexão destruída\n", display); 37 | sleep(3); 38 | } 39 | } -------------------------------------------------------------------------------- /3imagem_xpm.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | typedef struct s_data 8 | { 9 | void *mlx; 10 | void *win; 11 | void *img; 12 | } t_data; 13 | 14 | int main(void) 15 | { 16 | t_data data; 17 | int inutil; 18 | int contador = 0; 19 | 20 | data.mlx = mlx_init(); 21 | data.win = mlx_new_window(data.mlx, 400, 400, "Pikachu, eu escolho voce!"); 22 | while (1) 23 | { 24 | data.img = mlx_xpm_file_to_image(data.mlx, "pikachu.xpm", &inutil, &inutil); 25 | printf("Carregando imagem...\n"); 26 | sleep(1); 27 | srand(time(NULL)); 28 | mlx_put_image_to_window(data.mlx, data.win, data.img, rand()%301, rand()%301); 29 | printf("Deletando imagem...\n"); 30 | sleep(1); 31 | inutil = mlx_destroy_image(data.mlx, data.img); 32 | printf("Image: %d | Imagem deletada!\n", inutil); 33 | sleep(1); 34 | contador++; 35 | if (contador == 30) 36 | { 37 | inutil = mlx_clear_window(data.mlx, data.win); 38 | printf("Clear: %d | Janela limpa!\n", inutil); 39 | contador = 0; 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /4hooks.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #define ESC 65307 9 | 10 | typedef struct s_data 11 | { 12 | void *mlx; 13 | void *win; 14 | void *img; 15 | char *addr; 16 | int bits_per_pixel; 17 | int line_length; 18 | int endian; 19 | } t_data; 20 | 21 | int destroi_tudo(t_data *data) 22 | { 23 | mlx_destroy_image(data->mlx, data->img); 24 | mlx_destroy_window(data->mlx, data->win); 25 | mlx_destroy_display(data->mlx); 26 | free(data->mlx); 27 | exit(0); 28 | } 29 | 30 | int teclas(int keycode, t_data *data) 31 | { 32 | if (keycode == ESC) 33 | destroi_tudo(data); 34 | if (keycode == 'r') 35 | { 36 | mlx_clear_window(data->mlx, data->win); 37 | mlx_string_put(data->mlx, data->win, 150, 265, 0x00FF0000, "Clique abaixo com o mouse para pintar"); 38 | } 39 | printf("Você pressionou a tecla: %c", keycode); 40 | printf("\nCujo valor em inteiro é: %d\n", keycode); 41 | return (0); 42 | } 43 | 44 | int rato(int button, int x, int y, t_data *data) 45 | { 46 | printf("Botão pressionado: %d\n", button); 47 | printf("Posição do mouse: %d, %d\n", x, y); 48 | if (button == 1) 49 | mlx_pixel_put(data->mlx, data->win, x, y, 0x00FFFFFF); 50 | return (0); 51 | } 52 | 53 | void pinta_pixel(t_data *data, int x, int y, int color) 54 | { 55 | char *dest; 56 | 57 | // char *ponteiro_do_pontoXY = &addr[y * tamanho de 1 linha + x * (transforma bits por pixel em bytes por pixel)] 58 | // *(unsigned int *)conteudo_do_pontoXY = cor 59 | dest = data->addr + (y * data->line_length + x * (data->bits_per_pixel / 8)); 60 | *(unsigned int *)dest = color; 61 | } 62 | 63 | int desenha_triangulo(t_data *data) 64 | { 65 | int x; 66 | int y; 67 | static int i = 0; 68 | static int quantidade = 0; 69 | 70 | data->addr = mlx_get_data_addr(data->img, &data->bits_per_pixel, &data->line_length, &data->endian); 71 | x = 250; 72 | y = 0; 73 | while (y < 250) 74 | { 75 | pinta_pixel(data, x + y, y, 0x0000FF00); 76 | pinta_pixel(data, x - y, y, 0x0000FF00); 77 | pinta_pixel(data, y, 250, 0x0000FF00); 78 | y++; 79 | } 80 | while (y < 500) 81 | { 82 | pinta_pixel(data, y, 250, 0x0000FF00); 83 | y++; 84 | } 85 | if (i == 499) 86 | i = 0; 87 | mlx_put_image_to_window(data->mlx, data->win, data->img, i++, 0); 88 | if (quantidade == __INT32_MAX__) 89 | quantidade = 0; 90 | quantidade++; 91 | usleep(quantidade); 92 | return (42); 93 | } 94 | 95 | int main(void) 96 | { 97 | t_data data; 98 | int key = 42; 99 | int mouse = 42; 100 | int expose = 42; 101 | int loop = 42; 102 | 103 | data.mlx = mlx_init(); 104 | data.win = mlx_new_window(data.mlx, 500, 500, "Ganchos"); 105 | data.img = mlx_new_image(data.mlx, 500, 251); 106 | key = mlx_key_hook(data.win, teclas, &data); 107 | sleep(1); 108 | printf("key: %d\n", key); 109 | mouse = mlx_mouse_hook(data.win, rato, &data); 110 | sleep(1); 111 | printf("mouse: %d\n", mouse); 112 | expose = mlx_expose_hook(data.win, desenha_triangulo, &data); 113 | sleep(1); 114 | printf("expose: %d\n", expose); 115 | loop = mlx_loop_hook(data.mlx, desenha_triangulo, &data); 116 | sleep(1); 117 | printf("loop: %d\n", loop); 118 | mlx_string_put(data.mlx, data.win, 150, 265, mlx_get_color_value(data.mlx, 0x00FF0000), "Clique abaixo com o mouse para pintar"); 119 | mlx_loop(data.mlx); 120 | } 121 | -------------------------------------------------------------------------------- /5ocultos.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #define ESC 65307 7 | 8 | typedef struct s_data 9 | { 10 | void *mlx; 11 | void *win; 12 | } t_data; 13 | 14 | int destroi_tudo(t_data *data) 15 | { 16 | int r = 42; 17 | 18 | r = mlx_clear_window(data->mlx, data->win); 19 | printf("clear = %d\n", r); 20 | r = mlx_destroy_window(data->mlx, data->win); 21 | printf("window = %d\n", r); 22 | r = mlx_loop_end(data->mlx); 23 | printf("end = %d\n", r); 24 | r = mlx_destroy_display(data->mlx); 25 | printf("display = %d\n", r); 26 | free(data->mlx); 27 | return (0); 28 | } 29 | 30 | int key_press(int keycode, t_data *data) 31 | { 32 | static int x = 0; 33 | static int y = 0; 34 | 35 | if (keycode == 'd' && x < 499) 36 | { 37 | mlx_pixel_put(data->mlx, data->win, x, y, 0x000000FF); 38 | x++; 39 | } 40 | else if (keycode == 'a' && x > 0) 41 | { 42 | mlx_pixel_put(data->mlx, data->win, x, y, 0x000000FF); 43 | x--; 44 | } 45 | else if (keycode == 'w' && y > 0) 46 | { 47 | mlx_pixel_put(data->mlx, data->win, x, y, 0x000000FF); 48 | y--; 49 | } 50 | else if (keycode == 's' && y < 499) 51 | { 52 | mlx_pixel_put(data->mlx, data->win, x, y, 0x000000FF); 53 | y++; 54 | } 55 | else if (keycode == 'r') 56 | mlx_clear_window(data->mlx, data->win); 57 | return (0); 58 | } 59 | 60 | int main(void) 61 | { 62 | t_data data; 63 | int retorno = 42; 64 | 65 | data.mlx = mlx_init(); 66 | data.win = mlx_new_window(data.mlx, 500, 500, "Etch A Sketch ou Tron?"); 67 | retorno = mlx_do_key_autorepeaton(data.mlx); 68 | printf("autorepeat = %d\n", retorno); 69 | retorno = mlx_hook(data.win, 2, 1L<<0, key_press, &data); 70 | printf("hook1 = %d\n", retorno); 71 | retorno = mlx_hook(data.win, 17, 0, destroi_tudo, &data); 72 | printf("hook2 = %d\n", retorno); 73 | retorno = mlx_string_put(data.mlx, data.win, 200, 200, 0xFFFFFF, "clique no X"); 74 | printf("string = %d\n", retorno); 75 | retorno = mlx_string_put(data.mlx, data.win, 180, 220, 0xFFFFFF, "ou desenhe com WASD"); 76 | printf("string = %d\n", retorno); 77 | retorno = mlx_do_sync(data.mlx); 78 | printf("sync = %d\n", retorno); 79 | mlx_loop(data.mlx); 80 | } -------------------------------------------------------------------------------- /6testes.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | typedef struct s_data 8 | { 9 | void *mlx; 10 | void *win; 11 | void *img; 12 | } t_data; 13 | 14 | int destroi_tudo(t_data *data) 15 | { 16 | mlx_clear_window(data->mlx, data->win); 17 | mlx_destroy_image(data->mlx, data->img); 18 | mlx_destroy_window(data->mlx, data->win); 19 | mlx_loop_end(data->mlx); 20 | mlx_destroy_display(data->mlx); 21 | free(data->mlx); 22 | exit(0); 23 | } 24 | 25 | int main(void) 26 | { 27 | t_data data; 28 | int tela_x = 42; 29 | int tela_y = 42; 30 | int mouse_x = 42; 31 | int mouse_y = 42; 32 | int r = 42; 33 | char *damas[] = { 34 | "32 32 3 1 ", 35 | "+ c #0000FF", 36 | ". c #00FFFF", 37 | "& c #FFFFFF", 38 | "++++++++++++++++++++++++++++++++", 39 | "++++++++++++++++++++++++++++++++", 40 | "++++++++++++++++++++++++++++++++", 41 | "++++++++++++++++++++++++++++++++", 42 | "++++....&&&&....&&&&....&&&&++++", 43 | "++++....&&&&....&&&&....&&&&++++", 44 | "++++....&&&&....&&&&....&&&&++++", 45 | "++++....&&&&....&&&&....&&&&++++", 46 | "++++&&&&....&&&&....&&&&....++++", 47 | "++++&&&&....&&&&....&&&&....++++", 48 | "++++&&&&....&&&&....&&&&....++++", 49 | "++++&&&&....&&&&....&&&&....++++", 50 | "++++....&&&&....&&&&....&&&&++++", 51 | "++++....&&&&....&&&&....&&&&++++", 52 | "++++....&&&&....&&&&....&&&&++++", 53 | "++++....&&&&....&&&&....&&&&++++", 54 | "++++&&&&....&&&&....&&&&....++++", 55 | "++++&&&&....&&&&....&&&&....++++", 56 | "++++&&&&....&&&&....&&&&....++++", 57 | "++++&&&&....&&&&....&&&&....++++", 58 | "++++....&&&&....&&&&....&&&&++++", 59 | "++++....&&&&....&&&&....&&&&++++", 60 | "++++....&&&&....&&&&....&&&&++++", 61 | "++++....&&&&....&&&&....&&&&++++", 62 | "++++&&&&....&&&&....&&&&....++++", 63 | "++++&&&&....&&&&....&&&&....++++", 64 | "++++&&&&....&&&&....&&&&....++++", 65 | "++++&&&&....&&&&....&&&&....++++", 66 | "++++++++++++++++++++++++++++++++", 67 | "++++++++++++++++++++++++++++++++", 68 | "++++++++++++++++++++++++++++++++", 69 | "++++++++++++++++++++++++++++++++" 70 | }; 71 | 72 | data.mlx = mlx_init(); 73 | data.win = mlx_new_window(data.mlx, 500, 500, "Se as damas sao as pecas elas evoluiem para o que?"); 74 | r = mlx_get_screen_size(data.mlx, &tela_x, &tela_y); 75 | printf("size: x = %d, y = %d | r = %d\n", tela_x, tela_y, r); 76 | mlx_string_put(data.mlx, data.win, 50, 50, 0x00FFFFFF, "RAPIDO, COLOQUE O MOUSE NA TELA"); 77 | sleep(3); 78 | r = mlx_mouse_get_pos(data.mlx, data.win, &mouse_x, &mouse_y); 79 | printf("mouse: x = %d, y = %d | r = %d\nNAO MEXA O MOUSE\n", mouse_x, mouse_y, r); 80 | sleep(1); 81 | r = mlx_mouse_hide(data.mlx, data.win); 82 | printf("hide = %d\n", r); 83 | srand(time(NULL)); 84 | r = mlx_mouse_move(data.mlx, data.win, rand()%500, rand()%500); 85 | printf("move = %d\n", r); 86 | sleep(1); 87 | r = mlx_mouse_show(data.mlx, data.win); 88 | printf("show = %d\n", r); 89 | sleep(1); 90 | data.img = mlx_xpm_to_image(data.mlx, damas, &tela_x, &tela_y); 91 | mlx_put_image_to_window(data.mlx, data.win, data.img, 50, 350); 92 | 93 | // Se surgir algum error troque o "10x20" por "6x13" 94 | mlx_set_font(data.mlx, data.win, "10x20"); 95 | mlx_string_put(data.mlx, data.win, 50, 400, 0x00FFFFFF, "Vai uma partidinha de cavalheiros ai?"); 96 | mlx_hook(data.win, 17, 0, destroi_tudo, &data); 97 | mlx_loop(data.mlx); 98 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Como contribuir? 2 | Este é um projeto totalmente livre que aceita constribuições via pull requests no Github. 3 | Este documento tem a responsabilidade de alinhar as contribuições de acordo com os padrões estabelecidos no mesmo. Em caso de dúvidas abra uma issue. 4 | 5 | 6 | ## Antes de começar 7 | º Certifique-se de que sua ideia / sugestão / problema / correção ainda não tenha sido discutido ou relatado anteriormente. Você pode verificar as issues existentes ou os pull requests abertos para ver se o problema já foi identificado ou resolvido.
8 | º Certifique-se de que você está trabalhando na versão mais recente do código. É importante que as contribuições sejam baseadas na versão atualizada do projeto. 9 | 10 | 11 | ## Primeiros passos 12 | 1. Fork este repositório. 13 | 2. Crie uma nova branch a partir da branch principal (main). É importante que você crie uma nova branch para que suas mudanças não afetem a branch principal e para que você possa trabalhar em seu próprio espaço. Você pode nomear sua nova branch como quiser. 14 | 3. Adicione o conteudo de acordo com o estilo padronizado neste guia. 15 | 4. Envie seus commits em português (ou em outros idiomas caso queira que esse doc também atinja mais pessoas). 16 | 5. Solicite a pull request. 17 | 6. Insira um pequeno resumo do conteudo adicionado ou modificado 18 | 19 | Diretrizes para um bom pull request 20 | - Certifique-se de que seu PR resolva um problema ou adicione um novo recurso relevante. 21 | - Certifique-se de que seu PR atenda aos padrões de codificação, formatação e estilo do projeto. 22 | - Certifique-se de que seus commits sejam significativos e descritivos. 23 | - Certifique-se de que seu PR inclua informações detalhadas sobre suas mudanças, os motivos por trás delas e como os revisores podem testá-las. 24 | - Certifique-se de que seu PR seja baseado na branch principal mais recente deste repositório. 25 | - Certifique-se de que seu PR não inclua mudanças irrelevantes ou não relacionadas ao problema a ser resolvido. 26 | 27 | ## Muchas Gracias 28 | Obrigado por contribuir para este projeto! Suas contribuições são valorizadas e ajudam a tornar este projeto ainda melhor 29 | -------------------------------------------------------------------------------- /FUNCOES.md: -------------------------------------------------------------------------------- 1 | # FUNÇÕES 2 | 3 | ## mlx_clear_window 4 | 5 | * Limpa a janela, removendo imagens, pixels e strings. 6 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver** e um ponteiro para a janela. 7 | * Retorno é indefinido. 8 | ```c 9 | int mlx_clear_window(void *mlx_ptr, void *win_ptr); 10 | ``` 11 | 12 | ## mlx_destroy_display**1** 13 | 14 | * Encerra a conexão com o **Xserver**. 15 | * Recebe como parâmetro um ponteiro para a conexão com o **Xserver**. 16 | * Retorno é indefinido. 17 | ```c 18 | int mlx_destroy_display(void *mlx_ptr); 19 | ``` 20 | **1**Essa função não dá free no ponteiro, então tome cuidado para não vazar memória. 21 | 22 | ## mlx_destroy_image**1** 23 | 24 | * Destroi uma imagem. 25 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver** e um ponteiro para a imagem. 26 | * Retorno é indefinido. 27 | ```c 28 | int mlx_destroy_image(void *mlx_ptr, void *img); 29 | ``` 30 | **1**Essa função dá free no ponteiro, então não se preocupe com vazamentos. 31 | 32 | ## mlx_destroy_window**1** 33 | 34 | * Destroi a janela. 35 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver** e um ponteiro para a janela. 36 | * Retorno é indefinido. 37 | ```c 38 | int mlx_destroy_window(void *mlx_ptr, void *win_ptr); 39 | ``` 40 | **1**Essa função dá free no ponteiro, então não se preocupe com vazamentos. 41 | 42 | ## mlx_do_key_autorepeaton e mlx_do_key_autorepeatoff 43 | 44 | * Repeaton e repeatoff, respectivamente ativam e desativam a repetição de teclas, ou seja, ao invés de ficar pressionando uma tecla você pode só segurar ela para continuar executando o evento do teclado. 45 | * Recebe como parâmetro um ponteiro para a conexão com o **Xserver**. 46 | * Retorno é indefinido. 47 | ```c 48 | int mlx_do_key_autorepeaton(void *mlx_ptr); 49 | 50 | int mlx_do_key_autorepeatoff(void *mlx_ptr); 51 | ``` 52 | 53 | ## mlx_do_sync 54 | 55 | * **Ela não é necessária**1, seu objetivo é garantir que todas as operações de desenho sejam realizas antes de prosseguir com outras operações. 56 | * Recebe como parâmetro um ponteiro para a conexão com o **Xserver**. 57 | * Retorno é indefinido. 58 | ```c 59 | int mlx_do_sync(void *mlx_ptr); 60 | ``` 61 | 1Digo que ela não é necessária, pois a MiniLibX já exibe tudo para você antes de executar o próximo evento. 62 | 63 | ## mlx_expose_hook 64 | 65 | * Ela só funciona se você mudar o tamanho da janela (tive que testar no WSL), mesmo que o Manuel diga que funciona quando você minimiza a janela... [**NÃO ACREDITE NAS MENTIRAS DELE**](https://youtu.be/VIbjjDtQVhQ). 66 | * Recebe como parâmetros um ponteiro para a janela, uma função que será chamada e um ponteiro para um argumento. 67 | * Retorno é indefinido. 68 | * A função que é chamada recebe como parâmetro um ponteiro para um argumento. 69 | * A função que é chamada pode retornar o que ela quiser. 70 | ```c 71 | int mlx_expose_hook(void *win_ptr, int (*funct_ptr)(), void *param); 72 | 73 | int funct_ptr(void *param); 74 | ``` 75 | 76 | ## mlx_get_color_value 77 | 78 | * Ela transforma uma cor em um valor inteiro... só vi utilidade em querer saber o valor decimal de um hex... o que da pra fazer na internet **OU NA CALCULADORA DE PROGRAMADOR**😡... 79 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver** e uma cor em int😑... 80 | * Retorna um valor inteiro que representa a cor😶... 81 | ```c 82 | int mlx_get_color_value(void *mlx_ptr, int color); 83 | ``` 84 | 85 | ## mlx_get_data_addr 86 | 87 | * Ela cria array de tipo char do tamanho **total**1 da imagem e coloca informação sobre os `bits por pixel`, `tamanho de 1 linha` e [`extremidade mais importante`](https://pt.wikipedia.org/wiki/Extremidade_(ordena%C3%A7%C3%A3o)). 88 | * Recebe como parâmetros um ponteiro para a imagem, um ponteiro para o tamanho de cada pixel, um ponteiro para o tamanho de cada linha e um ponteiro para o tamanho da imagem. 89 | * Retorna um ponteiro para o array de tipo char. 90 | ```c 91 | char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel, int *size_line, int *endian); 92 | ``` 93 | 1Com total eu teorizo que a formula para o tamanho é: `largura da imagem * altura da imagem * bits por pixel`, isso pois para conseguirmos pintar um pixel nessa imagem, acessamos o array na posição `y * size_line + x * (bpp / 8)` onde x é a posição da largura e y a da altura (no código fonte tem essa conta `(width + 32) * height * 4`, mas tenho quase certeza que ela retorna num número menor que o array final). 94 | 95 | ## mlx_hook 96 | 97 | * Chama uma função quando um evento ocorre, o tipo de reação que terá para o evento depende da máscara, o usuário define qual evento, máscara, função e parãmetro devem ser usados (por exemplo pode se programar para que quando uma tecla for pressionada uma máscara e função de mouse seja executada, assim é possivel colocar um pixel na posição atual do mouse quando a tecla `Z` for pressionada). 98 | * Recebe como parâmetro um ponteiro para a janela, um inteiro que representa um evento1 da X11, um inteiro que representa uma máscara2 da X11, uma função3 que será chamada e um argumento. 99 | * Retorno é indeterminado. 100 | ```c 101 | int mlx_hook(void *win_ptr, int x_event, int x_mask, int (*funct_ptr)(), void *param); 102 | ``` 103 | 1Informações sobre os eventos podem ser encontrados [aqui](https://tronche.com/gui/x/xlib/events/types.html), já seus valores estão [aqui](https://harm-smits.github.io/42docs/libs/minilibx/events.html#x11-events). 104 | 2Informações sobre as máscaras podem ser encontradas [aqui](https://tronche.com/gui/x/xlib/events/mask.html), já seus valores estão [aqui](https://harm-smits.github.io/42docs/libs/minilibx/events.html#x11-masks). 105 | 3A função chamada deve respeitar as regras de parâmetro de seu evento, ou seja, se for um evento do teclado, a função deve ter como parâmetro um int com o keycode e um argumento, se for um evento de mouse a função deve ter como parâmetro um int para o botão, outro para a posição x, mais um para a posição y e um argumento, ela pode retornar o que quiser. 106 | 107 | ## mlx_init 108 | 109 | * Inicializa a conexão com o **Xserver**. 110 | * Não tem parâmetros. 111 | * Retorna um ponteiro para a conexão criada. 112 | ```c 113 | void *mlx_init(void); 114 | ``` 115 | 116 | ## mlx_key_hook 117 | 118 | * Chama uma função quando um evento de tecla ocorre. 119 | * Recebe como parâmetros um ponteiro para a janela, uma função que será chamada e um argumento. 120 | * Retorno é indefinido. 121 | * A função chamada recebe como parâmetro um inteiro que representa o keycode da tecla pressionada e um argumento. 122 | * A função chamada pode retornar o que quiser. 123 | ```c 124 | int mlx_key_hook(void *win_ptr, int (*funct_ptr)(), void *param); 125 | 126 | int funct_ptr(int keycode, void *param); 127 | ``` 128 | 129 | ## mlx_xpm_file_to_image 130 | 131 | * Ela converte um arquivo [XPM](https://en.wikipedia.org/wiki/X_PixMap)1 em um ponteiro para a imagem do arquivo. 132 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, uma string com o nome do arquivo, um ponteiro para armazenar sua largura e sua altura. 133 | * Retorna um ponteiro para a imagem do arquivo XPM. 134 | ```c 135 | void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename, int *width, int *height); 136 | ``` 137 | 1O tipo do arquivo XPM é o XPM3, não se preocupe, você não precisa escrever pixel por pixel da imagem, pode utilizar sites que convertem um png ou jpg em xpm. 138 | 139 | ## mlx_xpm_to_image1 140 | 141 | * Ela converte um array de strings com estilo XPM3 em uma imagem. 142 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um array de strings, um ponteiro para armazenar sua largura e altura. 143 | * Retorna um ponteiro para a imagem criada pelo array de strings. 144 | ```c 145 | void mlx_xpm_to_image(void *mlx_ptr, char **data, int *width, int *height); 146 | ``` 147 | 1As cores ficam bugadas, então recomendo usar o `mlx_xpm_file_to_image` para melhores resultados. 148 | 149 | ## mlx_loop 150 | 151 | * Fica em loop chamando hook em uma ordem específica (expose->key_hook->mouse_hook->loop_hook). 152 | * Recebe como parâmetro uma ponteiro para a conexão com o **Xserver**. 153 | * Retorna `0`. 154 | ```c 155 | int mlx_loop(void *mlx_ptr); 156 | ``` 157 | 158 | ## mlx_loop_end 159 | 160 | * Encerra o loop. 161 | * Recebe como parâmetro um ponteiro para a conexão com o **Xserver**. 162 | * Retorna `1`. 163 | ```c 164 | int mlx_loop_end(void *mlx_ptr); 165 | ``` 166 | 167 | ## mlx_loop_hook 168 | 169 | * Executa uma função 1 vez a cada repetição do loop. 170 | * Recebe como parâmetros um ponteiro para o **Xserver**, uma função e um argumento. 171 | * Retorno indefinido. 172 | * A função chamada recebe como parâmetro um argumento. 173 | * A função chamada pode retornar o que quiser. 174 | ```c 175 | int mlx_loop_hook(void *mlx_ptr, int (*funct_ptr)(), void *param); 176 | 177 | int funct_ptr(void *param); 178 | ``` 179 | 180 | ### mlx_mouse_move 181 | 182 | * Move o mouse para uma posição X e Y na tela. 183 | * Recebe como parâmetros um ponteiro para a conexão **Xserver**, um ponteiro para a janela, uma posição x e uma posição y. 184 | * Retorna `0`. 185 | ```c 186 | int mlx_mouse_move(void *mlx_ptr, void *win_ptr, int x, int y); 187 | ``` 188 | 189 | ## mlx_mouse_hide 190 | 191 | * Supostamente deveria esconder o mouse, mas não funciona. 192 | * Recebe como parâmetros um ponteiro para a conexão **Xserver** e um ponteiro para a janela. 193 | * Retorno indefinido. 194 | ```c 195 | int mlx_mouse_hide(void *mlx_ptr, void *win_ptr); 196 | ``` 197 | 198 | ## mlx_mouse_show 199 | 200 | * Supostamente deveria mostrar o mouse, mas não funciona. 201 | * Recebe como parâmetros um ponteiro para a conexão **Xserver** e um ponteiro para a janela. 202 | * Retorno indefinido. 203 | ```c 204 | int mlx_mouse_show(void *mlx_ptr, void *win_ptr); 205 | ``` 206 | 207 | ## mlx_mouse_get_pos 208 | 209 | * Pega a posição do mouse na tela1. 210 | * Recebe como parâmetros um ponteiro para a conexão **Xserver**, um ponteiro para a janela, um ponteiro para armazenar a posição x e um ponteiro para armazenar a posição y. 211 | * Retorna `1`. 212 | ```c 213 | int mlx_mouse_get_pos(void *mlx_ptr, void *win_ptr, int *x, int *y); 214 | ``` 215 | 1Se o mouse estiver fora da janela o resultado é imprevísivel, mas não causa nenhum segfault. 216 | 217 | ## mlx_mouse_hook 218 | 219 | * Chama uma função quando um evento de mouse ocorre. 220 | * Recebe como parâmetros um ponteiro para a janela, uma função que será chamada e um argumento. 221 | * Retorno indefinido. 222 | * A função chamada recebe como parâmetro, o botão do mouse pressionado, a posição x e y do mouse e um argumento. 223 | * A função chamada pode retornar o que quiser. 224 | ```c 225 | int mlx_mouse_hook(void *win_ptr, int (*funct_ptr)(), void *param); 226 | 227 | int funct_ptr(int button, int x, int y, void *param); 228 | ``` 229 | 230 | ## mlx_new_image 231 | 232 | * Cria uma nova imagem. 233 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, a largura e altura da imagem em pixels. 234 | * Retorna um ponteiro para a imagem criada. 235 | ```c 236 | void *mlx_new_image(void *mlx_ptr, int width, int height); 237 | ``` 238 | 239 | ## mlx_new_window 240 | 241 | * Inicializa uma janela. 242 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, o tamanho da janela em pixels (0 representa o canto superior esquerdo da tela, **width** avança para a direita e **height** avança para baixo) e o título da janela. 243 | * Retorna um ponteiro para a janela criada. 244 | ```c 245 | void *mlx_new_window(void *mlx_ptr, int width, int height, char *title); 246 | ``` 247 | 248 | ## mlx_pixel_put 249 | 250 | * Coloca um pixel na tela. 251 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um ponteiro para a janela, a posição x e y do pixel e a cor do pixel. 252 | * Retorno indefinido. 253 | ```c 254 | int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color); 255 | ``` 256 | 257 | ## mlx_put_image_to_window 258 | 259 | * Coloca uma imagem na tela. 260 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um ponteiro para a janela, um ponteiro para a imagem, a posição x e y da tela. 261 | * Retorno indefinido. 262 | ```c 263 | int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y); 264 | ``` 265 | 266 | ## mlx_get_screen_size 267 | 268 | * Pega o tamanho do monitor1. 269 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um ponteiro para armazenar a largura e um ponteiro para armazenar a altura. 270 | * Retorno indefinido. 271 | ```c 272 | int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey); 273 | ``` 274 | 1Se você tiver mais de 1 monitor ele guarda a largura e altura somada, por exemplo se um monitor é 1900x1080 e o outro é 1280x1024, o resultado será 3180x2104 (descoberto por Raphael🏎️). 275 | 276 | ### mlx_set_font 277 | 278 | * Muda a fonte1 da função `mlx_string_put`. 279 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um ponteiro para a janela e o nome da fonte, esse nome pode ser simples ou composto (ex: "5x7" "-Misc-Fixed-Medium-R-Normal--7-70-75-75-C-50-ISO10646-1"). 280 | * Retorno indefinido. 281 | ```c 282 | int mlx_set_font(void *mlx_ptr, void *win_ptr, char *name); 283 | ``` 284 | 1Informações sobre as fontes que podem ser utilizadas [aqui](https://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html) (descoberta das fontes por Emmanuel🐶). 285 | 286 | ## mlx_string_put 287 | 288 | * Coloca uma string na tela. 289 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um ponteiro para a janela, a posição x, a posição y, a cor da string e a string. 290 | * Retorno indefinido. 291 | ```c 292 | int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string); 293 | ``` 294 | 295 | ACABOU 😁🎉🎊🎉 296 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Andrey and 42 Cadets 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Mini Library X 📄 3 |

4 | 5 |

6 | A documentação não-oficial e informal da biblioteca MLX usada pela 42 Ecole em pt-br.
7 |

8 | 9 | ## A Mini Library X 10 | A biblioteca Minilibx é uma biblioteca gráfica de baixo nível criada pela 42ecole, uma escola de programação francesa. Essa biblioteca permite a criação de aplicações gráficas simples em sistemas operacionais baseados em Unix, como macOS e Linux. 11 | 12 | A Minilibx é escrita em C e é usada para desenhar e manipular imagens e pixels em uma janela. A biblioteca suporta a exibição de imagens, a criação de janelas e o uso de teclas do teclado e mouse como entrada. 13 | 14 | A Minilibx é frequentemente usada em projetos de programação da 42ecole, como parte do aprendizado dos alunos sobre programação de baixo nível e gráficos computacionais. 15 | 16 | > 🗣️ Então... basicamente a mlx é uma biblioteca gráfica para C, que permite que você crie coisas básicas como um wireframe, ou até [**DUKEfuckingNUKEM**](https://www.youtube.com/watch?v=46MALEk-7cE)😮... Mas, como 17 | 18 | > "Nem tudo que reluz é ouro." -Muita gente (-2022 - 2022) 19 | 20 | > Ela é documentada como todo jogo moderno sai... Uma bos-🤬. Mas não se preocupe, eu abrirei mão do meu tempo livre (e sanidade mental😵‍💫) pra te ajudar a destrinchar essa POR-🤬. 21 | 22 | ## Sumario 23 | * [MiniLibx;](https://github.com/andreyvdl/MiniLibX_my_docs/blob/main/README.md#MINILIBX) Uma breve descrição da biblioteca e de suas funcionalidades. 24 | * [Instalar;](https://github.com/andreyvdl/MiniLibX_my_docs/blob/main/README.md#instalação) Como instalar a biblioteca em um sistema operacional (Windows, Linux ou Mac). 25 | * [Básico;](https://github.com/andreyvdl/MiniLibX_my_docs/blob/main/README.md#básico) Instruções para a utilização da biblioteca, incluindo exemplos de código. 26 | * [Funções;](https://github.com/andreyvdl/MiniLibX_my_docs/blob/main/FUNCOES.md) Explicação sobre as funções disponíveis, seus parâmetros e seus retornos. 27 | * [Fontes;](https://github.com/andreyvdl/MiniLibX_my_docs/blob/main/README.md#fontes-) Fontes usadas de inspiração na criação desse Doc. 28 | * [Como contribuir;](https://github.com/andreyvdl/MiniLibX_my_docs/blob/main/README.md#contribua-com-o-projeto-) Contribua com a documentação 29 | * [Licença;](https://github.com/andreyvdl/MiniLibX_my_docs/blob/main/README.md#licença-) Licença da documentação 30 | 31 | ## Instalação 32 | 33 | Basicamente só segue o que tá escrito no [README](https://github.com/42Paris/minilibx-linux), a não ser que esteja no WSL, (aka Linux Subsistema do Windows) aí acho bom seguir esse [daqui](https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html#getting-a-screen-on-windows-10-wsl2) (sinceramente fiz com [esse](https://github.com/codam-coding-college/MLX42#installation)). 34 | > "Ah Andrey, eu segui tudo direitinho mas não tenho essa `/usr/X11/lib` nem `/usr/X11/include` ou `/usr/X11/man/man3`" 35 | 36 | CRIA. 37 | > "Ah mas Andrey, não é-" 38 | 39 | **SÓ CRIA.** 40 | > "Mas não tenho permi-" 41 | 42 | ```bash 43 | $ sudo mkdir 44 | ``` 45 | > "Não consig-" 46 | 47 | ```bash 48 | $ sudo cp -rf 49 | ``` 50 | ❗️| Depois execute o shell de teste da mlx e torça pra dar tudo certo, porquê se algo der errado... boa sorte pra descobrir o que tá errado. 51 | 52 | ## Básico 53 | 54 | Se tudo deu certo no teste, então tá na hora de por a mão na massa. 55 | Crie um arquivo que termine com `.c` (afinal todo arquivo de Clang é assim), e coloque o seguinte código: 56 | 57 | ```main.c 58 | #include 59 | #include 60 | #include 61 | 62 | #define ESC 65307 63 | 64 | typedef struct struct_ponteiros { 65 | void *mlx; 66 | void *janela; 67 | } tipo_ponteiros; 68 | 69 | int checa_teclas(int tecla, tipo_ponteiros *ponteiros) { 70 | if (tecla == ESC) { 71 | printf("Fechando a janela e encerrando o programa...\n"); 72 | mlx_destroy_window(ponteiros->mlx, ponteiros->janela); 73 | mlx_destroy_display(ponteiros->mlx); 74 | free(ponteiros->mlx); 75 | exit(0); 76 | } 77 | else 78 | printf("Voce pressionou a tecla: %c\n", tecla); 79 | return (0); 80 | } 81 | 82 | int main() { 83 | tipo_ponteiros ponteiros; 84 | void *ponteiro_da_mlx; 85 | void *ponteiro_da_janela; 86 | 87 | ponteiro_da_mlx = mlx_init(); 88 | 89 | ponteiro_da_janela = mlx_new_window(ponteiro_da_mlx, 200, 200, "Janela"); 90 | 91 | ponteiros.mlx = ponteiro_da_mlx; 92 | ponteiros.janela = ponteiro_da_janela; 93 | 94 | mlx_key_hook(ponteiros.janela, checa_teclas, &ponteiros); 95 | mlx_loop(ponteiro_da_mlx); 96 | } 97 | ``` 98 | 99 | Compile ele com as seguintes flags: `-lmlx -lXext -lX11` e execute o binário (não se preocupe com o que cada flag e parte do código faz, explico depois), você agora deve ter uma janela com o título "Janela" com fundo preto, clique nela e pressione qualquer tecla do teclado, no terminal você verá uma mensagem, agora aperte a tecla `ESC`, mais uma mensagem vai aparecer no terminal e a janela vai sumir encerrando o programa (se você tentou fechar apertando o `X` no canto da janela, não se surpreenda por não funcionar, afinal ainda não programamos para isso). 100 | 101 | **📐 Fluxograma:** 102 | ![Fluxograma](fluxograma.png) 103 | 104 | Agora que você entendeu na prática e visualmente o que o programa faz, vamos falar na teoria. 105 | Nós criamos uma conexão entre nosso programa e o Xserver, depois criamos uma conexão entre nosso programa e uma janela gerada pelo Xserver, logo após dizemos para o Xserver ficar em loop esperando por eventos (como por exemplo, uma tecla ser pressionada), quando um evento acontece, o Xserver chama uma função que nós programamos, essa função recebe como parâmetro o código da tecla pressionada, e então nós verificamos se a tecla pressionada foi a `ESC`, se sim, nós encerramos o programa, se não, nós imprimimos a tecla pressionada no terminal. 106 | 107 | **🏳️ Flags de Compilação:**
108 | `-lmlx`: O comando -lmlx instrui o compilador a vincular o programa com a biblioteca mlx, que deve ter sido compilada e instalada anteriormente.
109 | `-lXext` : Já o comando -lXext instrui o compilador a vincular o programa com a biblioteca libxext-dev, [libXext](https://packages.debian.org/sid/libxext-dev) que fornece uma interface de cliente X Window System para diversas extensões para o protocolo X.
110 | `-lX11` : Por fim, o comando -lX11 instrui o compilador a vincular o programa com a biblioteca Xorg, [X11](https://pt.wikipedia.org/wiki/X_Window_System) que é um software de sistema e um protocolo que fornece uma base para interfaces gráficas de usuário (com o conceito de janelas) e funcionalidade rica de dispositivos de entrada para redes de computadores.
111 | 112 | ## Funções 113 | 114 | ### mlx_clear_window 115 | 116 | * Limpa a janela, removendo imagens, pixels e strings. 117 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver** e um ponteiro para a janela. 118 | * Retorno é indefinido. 119 | ```c 120 | int mlx_clear_window(void *mlx_ptr, void *win_ptr); 121 | ``` 122 | 123 | ### mlx_destroy_display**1** 124 | 125 | * Encerra a conexão com o **Xserver**. 126 | * Recebe como parâmetro um ponteiro para a conexão com o **Xserver**. 127 | * Retorno é indefinido. 128 | ```c 129 | int mlx_destroy_display(void *mlx_ptr); 130 | ``` 131 | **1**Essa função não dá free no ponteiro, então tome cuidado para não vazar memória. 132 | 133 | ### mlx_destroy_image**1** 134 | 135 | * Destroi uma imagem. 136 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver** e um ponteiro para a imagem. 137 | * Retorno é indefinido. 138 | ```c 139 | int mlx_destroy_image(void *mlx_ptr, void *img); 140 | ``` 141 | **1**Essa função dá free no ponteiro, então não se preocupe com vazamentos. 142 | 143 | ### mlx_destroy_window**1** 144 | 145 | * Destroi a janela. 146 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver** e um ponteiro para a janela. 147 | * Retorno é indefinido. 148 | ```c 149 | int mlx_destroy_window(void *mlx_ptr, void *win_ptr); 150 | ``` 151 | **1**Essa função dá free no ponteiro, então não se preocupe com vazamentos. 152 | 153 | ### mlx_do_key_autorepeaton e mlx_do_key_autorepeatoff 154 | 155 | * Repeaton e repeatoff, respectivamente ativam e desativam a repetição de teclas, ou seja, ao invés de ficar pressionando uma tecla você pode só segurar ela para continuar executando o evento do teclado. 156 | * Recebe como parâmetro um ponteiro para a conexão com o **Xserver**. 157 | * Retorno é indefinido. 158 | ```c 159 | int mlx_do_key_autorepeaton(void *mlx_ptr); 160 | 161 | int mlx_do_key_autorepeatoff(void *mlx_ptr); 162 | ``` 163 | 164 | ### mlx_do_sync 165 | 166 | * **Ela não é necessária**1, seu objetivo é garantir que todas as operações de desenho sejam realizas antes de prosseguir com outras operações. 167 | * Recebe como parâmetro um ponteiro para a conexão com o **Xserver**. 168 | * Retorno é indefinido. 169 | ```c 170 | int mlx_do_sync(void *mlx_ptr); 171 | ``` 172 | 1Digo que ela não é necessária, pois a MiniLibX já exibe tudo para você antes de executar o próximo evento. 173 | 174 | ### mlx_expose_hook 175 | 176 | * Ela só funciona se você mudar o tamanho da janela (tive que testar no WSL), mesmo que o Manuel diga que funciona quando você minimiza a janela... [**NÃO ACREDITE NAS MENTIRAS DELE**](https://youtu.be/VIbjjDtQVhQ). 177 | * Recebe como parâmetros um ponteiro para a janela, uma função que será chamada e um ponteiro para um argumento. 178 | * Retorno é indefinido. 179 | * A função que é chamada recebe como parâmetro um ponteiro para um argumento. 180 | * A função que é chamada pode retornar o que ela quiser. 181 | ```c 182 | int mlx_expose_hook(void *win_ptr, int (*funct_ptr)(), void *param); 183 | 184 | int funct_ptr(void *param); 185 | ``` 186 | 187 | ### mlx_get_color_value 188 | 189 | * Ela transforma uma cor em um valor inteiro... só vi utilidade em querer saber o valor decimal de um hex... o que da pra fazer na internet **OU NA CALCULADORA DE PROGRAMADOR**😡... 190 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver** e uma cor em int😑... 191 | * Retorna um valor inteiro que representa a cor😶... 192 | ```c 193 | int mlx_get_color_value(void *mlx_ptr, int color); 194 | ``` 195 | 196 | ### mlx_get_data_addr 197 | 198 | * Ela cria array de tipo char do tamanho **total**1 da imagem e coloca informação sobre os `bits por pixel`, `tamanho de 1 linha` e [`extremidade mais importante`](https://pt.wikipedia.org/wiki/Extremidade_(ordena%C3%A7%C3%A3o)). 199 | * Recebe como parâmetros um ponteiro para a imagem, um ponteiro para o tamanho de cada pixel, um ponteiro para o tamanho de cada linha e um ponteiro para o tamanho da imagem. 200 | * Retorna um ponteiro para o array de tipo char. 201 | ```c 202 | char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel, int *size_line, int *endian); 203 | ``` 204 | 1Com total eu teorizo que a formula para o tamanho é: `largura da imagem * altura da imagem * bits por pixel`, isso pois para conseguirmos pintar um pixel nessa imagem, acessamos o array na posição `y * size_line + x * (bpp / 8)` onde x é a posição da largura e y a da altura (no código fonte tem essa conta `(width + 32) * height * 4`, mas tenho quase certeza que ela retorna num número menor que o array final). 205 | 206 | ### mlx_hook 207 | 208 | * Chama uma função quando um evento ocorre, o tipo de reação que terá para o evento depende da máscara, o usuário define qual evento, máscara, função e parãmetro devem ser usados (por exemplo pode se programar para que quando uma tecla for pressionada uma máscara e função de mouse seja executada, assim é possivel colocar um pixel na posição atual do mouse quando a tecla `Z` for pressionada). 209 | * Recebe como parâmetro um ponteiro para a janela, um inteiro que representa um evento1 da X11, um inteiro que representa uma máscara2 da X11, uma função3 que será chamada e um argumento. 210 | * Retorno é indeterminado. 211 | ```c 212 | int mlx_hook(void *win_ptr, int x_event, int x_mask, int (*funct_ptr)(), void *param); 213 | ``` 214 | 1Informações sobre os eventos podem ser encontrados [aqui](https://tronche.com/gui/x/xlib/events/types.html), já seus valores estão [aqui](https://harm-smits.github.io/42docs/libs/minilibx/events.html#x11-events). 215 | 2Informações sobre as máscaras podem ser encontradas [aqui](https://tronche.com/gui/x/xlib/events/mask.html), já seus valores estão [aqui](https://harm-smits.github.io/42docs/libs/minilibx/events.html#x11-masks). 216 | 3A função chamada deve respeitar as regras de parâmetro de seu evento, ou seja, se for um evento do teclado, a função deve ter como parâmetro um int com o keycode e um argumento, se for um evento de mouse a função deve ter como parâmetro um int para o botão, outro para a posição x, mais um para a posição y e um argumento, ela pode retornar o que quiser. 217 | 218 | ### mlx_init 219 | 220 | * Inicializa a conexão com o **Xserver**. 221 | * Não tem parâmetros. 222 | * Retorna um ponteiro para a conexão criada. 223 | ```c 224 | void *mlx_init(void); 225 | ``` 226 | 227 | ### mlx_key_hook 228 | 229 | * Chama uma função quando um evento de tecla ocorre. 230 | * Recebe como parâmetros um ponteiro para a janela, uma função que será chamada e um argumento. 231 | * Retorno é indefinido. 232 | * A função chamada recebe como parâmetro um inteiro que representa o keycode da tecla pressionada e um argumento. 233 | * A função chamada pode retornar o que quiser. 234 | ```c 235 | int mlx_key_hook(void *win_ptr, int (*funct_ptr)(), void *param); 236 | 237 | int funct_ptr(int keycode, void *param); 238 | ``` 239 | 240 | ### mlx_xpm_file_to_image 241 | 242 | * Ela converte um arquivo [XPM](https://en.wikipedia.org/wiki/X_PixMap)1 em um ponteiro para a imagem do arquivo. 243 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, uma string com o nome do arquivo, um ponteiro para armazenar sua largura e sua altura. 244 | * Retorna um ponteiro para a imagem do arquivo XPM. 245 | ```c 246 | void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename, int *width, int *height); 247 | ``` 248 | 1O tipo do arquivo XPM é o XPM3, não se preocupe, você não precisa escrever pixel por pixel da imagem, pode utilizar sites que convertem um png ou jpg em xpm. 249 | 250 | ### mlx_xpm_to_image1 251 | 252 | * Ela converte um array de strings com estilo XPM3 em uma imagem. 253 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um array de strings, um ponteiro para armazenar sua largura e altura. 254 | * Retorna um ponteiro para a imagem criada pelo array de strings. 255 | ```c 256 | void mlx_xpm_to_image(void *mlx_ptr, char **data, int *width, int *height); 257 | ``` 258 | 1As cores ficam bugadas, então recomendo usar o `mlx_xpm_file_to_image` para melhores resultados. 259 | 260 | ### mlx_loop 261 | 262 | * Fica em loop chamando hook em uma ordem específica (expose->key_hook->mouse_hook->loop_hook). 263 | * Recebe como parâmetro uma ponteiro para a conexão com o **Xserver**. 264 | * Retorna `0`. 265 | ```c 266 | int mlx_loop(void *mlx_ptr); 267 | ``` 268 | 269 | ### mlx_loop_end 270 | 271 | * Encerra o loop. 272 | * Recebe como parâmetro um ponteiro para a conexão com o **Xserver**. 273 | * Retorna `1`. 274 | ```c 275 | int mlx_loop_end(void *mlx_ptr); 276 | ``` 277 | 278 | ### mlx_loop_hook 279 | 280 | * Executa uma função 1 vez a cada repetição do loop. 281 | * Recebe como parâmetros um ponteiro para o **Xserver**, uma função e um argumento. 282 | * Retorno indefinido. 283 | * A função chamada recebe como parâmetro um argumento. 284 | * A função chamada pode retornar o que quiser. 285 | ```c 286 | int mlx_loop_hook(void *mlx_ptr, int (*funct_ptr)(), void *param); 287 | 288 | int funct_ptr(void *param); 289 | ``` 290 | 291 | ### mlx_mouse_move 292 | 293 | * Move o mouse para uma posição X e Y na tela. 294 | * Recebe como parâmetros um ponteiro para a conexão **Xserver**, um ponteiro para a janela, uma posição x e uma posição y. 295 | * Retorna `0`. 296 | ```c 297 | int mlx_mouse_move(void *mlx_ptr, void *win_ptr, int x, int y); 298 | ``` 299 | 300 | ### mlx_mouse_hide 301 | 302 | * Supostamente deveria esconder o mouse, mas não funciona. 303 | * Recebe como parâmetros um ponteiro para a conexão **Xserver** e um ponteiro para a janela. 304 | * Retorno indefinido. 305 | ```c 306 | int mlx_mouse_hide(void *mlx_ptr, void *win_ptr); 307 | ``` 308 | 309 | ### mlx_mouse_show 310 | 311 | * Supostamente deveria mostrar o mouse, mas não funciona. 312 | * Recebe como parâmetros um ponteiro para a conexão **Xserver** e um ponteiro para a janela. 313 | * Retorno indefinido. 314 | ```c 315 | int mlx_mouse_show(void *mlx_ptr, void *win_ptr); 316 | ``` 317 | 318 | ### mlx_mouse_get_pos 319 | 320 | * Pega a posição do mouse na tela1. 321 | * Recebe como parâmetros um ponteiro para a conexão **Xserver**, um ponteiro para a janela, um ponteiro para armazenar a posição x e um ponteiro para armazenar a posição y. 322 | * Retorna `1`. 323 | ```c 324 | int mlx_mouse_get_pos(void *mlx_ptr, void *win_ptr, int *x, int *y); 325 | ``` 326 | 1Se o mouse estiver fora da janela o resultado é imprevísivel, mas não causa nenhum segfault. 327 | 328 | ### mlx_mouse_hook 329 | 330 | * Chama uma função quando um evento de mouse ocorre. 331 | * Recebe como parâmetros um ponteiro para a janela, uma função que será chamada e um argumento. 332 | * Retorno indefinido. 333 | * A função chamada recebe como parâmetro, o botão do mouse pressionado, a posição x e y do mouse e um argumento. 334 | * A função chamada pode retornar o que quiser. 335 | ```c 336 | int mlx_mouse_hook(void *win_ptr, int (*funct_ptr)(), void *param); 337 | 338 | int funct_ptr(int button, int x, int y, void *param); 339 | ``` 340 | 341 | ### mlx_new_image 342 | 343 | * Cria uma nova imagem. 344 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, a largura e altura da imagem em pixels. 345 | * Retorna um ponteiro para a imagem criada. 346 | ```c 347 | void *mlx_new_image(void *mlx_ptr, int width, int height); 348 | ``` 349 | 350 | ### mlx_new_window 351 | 352 | * Inicializa uma janela. 353 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, o tamanho da janela em pixels (0 representa o canto superior esquerdo da tela, **width** avança para a direita e **height** avança para baixo) e o título da janela. 354 | * Retorna um ponteiro para a janela criada. 355 | ```c 356 | void *mlx_new_window(void *mlx_ptr, int width, int height, char *title); 357 | ``` 358 | 359 | ### mlx_pixel_put 360 | 361 | * Coloca um pixel na tela. 362 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um ponteiro para a janela, a posição x e y do pixel e a cor do pixel. 363 | * Retorno indefinido. 364 | ```c 365 | int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color); 366 | ``` 367 | 368 | ### mlx_put_image_to_window 369 | 370 | * Coloca uma imagem na tela. 371 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um ponteiro para a janela, um ponteiro para a imagem, a posição x e y da tela. 372 | * Retorno indefinido. 373 | ```c 374 | int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y); 375 | ``` 376 | 377 | ### mlx_get_screen_size 378 | 379 | * Pega o tamanho do monitor1. 380 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um ponteiro para armazenar a largura e um ponteiro para armazenar a altura. 381 | * Retorno indefinido. 382 | ```c 383 | int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey); 384 | ``` 385 | 1Se você tiver mais de 1 monitor ele guarda a largura e altura somada, por exemplo se um monitor é 1900x1080 e o outro é 1280x1024, o resultado será 3180x2104 (descoberto por Raphael🏎️). 386 | 387 | ### mlx_set_font 388 | 389 | * Muda a fonte1 da função `mlx_string_put`. 390 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um ponteiro para a janela e o nome da fonte, esse nome pode ser simples ou composto (ex: "5x7" "-Misc-Fixed-Medium-R-Normal--7-70-75-75-C-50-ISO10646-1"). 391 | * Retorno indefinido. 392 | ```c 393 | int mlx_set_font(void *mlx_ptr, void *win_ptr, char *name); 394 | ``` 395 | 1Informações sobre as fontes que podem ser utilizadas [aqui](https://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html) (descoberta das fontes por Emmanuel🐶). 396 | 397 | ### mlx_string_put 398 | 399 | * Coloca uma string na tela. 400 | * Recebe como parâmetros um ponteiro para a conexão com o **Xserver**, um ponteiro para a janela, a posição x, a posição y, a cor da string e a string. 401 | * Retorno indefinido. 402 | ```c 403 | int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string); 404 | ``` 405 |
406 | 407 | > 🗣️ Caso queira testar algumas delas existem alguns arquivos .c númerados de `0` a `6`, fiz eles demonstrando algumas funções incluindo algumas que não funcionam (infelizmente a set_font não funciona num nível que causa erro). 408 | 409 | ## Fontes 📎 410 | 411 | Não, não vou passar link de _[comic sans](https://youtu.be/wDgQdr8ZkTw)_ na verdade vou passar link de documentações feitas de forma séria, então caso você já tenha enjoado do meu texto... vaza, xispa daqui. 412 | * [harm-smits](https://harm-smits.github.io/42docs/libs/minilibx). 413 | * [Aurelien Brabant (brabo)](https://aurelienbrabant.fr/blog?tags=school+42). 414 | * [Soraia Novaes](https://soraianovaes.notion.site/So-Long-c6d751eb784f46b8848a8cda5e3fdf4d). 415 | 416 | 417 | ## Contribua com o projeto ☕ 418 | Quer fazer parte desse projeto? Clique [AQUI](CONTRIBUTING.md) e leia como contribuir.
419 | 420 | ## Licença 📜 421 | Este projeto está licenciado sob os termos do arquivo [LICENÇA](https://github.com/andreyvdl/MiniLibX_my_docs/blob/main/LICENSE). Veja o arquivo para mais detalhes.
422 | 423 |

Documentação criada com revolta e paz no coração por adantas-.

424 | -------------------------------------------------------------------------------- /fluxograma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andreyvdl/MiniLibX_my_docs/a163c7115cc80d320fa1be89ce0bef739460b933/fluxograma.png -------------------------------------------------------------------------------- /pikachu.xpm: -------------------------------------------------------------------------------- 1 | /* XPM */ 2 | static char *pikachu[] = { 3 | /* columns rows colors chars-per-pixel */ 4 | "100 100 13 1 ", 5 | " c white", 6 | ". c black", 7 | "X c gray16", 8 | "o c #623108", 9 | "O c #52525A", 10 | "+ c #C52018", 11 | "@ c #9C5200", 12 | "# c #E65A41", 13 | "$ c #DE9400", 14 | "% c #F6BD20", 15 | "& c #F6E652", 16 | "* c #FFF6A4", 17 | "= c white", 18 | /* pixels */ 19 | " XX ", 20 | " XX ", 21 | " XXXXXX ", 22 | " XXXXXX ", 23 | " XXXXXX ", 24 | " XXXXXX ", 25 | " XXXXXXXX ", 26 | " XXXXXXXX ", 27 | " XXXXXXXXXX ", 28 | " XXXXXXXXXX ", 29 | " XXXXOO%%oo ", 30 | " XXXXOO%%oo ", 31 | " XXOO%%%%%%oo .......... ", 32 | " XXOO%%%%%%oo .......... ", 33 | " XX%%%%%%%%XX ..XX..OOOOOO.... ", 34 | " XX%%%%%%%%XX ..XX..OOOOOO.... ", 35 | " oo%%%%%%%%XX ....OOOOOOOOXXXX.. ", 36 | " oo%%%%%%%%XX ....OOOOOOOOXXXX.. ", 37 | " oo%%%%%%%%XX @@@@&&&&OOOOXXXXXX.... ", 38 | " oo%%%%%%%%XX @@@@&&&&OOOOXXXXXX.... ", 39 | " oo%%%%%%%%XX @@@@&&&&&&&&&&XXXXXX.... @@@@ ", 40 | " oo%%%%%%%%XX @@@@&&&&&&&&&&XXXXXX.... @@@@ ", 41 | " oo%%%%%%%%XX$$@@@@@@@@@@@@ @@%%&&&&&&&&&&&&XXXX.... @@&&&&@@ ", 42 | " oo%%%%%%%%XX$$@@@@@@@@@@@@ @@%%&&&&&&&&&&&&XXXX.... @@&&&&@@ ", 43 | " oo%%%%$$$$******&&&&&&&&$$&&&&&&&&&&&&&&$$...... $$&&&&&&&&@@ ", 44 | " oo%%%%$$$$******&&&&&&&&$$&&&&&&&&&&&&&&$$...... $$&&&&&&&&@@ ", 45 | " oooo$$&&**********&&&&&&&&&&&&&&&&&&%%...... $$&&&&&&&&&&@@ ", 46 | " oooo$$&&**********&&&&&&&&&&&&&&&&&&%%...... $$&&&&&&&&&&@@ ", 47 | " oo%%&&************&&&&&&&&&&&&$$$$.... @@&&&&&&&&&&@@ ", 48 | " oo%%&&************&&&&&&&&&&&&$$$$.... @@&&&&&&&&&&@@ ", 49 | " oo&&&&&&&&****&&**&&&&....%%&&&&&&.. @@&&&&&&&&&&&&@@ ", 50 | " oo&&&&&&&&****&&**&&&&....%%&&&&&&.. @@&&&&&&&&&&&&@@ ", 51 | " ..$$..&&&&&&&&&&&&&&..==....&&&&&&oo $$&&&&&&&&&&&&&&$$@@@@ ", 52 | " ..$$..&&&&&&&&&&&&&&..==....&&&&&&oo $$&&&&&&&&&&&&&&$$@@@@ ", 53 | " oo@@..==%%&&&&&&&&&&&&....OO..&&&&&&&&@@ $$&&&&&&&&&&&&&&&&&&&&@@@@ ", 54 | " oo@@..==%%&&&&&&&&&&&&....OO..&&&&&&&&@@ $$&&&&&&&&&&&&&&&&&&&&@@@@ ", 55 | " oo$$OO..%%&&&&&&&&&&&&%%....%%&&&&&&&&oo $$&&&&&&&&&&&&&&&&&&&&&&&&&&@", 56 | " oo$$OO..%%&&&&&&&&&&&&%%....%%&&&&&&&&oo $$&&&&&&&&&&&&&&&&&&&&&&&&&&@", 57 | " $$%%..@@&&&&@@$$&&&&&&&&&&&&&&####&&%%$$oo @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&@", 58 | " $$%%..@@&&&&@@$$&&&&&&&&&&&&&&####&&%%$$oo @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&@", 59 | " oo&&&&&&&&&&&&&&&&&&&&&&&&&&&&######++%%%%oo@@oo oo @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.", 60 | " oo&&&&&&&&&&&&&&&&&&&&&&&&&&&&######++%%%%oo@@oo oo @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.", 61 | " oo##&&&&&&&&&&oooooo@@@@oo%%%%####++++%%%%oo@@&&oo&&@@@@ @@%%%%&&&&&&&&&&&&&&&&&&&&&&&&.... ", 62 | " oo##&&&&&&&&&&oooooo@@@@oo%%%%####++++%%%%oo@@&&oo&&@@@@ @@%%%%&&&&&&&&&&&&&&&&&&&&&&&&.... ", 63 | " oo##%%%%&&$$oo@@++++##@@%%%%%%++++++++%%%%@@%%&&&&&&&&.. @@%%%%%%%%&&&&&&&&&&&&&&&&.... ", 64 | " oo##%%%%&&$$oo@@++++##@@%%%%%%++++++++%%%%@@%%&&&&&&&&.. @@%%%%%%%%&&&&&&&&&&&&&&&&.... ", 65 | " oo++%%%%%%%%%%%%++####@@%%%%%%%%++++%%%%%%@@%%&&&&&&oo..@@%%%%%%%%%%%%%%&&&&&&...... ", 66 | " oo++%%%%%%%%%%%%++####@@%%%%%%%%++++%%%%%%@@%%&&&&&&oo..@@%%%%%%%%%%%%%%&&&&&&...... ", 67 | " oo%%%%%%%%%%%%@@####@@%%%%%%%%%%%%%%%%@@%%%%%%&&&&&&..%%%%%%%%%%%%%%%%%%.... ", 68 | " oo%%%%%%%%%%%%@@####@@%%%%%%%%%%%%%%%%@@%%%%%%&&&&&&..%%%%%%%%%%%%%%%%%%.... ", 69 | " oo%%%%%%%%%%%%@@@@%%%%%%%%%%%%%%%%@@%%%%%%%%%%%%oo%%%%%%%%%%%%%%%%%%.. ", 70 | " oo%%%%%%%%%%%%@@@@%%%%%%%%%%%%%%%%@@%%%%%%%%%%%%oo%%%%%%%%%%%%%%%%%%.. ", 71 | " oo%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@%%%%%%%%%%.. oo%%%%%%%%%%%%.... ", 72 | " oo%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@%%%%%%%%%%.. oo%%%%%%%%%%%%.... ", 73 | " oo%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@$$%%%%%%%%%%.. oo%%%%%%%%@@ ", 74 | " oo%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@$$%%%%%%%%%%.. oo%%%%%%%%@@ ", 75 | " @@$$oo%%%%%%%%%%%%%%%%%%%%%%%%%%@@%%%%%%%%%%.. oo%%%%%%%%oo ", 76 | " @@$$oo%%%%%%%%%%%%%%%%%%%%%%%%%%@@%%%%%%%%%%.. oo%%%%%%%%oo ", 77 | " @@@@&&&&%%$$%%&&%%%%%%%%%%%%%%%%%%&&%%%%%%%%%%%%.. oo%%%%%%oo ", 78 | " @@@@&&&&%%$$%%&&%%%%%%%%%%%%%%%%%%&&%%%%%%%%%%%%.. oo%%%%%%oo ", 79 | " @@@@@@&&&&&&&&&&$$&&%%&&%%&&%%%%%%%%%%&&&&%%%%%%%%%%%%oo ..$$%%%%%%%%oo ", 80 | " @@@@@@&&&&&&&&&&$$&&%%&&%%&&%%%%%%%%%%&&&&%%%%%%%%%%%%oo ..$$%%%%%%%%oo ", 81 | "@&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%&&&&&&&&%%%%%%%%%%oo oo$$$$$$%%$$oo.. ", 82 | "@&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%&&&&&&&&%%%%%%%%%%oo oo$$$$$$%%$$oo.. ", 83 | " @@$$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%&&oo ..$$$$$$$$oooo ", 84 | " @@$$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%&&oo ..$$$$$$$$oooo ", 85 | " @@&&&&&&%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.. ..$$$$.. ", 86 | " @@&&&&&&%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.. ..$$$$.. ", 87 | " @@ooooooXXXX@@$$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.. ..@@$$.. ", 88 | " @@ooooooXXXX@@$$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.. ..@@$$.. ", 89 | " @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&oo ..@@@@.. ", 90 | " @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&oo ..@@@@.. ", 91 | " @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%oo ......@@@@@@.. ", 92 | " @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%oo ......@@@@@@.. ", 93 | " @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%oo ..oooo@@.... ", 94 | " @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%oo ..oooo@@.... ", 95 | " @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%..oo...... ", 96 | " @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%..oo...... ", 97 | " @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%oooo.. ", 98 | " @@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%oooo.. ", 99 | " oo&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%&&%%%%%%%%%%oooo.. ", 100 | " oo&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%&&%%%%%%%%%%oooo.. ", 101 | " oo%%&&&&&&&&%%%%%%%%%%%%&&&&&&%%&&%%&&%%%%%%%%.... ", 102 | " oo%%&&&&&&&&%%%%%%%%%%%%&&&&&&%%&&%%&&%%%%%%%%.... ", 103 | " oo%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&%%%%%%%%$$.. ", 104 | " oo%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&%%%%%%%%$$.. ", 105 | " @@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.. ", 106 | " @@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.. ", 107 | " oo%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.. ", 108 | " oo%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.. ", 109 | " oo$$%%%%%%%%$$oooooooooo%%%%%%%%%%%%%%..$$.. ", 110 | " oo$$%%%%%%%%$$oooooooooo%%%%%%%%%%%%%%..$$.. ", 111 | " oo$$$$$$@@.. oooooo%%%%%%@@@@$$$$.. ", 112 | " oo$$$$$$@@.. oooooo%%%%%%@@@@$$$$.. ", 113 | " oo%%%%%%$$.. oooooooo$$@@$$.. ", 114 | " oo%%%%%%$$.. oooooooo$$@@$$.. ", 115 | " oo&&@@&&@@.. ...... ", 116 | " oo&&@@&&@@.. ...... ", 117 | " oo.... ", 118 | " oo.... " 119 | }; --------------------------------------------------------------------------------