[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37537] branches/soc-2011-pepper: == Simple Title Cards for Sequencer ==

Joshua Leung aligorith at gmail.com
Thu Jun 16 04:46:38 CEST 2011


Revision: 37537
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37537
Author:   aligorith
Date:     2011-06-16 02:46:38 +0000 (Thu, 16 Jun 2011)
Log Message:
-----------
== Simple Title Cards for Sequencer ==

This commit adds an experimental effect strip to the sequencer: "Title
Card".

This is useful for adding simple one-line text section headers or
"title cards" (i.e. title + author/contact details) to video clips,
which is often seen in demo videos accompanying papers and/or
animation tests.

See http://aligorith.blogspot.com/2011/06/gsoc11-simple-title-
cards.html for some more details on usage.

Code notes:
- There are a few things I've done here which will probably need
cleaning up. For instance, the hacks to get threadsafe fonts for
rendering, and also the way I've tried to piggyback the backdrop
drawing on top of the Solid Colour strips (this method was used to
keep changes here minimal, but is quite fragile if things change).

Modified Paths:
--------------
    branches/soc-2011-pepper/release/scripts/startup/bl_ui/space_sequencer.py
    branches/soc-2011-pepper/source/blender/blenfont/BLF_api.h
    branches/soc-2011-pepper/source/blender/blenfont/intern/blf.c
    branches/soc-2011-pepper/source/blender/blenkernel/intern/seqeffects.c
    branches/soc-2011-pepper/source/blender/blenkernel/intern/sequencer.c
    branches/soc-2011-pepper/source/blender/blenloader/intern/writefile.c
    branches/soc-2011-pepper/source/blender/editors/interface/interface_style.c
    branches/soc-2011-pepper/source/blender/editors/space_sequencer/sequencer_draw.c
    branches/soc-2011-pepper/source/blender/editors/space_sequencer/sequencer_edit.c
    branches/soc-2011-pepper/source/blender/makesdna/DNA_sequence_types.h
    branches/soc-2011-pepper/source/blender/makesrna/RNA_access.h
    branches/soc-2011-pepper/source/blender/makesrna/intern/rna_sequencer.c

Modified: branches/soc-2011-pepper/release/scripts/startup/bl_ui/space_sequencer.py
===================================================================
--- branches/soc-2011-pepper/release/scripts/startup/bl_ui/space_sequencer.py	2011-06-16 02:14:01 UTC (rev 37536)
+++ branches/soc-2011-pepper/release/scripts/startup/bl_ui/space_sequencer.py	2011-06-16 02:46:38 UTC (rev 37537)
@@ -214,6 +214,7 @@
         layout.operator("sequencer.effect_strip_add", text="Speed Control").type = 'SPEED'
         layout.operator("sequencer.effect_strip_add", text="Multicam Selector").type = 'MULTICAM'
         layout.operator("sequencer.effect_strip_add", text="Adjustment Layer").type = 'ADJUSTMENT'
+        layout.operator("sequencer.effect_strip_add", text="Title Card").type = 'TITLE_CARD'
 
 
 class SEQUENCER_MT_strip(bpy.types.Menu):
@@ -392,7 +393,7 @@
                               'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
                               'PLUGIN',
                               'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'SPEED',
-                              'MULTICAM', 'ADJUSTMENT'}
+                              'MULTICAM', 'ADJUSTMENT', 'TITLE_CARD'}
 
     def draw(self, context):
         layout = self.layout
@@ -460,6 +461,11 @@
             row.label("Cut To")
             for i in range(1, strip.channel):
                 row.operator("sequencer.cut_multicam", text=str(i)).camera = i
+        elif strip.type == "TITLE_CARD":
+            layout.prop(strip, "title")
+            layout.prop(strip, "subtitle")
+            layout.prop(strip, "color_foreground")
+            layout.prop(strip, "color_background")
 
         col = layout.column(align=True)
         if strip.type == 'SPEED':
@@ -531,7 +537,8 @@
                               'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
                               'PLUGIN',
                               'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
-                              'MULTICAM', 'SPEED', 'ADJUSTMENT'}
+                              'MULTICAM', 'SPEED', 'ADJUSTMENT',
+                              'TITLE_CARD'}
 
     def draw(self, context):
         layout = self.layout
@@ -687,7 +694,8 @@
                               'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
                               'PLUGIN',
                               'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
-                              'MULTICAM', 'SPEED', 'ADJUSTMENT'}
+                              'MULTICAM', 'SPEED', 'ADJUSTMENT',
+                              'TITLE_CARD'}
 
     def draw(self, context):
         layout = self.layout

