From 7c534833889c6378b24d4b14f0ae1f6bb82890f1 Mon Sep 17 00:00:00 2001 From: Christopher Serr Date: Thu, 31 Jan 2019 04:54:24 +0100 Subject: [PATCH] Use Premultiplied Alpha for Text and Game Capture (#1578) The GDI+ based Text Source actually uses Premultiplied Alpha. The edges of the fonts are therefore incorrectly blended, causing ugly artifacts especially if bright text above a bright background is used. Here's an image comparing the new text blending (left) to before (right): ![https://i.imgur.com/VhhkQcZ.png](https://i.imgur.com/VhhkQcZ.png) Additionally, the game capture has the same problem, so premultiplied alpha is used there as well now. --- plugins/obs-text/gdiplus/obs-text.cpp | 19 ++++++++++++++----- plugins/win-capture/game-capture.c | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/plugins/obs-text/gdiplus/obs-text.cpp b/plugins/obs-text/gdiplus/obs-text.cpp index 031e97907..97c70f676 100644 --- a/plugins/obs-text/gdiplus/obs-text.cpp +++ b/plugins/obs-text/gdiplus/obs-text.cpp @@ -266,7 +266,7 @@ struct TextSource { inline void Update(obs_data_t *settings); inline void Tick(float seconds); - inline void Render(gs_effect_t *effect); + inline void Render(); }; static time_t get_modified_timestamp(const char *filename) @@ -789,13 +789,22 @@ inline void TextSource::Tick(float seconds) } } -inline void TextSource::Render(gs_effect_t *effect) +inline void TextSource::Render() { if (!tex) return; + gs_effect_t *effect = obs_get_base_effect(OBS_EFFECT_PREMULTIPLIED_ALPHA); + gs_technique_t *tech = gs_effect_get_technique(effect, "Draw"); + + gs_technique_begin(tech); + gs_technique_begin_pass(tech, 0); + gs_effect_set_texture(gs_effect_get_param_by_name(effect, "image"), tex); gs_draw_sprite(tex, 0, cx, cy); + + gs_technique_end_pass(tech); + gs_technique_end(tech); } /* ------------------------------------------------------------------------- */ @@ -914,7 +923,7 @@ static obs_properties_t *get_properties(void *data) T_GRADIENT_OPACITY, 0, 100, 1); obs_properties_add_float_slider(props, S_GRADIENT_DIR, T_GRADIENT_DIR, 0, 360, 0.1); - + obs_properties_add_color(props, S_BKCOLOR, T_BKCOLOR); obs_properties_add_int_slider(props, S_BKOPACITY, T_BKOPACITY, 0, 100, 1); @@ -1017,9 +1026,9 @@ bool obs_module_load(void) { reinterpret_cast(data)->Tick(seconds); }; - si.video_render = [] (void *data, gs_effect_t *effect) + si.video_render = [] (void *data, gs_effect_t*) { - reinterpret_cast(data)->Render(effect); + reinterpret_cast(data)->Render(); }; obs_register_source(&si); diff --git a/plugins/win-capture/game-capture.c b/plugins/win-capture/game-capture.c index 744ae5a7a..b825b2df9 100644 --- a/plugins/win-capture/game-capture.c +++ b/plugins/win-capture/game-capture.c @@ -1771,7 +1771,7 @@ static void game_capture_render(void *data, gs_effect_t *effect) return; effect = obs_get_base_effect(gc->config.allow_transparency ? - OBS_EFFECT_DEFAULT : OBS_EFFECT_OPAQUE); + OBS_EFFECT_PREMULTIPLIED_ALPHA : OBS_EFFECT_OPAQUE); while (gs_effect_loop(effect, "Draw")) { obs_source_draw(gc->texture, 0, 0, 0, 0,