(Caca/GDI/Sixel/VGA) Did not have proper implemented free functions

This commit is contained in:
libretroadmin 2022-07-07 21:29:14 +02:00
parent af71dcb893
commit 3494c0de0a
7 changed files with 118 additions and 67 deletions

View File

@ -31,8 +31,8 @@
typedef struct typedef struct
{ {
const font_renderer_driver_t *caca_font_driver; const font_renderer_driver_t *font_driver;
void *caca_font_data; void *font_data;
caca_t *caca; caca_t *caca;
} caca_raster_t; } caca_raster_t;
@ -48,8 +48,8 @@ static void *caca_font_init(void *data,
font->caca = (caca_t*)data; font->caca = (caca_t*)data;
if (!font_renderer_create_default( if (!font_renderer_create_default(
&font->caca_font_driver, &font->font_driver,
&font->caca_font_data, font_path, font_size)) &font->font_data, font_path, font_size))
{ {
RARCH_WARN("Couldn't initialize font renderer.\n"); RARCH_WARN("Couldn't initialize font renderer.\n");
return NULL; return NULL;
@ -58,7 +58,18 @@ static void *caca_font_init(void *data,
return font; return font;
} }
static void caca_font_free(void *data, bool is_threaded) { } static void caca_font_free(void *data, bool is_threaded)
{
caca_raster_t *font = (caca_raster_t*)data;
if (!font)
return;
if (font->font_driver && font->font_data && font->font_driver->free)
font->font_driver->free(font->font_data);
free(font);
}
static int caca_font_get_message_width(void *data, const char *msg, static int caca_font_get_message_width(void *data, const char *msg,
unsigned msg_len, float scale) unsigned msg_len, float scale)

View File

@ -43,6 +43,9 @@ typedef struct
static void* ctr_font_init(void* data, const char* font_path, static void* ctr_font_init(void* data, const char* font_path,
float font_size, bool is_threaded) float font_size, bool is_threaded)
{ {
int i, j;
const uint8_t* src = NULL;
uint8_t* tmp = NULL;
const struct font_atlas* atlas = NULL; const struct font_atlas* atlas = NULL;
ctr_font_t* font = (ctr_font_t*)calloc(1, sizeof(*font)); ctr_font_t* font = (ctr_font_t*)calloc(1, sizeof(*font));
ctr_video_t* ctr = (ctr_video_t*)data; ctr_video_t* ctr = (ctr_video_t*)data;
@ -50,7 +53,7 @@ static void* ctr_font_init(void* data, const char* font_path,
if (!font) if (!font)
return NULL; return NULL;
font_size = 10; font_size = 10;
if (!font_renderer_create_default( if (!font_renderer_create_default(
&font->font_driver, &font->font_driver,
&font->font_data, font_path, font_size)) &font->font_data, font_path, font_size))
@ -60,20 +63,19 @@ static void* ctr_font_init(void* data, const char* font_path,
return NULL; return NULL;
} }
atlas = font->font_driver->get_atlas(font->font_data); atlas = font->font_driver->get_atlas(font->font_data);
font->texture.width = next_pow2(atlas->width); font->texture.width = next_pow2(atlas->width);
font->texture.height = next_pow2(atlas->height); font->texture.height = next_pow2(atlas->height);
#if FONT_TEXTURE_IN_VRAM #if FONT_TEXTURE_IN_VRAM
font->texture.data = vramAlloc(font->texture.width * font->texture.height); font->texture.data = vramAlloc(font->texture.width * font->texture.height);
uint8_t* tmp = linearAlloc(font->texture.width * font->texture.height); tmp = linearAlloc(font->texture.width * font->texture.height);
#else #else
font->texture.data = linearAlloc(font->texture.width * font->texture.height); font->texture.data = linearAlloc(font->texture.width * font->texture.height);
uint8_t* tmp = font->texture.data; tmp = font->texture.data;
#endif #endif
int i, j; src = atlas->buffer;
const uint8_t* src = atlas->buffer;
for (j = 0; (j < atlas->height) && (j < font->texture.height); j++) for (j = 0; (j < atlas->height) && (j < font->texture.height); j++)
for (i = 0; (i < atlas->width) && (i < font->texture.width); i++) for (i = 0; (i < atlas->width) && (i < font->texture.width); i++)

View File

@ -37,8 +37,8 @@
typedef struct typedef struct
{ {
const font_renderer_driver_t *gdi_font_driver; const font_renderer_driver_t *font_driver;
void *gdi_font_data; void *font_data;
gdi_t *gdi; gdi_t *gdi;
} gdi_raster_t; } gdi_raster_t;
@ -54,8 +54,8 @@ static void *gdi_font_init(void *data,
font->gdi = (gdi_t*)data; font->gdi = (gdi_t*)data;
if (!font_renderer_create_default( if (!font_renderer_create_default(
&font->gdi_font_driver, &font->font_driver,
&font->gdi_font_data, font_path, font_size)) &font->font_data, font_path, font_size))
{ {
RARCH_WARN("Couldn't initialize font renderer.\n"); RARCH_WARN("Couldn't initialize font renderer.\n");
return NULL; return NULL;
@ -64,7 +64,18 @@ static void *gdi_font_init(void *data,
return font; return font;
} }
static void gdi_font_free(void *data, bool is_threaded) { } static void gdi_font_free(void *data, bool is_threaded)
{
gdi_raster_t *font = (gdi_raster_t*)data;
if (!font)
return;
if (font->font_driver && font->font_data && font->font_driver->free)
font->font_driver->free(font->font_data);
free(font);
}
static void gdi_font_render_msg( static void gdi_font_render_msg(
void *userdata, void *userdata,
@ -76,7 +87,7 @@ static void gdi_font_render_msg(
float x, y, scale, drop_mod, drop_alpha; float x, y, scale, drop_mod, drop_alpha;
int drop_x, drop_y, msg_strlen; int drop_x, drop_y, msg_strlen;
unsigned i; unsigned i;
unsigned newX, newY, newDropX, newDropY; unsigned new_x, new_y, new_drop_x, new_drop_y;
unsigned align; unsigned align;
unsigned red, green, blue; unsigned red, green, blue;
gdi_t *gdi = (gdi_t*)userdata; gdi_t *gdi = (gdi_t*)userdata;
@ -133,25 +144,25 @@ static void gdi_font_render_msg(
switch (align) switch (align)
{ {
case TEXT_ALIGN_LEFT: case TEXT_ALIGN_LEFT:
newX = x * width * scale; new_x = x * width * scale;
newDropX = drop_x * width * scale; new_drop_x = drop_x * width * scale;
break; break;
case TEXT_ALIGN_RIGHT: case TEXT_ALIGN_RIGHT:
newX = (x * width * scale) - text_size.cx; new_x = (x * width * scale) - text_size.cx;
newDropX = (drop_x * width * scale) - text_size.cx; new_drop_x = (drop_x * width * scale) - text_size.cx;
break; break;
case TEXT_ALIGN_CENTER: case TEXT_ALIGN_CENTER:
newX = (x * width * scale) - (text_size.cx / 2); new_x = (x * width * scale) - (text_size.cx / 2);
newDropX = (drop_x * width * scale) - (text_size.cx / 2); new_drop_x = (drop_x * width * scale) - (text_size.cx / 2);
break; break;
default: default:
newX = 0; new_x = 0;
newDropX = 0; new_drop_x = 0;
break; break;
} }
newY = height - (y * height * scale) - text_size.cy; new_y = height - (y * height * scale) - text_size.cy;
newDropY = height - (drop_y * height * scale) - text_size.cy; new_drop_y = height - (drop_y * height * scale) - text_size.cy;
font->gdi->bmp_old = (HBITMAP)SelectObject(font->gdi->memDC, font->gdi->bmp); font->gdi->bmp_old = (HBITMAP)SelectObject(font->gdi->memDC, font->gdi->bmp);
@ -170,7 +181,8 @@ static void gdi_font_render_msg(
SetTextColor(font->gdi->memDC, RGB(drop_red, drop_green, drop_blue)); SetTextColor(font->gdi->memDC, RGB(drop_red, drop_green, drop_blue));
for (i = 0; i < msg_list.size; i++) for (i = 0; i < msg_list.size; i++)
TextOut(font->gdi->memDC, newDropX, newDropY + (text_size.cy * i), TextOut(font->gdi->memDC, new_drop_x,
new_drop_y + (text_size.cy * i),
msg_list.elems[i].data, msg_list.elems[i].data,
strlen(msg_list.elems[i].data)); strlen(msg_list.elems[i].data));
} }
@ -178,7 +190,7 @@ static void gdi_font_render_msg(
SetTextColor(font->gdi->memDC, RGB(red, green, blue)); SetTextColor(font->gdi->memDC, RGB(red, green, blue));
for (i = 0; i < msg_list.size; i++) for (i = 0; i < msg_list.size; i++)
TextOut(font->gdi->memDC, newX, newY + (text_size.cy * i), TextOut(font->gdi->memDC, new_x, new_y + (text_size.cy * i),
msg_list.elems[i].data, msg_list.elems[i].data,
strlen(msg_list.elems[i].data)); strlen(msg_list.elems[i].data));

View File

@ -39,8 +39,11 @@ typedef struct
static void* ps2_font_init(void* data, const char* font_path, static void* ps2_font_init(void* data, const char* font_path,
float font_size, bool is_threaded) float font_size, bool is_threaded)
{ {
const struct font_atlas* atlas = NULL;
uint32_t j; uint32_t j;
int text_size, clut_size;
uint8_t *tex8;
uint32_t *clut32;
const struct font_atlas* atlas = NULL;
ps2_font_t* font = (ps2_font_t*)calloc(1, sizeof(*font)); ps2_font_t* font = (ps2_font_t*)calloc(1, sizeof(*font));
if (!font) if (!font)
@ -55,26 +58,26 @@ static void* ps2_font_init(void* data, const char* font_path,
return NULL; return NULL;
} }
atlas = font->font_driver->get_atlas(font->font_data); atlas = font->font_driver->get_atlas(font->font_data);
font->texture = (GSTEXTURE*)calloc(1, sizeof(GSTEXTURE)); font->texture = (GSTEXTURE*)calloc(1, sizeof(GSTEXTURE));
font->texture->Width = atlas->width; font->texture->Width = atlas->width;
font->texture->Height = atlas->height; font->texture->Height = atlas->height;
font->texture->PSM = GS_PSM_T8; font->texture->PSM = GS_PSM_T8;
font->texture->ClutPSM = GS_PSM_CT32; font->texture->ClutPSM = GS_PSM_CT32;
font->texture->Filter = GS_FILTER_NEAREST; font->texture->Filter = GS_FILTER_NEAREST;
// Convert to 8bit texture /* Convert to 8bit texture */
int textSize = gsKit_texture_size_ee(atlas->width, atlas->height, GS_PSM_T8); text_size = gsKit_texture_size_ee(atlas->width, atlas->height, GS_PSM_T8);
uint8_t *tex8 = malloc(textSize); tex8 = (uint8_t*)malloc(text_size);
for (j = 0; j < atlas->width * atlas->height; j++ ) for (j = 0; j < atlas->width * atlas->height; j++ )
tex8[j] = atlas->buffer[j] & 0x000000FF; tex8[j] = atlas->buffer[j] & 0x000000FF;
font->texture->Mem = (u32 *)tex8; font->texture->Mem = (u32 *)tex8;
// Create 8bit CLUT /* Create 8bit CLUT */
int clutSize = gsKit_texture_size_ee(16, 16, GS_PSM_CT32); clut_size = gsKit_texture_size_ee(16, 16, GS_PSM_CT32);
uint32_t *clut32 = malloc(clutSize); clut32 = (uint32_t*)malloc(clutSize);
for (j = 0; j < 256; j++ ) for (j = 0; j < 256; j++)
clut32[j] = 0x01010101 * j; clut32[j] = 0x01010101 * j;
font->texture->Clut = (u32 *)clut32; font->texture->Clut = (u32 *)clut32;
return font; return font;
@ -149,10 +152,10 @@ static void ps2_font_render_line(
int delta_x = 0; int delta_x = 0;
int delta_y = 0; int delta_y = 0;
/* We need to >> 1, because GS_SETREG_RGBAQ expects 0x80 as max color */ /* We need to >> 1, because GS_SETREG_RGBAQ expects 0x80 as max color */
int colorA = (int)(((color & 0xFF000000) >> 24) >> 2); int color_a = (int)(((color & 0xFF000000) >> 24) >> 2);
int colorB = (int)(((color & 0x00FF0000) >> 16) >> 1); int color_b = (int)(((color & 0x00FF0000) >> 16) >> 1);
int colorG = (int)(((color & 0x0000FF00) >> 8) >> 1); int color_g = (int)(((color & 0x0000FF00) >> 8) >> 1);
int colorR = (int)(((color & 0x000000FF) >> 0) >> 1); int color_r = (int)(((color & 0x000000FF) >> 0) >> 1);
/* Enable Alpha for font */ /* Enable Alpha for font */
gsKit_set_primalpha(ps2->gsGlobal, GS_SETREG_ALPHA(0, 1, 0, 1, 0), 0); gsKit_set_primalpha(ps2->gsGlobal, GS_SETREG_ALPHA(0, 1, 0, 1, 0), 0);
@ -220,7 +223,7 @@ static void ps2_font_render_line(
u2, /* U2 */ u2, /* U2 */
v2, /* V2 */ v2, /* V2 */
5, /* Z */ 5, /* Z */
GS_SETREG_RGBAQ(colorR,colorG,colorB,colorA,0x00)); GS_SETREG_RGBAQ(color_r, color_g, color_b, color_a, 0x00));
delta_x += glyph->advance_x; delta_x += glyph->advance_x;
delta_y += glyph->advance_y; delta_y += glyph->advance_y;

View File

@ -30,8 +30,8 @@
typedef struct typedef struct
{ {
const font_renderer_driver_t *sixel_font_driver; const font_renderer_driver_t *font_driver;
void *sixel_font_data; void *font_data;
sixel_t *sixel; sixel_t *sixel;
} sixel_raster_t; } sixel_raster_t;
@ -47,8 +47,8 @@ static void *sixel_font_init(void *data,
font->sixel = (sixel_t*)data; font->sixel = (sixel_t*)data;
if (!font_renderer_create_default( if (!font_renderer_create_default(
&font->sixel_font_driver, &font->font_driver,
&font->sixel_font_data, font_path, font_size)) &font->font_data, font_path, font_size))
{ {
RARCH_WARN("Couldn't initialize font renderer.\n"); RARCH_WARN("Couldn't initialize font renderer.\n");
return NULL; return NULL;
@ -57,7 +57,18 @@ static void *sixel_font_init(void *data,
return font; return font;
} }
static void sixel_font_free(void *data, bool is_threaded) { } static void sixel_font_free(void *data, bool is_threaded)
{
sixel_raster_t *font = (sixel_raster_t*)data;
if (!font)
return;
if (font->font_driver && font->font_data && font->font_driver->free)
font->font_driver->free(font->font_data);
free(font);
}
static int sixel_font_get_message_width(void *data, const char *msg, static int sixel_font_get_message_width(void *data, const char *msg,
unsigned msg_len, float scale) { return 0; } unsigned msg_len, float scale) { return 0; }
static const struct font_glyph *sixel_font_get_glyph( static const struct font_glyph *sixel_font_get_glyph(

View File

@ -29,8 +29,8 @@
typedef struct typedef struct
{ {
const font_renderer_driver_t *vga_font_driver; const font_renderer_driver_t *font_driver;
void *vga_font_data; void *font_data;
vga_t *vga; vga_t *vga;
} vga_raster_t; } vga_raster_t;
@ -48,8 +48,8 @@ static void *vga_font_init(void *data,
font_size = 1; font_size = 1;
if (!font_renderer_create_default( if (!font_renderer_create_default(
&font->vga_font_driver, &font->font_driver,
&font->vga_font_data, font_path, font_size)) &font->font_data, font_path, font_size))
{ {
RARCH_WARN("Couldn't initialize font renderer.\n"); RARCH_WARN("Couldn't initialize font renderer.\n");
return NULL; return NULL;
@ -58,7 +58,19 @@ static void *vga_font_init(void *data,
return font; return font;
} }
static void vga_font_render_free(void *data, bool is_threaded) { } static void vga_font_render_free(void *data, bool is_threaded)
{
vga_raster_t *font = (vga_raster_t*)data;
if (!font)
return;
if (font->font_driver && font->font_data && font->font_driver->free)
font->font_driver->free(font->font_data);
free(font);
}
static int vga_font_get_message_width(void *data, const char *msg, static int vga_font_get_message_width(void *data, const char *msg,
unsigned msg_len, float scale) { return 0; } unsigned msg_len, float scale) { return 0; }
static const struct font_glyph *vga_font_get_glyph( static const struct font_glyph *vga_font_get_glyph(

View File

@ -67,10 +67,10 @@ static void xfonts_free(void *data, bool is_threaded)
{ {
xfonts_t *font = (xfonts_t*)data; xfonts_t *font = (xfonts_t*)data;
if (font) if (!font)
free(font); return;
font = NULL; free(font);
} }
static void xfonts_render_msg( static void xfonts_render_msg(