Add MLX42 V2

This commit is contained in:
Etienne Rey-bethbeder
2023-04-26 13:39:03 +02:00
parent 8ff4363d2c
commit bc5fc2fc59
62 changed files with 26910 additions and 1 deletions

3543
MLX42/src/font/font.h Normal file

File diff suppressed because it is too large Load Diff

80
MLX42/src/font/mlx_font.c Normal file
View File

@ -0,0 +1,80 @@
/* ************************************************************************** */
/* */
/* :::::::: */
/* mlx_font.c :+: :+: */
/* +:+ */
/* By: W2Wizard <w2.wizzard@gmail.com> +#+ */
/* +#+ */
/* Created: 2022/02/22 12:01:37 by W2Wizard #+# #+# */
/* Updated: 2022/06/27 19:53:36 by lde-la-h ######## odam.nl */
/* */
/* ************************************************************************** */
#include "font.h"
#include "MLX42/MLX42_Int.h"
//= Private =//
/**
* Does the actual copying of pixels form the atlas buffer to the
* image buffer.
*
* Skips any non-printable characters.
*
* @param image The image to draw on.
* @param texture The font_atlas.
* @param texoffset The character texture X offset.
* @param imgoffset The image X offset.
*/
static void mlx_draw_char(mlx_image_t* image, int32_t texoffset, int32_t imgoffset)
{
if (texoffset < 0)
return;
char* pixelx;
uint8_t* pixeli;
for (uint32_t y = 0; y < FONT_HEIGHT; y++)
{
pixelx = &font_atlas.pixels[(y * font_atlas.width + texoffset) * BPP];
pixeli = image->pixels + ((y * image->width + imgoffset) * BPP);
memcpy(pixeli, pixelx, FONT_WIDTH * BPP);
}
}
//= Public =//
const mlx_texture_t* mlx_get_font(void)
{
return ((const mlx_texture_t*)&font_atlas);
}
int32_t mlx_get_texoffset(char c)
{
const bool _isprint = isprint(c);
// NOTE: Cheesy branchless operation :D
// +2 To skip line separator in texture
return (-1 * !_isprint + ((FONT_WIDTH + 2) * (c - 32)) * _isprint);
}
mlx_image_t* mlx_put_string(mlx_t* mlx, const char* str, int32_t x, int32_t y)
{
MLX_NONNULL(mlx);
MLX_NONNULL(str);
mlx_image_t* strimage;
const size_t len = strlen(str);
if (len > MLX_MAX_STRING)
return ((void*)mlx_error(MLX_STRTOOBIG));
if (!(strimage = mlx_new_image(mlx, len * FONT_WIDTH, FONT_HEIGHT)))
return (NULL);
// Draw the text itself
int32_t imgoffset = 0;
for (size_t i = 0; i < len; i++, imgoffset += FONT_WIDTH)
mlx_draw_char(strimage, mlx_get_texoffset(str[i]), imgoffset);
if (mlx_image_to_window(mlx, strimage, x, y) == -1)
return (mlx_delete_image(mlx, strimage), NULL);
return (strimage);
}