Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_sequencer/sequencer_draw.c')
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c287
1 files changed, 150 insertions, 137 deletions
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 081714991ff..d7d601a3c76 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -227,16 +227,16 @@ void color3ubv_from_seq(Scene *curscene, Sequence *seq, uchar col[3])
* \param x1, x2, y1, y2: The starting and end X value to draw the wave, same for y1 and y2.
* \param stepsize: The width of a pixel.
*/
-static void draw_seq_waveform(View2D *v2d,
- const bContext *C,
- SpaceSeq *sseq,
- Scene *scene,
- Sequence *seq,
- float x1,
- float y1,
- float x2,
- float y2,
- float stepsize)
+static void draw_seq_waveform_overlay(View2D *v2d,
+ const bContext *C,
+ SpaceSeq *sseq,
+ Scene *scene,
+ Sequence *seq,
+ float x1,
+ float y1,
+ float x2,
+ float y2,
+ float stepsize)
{
/* Offset x1 and x2 values, to match view min/max, if strip is out of bounds. */
int x1_offset = max_ff(v2d->cur.xmin, x1);
@@ -603,121 +603,110 @@ static void draw_seq_outline(Sequence *seq,
}
}
-/* Draw info text on a sequence strip. */
-static void draw_seq_text(View2D *v2d,
- Sequence *seq,
- SpaceSeq *sseq,
- float x1,
- float x2,
- float y1,
- float y2,
- bool seq_active,
- bool y_threshold)
+static const char *draw_seq_text_get_name(Sequence *seq)
{
- rctf rect;
- char str[32 + FILE_MAX];
- size_t str_len;
const char *name = seq->name + 2;
- uchar col[4];
-
- /* All strings should include name. */
if (name[0] == '\0') {
name = BKE_sequence_give_name(seq);
}
+ return name;
+}
- if (ELEM(seq->type, SEQ_TYPE_META, SEQ_TYPE_ADJUSTMENT)) {
- str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
+static void draw_seq_text_get_source(Sequence *seq, char *r_source, size_t source_len)
+{
+ /* Set source for the most common types. */
+ if (ELEM(seq->type, SEQ_TYPE_IMAGE, SEQ_TYPE_MOVIE)) {
+ BLI_snprintf(r_source, source_len, "%s%s", seq->strip->dir, seq->strip->stripdata->name);
}
- else if (seq->type == SEQ_TYPE_SCENE) {
- if (seq->scene) {
- if (seq->scene_camera) {
- str_len = BLI_snprintf(str,
- sizeof(str),
- "%s: %s (%s) | %d",
- name,
- seq->scene->id.name + 2,
- ((ID *)seq->scene_camera)->name + 2,
- seq->len);
- }
- else {
- str_len = BLI_snprintf(
- str, sizeof(str), "%s: %s | %d", name, seq->scene->id.name + 2, seq->len);
- }
- }
- else {
- str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
+ else if (seq->type == SEQ_TYPE_SOUND_RAM) {
+ if (seq->sound) {
+ BLI_snprintf(r_source, source_len, "%s", seq->sound->filepath);
}
}
- else if (seq->type == SEQ_TYPE_MOVIECLIP) {
- if (seq->clip && !STREQ(name, seq->clip->id.name + 2)) {
- str_len = BLI_snprintf(
- str, sizeof(str), "%s: %s | %d", name, seq->clip->id.name + 2, seq->len);
- }
- else {
- str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
- }
+ else if (seq->type == SEQ_TYPE_MULTICAM) {
+ BLI_snprintf(r_source, source_len, "Channel: %d", seq->multicam_source);
}
- else if (seq->type == SEQ_TYPE_MASK) {
- if (seq->mask && !STREQ(name, seq->mask->id.name + 2)) {
- str_len = BLI_snprintf(
- str, sizeof(str), "%s: %s | %d", name, seq->mask->id.name + 2, seq->len);
+ else if (seq->type == SEQ_TYPE_TEXT) {
+ TextVars *textdata = seq->effectdata;
+ BLI_snprintf(r_source, source_len, "%s", textdata->text);
+ }
+ else if (seq->type == SEQ_TYPE_SCENE) {
+ if (seq->scene_camera) {
+ BLI_snprintf(r_source,
+ source_len,
+ "%s (%s)",
+ seq->scene->id.name + 2,
+ ((ID *)seq->scene_camera)->name + 2);
}
else {
- str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
+ BLI_snprintf(r_source, source_len, "%s", seq->scene->id.name + 2);
}
}
- else if (seq->type == SEQ_TYPE_MULTICAM) {
- str_len = BLI_snprintf(str, sizeof(str), "Cam %s: %d", name, seq->multicam_source);
- }
- else if (seq->type == SEQ_TYPE_IMAGE) {
- str_len = BLI_snprintf(str,
- sizeof(str),
- "%s: %s%s | %d",
- name,
- seq->strip->dir,
- seq->strip->stripdata->name,
- seq->len);
+ else if (seq->type == SEQ_TYPE_MOVIECLIP) {
+ BLI_snprintf(r_source, source_len, "%s", seq->clip->id.name + 2);
}
- else if (seq->type == SEQ_TYPE_TEXT) {
- TextVars *textdata = seq->effectdata;
- str_len = BLI_snprintf(str, sizeof(str), "%s | %d", textdata->text, seq->startdisp);
+ else if (seq->type == SEQ_TYPE_MASK) {
+ BLI_snprintf(r_source, source_len, "%s", seq->mask->id.name + 2);
}
- else if (seq->type & SEQ_TYPE_EFFECT) {
- str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
+ else {
+ *r_source = '\0';
}
- else if (seq->type == SEQ_TYPE_SOUND_RAM) {
- /* If a waveform is drawn, avoid to draw text when there is not enough vertical space. */
- if (!y_threshold && (sseq->flag & SEQ_NO_WAVEFORMS) == 0 &&
- ((sseq->flag & SEQ_ALL_WAVEFORMS) || (seq->flag & SEQ_AUDIO_DRAW_WAVEFORM))) {
+}
- str[0] = 0;
- str_len = 0;
- }
- else if (seq->sound) {
- str_len = BLI_snprintf(
- str, sizeof(str), "%s: %s | %d", name, seq->sound->filepath, seq->len);
+static size_t draw_seq_text_get_overlay_string(SpaceSeq *sseq,
+ Sequence *seq,
+ char *r_overlay_string,
+ size_t overlay_string_len)
+{
+ const char *name = draw_seq_text_get_name(seq);
+ char source[FILE_MAX];
+ int strip_duration = seq->enddisp - seq->startdisp;
+ draw_seq_text_get_source(seq, source, sizeof(source));
+
+ bool show_name = sseq->flag & SEQ_SHOW_STRIP_NAME;
+ bool show_source = (sseq->flag & (SEQ_SHOW_STRIP_SOURCE)) && source[0] != '\0';
+ bool show_duration = sseq->flag & SEQ_SHOW_STRIP_DURATION;
+
+ size_t string_len = 0;
+ if (show_name) {
+ string_len = BLI_snprintf(r_overlay_string, overlay_string_len, "%s", name);
+ if (show_source || show_duration) {
+ string_len += BLI_snprintf(r_overlay_string + string_len, overlay_string_len, " | ");
}
- else {
- str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
+ }
+ if (show_source) {
+ string_len += BLI_snprintf(r_overlay_string + string_len, overlay_string_len, "%s", source);
+ if (show_duration) {
+ string_len += BLI_snprintf(r_overlay_string + string_len, overlay_string_len, " | ");
}
}
- else if (seq->type == SEQ_TYPE_MOVIE) {
- str_len = BLI_snprintf(str,
- sizeof(str),
- "%s: %s%s | %d",
- name,
- seq->strip->dir,
- seq->strip->stripdata->name,
- seq->len);
+ if (show_duration) {
+ string_len += BLI_snprintf(
+ r_overlay_string + string_len, overlay_string_len, "%d", strip_duration);
}
- else {
- /* Should never get here!, but might with files from future. */
- BLI_assert(0);
+ return string_len;
+}
+
+/* Draw info text on a sequence strip. */
+static void draw_seq_text_overlay(View2D *v2d,
+ Sequence *seq,
+ SpaceSeq *sseq,
+ float x1,
+ float x2,
+ float y1,
+ float y2,
+ bool seq_active)
+{
+ char overlay_string[FILE_MAX];
+ size_t overlay_string_len = draw_seq_text_get_overlay_string(
+ sseq, seq, overlay_string, sizeof(overlay_string));
- str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
+ if (overlay_string_len == 0) {
+ return;
}
/* White text for the active strip. */
+ uchar col[4];
col[0] = col[1] = col[2] = seq_active ? 255 : 10;
col[3] = 255;
@@ -731,15 +720,16 @@ static void draw_seq_text(View2D *v2d,
}
}
+ rctf rect;
rect.xmin = x1;
rect.ymin = y1;
rect.xmax = x2;
rect.ymax = y2;
- UI_view2d_text_cache_add_rectf(v2d, &rect, str, str_len, col);
+ UI_view2d_text_cache_add_rectf(v2d, &rect, overlay_string, overlay_string_len, col);
}
-static void draw_sequence_extensions(Scene *scene, Sequence *seq, uint pos, float pixely)
+static void draw_sequence_extensions_overlay(Scene *scene, Sequence *seq, uint pos, float pixely)
{
float x1, x2, y1, y2;
uchar col[4], blend_col[3];
@@ -988,7 +978,7 @@ static void fcurve_batch_add_verts(GPUVertBuf *vbo,
* - Volume for sound strips.
* - Opacity for the other types.
*/
-static void draw_seq_fcurve(
+static void draw_seq_fcurve_overlay(
Scene *scene, View2D *v2d, Sequence *seq, float x1, float y1, float x2, float y2, float pixelx)
{
FCurve *fcu;
@@ -1085,11 +1075,21 @@ static void draw_seq_strip(const bContext *C,
x2 = (seq->endstill) ? (seq->start + seq->len) : seq->enddisp;
y2 = seq->machine + SEQ_STRIP_OFSTOP;
- /* Calculate height needed for drawing text on strip. */
- float text_margin_y = y2 - min_ff(0.40f, 20 * U.dpi_fac * pixely);
+ float text_margin_y;
+ bool y_threshold;
+ if ((sseq->flag & SEQ_SHOW_STRIP_NAME) || (sseq->flag & SEQ_SHOW_STRIP_SOURCE) ||
+ (sseq->flag & SEQ_SHOW_STRIP_DURATION)) {
- /* Is there enough space for drawing something else than text? */
- bool y_threshold = ((y2 - y1) / pixely) > 20 * U.dpi_fac;
+ /* Calculate height needed for drawing text on strip. */
+ text_margin_y = y2 - min_ff(0.40f, 20 * U.dpi_fac * pixely);
+
+ /* Is there enough space for drawing something else than text? */
+ y_threshold = ((y2 - y1) / pixely) > 20 * U.dpi_fac;
+ }
+ else {
+ text_margin_y = y2;
+ y_threshold = 1;
+ }
uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
@@ -1102,12 +1102,13 @@ static void draw_seq_strip(const bContext *C,
}
/* Draw strip offsets when flag is enabled or during "solo preview". */
- if (!is_single_image && (seq->startofs || seq->endofs) && pixely > 0) {
- if ((sseq->draw_flag & SEQ_DRAW_OFFSET_EXT) || (seq == special_seq_update)) {
- draw_sequence_extensions(scene, seq, pos, pixely);
+ if ((sseq->flag & SEQ_SHOW_STRIP_OVERLAY)) {
+ if (!is_single_image && (seq->startofs || seq->endofs) && pixely > 0) {
+ if ((sseq->draw_flag & SEQ_DRAW_OFFSET_EXT) || (seq == special_seq_update)) {
+ draw_sequence_extensions_overlay(scene, seq, pos, pixely);
+ }
}
}
-
immUnbindProgram();
x1 = seq->startdisp;
@@ -1118,24 +1119,24 @@ static void draw_seq_strip(const bContext *C,
drawmeta_contents(scene, seq, x1, y1, x2, y2);
}
- if (sseq->flag & SEQ_SHOW_FCURVES) {
- draw_seq_fcurve(scene, v2d, seq, x1, y1, x2, y2, pixelx);
+ if ((sseq->flag & SEQ_SHOW_STRIP_OVERLAY) && (sseq->flag & SEQ_SHOW_FCURVES)) {
+ draw_seq_fcurve_overlay(scene, v2d, seq, x1, y1, x2, y2, pixelx);
}
/* Draw sound strip waveform. */
- if ((seq->type == SEQ_TYPE_SOUND_RAM) && (sseq->flag & SEQ_NO_WAVEFORMS) == 0) {
- draw_seq_waveform(v2d,
- C,
- sseq,
- scene,
- seq,
- x1,
- y_threshold ? y1 + 0.05f : y1,
- x2,
- y_threshold ? text_margin_y : y2,
- BLI_rctf_size_x(&region->v2d.cur) / region->winx);
+ if ((seq->type == SEQ_TYPE_SOUND_RAM) && ((sseq->flag & SEQ_SHOW_STRIP_OVERLAY)) &&
+ (sseq->flag & SEQ_NO_WAVEFORMS) == 0) {
+ draw_seq_waveform_overlay(v2d,
+ C,
+ sseq,
+ scene,
+ seq,
+ x1,
+ y_threshold ? y1 + 0.05f : y1,
+ x2,
+ y_threshold ? text_margin_y : y2,
+ BLI_rctf_size_x(&region->v2d.cur) / region->winx);
}
-
/* Draw locked state. */
if (seq->flag & SEQ_LOCK) {
draw_seq_locked(x1, y1, x2, y2);
@@ -1162,11 +1163,21 @@ static void draw_seq_strip(const bContext *C,
calculate_seq_text_offsets(v2d, seq, &x1, &x2, pixelx);
- /* Don't draw strip if there is not enough vertical or horizontal space. */
- if (((x2 - x1) > 32 * pixelx * U.dpi_fac) && ((y2 - y1) > 8 * pixely * U.dpi_fac)) {
- /* Depending on the vertical space, draw text on top or in the center of strip. */
- draw_seq_text(
- v2d, seq, sseq, x1, x2, y_threshold ? text_margin_y : y1, y2, seq_active, y_threshold);
+ /* If a waveform is drawn, avoid drawing text when there is not enough vertical space. */
+ if (seq->type == SEQ_TYPE_SOUND_RAM) {
+ if (!y_threshold && (sseq->flag & SEQ_NO_WAVEFORMS) == 0 &&
+ ((sseq->flag & SEQ_ALL_WAVEFORMS) || (seq->flag & SEQ_AUDIO_DRAW_WAVEFORM))) {
+ return;
+ }
+ }
+
+ if (sseq->flag & SEQ_SHOW_STRIP_OVERLAY) {
+ /* Don't draw strip if there is not enough vertical or horizontal space. */
+ if (((x2 - x1) > 32 * pixelx * U.dpi_fac) && ((y2 - y1) > 8 * pixely * U.dpi_fac)) {
+ /* Depending on the vertical space, draw text on top or in the center of strip. */
+ draw_seq_text_overlay(
+ v2d, seq, sseq, x1, x2, y_threshold ? text_margin_y : y1, y2, seq_active);
+ }
}
}
@@ -1360,7 +1371,7 @@ static void sequencer_display_size(Scene *scene, float r_viewrect[2])
r_viewrect[0] *= scene->r.xasp / scene->r.yasp;
}
-static void sequencer_draw_gpencil(const bContext *C)
+static void sequencer_draw_gpencil_overlay(const bContext *C)
{
/* Draw grease-pencil (image aligned). */
ED_annotation_draw_2dimage(C);
@@ -1373,7 +1384,9 @@ static void sequencer_draw_gpencil(const bContext *C)
}
/* Draw content and safety borders borders. */
-static void sequencer_draw_borders(const SpaceSeq *sseq, const View2D *v2d, const Scene *scene)
+static void sequencer_draw_borders_overlay(const SpaceSeq *sseq,
+ const View2D *v2d,
+ const Scene *scene)
{
float x1 = v2d->tot.xmin;
float y1 = v2d->tot.ymin;
@@ -1825,17 +1838,17 @@ void sequencer_draw_preview(const bContext *C,
C, scene, region, sseq, ibuf, scope, draw_overlay, draw_backdrop);
/* Draw over image. */
- if (sseq->flag & SEQ_SHOW_METADATA) {
+ if (sseq->flag & SEQ_SHOW_METADATA && sseq->flag & SEQ_SHOW_STRIP_OVERLAY) {
ED_region_image_metadata_draw(0.0, 0.0, ibuf, &v2d->tot, 1.0, 1.0);
}
}
- if (show_imbuf) {
- sequencer_draw_borders(sseq, v2d, scene);
+ if (show_imbuf && (sseq->flag & SEQ_SHOW_STRIP_OVERLAY)) {
+ sequencer_draw_borders_overlay(sseq, v2d, scene);
}
- if (draw_gpencil && show_imbuf) {
- sequencer_draw_gpencil(C);
+ if (draw_gpencil && show_imbuf && (sseq->flag & SEQ_SHOW_STRIP_OVERLAY)) {
+ sequencer_draw_gpencil_overlay(C);
}
#if 0
sequencer_draw_maskedit(C, scene, region, sseq);
@@ -2292,7 +2305,7 @@ void draw_timeline_seq(const bContext *C, ARegion *region)
UI_view2d_view_ortho(v2d);
/* Get timeline bound-box, needed for the scroll-bars. */
- boundbox_seq(scene, &v2d->tot);
+ SEQ_timeline_boundbox(scene, SEQ_active_seqbase_get(ed), &v2d->tot);
draw_seq_backdrop(v2d);
UI_view2d_constant_grid_draw(v2d, FPS);