42#include "RNA_prototypes.hh"
102 if (seq->machine + 1.0f < v2d->
cur.
ymin) {
105 if (seq->machine > v2d->
cur.
ymax) {
134 ctx.
quads = quads_batch;
150 if (strip_is_valid && overlays_enabled && ovelay_option) {
243 strip_ctx.
missing_media = media_presence_is_missing(scene, seq);
251 if (media_presence_is_missing(scene, sub)) {
265 strip_ctx.
curve =
nullptr;
272 strip_ctx.
curve =
nullptr;
280 if (showing_curve_overlay || showing_waveform) {
283 &ctx->
scene->
id, strip_ctx.
seq, &RNA_Sequence, prop_name, 0,
nullptr);
285 strip_ctx.
curve =
nullptr;
292 const bool show_strip_color_tag,
337 if (seq->
scene == curscene) {
421 blendcol[0] = blendcol[1] = blendcol[2] = 128;
463 return round_fl_to_int(frame_coord / frames_per_pixel) * frames_per_pixel;
484 const float samples_per_pixel = samples_per_frame * frames_per_pixel;
485 const float bottom = strip_ctx->
bottom + timeline_ctx->
pixely * 2.0f;
488 const float y_zero = half_style ? bottom : (bottom +
top) / 2.0f;
490 const float y_scale = half_style ? top - bottom : (top - bottom) / 2.0f;
496 const float draw_start_frame =
max_ff(v2d->
cur.
xmin, strip_start_aligned);
500 float sample_start_frame = draw_start_frame -
503 const int pixels_to_draw =
round_fl_to_int((draw_end_frame - draw_start_frame) /
506 if (pixels_to_draw < 2) {
513 if (waveform ==
nullptr || waveform->
length == 0) {
518 uchar color[4] = {255, 255, 255, 127};
519 uchar color_clip[4] = {255, 0, 0, 127};
520 uchar color_rms[4] = {255, 255, 255, 204};
521 timeline_ctx->
quads->
add_line(draw_start_frame, y_zero, draw_end_frame, y_zero, color);
523 float prev_y_mid = y_zero;
524 for (
int i = 0; i < pixels_to_draw; i++) {
525 float timeline_frame = sample_start_frame + i * frames_per_pixel;
527 float sample = frame_index * samples_per_frame;
530 if (sample_index < 0) {
534 if (sample_index >= waveform->
length) {
538 float value_min = waveform->
data[sample_index * 3];
539 float value_max = waveform->
data[sample_index * 3 + 1];
540 float rms = waveform->
data[sample_index * 3 + 2];
542 if (samples_per_pixel > 1.0f) {
544 float next_pos =
sample + samples_per_pixel;
547 for (
int j = sample_index + 1; (j < waveform->
length) && (j < end_idx); j++) {
548 value_min =
min_ff(value_min, waveform->
data[j * 3]);
549 value_max =
max_ff(value_max, waveform->
data[j * 3 + 1]);
554 float volume = seq->
volume;
555 if (strip_ctx->
curve !=
nullptr) {
556 float evaltime = draw_start_frame + (i * frames_per_pixel);
565 bool is_clipping =
false;
566 float clamped_min =
clamp_f(value_min, -1.0f, 1.0f);
567 float clamped_max =
clamp_f(value_max, -1.0f, 1.0f);
568 if (clamped_min != value_min || clamped_max != value_max) {
571 value_min = clamped_min;
572 value_max = clamped_max;
579 bool pos_min = value_min > 0.0f;
580 bool pos_max = value_max > 0.0f;
581 float abs_min = std::abs(value_min);
582 float abs_max = std::abs(value_max);
583 if (pos_min == pos_max) {
584 value_min = std::min(abs_min, abs_max);
585 value_max = std::max(abs_min, abs_max);
589 value_max = std::max(abs_min, abs_max);
593 float x1 = draw_start_frame + i * frames_per_pixel;
594 float x2 = draw_start_frame + (i + 1) * frames_per_pixel;
595 float y_min = y_zero + value_min * y_scale;
596 float y_max = y_zero + value_max * y_scale;
597 float y_mid = (y_max + y_min) * 0.5f;
600 if (y_max - y_min < timeline_ctx->pixely * 2) {
603 if (std::abs(y_mid - prev_y_mid) > timeline_ctx->
pixely) {
604 float x0 = draw_start_frame + (i - 1) * frames_per_pixel;
605 timeline_ctx->
quads->
add_line(x0, prev_y_mid, x1, y_mid, is_clipping ? color_clip : color);
607 timeline_ctx->
quads->
add_line(x1, y_mid, x2, y_mid, is_clipping ? color_clip : color);
610 float rms_min = y_zero +
max_ff(-rms, value_min) * y_scale;
611 float rms_max = y_zero +
min_ff(rms, value_max) * y_scale;
614 x1, rms_min, x2, rms_max, is_clipping ? color_clip : color_rms);
616 timeline_ctx->
quads->
add_quad(x1, y_min, x2, y_max, is_clipping ? color_clip : color);
648 const float bottom = strip_ctx->
bottom + corner_radius * 0.8f * timeline_ctx->
pixely;
650 const float draw_range = top - bottom;
651 if (draw_range < timeline_ctx->pixely) {
667 offset = seq_meta->
start - offset;
674 chan_min =
min_ii(chan_min, seq->machine);
675 chan_max =
max_ii(chan_max, seq->machine);
678 chan_range = (chan_max - chan_min) + 1;
679 draw_height = draw_range / chan_range;
690 if (x1_chan <= meta_x2 && x2_chan >= meta_x1) {
691 float y_chan = (seq->machine - chan_min) /
float(chan_range) * draw_range;
692 float y1_chan, y2_chan;
710 const bool missing_media = media_presence_is_missing(scene, seq);
711 if (missing_data || missing_media) {
718 x1_chan =
max_ff(x1_chan, meta_x1);
719 x2_chan =
min_ff(x2_chan, meta_x2);
756 const uchar col[4] = {255, 255, 255, 255};
757 const float text_margin = 1.2f * strip_ctx->
handle_width;
758 const float text_y = strip_ctx->
bottom + 0.09f;
763 text_x += text_margin;
776 const float handle_size = use_thin_handle ? 5.0f : 8.0f;
777 const float maxhandle = (pixelx * handle_size) *
U.pixelsize;
788 const char *name = seq->
name + 2;
789 if (name[0] ==
'\0') {
808 if (seq->
sound !=
nullptr) {
823 if (seq->
scene !=
nullptr) {
838 if (seq->
clip !=
nullptr) {
844 if (seq->
mask !=
nullptr) {
854 char *r_overlay_string,
855 size_t overlay_string_len)
859 const char *text_sep =
" | ";
860 const char *text_array[5];
870 if (source[0] !=
'\0') {
872 text_array[i++] = text_sep;
874 text_array[i++] = source;
878 char strip_duration_text[16];
882 text_array[i++] = text_sep;
884 text_array[i++] = strip_duration_text;
898 r_col[0] = r_col[1] = r_col[2] = r_col[3] = 255;
901 if (!active_or_selected) {
902 r_col[0] = r_col[1] = r_col[2] = 0;
906 r_col[0] = r_col[1] = r_col[2] = 192;
915 const uchar color[4])
932 const float x_offset = (right - left - icon_size) * 0.5f;
933 const float y_offset = (top - bottom - icon_size) * 0.5f;
957 const bool missing_data = strip.missing_data_block;
958 const bool missing_media = strip.missing_media;
959 const bool is_connected = strip.is_connected;
960 if (!missing_data && !missing_media && !is_connected) {
966 strip.can_draw_text_overlay)
971 float icon_indent = 2.0f * strip.handle_width - 4 * timeline_ctx->
pixelx *
UI_SCALE_FAC;
973 rect.
ymin = strip.strip_content_top;
974 rect.
ymax = strip.top;
977 rect.
xmax =
min_ff(strip.right_handle - strip.handle_width, rect.
xmin + icon_size_x);
982 rect.
xmax =
min_ff(strip.right_handle - strip.handle_width, rect.
xmin + icon_size_x);
987 rect.
xmax =
min_ff(strip.right_handle - strip.handle_width, rect.
xmin + icon_size_x);
993 if (strip.can_draw_strip_content && strip.seq->type !=
SEQ_TYPE_META) {
995 rect.
xmin = strip.left_handle + strip.handle_width;
996 rect.
xmax = strip.right_handle - strip.handle_width;
997 rect.
ymin = strip.bottom;
998 rect.
ymax = strip.strip_content_top;
1003 if (missing_media) {
1026 timeline_ctx, strip_ctx, overlay_string,
sizeof(overlay_string));
1028 if (overlay_string_len == 0) {
1063 timeline_ctx->
v2d, &rect, overlay_string, overlay_string_len,
col);
1132 if (strip_ctx->
curve ==
nullptr) {
1137 uchar color[4] = {0, 0, 0, 38};
1142 if (eval_start >= eval_end) {
1146 const float y_height = strip_ctx->
top - strip_ctx->
bottom;
1147 float prev_x = eval_start;
1149 CLAMP(prev_val, 0.0f, 1.0f);
1152 for (
int timeline_frame = eval_start + eval_step; timeline_frame <= eval_end;
1153 timeline_frame += eval_step)
1156 CLAMP(curve_val, 0.0f, 1.0f);
1159 if (curve_val == prev_val && timeline_frame < eval_end - eval_step) {
1167 (prev_val * y_height) + strip_ctx->
bottom,
1170 timeline_frame - eval_step,
1171 (prev_val * y_height) + strip_ctx->
bottom,
1172 timeline_frame - eval_step,
1176 prev_x = timeline_frame - eval_step;
1180 (prev_val * y_height) + strip_ctx->
bottom,
1184 (curve_val * y_height) + strip_ctx->
bottom,
1188 prev_x = timeline_frame;
1189 prev_val = curve_val;
1199 if (strip_ctx->
seq != act_seq || act_seq ==
nullptr) {
1213 uchar color[4] = {255, 255, 255, 48};
1236 while (i < v2d->cur.ymax) {
1255 r_bottom_layer.
clear();
1256 r_top_layer.
clear();
1264 r_bottom_layer.
append(strip_ctx);
1267 r_top_layer.
append(strip_ctx);
1274 for (int64_t index : range) {
1275 strip_draw_context_curve_get(timeline_ctx, r_bottom_layer[index]);
1279 for (int64_t index : range) {
1280 strip_draw_context_curve_get(timeline_ctx, r_top_layer[index]);
1301 strip.strip_content_top,
1305 strip.is_single_image);
1313 if (strip.is_muted) {
1314 uchar muted_color[3] = {128, 128, 128};
1328 if (show_overlay && strip.can_draw_strip_content &&
1409 if (!selected && !active) {
1422 if (overlaps && !use_overwrite) {
1427 else if (selected) {
1442 if (act_seq !=
nullptr && (act_seq->
flag &
SELECT) != 0) {
1447 if (special_preview == strip.
seq) {
1463 const bool selected_l = selected &&
1465 const bool selected_r = selected &&
1467 const bool show_l = show_handles || selected_l;
1468 const bool show_r = show_handles || selected_r;
1497 strip.strip_content_top,
1501 strip.is_single_image);
1581 if (timeline_ctx->
ed ==
nullptr) {
1606 const int frame_sta = scene->r.sfra;
1607 const int frame_end = scene->r.efra + 1;
1617 if (frame_sta < frame_end) {
1684 return item_count == 0;
1695 float stripe_top, stripe_bot;
1700 const uchar4 col_final{108, 108, 210, 255};
1701 const uchar4 col_raw{255, 25, 5, 100};
1702 const uchar4 col_preproc{25, 25, 191, 100};
1703 const uchar4 col_composite{255, 153, 0, 100};
1737 col = col_composite;
1742 stripe_top = stripe_bot + drawdata->
stripe_ht;
1745 drawdata->
quads->
add_quad(timeline_frame, stripe_bot, timeline_frame + 1, stripe_top,
col);
1753 const float stripe_bot,
1754 const float stripe_ht,
1755 const uchar color[4])
1760 stripe_bot + stripe_ht,
1773 const uchar4 bg_final{78, 78, 145, 255};
1774 const uchar4 bg_raw{255, 25, 5, 25};
1775 const uchar4 bg_preproc{25, 25, 191, 25};
1776 const uchar4 bg_composite{255, 153, 0, 25};
1786 draw_data->
quads->
add_quad(scene->r.sfra, stripe_bot, scene->r.efra, stripe_top, bg_final);
1797 for (
const Sequence *seq : strips) {
1806 scene, seq, *draw_data->
quads, stripe_bot, draw_data->
stripe_ht, bg_preproc);
1813 scene, seq, *draw_data->
quads, stripe_bot, draw_data->
stripe_ht, bg_composite);
1841 userdata.
quads = &quads;
1856 scene->ed->overlay_frame_abs :
1857 scene->r.cfra + scene->ed->overlay_frame_ofs;
1861 float viewport_size[4];
1863 immUniform2f(
"viewport_size", viewport_size[2], viewport_size[3]);
1886 U.v2d_min_gridsize *= 3;
1889 U.v2d_min_gridsize /= 3;
1904 ctx->
C, ctx->
scene, ctx->
region, ctx->
sseq, preview_frame, 0,
false,
true);
1970 View2D *v2d = ®ion->v2d;
1972 if (scene->ed !=
nullptr) {
Scene * CTX_data_scene(const bContext *C)
SpaceSeq * CTX_wm_space_seq(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
bool BKE_fcurve_is_empty(const FCurve *fcu)
float evaluate_fcurve(const FCurve *fcu, float evaltime)
FCurve * id_data_find_fcurve(ID *id, void *data, StructRNA *type, const char *prop_name, int index, bool *r_driven)
#define SOUND_WAVE_SAMPLES_PER_SECOND
float BLF_width(int fontid, const char *str, size_t str_len, ResultBLF *r_info=nullptr) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
MINLINE int round_fl_to_int(float a)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE float clamp_f(float value, float min, float max)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
void rgb_byte_set_hue_float_offset(unsigned char rgb[3], float hue_offset)
void rgb_float_to_uchar(unsigned char r_col[3], const float col_f[3])
MINLINE void copy_v3_v3_uchar(unsigned char r[3], const unsigned char a[3])
#define BLI_path_join(...)
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
#define SNPRINTF(dst, format,...)
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define SNPRINTF_RLEN(dst, format,...)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
size_t BLI_string_join_array(char *result, size_t result_maxncpy, const char *strings[], uint strings_num) ATTR_NONNULL()
pthread_spinlock_t SpinLock
void BLI_spin_unlock(SpinLock *spin)
void BLI_spin_lock(SpinLock *spin)
@ SEQ_CACHE_STORE_PREPROCESSED
@ SEQ_CACHE_STORE_FINAL_OUT
@ SEQ_CACHE_STORE_COMPOSITE
@ SEQ_AUDIO_DRAW_WAVEFORM
#define SEQ_STRIP_OFSBOTTOM
@ SEQ_EDIT_OVERLAY_FRAME_ABS
@ SEQ_EDIT_OVERLAY_FRAME_SHOW
@ SOUND_TAGS_WAVEFORM_LOADING
@ SEQ_TIMELINE_SHOW_FCURVES
@ SEQ_TIMELINE_SHOW_STRIP_DURATION
@ SEQ_TIMELINE_SHOW_STRIP_OFFSETS
@ SEQ_TIMELINE_ALL_WAVEFORMS
@ SEQ_TIMELINE_WAVEFORMS_HALF
@ SEQ_TIMELINE_SHOW_STRIP_SOURCE
@ SEQ_TIMELINE_SHOW_STRIP_NAME
@ SEQ_TIMELINE_NO_WAVEFORMS
@ SEQ_TIMELINE_SHOW_STRIP_COLOR_TAG
@ SEQ_CACHE_SHOW_PREPROCESSED
@ SEQ_CACHE_SHOW_COMPOSITE
@ SEQ_CACHE_SHOW_FINAL_OUT
@ USER_SEQ_ED_SIMPLE_TWEAKING
Sequence * ED_sequencer_special_preview_get()
bool ED_sequencer_can_select_handle(const Scene *scene, const Sequence *seq, const View2D *v2d)
bool ED_sequencer_handle_is_selected(const Sequence *seq, eSeqHandle handle)
void ED_region_draw_cb_draw(const bContext *C, ARegion *region, int type)
#define REGION_DRAW_POST_VIEW
#define REGION_DRAW_PRE_VIEW
void GPU_framebuffer_bind_no_srgb(GPUFrameBuffer *framebuffer)
void GPU_framebuffer_bind(GPUFrameBuffer *framebuffer)
void GPU_matrix_push_projection()
void GPU_matrix_pop_projection()
@ GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR
@ GPU_SHADER_3D_UNIFORM_COLOR
@ GPU_SEQ_FLAG_BACKGROUND
@ GPU_SEQ_FLAG_MISSING_CONTENT
@ GPU_SEQ_FLAG_COLOR_BAND
@ GPU_SEQ_FLAG_TRANSITION
@ GPU_SEQ_FLAG_SELECTED_LH
@ GPU_SEQ_FLAG_SELECTED_RH
@ GPU_SEQ_FLAG_MISSING_TITLE
@ GPU_BLEND_ALPHA_PREMULT
void GPU_blend(eGPUBlend blend)
void GPU_depth_test(eGPUDepthTest test)
void GPU_viewport_size_get_f(float coords[4])
GPUFrameBuffer * GPU_viewport_framebuffer_overlay_get(GPUViewport *viewport)
Read Guarded memory(de)allocation.
constexpr int SEQ_MAX_CHANNELS
#define ICON_DEFAULT_HEIGHT
#define UI_NO_ICON_OVERLAY_TEXT
void UI_icon_draw_ex(float x, float y, int icon_id, float aspect, float alpha, float desaturate, const uchar mono_color[4], bool mono_border, const IconTextOverlay *text_overlay, const bool inverted=false)
void UI_Theme_Store(bThemeState *theme_state)
void UI_Theme_Restore(const bThemeState *theme_state)
void UI_GetColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], float fac, int offset, unsigned char r_col[3])
void UI_ThemeClearColor(int colorid)
void UI_GetThemeColor3ubv(int colorid, unsigned char col[3])
void UI_GetThemeColorShade3ubv(int colorid, int offset, unsigned char col[3])
void UI_SetTheme(int spacetype, int regionid)
void UI_GetColorPtrShade3ubv(const unsigned char cp[3], int offset, unsigned char r_col[3])
void UI_view2d_view_orthoSpecial(ARegion *region, View2D *v2d, bool xaxis)
char char char char void UI_view2d_text_cache_add(View2D *v2d, float x, float y, const char *str, size_t str_len, const unsigned char col[4])
void UI_view2d_scrollers_draw(View2D *v2d, const rcti *mask_custom)
#define UI_TIME_CACHE_MARGIN_Y
void UI_view2d_view_restore(const bContext *C)
void UI_view2d_text_cache_draw(ARegion *region)
float UI_view2d_region_to_view_y(const View2D *v2d, float y)
#define UI_TIME_SCRUB_MARGIN_Y
void UI_view2d_text_cache_add_rectf(View2D *v2d, const rctf *rect_view, const char *str, size_t str_len, const unsigned char col[4])
void UI_view2d_view_ortho(const View2D *v2d)
void UI_view2d_draw_lines_x__discrete_frames_or_seconds(const View2D *v2d, const Scene *scene, bool display_seconds, bool display_minor_lines)
View2D * UI_view2d_fromcontext(const bContext *C)
float UI_view2d_scale_get_y(const View2D *v2d)
@ WM_GIZMOMAP_DRAWSTEP_2D
void ANIM_draw_previewrange(const bContext *C, View2D *v2d, int end_frame_width)
void ED_markers_draw(const bContext *C, int flag)
ListBase * SEQ_channels_displayed_get(Editing *ed)
void add_line(float x1, float y1, float x2, float y2, const uchar color[4])
void add_wire_quad(float x1, float y1, float x2, float y2, const uchar color[4])
void add_quad(float x1, float y1, float x2, float y2, const uchar color[4])
int64_t remove_if(Predicate &&predicate)
void append(const T &value)
void reserve(const int64_t min_capacity)
SeqStripDrawData & add_strip(float content_start, float content_end, float top, float bottom, float content_top, float left_handle, float right_handle, float handle_width, bool single_image)
void SEQ_cache_iterate(Scene *scene, void *userdata, bool callback_init(void *userdata, size_t item_count), bool callback_iter(void *userdata, Sequence *seq, int timeline_frame, int cache_type))
ccl_device_inline float2 floor(const float2 a)
uint color_pack(const uchar rgba[4])
float calc_strip_round_radius(float pixely)
void thumbnail_cache_discard_requests_outside(Scene *scene, const rctf &rect)
void thumbnail_cache_maintain_capacity(Scene *scene)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
bool SEQ_prefetch_need_redraw(const bContext *C, Scene *scene)
bool SEQ_render_is_muted(const ListBase *channels, const Sequence *seq)
const char * SEQ_sequence_give_name(const Sequence *seq)
ListBase * SEQ_get_seqbase_from_sequence(Sequence *seq, ListBase **r_channels, int *r_offset)
bool SEQ_sequence_has_valid_data(const Sequence *seq)
ListBase * SEQ_active_seqbase_get(const Editing *ed)
eSeqOverlapMode SEQ_tool_settings_overlap_mode_get(Scene *scene)
Editing * SEQ_editing_get(const Scene *scene)
void sequencer_retiming_draw_continuity(const TimelineDrawContext *timeline_ctx, const StripDrawContext &strip_ctx)
void sequencer_draw_preview(const bContext *C, Scene *scene, ARegion *region, SpaceSeq *sseq, int timeline_frame, int offset, bool draw_overlay, bool draw_backdrop)
bool sequencer_draw_get_transform_preview(SpaceSeq *sseq, Scene *scene)
void sequencer_retiming_keys_draw(const TimelineDrawContext *timeline_ctx, blender::Span< StripDrawContext > strips)
void draw_strip_thumbnails(TimelineDrawContext *ctx, blender::ed::seq::StripsDrawBatch &strips_batch, const blender::Vector< StripDrawContext > &strips)
void sequencer_retiming_speed_draw(const TimelineDrawContext *timeline_ctx, const StripDrawContext &strip_ctx)
bool retiming_keys_can_be_displayed(const SpaceSeq *sseq)
void sequencer_preview_add_sound(const bContext *C, const Sequence *seq)
int sequencer_draw_get_transform_preview_frame(Scene *scene)
static void draw_timeline_backdrop(TimelineDrawContext *ctx)
static void seq_prefetch_wm_notify(const bContext *C, Scene *scene)
static void draw_cache_view(const bContext *C)
static void draw_seq_waveform_overlay(TimelineDrawContext *timeline_ctx, const StripDrawContext *strip_ctx)
static float align_frame_with_pixel(float frame_coord, float frames_per_pixel)
Vector< Sequence * > sequencer_visible_strips_get(const bContext *C)
static void strip_data_handle_flags_set(const StripDrawContext &strip, const TimelineDrawContext *timeline_ctx, SeqStripDrawData &data)
static void strip_draw_context_set_retiming_overlay_visibility(TimelineDrawContext *ctx, StripDrawContext *strip_ctx)
static void draw_timeline_markers(TimelineDrawContext *ctx)
static void draw_strips_background(TimelineDrawContext *timeline_ctx, StripsDrawBatch &strips_batch, const Vector< StripDrawContext > &strips)
static void draw_strip_offsets(TimelineDrawContext *timeline_ctx, const StripDrawContext *strip_ctx)
static void draw_cache_stripe(const Scene *scene, const Sequence *seq, SeqQuadsBatch &quads, const float stripe_bot, const float stripe_ht, const uchar color[4])
void draw_timeline_seq_display(const bContext *C, ARegion *region)
static void strip_data_missing_media_flags_set(const StripDrawContext &strip, SeqStripDrawData &data)
static void draw_icon_centered(TimelineDrawContext &ctx, const rctf &rect, int icon_id, const uchar color[4])
static void draw_timeline_gizmos(TimelineDrawContext *ctx)
static void visible_strips_ordered_get(TimelineDrawContext *timeline_ctx, Vector< StripDrawContext > &r_bottom_layer, Vector< StripDrawContext > &r_top_layer)
static void color3ubv_from_seq(const Scene *curscene, const Sequence *seq, const bool show_strip_color_tag, const bool is_muted, uchar r_col[3])
static void draw_seq_strips(TimelineDrawContext *timeline_ctx, StripsDrawBatch &strips_batch, const Vector< StripDrawContext > &strips)
static StripDrawContext strip_draw_context_get(TimelineDrawContext *ctx, Sequence *seq)
static size_t draw_seq_text_get_overlay_string(TimelineDrawContext *timeline_ctx, const StripDrawContext *strip_ctx, char *r_overlay_string, size_t overlay_string_len)
static void draw_seq_text_get_source(const Sequence *seq, char *r_source, size_t source_maxncpy)
static const char * draw_seq_text_get_name(const Sequence *seq)
static void draw_multicam_highlight(TimelineDrawContext *timeline_ctx, const StripDrawContext *strip_ctx)
static void waveform_job_start_if_needed(const bContext *C, const Sequence *seq)
static bool draw_cache_view_init_fn(void *, size_t item_count)
static void draw_seq_fcurve_overlay(TimelineDrawContext *timeline_ctx, const StripDrawContext *strip_ctx)
static void draw_timeline_grid(TimelineDrawContext *ctx)
static void draw_seq_text_overlay(TimelineDrawContext *timeline_ctx, const StripDrawContext *strip_ctx)
static void draw_seq_timeline_channels(TimelineDrawContext *ctx)
static bool draw_cache_view_iter_fn(void *userdata, Sequence *seq, int timeline_frame, int cache_type)
static void draw_strip_icons(TimelineDrawContext *timeline_ctx, const Vector< StripDrawContext > &strips)
static void strip_data_highlight_flags_set(const StripDrawContext &strip, const TimelineDrawContext *timeline_ctx, SeqStripDrawData &data)
static bool strip_hides_text_overlay_first(const TimelineDrawContext *ctx, const StripDrawContext *strip_ctx)
constexpr float ICON_SIZE
void draw_timeline_seq(const bContext *C, ARegion *region)
static void draw_timeline_sfra_efra(TimelineDrawContext *ctx)
static void draw_overlap_frame_indicator(const Scene *scene, const View2D *v2d)
static bool seq_draw_waveforms_poll(const SpaceSeq *sseq, const Sequence *seq)
static void drawmeta_contents(TimelineDrawContext *timeline_ctx, const StripDrawContext *strip_ctx, float corner_radius)
static void get_strip_text_color(const StripDrawContext *strip, uchar r_col[4])
static void strip_draw_context_curve_get(const TimelineDrawContext *ctx, StripDrawContext &strip_ctx)
static TimelineDrawContext timeline_draw_context_get(const bContext *C, SeqQuadsBatch *quads_batch)
static void strip_draw_context_set_strip_content_visibility(TimelineDrawContext *ctx, StripDrawContext *strip_ctx)
float sequence_handle_size_get_clamped(const Scene *scene, Sequence *seq, const float pixelx)
static void strip_data_lock_flags_set(const StripDrawContext &strip, const TimelineDrawContext *timeline_ctx, SeqStripDrawData &data)
static void draw_cache_background(const bContext *C, CacheDrawData *draw_data)
static void strip_draw_context_set_text_overlay_visibility(TimelineDrawContext *ctx, StripDrawContext *strip_ctx)
static void draw_timeline_pre_view_callbacks(TimelineDrawContext *ctx)
static void draw_timeline_post_view_callbacks(TimelineDrawContext *ctx)
static void draw_strips_foreground(TimelineDrawContext *timeline_ctx, StripsDrawBatch &strips_batch, const Vector< StripDrawContext > &strips)
static void draw_retiming_continuity_ranges(TimelineDrawContext *timeline_ctx, const Vector< StripDrawContext > &strips)
static void draw_handle_transform_text(const TimelineDrawContext *timeline_ctx, const StripDrawContext *strip_ctx, eSeqHandle handle)
static void strip_data_outline_params_set(const StripDrawContext &strip, const TimelineDrawContext *timeline_ctx, SeqStripDrawData &data)
bool SEQ_is_strip_connected(const Sequence *seq)
blender::Map< SeqRetimingKey *, Sequence * > SEQ_retiming_selection_get(const Editing *ed)
Sequence * SEQ_select_active_get(const Scene *scene)
float SEQ_give_frame_index(const Scene *scene, const Sequence *seq, float timeline_frame)
int SEQ_time_left_handle_frame_get(const Scene *, const Sequence *seq)
float SEQ_time_content_end_frame_get(const Scene *scene, const Sequence *seq)
void SEQ_timeline_boundbox(const Scene *scene, const ListBase *seqbase, rctf *r_rect)
float SEQ_time_start_frame_get(const Sequence *seq)
int SEQ_time_right_handle_frame_get(const Scene *scene, const Sequence *seq)
struct wmGizmoMap * gizmo_map
struct Object * scene_camera
struct SequencerCacheOverlay cache_overlay
struct SequencerTimelineOverlay timeline_overlay
bool show_strip_color_tag
bool can_draw_retiming_overlay
bool can_draw_text_overlay
bool can_draw_strip_content
blender::Map< SeqRetimingKey *, Sequence * > retiming_selection
GPUFrameBuffer * framebuffer_overlay
ThemeStripColor strip_color[9]
rcti ED_time_scrub_clamp_scroller_mask(const rcti &scroller_mask)
void ED_time_scrub_draw_current_frame(const ARegion *region, const Scene *scene, bool display_seconds)
void ED_time_scrub_draw(const ARegion *region, const Scene *scene, bool display_seconds, bool discrete_frames)
GPUViewport * WM_draw_region_get_viewport(ARegion *region)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_gizmomap_draw(wmGizmoMap *gzmap, const bContext *C, const eWM_GizmoFlagMapDrawStep drawstep)
void wmOrtho2_region_pixelspace(const ARegion *region)