sdl3/php-sdl3/sdl3_ttf.c
2025-10-26 13:39:25 +01:00

171 lines
4.5 KiB
C

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_sdl3.h"
#include "sdl3_ttf.h"
#include "sdl3_image.h"
#include <SDL3/SDL.h>
#include <SDL3_ttf/SDL_ttf.h>
// Resource handles
int le_ttf_font;
// Destructor für Font
void ttf_font_dtor(zend_resource *rsrc) {
TTF_Font *font = (TTF_Font *)rsrc->ptr;
if (font) {
TTF_CloseFont(font);
}
}
// Registriert die Resource-Typen
void sdl3_ttf_register_resources(int module_number) {
le_ttf_font = zend_register_list_destructors_ex(ttf_font_dtor, NULL, "TTF_Font", module_number);
}
PHP_FUNCTION(ttf_init) {
if (!TTF_Init()) {
php_error_docref(NULL, E_WARNING, "TTF_Init failed: %s", SDL_GetError());
RETURN_FALSE;
}
RETURN_TRUE;
}
PHP_FUNCTION(ttf_open_font) {
char *file;
size_t file_len;
zend_long ptsize;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl", &file, &file_len, &ptsize) == FAILURE) {
RETURN_THROWS();
}
TTF_Font *font = TTF_OpenFont(file, (float)ptsize);
if (!font) {
php_error_docref(NULL, E_WARNING, "Failed to open font: %s", SDL_GetError());
RETURN_FALSE;
}
RETURN_RES(zend_register_resource(font, le_ttf_font));
}
PHP_FUNCTION(ttf_close_font) {
zval *font_res;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &font_res) == FAILURE) {
RETURN_THROWS();
}
// Resource wird automatisch durch den Destructor freigegeben
zend_list_close(Z_RES_P(font_res));
RETURN_TRUE;
}
PHP_FUNCTION(ttf_render_text_solid) {
zval *font_res;
TTF_Font *font;
char *text;
size_t text_len;
zend_long r, g, b;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rslll", &font_res, &text, &text_len, &r, &g, &b) == FAILURE) {
RETURN_THROWS();
}
font = (TTF_Font *)zend_fetch_resource(Z_RES_P(font_res), "TTF_Font", le_ttf_font);
if (!font) {
RETURN_FALSE;
}
SDL_Color color = {(Uint8)r, (Uint8)g, (Uint8)b, 255};
SDL_Surface *surface = TTF_RenderText_Solid(font, text, text_len, color);
if (!surface) {
php_error_docref(NULL, E_WARNING, "Failed to render text: %s", SDL_GetError());
RETURN_FALSE;
}
RETURN_RES(zend_register_resource(surface, le_sdl_surface));
}
PHP_FUNCTION(ttf_render_text_blended) {
zval *font_res;
TTF_Font *font;
char *text;
size_t text_len;
zend_long r, g, b;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rslll", &font_res, &text, &text_len, &r, &g, &b) == FAILURE) {
RETURN_THROWS();
}
font = (TTF_Font *)zend_fetch_resource(Z_RES_P(font_res), "TTF_Font", le_ttf_font);
if (!font) {
RETURN_FALSE;
}
SDL_Color color = {(Uint8)r, (Uint8)g, (Uint8)b, 255};
SDL_Surface *surface = TTF_RenderText_Blended(font, text, text_len, color);
if (!surface) {
php_error_docref(NULL, E_WARNING, "Failed to render text: %s", SDL_GetError());
RETURN_FALSE;
}
RETURN_RES(zend_register_resource(surface, le_sdl_surface));
}
PHP_FUNCTION(ttf_render_text_shaded) {
zval *font_res;
TTF_Font *font;
char *text;
size_t text_len;
zend_long fg_r, fg_g, fg_b, bg_r, bg_g, bg_b;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsllllll", &font_res, &text, &text_len,
&fg_r, &fg_g, &fg_b, &bg_r, &bg_g, &bg_b) == FAILURE) {
RETURN_THROWS();
}
font = (TTF_Font *)zend_fetch_resource(Z_RES_P(font_res), "TTF_Font", le_ttf_font);
if (!font) {
RETURN_FALSE;
}
SDL_Color fg_color = {(Uint8)fg_r, (Uint8)fg_g, (Uint8)fg_b, 255};
SDL_Color bg_color = {(Uint8)bg_r, (Uint8)bg_g, (Uint8)bg_b, 255};
SDL_Surface *surface = TTF_RenderText_Shaded(font, text, text_len, fg_color, bg_color);
if (!surface) {
php_error_docref(NULL, E_WARNING, "Failed to render text: %s", SDL_GetError());
RETURN_FALSE;
}
RETURN_RES(zend_register_resource(surface, le_sdl_surface));
}
PHP_FUNCTION(ttf_size_text) {
zval *font_res;
TTF_Font *font;
char *text;
size_t text_len;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &font_res, &text, &text_len) == FAILURE) {
RETURN_THROWS();
}
font = (TTF_Font *)zend_fetch_resource(Z_RES_P(font_res), "TTF_Font", le_ttf_font);
if (!font) {
RETURN_FALSE;
}
int w, h;
if (!TTF_GetStringSize(font, text, text_len, &w, &h)) {
php_error_docref(NULL, E_WARNING, "Failed to get text size: %s", SDL_GetError());
RETURN_FALSE;
}
array_init(return_value);
add_assoc_long(return_value, "w", w);
add_assoc_long(return_value, "h", h);
}