浏览代码

obs-text: Add gradient feature

Closes jp9000/obs-studio#636
Michael Fabian Dirks 9 年之前
父节点
当前提交
4bafe668ee
共有 2 个文件被更改,包括 56 次插入2 次删除
  1. 4 0
      plugins/obs-text/data/locale/en-US.ini
  2. 52 2
      plugins/obs-text/gdiplus/obs-text.cpp

+ 4 - 0
plugins/obs-text/data/locale/en-US.ini

@@ -7,6 +7,10 @@ Filter.TextFiles="Text Files"
 Filter.AllFiles="All Files"
 Filter.AllFiles="All Files"
 Color="Color"
 Color="Color"
 Opacity="Opacity"
 Opacity="Opacity"
+Gradient="Gradient"
+Gradient.Color="Gradient Color"
+Gradient.Opacity="Gradient Opacity"
+Gradient.Direction="Gradient Direction"
 BkColor="Background Color"
 BkColor="Background Color"
 BkOpacity="Background Opacity"
 BkOpacity="Background Opacity"
 Alignment="Alignment"
 Alignment="Alignment"

+ 52 - 2
plugins/obs-text/gdiplus/obs-text.cpp

@@ -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);