Modified: branches/soc-2011-pepper/source/blender/blenfont/BLF_api.h
===================================================================
--- branches/soc-2011-pepper/source/blender/blenfont/BLF_api.h	2011-06-16 02:14:01 UTC (rev 37536)
+++ branches/soc-2011-pepper/source/blender/blenfont/BLF_api.h	2011-06-16 02:46:38 UTC (rev 37537)
@@ -215,5 +215,6 @@
 // XXX, bad design
 extern int blf_mono_font;
 extern int blf_mono_font_render; // dont mess drawing with render threads.
+extern int blf_default_font_render; // dont mess drawing with render threads.
 
 #endif /* BLF_API_H */

Modified: branches/soc-2011-pepper/source/blender/blenfont/intern/blf.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenfont/intern/blf.c	2011-06-16 02:14:01 UTC (rev 37536)
+++ branches/soc-2011-pepper/source/blender/blenfont/intern/blf.c	2011-06-16 02:46:38 UTC (rev 37537)
@@ -74,6 +74,7 @@
 // XXX, should these be made into global_font_'s too?
 int blf_mono_font= -1;
 int blf_mono_font_render= -1;
+int blf_default_font_render= -1;
 
 static FontBLF *BLF_get(int fontid)
 {

Modified: branches/soc-2011-pepper/source/blender/blenkernel/intern/seqeffects.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/intern/seqeffects.c	2011-06-16 02:14:01 UTC (rev 37536)
+++ branches/soc-2011-pepper/source/blender/blenkernel/intern/seqeffects.c	2011-06-16 02:46:38 UTC (rev 37537)
@@ -40,8 +40,11 @@
 #include "BLI_dynlib.h"
 
 #include "BLI_math.h" /* windows needs for M_PI */
+#include "BLI_string.h"
 #include "BLI_utildefines.h"
 
+#include "BLF_api.h"
+
 #include "DNA_scene_types.h"
 #include "DNA_sequence_types.h"
 #include "DNA_anim_types.h"
@@ -2805,6 +2808,130 @@
 }
 
 /* **********************************************************************
+   TITLE CARD
+   ********************************************************************** */
+
+static void init_title_card(Sequence *seq)
+{
+	TitleCardVars *tv;
+	
+	if(seq->effectdata)MEM_freeN(seq->effectdata);
+	seq->effectdata = MEM_callocN(sizeof(struct TitleCardVars), "titlecard");
+	
+	tv = (TitleCardVars *)seq->effectdata;
+	
+	BLI_strncpy(tv->titlestr, "Title goes here", sizeof(tv->titlestr));
+	tv->fgcol[0] = tv->fgcol[1] = tv->fgcol[2] = 1.0f; /* white */
+}
+
+static int num_inputs_titlecard(void)
+{
+	return 0;
+}
+
+static void free_title_card(Sequence *seq)
+{
+	if(seq->effectdata)MEM_freeN(seq->effectdata);
+	seq->effectdata = NULL;
+}
+
+static void copy_title_card(Sequence *dst, Sequence *src)
+{
+	dst->effectdata = MEM_dupallocN(src->effectdata);
+}
+
+static int early_out_titlecard(struct Sequence *UNUSED(seq),
+			   float UNUSED(facf0), float UNUSED(facf1))
+{
+	return -1;
+}
+
+static struct ImBuf * do_title_card(
+	SeqRenderData context, Sequence *seq, float cfra,
+	float facf0, float facf1, 
+	struct ImBuf *ibuf1, struct ImBuf *ibuf2, 
+	struct ImBuf *ibuf3)
+{	
+	TitleCardVars *tv = (TitleCardVars *)seq->effectdata;
+	
+	SolidColorVars cv = {{0}};
+	struct ImBuf *out;
+	
+	int titleFontId = blf_default_font_render; // XXX: bad design!
+	
+	int width = context.rectx;
+	int height = context.recty;
+	float w, h;
+	int x, y;
+	
+	/* use fake solid-color vars to get backdrop (and an out buffer at the same time) */
+	VECCOPY(cv.col, tv->bgcol);
+	seq->effectdata = &cv;
+	
+	out = do_solid_color(context, seq, cfra,
+			facf0, facf1,
+			ibuf1, ibuf2, ibuf3);
+			
+	seq->effectdata = tv;
+	
+	/* draw text */
+	/* FIXME: imbuf out->rect is unsigned int NOT unsigned char, but without passing this pointer
+	 * this drawing code doesn't work. This cast really masks some potential bugs though...
+	 */
+	BLF_buffer(titleFontId, out->rect_float, (unsigned char *)out->rect, width, height, 4);
+	
+	if (tv->titlestr[0]) {
+		/* automatic scale - these formulae have been derived experimentally:
+		 *	- base size is based on 40pt at 960 width
+		 *	- each 26 characters, size jumps down one step, 
+		 *	  but this decrease needs to be exponential to fit everything
+		 */
+		float lfac = strlen(tv->titlestr) / 26.0f;
+		float size = (width * 0.06f) * (1.0f - 0.1f*lfac*lfac);
+		
+		BLF_size(titleFontId, size, 72);
+		BLF_buffer_col(titleFontId, tv->fgcol[0], tv->fgcol[1], tv->fgcol[2], 1.0);
+		
+		BLF_width_and_height(titleFontId, tv->titlestr, &w, &h);
+		x = width/2.0f - w/2.0f;
+		if (tv->subtitle[0])
+			y = height/2.0f + h;
+		else
+			y = height/2.0f;
+		
+		BLF_position(titleFontId, x, y, 0.0);
+		BLF_draw_buffer(titleFontId, tv->titlestr);
+	}
+	
+	if (tv->subtitle[0]) {
+		/* automatic scale - these formulae have been derived experimentally (as above):
+		 *	- base size is based on 20pt at 960 width
+		 *	- size steps aren't quite as refined here. Need a slower-growing curve!
+		 */
+		float lfac = strlen(tv->subtitle) / 36.0f;
+		float size = (width * 0.03f) * (1.0f - 0.1f*lfac*lfac*log(lfac));
+		
+		BLF_size(titleFontId, size, 72);
+		BLF_buffer_col(titleFontId, tv->fgcol[0], tv->fgcol[1], tv->fgcol[2], 1.0);
+		
+		BLF_width_and_height(titleFontId, tv->subtitle, &w, &h);
+		x = width/2.0f - w/2.0f;
+		if (tv->titlestr[0])
+			y = height/2.0f - h;
+		else
+			y = height/2.0f;
+		
+		BLF_position(titleFontId, x, y, 0.0);
+		BLF_draw_buffer(titleFontId, tv->subtitle);
+	}
+	
+	/* cleanup the buffer. */
+	BLF_buffer(UIFONT_DEFAULT, NULL, NULL, 0, 0, 0);
+	
+	return out;
+}
+
+/* **********************************************************************
    MULTICAM
    ********************************************************************** */
 
