|
@@ -42,6 +42,10 @@ using namespace Gdiplus;
|
|
|
#define S_FILE "file"
|
|
#define S_FILE "file"
|
|
|
#define S_TEXT "text"
|
|
#define S_TEXT "text"
|
|
|
#define S_COLOR "color"
|
|
#define S_COLOR "color"
|
|
|
|
|
+#define S_GRADIENT "gradient"
|
|
|
|
|
+#define S_GRADIENT_COLOR "gradient_color"
|
|
|
|
|
+#define S_GRADIENT_DIR "gradient_dir"
|
|
|
|
|
+#define S_GRADIENT_OPACITY "gradient_opacity"
|
|
|
#define S_ALIGN "align"
|
|
#define S_ALIGN "align"
|
|
|
#define S_VALIGN "valign"
|
|
#define S_VALIGN "valign"
|
|
|
#define S_OPACITY "opacity"
|
|
#define S_OPACITY "opacity"
|
|
@@ -73,6 +77,10 @@ using namespace Gdiplus;
|
|
|
#define T_FILE T_("TextFile")
|
|
#define T_FILE T_("TextFile")
|
|
|
#define T_TEXT T_("Text")
|
|
#define T_TEXT T_("Text")
|
|
|
#define T_COLOR T_("Color")
|
|
#define T_COLOR T_("Color")
|
|
|
|
|
+#define T_GRADIENT T_("Gradient")
|
|
|
|
|
+#define T_GRADIENT_COLOR T_("Gradient.Color")
|
|
|
|
|
+#define T_GRADIENT_DIR T_("Gradient.Direction")
|
|
|
|
|
+#define T_GRADIENT_OPACITY T_("Gradient.Opacity")
|
|
|
#define T_ALIGN T_("Alignment")
|
|
#define T_ALIGN T_("Alignment")
|
|
|
#define T_VALIGN T_("VerticalAlignment")
|
|
#define T_VALIGN T_("VerticalAlignment")
|
|
|
#define T_OPACITY T_("Opacity")
|
|
#define T_OPACITY T_("Opacity")
|
|
@@ -195,11 +203,15 @@ struct TextSource {
|
|
|
wstring face;
|
|
wstring face;
|
|
|
int face_size = 0;
|
|
int face_size = 0;
|
|
|
uint32_t color = 0xFFFFFF;
|
|
uint32_t color = 0xFFFFFF;
|
|
|
|
|
+ uint32_t color2 = 0xFFFFFF;
|
|
|
|
|
+ float gradient_dir = 0;
|
|
|
uint32_t opacity = 100;
|
|
uint32_t opacity = 100;
|
|
|
|
|
+ uint32_t opacity2 = 100;
|
|
|
uint32_t bk_color = 0;
|
|
uint32_t bk_color = 0;
|
|
|
uint32_t bk_opacity = 0;
|
|
uint32_t bk_opacity = 0;
|
|
|
Align align = Align::Left;
|
|
Align align = Align::Left;
|
|
|
VAlign valign = VAlign::Top;
|
|
VAlign valign = VAlign::Top;
|
|
|
|
|
+ bool gradient = false;
|
|
|
bool bold = false;
|
|
bool bold = false;
|
|
|
bool italic = false;
|
|
bool italic = false;
|
|
|
bool underline = false;
|
|
bool underline = false;
|
|
@@ -515,7 +527,10 @@ void TextSource::RenderText()
|
|
|
bits.get());
|
|
bits.get());
|
|
|
|
|
|
|
|
Graphics graphics_bitmap(&bitmap);
|
|
Graphics graphics_bitmap(&bitmap);
|
|
|
- SolidBrush brush(Color(get_alpha_val(opacity) | (color & 0xFFFFFF)));
|
|
|
|
|
|
|
+ LinearGradientBrush brush(RectF(0, 0, (float)size.cx, (float)size.cy),
|
|
|
|
|
+ Color(calc_color(color, opacity)),
|
|
|
|
|
+ Color(calc_color(color2, opacity2)),
|
|
|
|
|
+ gradient_dir, 1);
|
|
|
DWORD full_bk_color = bk_color & 0xFFFFFF;
|
|
DWORD full_bk_color = bk_color & 0xFFFFFF;
|
|
|
|
|
|
|
|
if (!text.empty() || use_extents)
|
|
if (!text.empty() || use_extents)
|
|
@@ -625,6 +640,10 @@ inline void TextSource::Update(obs_data_t *s)
|
|
|
const char *valign_str = obs_data_get_string(s, S_VALIGN);
|
|
const char *valign_str = obs_data_get_string(s, S_VALIGN);
|
|
|
uint32_t new_color = obs_data_get_uint32(s, S_COLOR);
|
|
uint32_t new_color = obs_data_get_uint32(s, S_COLOR);
|
|
|
uint32_t new_opacity = obs_data_get_uint32(s, S_OPACITY);
|
|
uint32_t new_opacity = obs_data_get_uint32(s, S_OPACITY);
|
|
|
|
|
+ bool gradient = obs_data_get_bool(s, S_GRADIENT);
|
|
|
|
|
+ uint32_t new_color2 = obs_data_get_uint32(s, S_GRADIENT_COLOR);
|
|
|
|
|
+ uint32_t new_opacity2 = obs_data_get_uint32(s, S_GRADIENT_OPACITY);
|
|
|
|
|
+ float new_grad_dir = (float)obs_data_get_double(s, S_GRADIENT_DIR);
|
|
|
bool new_vertical = obs_data_get_bool(s, S_VERTICAL);
|
|
bool new_vertical = obs_data_get_bool(s, S_VERTICAL);
|
|
|
bool new_outline = obs_data_get_bool(s, S_OUTLINE);
|
|
bool new_outline = obs_data_get_bool(s, S_OUTLINE);
|
|
|
uint32_t new_o_color = obs_data_get_uint32(s, S_OUTLINE_COLOR);
|
|
uint32_t new_o_color = obs_data_get_uint32(s, S_OUTLINE_COLOR);
|
|
@@ -674,11 +693,15 @@ inline void TextSource::Update(obs_data_t *s)
|
|
|
/* ----------------------------- */
|
|
/* ----------------------------- */
|
|
|
|
|
|
|
|
new_color = rgb_to_bgr(new_color);
|
|
new_color = rgb_to_bgr(new_color);
|
|
|
|
|
+ new_color2 = rgb_to_bgr(new_color2);
|
|
|
new_o_color = rgb_to_bgr(new_o_color);
|
|
new_o_color = rgb_to_bgr(new_o_color);
|
|
|
new_bk_color = rgb_to_bgr(new_bk_color);
|
|
new_bk_color = rgb_to_bgr(new_bk_color);
|
|
|
|
|
|
|
|
color = new_color;
|
|
color = new_color;
|
|
|
opacity = new_opacity;
|
|
opacity = new_opacity;
|
|
|
|
|
+ color2 = new_color2;
|
|
|
|
|
+ opacity2 = new_opacity2;
|
|
|
|
|
+ gradient_dir = new_grad_dir;
|
|
|
vertical = new_vertical;
|
|
vertical = new_vertical;
|
|
|
|
|
|
|
|
bk_color = new_bk_color;
|
|
bk_color = new_bk_color;
|
|
@@ -688,6 +711,11 @@ inline void TextSource::Update(obs_data_t *s)
|
|
|
extents_cx = n_extents_cx;
|
|
extents_cx = n_extents_cx;
|
|
|
extents_cy = n_extents_cy;
|
|
extents_cy = n_extents_cy;
|
|
|
|
|
|
|
|
|
|
+ if (!gradient) {
|
|
|
|
|
+ color2 = color;
|
|
|
|
|
+ opacity2 = opacity;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
read_from_file = new_use_file;
|
|
read_from_file = new_use_file;
|
|
|
|
|
|
|
|
chatlog_mode = new_chat_mode;
|
|
chatlog_mode = new_chat_mode;
|
|
@@ -807,6 +835,17 @@ static bool chatlog_mode_changed(obs_properties_t *props, obs_property_t *p,
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static bool gradient_changed(obs_properties_t *props, obs_property_t *p,
|
|
|
|
|
+ obs_data_t *s)
|
|
|
|
|
+{
|
|
|
|
|
+ bool gradient = obs_data_get_bool(s, S_GRADIENT);
|
|
|
|
|
+
|
|
|
|
|
+ set_vis(gradient, S_GRADIENT_COLOR, true);
|
|
|
|
|
+ set_vis(gradient, S_GRADIENT_OPACITY, true);
|
|
|
|
|
+ set_vis(gradient, S_GRADIENT_DIR, true);
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static bool extents_modified(obs_properties_t *props, obs_property_t *p,
|
|
static bool extents_modified(obs_properties_t *props, obs_property_t *p,
|
|
|
obs_data_t *s)
|
|
obs_data_t *s)
|
|
|
{
|
|
{
|
|
@@ -855,8 +894,16 @@ static obs_properties_t *get_properties(void *data)
|
|
|
|
|
|
|
|
obs_properties_add_bool(props, S_VERTICAL, T_VERTICAL);
|
|
obs_properties_add_bool(props, S_VERTICAL, T_VERTICAL);
|
|
|
obs_properties_add_color(props, S_COLOR, T_COLOR);
|
|
obs_properties_add_color(props, S_COLOR, T_COLOR);
|
|
|
-
|
|
|
|
|
obs_properties_add_int_slider(props, S_OPACITY, T_OPACITY, 0, 100, 1);
|
|
obs_properties_add_int_slider(props, S_OPACITY, T_OPACITY, 0, 100, 1);
|
|
|
|
|
+
|
|
|
|
|
+ p = obs_properties_add_bool(props, S_GRADIENT, T_GRADIENT);
|
|
|
|
|
+ obs_property_set_modified_callback(p, gradient_changed);
|
|
|
|
|
+
|
|
|
|
|
+ obs_properties_add_color(props, S_GRADIENT_COLOR, T_GRADIENT_COLOR);
|
|
|
|
|
+ obs_properties_add_int_slider(props, S_GRADIENT_OPACITY,
|
|
|
|
|
+ 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_color(props, S_BKCOLOR, T_BKCOLOR);
|
|
|
obs_properties_add_int_slider(props, S_BKOPACITY, T_BKOPACITY,
|
|
obs_properties_add_int_slider(props, S_BKOPACITY, T_BKOPACITY,
|
|
@@ -937,6 +984,9 @@ bool obs_module_load(void)
|
|
|
obs_data_set_default_string(settings, S_VALIGN, S_VALIGN_TOP);
|
|
obs_data_set_default_string(settings, S_VALIGN, S_VALIGN_TOP);
|
|
|
obs_data_set_default_int(settings, S_COLOR, 0xFFFFFF);
|
|
obs_data_set_default_int(settings, S_COLOR, 0xFFFFFF);
|
|
|
obs_data_set_default_int(settings, S_OPACITY, 100);
|
|
obs_data_set_default_int(settings, S_OPACITY, 100);
|
|
|
|
|
+ obs_data_set_default_int(settings, S_GRADIENT_COLOR, 0xFFFFFF);
|
|
|
|
|
+ obs_data_set_default_int(settings, S_GRADIENT_OPACITY, 100);
|
|
|
|
|
+ obs_data_set_default_double(settings, S_GRADIENT_DIR, 90.0);
|
|
|
obs_data_set_default_int(settings, S_BKCOLOR, 0x000000);
|
|
obs_data_set_default_int(settings, S_BKCOLOR, 0x000000);
|
|
|
obs_data_set_default_int(settings, S_BKOPACITY, 0);
|
|
obs_data_set_default_int(settings, S_BKOPACITY, 0);
|
|
|
obs_data_set_default_int(settings, S_OUTLINE_SIZE, 2);
|
|
obs_data_set_default_int(settings, S_OUTLINE_SIZE, 2);
|