static void gl_raster_font_render_msg(void *data, const char *msg, const void *userdata) { GLfloat x, y, scale, drop_mod; GLfloat color[4], color_dark[4]; int drop_x, drop_y; bool full_screen; enum text_alignment text_align; gl_t *gl = NULL; gl_raster_t *font = (gl_raster_t*)data; settings_t *settings = config_get_ptr(); const struct font_params *params = (const struct font_params*)userdata; if (!font) return; gl = font->gl; if (params) { x = params->x; y = params->y; scale = params->scale; full_screen = params->full_screen; text_align = params->text_align; drop_x = params->drop_x; drop_y = params->drop_y; drop_mod = params->drop_mod; color[0] = FONT_COLOR_GET_RED(params->color) / 255.0f; color[1] = FONT_COLOR_GET_GREEN(params->color) / 255.0f; color[2] = FONT_COLOR_GET_BLUE(params->color) / 255.0f; color[3] = FONT_COLOR_GET_ALPHA(params->color) / 255.0f; /* If alpha is 0.0f, turn it into default 1.0f */ if (color[3] <= 0.0f) color[3] = 1.0f; } else { x = settings->video.msg_pos_x; y = settings->video.msg_pos_y; scale = 1.0f; full_screen = false; text_align = TEXT_ALIGN_LEFT; color[0] = settings->video.msg_color_r; color[1] = settings->video.msg_color_g; color[2] = settings->video.msg_color_b; color[3] = 1.0f; drop_x = -2; drop_y = -2; drop_mod = 0.3f; } if (font->block) font->block->fullscreen = full_screen; else gl_raster_font_setup_viewport(font, full_screen); if (drop_x || drop_y) { color_dark[0] = color[0] * drop_mod; color_dark[1] = color[1] * drop_mod; color_dark[2] = color[2] * drop_mod; color_dark[3] = color[3]; gl_raster_font_render_message(font, msg, scale, color_dark, x + scale * drop_x / gl->vp.width, y + scale * drop_y / gl->vp.height, text_align); } gl_raster_font_render_message(font, msg, scale, color, x, y, text_align); if (!font->block) gl_raster_font_restore_viewport(gl); }
static void gl_raster_font_render_msg( video_frame_info_t *video_info, void *data, const char *msg, const void *userdata) { GLfloat x, y, scale, drop_mod, drop_alpha; GLfloat color[4], color_dark[4]; int drop_x, drop_y; enum text_alignment text_align = TEXT_ALIGN_LEFT; bool full_screen = false ; gl_t *gl = NULL; gl_raster_t *font = (gl_raster_t*)data; unsigned width = video_info->width; unsigned height = video_info->height; const struct font_params *params = (const struct font_params*)userdata; if (!font || string_is_empty(msg)) return; gl = font->gl; if (!gl) return; if (params) { x = params->x; y = params->y; scale = params->scale; full_screen = params->full_screen; text_align = params->text_align; drop_x = params->drop_x; drop_y = params->drop_y; drop_mod = params->drop_mod; drop_alpha = params->drop_alpha; color[0] = FONT_COLOR_GET_RED(params->color) / 255.0f; color[1] = FONT_COLOR_GET_GREEN(params->color) / 255.0f; color[2] = FONT_COLOR_GET_BLUE(params->color) / 255.0f; color[3] = FONT_COLOR_GET_ALPHA(params->color) / 255.0f; /* If alpha is 0.0f, turn it into default 1.0f */ if (color[3] <= 0.0f) color[3] = 1.0f; } else { x = video_info->font_msg_pos_x; y = video_info->font_msg_pos_y; scale = 1.0f; full_screen = true; text_align = TEXT_ALIGN_LEFT; color[0] = video_info->font_msg_color_r; color[1] = video_info->font_msg_color_g; color[2] = video_info->font_msg_color_b; color[3] = 1.0f; drop_x = -2; drop_y = -2; drop_mod = 0.3f; drop_alpha = 1.0f; } if (font && font->block) font->block->fullscreen = full_screen; else gl_raster_font_setup_viewport(width, height, font, full_screen); if (drop_x || drop_y) { color_dark[0] = color[0] * drop_mod; color_dark[1] = color[1] * drop_mod; color_dark[2] = color[2] * drop_mod; color_dark[3] = color[3] * drop_alpha; if (font && !string_is_empty(msg) && font->gl && font->font_data && font->font_driver) gl_raster_font_render_message(font, msg, scale, color_dark, x + scale * drop_x / gl->vp.width, y + scale * drop_y / gl->vp.height, text_align); } if (font && !string_is_empty(msg) && font->gl && font->font_data && font->font_driver) gl_raster_font_render_message(font, msg, scale, color, x, y, text_align); if (!font->block) gl_raster_font_restore_viewport(width, height, gl, false); }
static void wiiu_font_render_msg( video_frame_info_t *video_info, void* data, const char* msg, const struct font_params *params) { float x, y, scale, drop_mod, drop_alpha; int drop_x, drop_y; unsigned max_glyphs; enum text_alignment text_align; unsigned color, color_dark, r, g, b, alpha, r_dark, g_dark, b_dark, alpha_dark; wiiu_font_t *font = (wiiu_font_t*)data; unsigned width = video_info->width; unsigned height = video_info->height; if (!font || !msg || !*msg) return; if (params) { x = params->x; y = params->y; scale = params->scale; text_align = params->text_align; drop_x = params->drop_x; drop_y = params->drop_y; drop_mod = params->drop_mod; drop_alpha = params->drop_alpha; r = FONT_COLOR_GET_RED(params->color); g = FONT_COLOR_GET_GREEN(params->color); b = FONT_COLOR_GET_BLUE(params->color); alpha = FONT_COLOR_GET_ALPHA(params->color); color = params->color; } else { x = video_info->font_msg_pos_x; y = video_info->font_msg_pos_y; scale = 1.0f; text_align = TEXT_ALIGN_LEFT; r = (video_info->font_msg_color_r * 255); g = (video_info->font_msg_color_g * 255); b = (video_info->font_msg_color_b * 255); alpha = 255; color = COLOR_RGBA(r, g, b, alpha); drop_x = -2; drop_y = -2; drop_mod = 0.3f; drop_alpha = 1.0f; } max_glyphs = strlen(msg); if (drop_x || drop_y) max_glyphs *= 2; if (drop_x || drop_y) { r_dark = r * drop_mod; g_dark = g * drop_mod; b_dark = b * drop_mod; alpha_dark = alpha * drop_alpha; color_dark = COLOR_RGBA(r_dark, g_dark, b_dark, alpha_dark); wiiu_font_render_message(video_info, font, msg, scale, color_dark, x + scale * drop_x / width, y + scale * drop_y / height, text_align); } wiiu_font_render_message(video_info, font, msg, scale, color, x, y, text_align); }
static void gdi_render_msg( video_frame_info_t *video_info, void *data, const char *msg, const struct font_params *params) { float x, y, scale; unsigned newX, newY, len; unsigned align; unsigned red; unsigned green; unsigned blue; gdi_raster_t *font = (gdi_raster_t*)data; unsigned width = video_info->width; unsigned height = video_info->height; if (!font || string_is_empty(msg) || !font->gdi) return; if (params) { x = params->x; y = params->y; scale = params->scale; align = params->text_align; red = FONT_COLOR_GET_RED(params->color); green = FONT_COLOR_GET_GREEN(params->color); blue = FONT_COLOR_GET_BLUE(params->color); } else { x = video_info->font_msg_pos_x; y = video_info->font_msg_pos_y; scale = 1.0f; align = TEXT_ALIGN_LEFT; red = video_info->font_msg_color_r * 255.0f; green = video_info->font_msg_color_g * 255.0f; blue = video_info->font_msg_color_b * 255.0f; } len = utf8len(msg); switch (align) { case TEXT_ALIGN_LEFT: newX = x * width * scale; break; case TEXT_ALIGN_RIGHT: newX = (x * width * scale) - len; break; case TEXT_ALIGN_CENTER: newX = (x * width * scale) - (len / 2); break; default: newX = 0; break; } newY = height - (y * height * scale); font->gdi->bmp_old = (HBITMAP)SelectObject(font->gdi->memDC, font->gdi->bmp); SetBkMode(font->gdi->memDC, TRANSPARENT); SetTextColor(font->gdi->memDC, RGB(red, green, blue)); TextOut(font->gdi->memDC, newX, newY, msg, len); SelectObject(font->gdi->memDC, font->gdi->bmp_old); }
static void gl_render_msg(void *data, const char *msg, const struct font_params *params) { GLfloat x, y, scale, drop_mod; GLfloat color[4], color_dark[4]; int drop_x, drop_y; bool full_screen; gl_raster_t *font = (gl_raster_t*)data; if (!font) return; gl_t *gl = font->gl; if (params) { x = params->x; y = params->y; scale = params->scale; full_screen = params->full_screen; drop_x = params->drop_x; drop_y = params->drop_y; drop_mod = params->drop_mod; color[0] = FONT_COLOR_GET_RED(params->color) / 255.0f; color[1] = FONT_COLOR_GET_GREEN(params->color) / 255.0f; color[2] = FONT_COLOR_GET_BLUE(params->color) / 255.0f; color[3] = FONT_COLOR_GET_ALPHA(params->color) / 255.0f; // If alpha is 0.0f, turn it into default 1.0f if (color[3] <= 0.0f) color[3] = 1.0f; } else { x = g_settings.video.msg_pos_x; y = g_settings.video.msg_pos_y; scale = 1.0f; full_screen = false; color[0] = g_settings.video.msg_color_r; color[1] = g_settings.video.msg_color_g; color[2] = g_settings.video.msg_color_b; color[3] = 1.0f; drop_x = -2; drop_y = -2; drop_mod = 0.3f; } gl_set_viewport(gl, gl->win_width, gl->win_height, full_screen, false); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); if (drop_x || drop_y) { color_dark[0] = color[0] * drop_mod; color_dark[1] = color[1] * drop_mod; color_dark[2] = color[2] * drop_mod; color_dark[3] = color[3]; render_message(font, msg, scale, color_dark, x + scale * drop_x / gl->vp.width, y + scale * drop_y / gl->vp.height); } render_message(font, msg, scale, color, x, y); glDisable(GL_BLEND); gl_set_viewport(gl, gl->win_width, gl->win_height, false, true); }
static void d3dfonts_w32_render_msg(video_frame_info_t *video_info, void *data, const char *msg, const struct font_params *params) { unsigned format; unsigned a, r, g, b; RECT rect, rect_shifted; RECT *p_rect_shifted = NULL; RECT *p_rect = NULL; d3dfonts_t *d3dfonts = (d3dfonts_t*)data; unsigned width = video_info->width; unsigned height = video_info->height; float drop_mod = 0.3f; float drop_alpha = 1.0f; int drop_x = -2; int drop_y = -2; if (!d3dfonts || !d3dfonts->d3d || !msg) return; format = DT_LEFT; p_rect = &d3dfonts->d3d->font_rect; p_rect_shifted = &d3dfonts->d3d->font_rect_shifted; if(params) { a = FONT_COLOR_GET_ALPHA(params->color); r = FONT_COLOR_GET_RED(params->color); g = FONT_COLOR_GET_GREEN(params->color); b = FONT_COLOR_GET_BLUE(params->color); switch (params->text_align) { case TEXT_ALIGN_RIGHT: format = DT_RIGHT; rect.left = 0; rect.right = params->x * width; break; case TEXT_ALIGN_CENTER: format = DT_CENTER; rect.left = (params->x - 1.0) * width; rect.right = (params->x + 1.0) * width; break; case TEXT_ALIGN_LEFT: default: format = DT_LEFT; rect.left = params->x * width; rect.right = width; break; } rect.top = (1.0 - params->y) * height - d3dfonts->ascent; rect.bottom = height; p_rect = ▭ drop_x = params->drop_x; drop_y = params->drop_y; if(drop_x || drop_y) { drop_mod = params->drop_mod; drop_alpha = params->drop_alpha; rect_shifted = rect; rect_shifted.left += params->drop_x; rect_shifted.right += params->drop_x; rect_shifted.top -= params->drop_y; rect_shifted.bottom -= params->drop_y; p_rect_shifted = &rect_shifted; } } else { a = 255; r = video_info->font_msg_color_r * 255; g = video_info->font_msg_color_g * 255; b = video_info->font_msg_color_b * 255; } if(drop_x || drop_y) { unsigned drop_a = a * drop_alpha; unsigned drop_r = r * drop_mod; unsigned drop_g = g * drop_mod; unsigned drop_b = b * drop_mod; d3d9x_font_draw_text(d3dfonts->font, NULL, (void*)msg, -1, p_rect_shifted, format, D3DCOLOR_ARGB(drop_a , drop_r, drop_g, drop_b)); } d3d9x_font_draw_text(d3dfonts->font, NULL, (void*)msg, -1, p_rect, format, D3DCOLOR_ARGB(a, r, g, b)); }
static void vita2d_font_render_msg(void *data, const char *msg, const void *userdata) { float x, y, scale, drop_mod, drop_alpha; unsigned color, color_dark, r, g, b, alpha, r_dark, g_dark, b_dark, alpha_dark; unsigned width, height; int drop_x, drop_y; unsigned max_glyphs; enum text_alignment text_align; settings_t *settings = config_get_ptr(); vita_font_t *font = (vita_font_t *)data; const struct font_params *params = (const struct font_params*)userdata; if (!font || !msg || !*msg) return; video_driver_get_size(&width, &height); if (params) { x = params->x; y = params->y; scale = params->scale; text_align = params->text_align; drop_x = params->drop_x; drop_y = params->drop_y; drop_mod = params->drop_mod; drop_alpha = params->drop_alpha; r = FONT_COLOR_GET_RED(params->color); g = FONT_COLOR_GET_GREEN(params->color); b = FONT_COLOR_GET_BLUE(params->color); alpha = FONT_COLOR_GET_ALPHA(params->color); color = params->color; } else { x = settings->video.msg_pos_x; y = settings->video.msg_pos_y; scale = 1.0f; text_align = TEXT_ALIGN_LEFT; r = (settings->video.msg_color_r * 255); g = (settings->video.msg_color_g * 255); b = (settings->video.msg_color_b * 255); alpha = 255; color = RGBA8(r,g,b,alpha); drop_x = -2; drop_y = -2; drop_mod = 0.3f; drop_alpha = 1.0f; } max_glyphs = strlen(msg); if (drop_x || drop_y) max_glyphs *= 2; if (drop_x || drop_y) { r_dark = r * drop_mod; g_dark = g * drop_mod; b_dark = b * drop_mod; alpha_dark = alpha * drop_alpha; color_dark = RGBA8(r_dark,g_dark,b_dark,alpha_dark); vita2d_font_render_message(font, msg, scale, color_dark, x + scale * drop_x / width, y + scale * drop_y / height, text_align); } vita2d_font_render_message(font, msg, scale, color, x, y, text_align); }
static void vulkan_raster_font_render_msg( video_frame_info_t *video_info, void *data, const char *msg, const void *userdata) { float color[4], color_dark[4]; int drop_x, drop_y; bool full_screen; unsigned max_glyphs; enum text_alignment text_align; float x, y, scale, drop_mod, drop_alpha; vk_t *vk = NULL; vulkan_raster_t *font = (vulkan_raster_t*)data; unsigned width = video_info->width; unsigned height = video_info->height; const struct font_params *params = (const struct font_params*)userdata; if (!font || !msg || !*msg) return; vk = font->vk; if (params) { x = params->x; y = params->y; scale = params->scale; full_screen = params->full_screen; text_align = params->text_align; drop_x = params->drop_x; drop_y = params->drop_y; drop_mod = params->drop_mod; drop_alpha = params->drop_alpha; color[0] = FONT_COLOR_GET_RED(params->color) / 255.0f; color[1] = FONT_COLOR_GET_GREEN(params->color) / 255.0f; color[2] = FONT_COLOR_GET_BLUE(params->color) / 255.0f; color[3] = FONT_COLOR_GET_ALPHA(params->color) / 255.0f; /* If alpha is 0.0f, turn it into default 1.0f */ if (color[3] <= 0.0f) color[3] = 1.0f; } else { x = video_info->font_msg_pos_x; y = video_info->font_msg_pos_y; scale = 1.0f; full_screen = true; text_align = TEXT_ALIGN_LEFT; drop_x = -2; drop_y = -2; drop_mod = 0.3f; drop_alpha = 1.0f; color[0] = video_info->font_msg_color_r; color[1] = video_info->font_msg_color_g; color[2] = video_info->font_msg_color_b; color[3] = 1.0f; } video_driver_set_viewport(width, height, full_screen, false); max_glyphs = strlen(msg); if (drop_x || drop_y) max_glyphs *= 2; if (!vulkan_buffer_chain_alloc(font->vk->context, &font->vk->chain->vbo, 6 * sizeof(struct vk_vertex) * max_glyphs, &font->range)) return; font->vertices = 0; font->pv = (struct vk_vertex*)font->range.data; if (drop_x || drop_y) { color_dark[0] = color[0] * drop_mod; color_dark[1] = color[1] * drop_mod; color_dark[2] = color[2] * drop_mod; color_dark[3] = color[3] * drop_alpha; vulkan_raster_font_render_message(font, msg, scale, color_dark, x + scale * drop_x / vk->vp.width, y + scale * drop_y / vk->vp.height, text_align); } vulkan_raster_font_render_message(font, msg, scale, color, x, y, text_align); vulkan_raster_font_flush(font); }