@@ -3343,6 +3470,14 @@
 		rval.early_out = early_out_adjustment;
 		rval.execute = do_adjustment;
 		break;
+	case SEQ_TITLECARD:
+		rval.init = init_title_card;
+		rval.num_inputs = num_inputs_titlecard;
+		rval.early_out = early_out_titlecard;
+		rval.free = free_title_card;
+		rval.copy = copy_title_card;
+		rval.execute = do_title_card;
+		break;
 	}
 
 	return rval;

Modified: branches/soc-2011-pepper/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/intern/sequencer.c	2011-06-16 02:14:01 UTC (rev 37536)
+++ branches/soc-2011-pepper/source/blender/blenkernel/intern/sequencer.c	2011-06-16 02:46:38 UTC (rev 37537)
@@ -895,6 +895,7 @@
 	case SEQ_MULTICAM:   return "Multicam";
 	case SEQ_ADJUSTMENT: return "Adjustment";
 	case SEQ_SPEED:      return "Speed";
+	case SEQ_TITLECARD:  return "Title Card";
 	default:
 		return NULL;
 	}
@@ -3020,7 +3021,7 @@
 		if(seq->flag & SEQ_MUTE || seq->startdisp > frame || seq->enddisp <= frame)
 			continue;
 		/* only use elements you can see - not */
-		if (ELEM5(seq->type, SEQ_IMAGE, SEQ_META, SEQ_SCENE, SEQ_MOVIE, SEQ_COLOR)) {
+		if (ELEM6(seq->type, SEQ_IMAGE, SEQ_META, SEQ_SCENE, SEQ_MOVIE, SEQ_COLOR, SEQ_TITLECARD)) {
 			if (seq->machine > best_machine) {
 				best_seq = seq;
 				best_machine = seq->machine;

Modified: branches/soc-2011-pepper/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenloader/intern/writefile.c	2011-06-16 02:14:01 UTC (rev 37536)
+++ branches/soc-2011-pepper/source/blender/blenloader/intern/writefile.c	2011-06-16 02:46:38 UTC (rev 37537)
@@ -1892,6 +1892,9 @@
 						case SEQ_TRANSFORM:
 							writestruct(wd, DATA, "TransformVars", 1, seq->effectdata);
 							break;
+						case SEQ_TITLECARD:
+							writestruct(wd, DATA, "TitleCardVars", 1, seq->effectdata);
+							break;
 						}
 					}
 					

Modified: branches/soc-2011-pepper/source/blender/editors/interface/interface_style.c
===================================================================

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list