Add font selection to VSE text strips
[blender.git] / source / blender / makesdna / DNA_sequence_types.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27 /** \file DNA_sequence_types.h
28  *  \ingroup DNA
29  *  \since mar-2001
30  *  \author nzc
31  *
32  * Structs for use by the 'Sequencer' (Video Editor)
33  *
34  * Note on terminology
35  * - #Sequence: video/effect/audio data you can select and manipulate in the sequencer.
36  * - #Sequence.machine: Strange name for the channel.
37  * - #Strip: The data referenced by the #Sequence
38  * - Meta Strip (SEQ_TYPE_META): Support for nesting Sequences.
39  */
40
41 #ifndef __DNA_SEQUENCE_TYPES_H__
42 #define __DNA_SEQUENCE_TYPES_H__
43
44 #include "DNA_defs.h"
45 #include "DNA_color_types.h"
46 #include "DNA_listBase.h"
47 #include "DNA_vec_types.h"
48 #include "DNA_vfont_types.h"
49
50 struct Ipo;
51 struct Scene;
52 struct bSound;
53 struct MovieClip;
54
55 /* strlens; 256= FILE_MAXFILE, 768= FILE_MAXDIR */
56
57 typedef struct StripAnim {
58         struct StripAnim *next, *prev;
59         struct anim *anim;
60 } StripAnim;
61
62 typedef struct StripElem {
63         char name[256];
64         int orig_width, orig_height;
65 } StripElem;
66
67 typedef struct StripCrop {
68         int top;
69         int bottom;
70         int left;
71         int right;
72 } StripCrop;
73
74 typedef struct StripTransform {
75         int xofs;
76         int yofs;
77 } StripTransform;
78
79 typedef struct StripColorBalance {
80         float lift[3];
81         float gamma[3];
82         float gain[3];
83         int flag;
84         int pad;
85         // float exposure;
86         // float saturation;
87 } StripColorBalance;
88
89 typedef struct StripProxy {
90         char dir[768];         // custom directory for index and proxy files
91                                // (defaults to BL_proxy)
92
93         char file[256];        // custom file
94         struct anim *anim;     // custom proxy anim file
95
96         short tc;              // time code in use
97
98         short quality;         // proxy build quality
99         short build_size_flags; // size flags (see below) of all proxies
100                                // to build
101         short build_tc_flags;  // time code flags (see below) of all tc indices
102                                // to build
103         short build_flags;
104         char storage;
105         char pad[5];
106 } StripProxy;
107
108 typedef struct Strip {
109         struct Strip *next, *prev;
110         int us, done;
111         int startstill, endstill;
112         StripElem *stripdata;  /* only used as an array in IMAGE sequences(!),
113                                 * and as a 1-element array in MOVIE sequences,
114                                 * NULL for all other strip-types */
115         char dir[768];
116         StripProxy *proxy;
117         StripCrop *crop;
118         StripTransform *transform;
119         StripColorBalance *color_balance DNA_DEPRECATED;
120
121         /* color management */
122         ColorManagedColorspaceSettings colorspace_settings;
123 } Strip;
124
125 /**
126  * The sequence structure is the basic struct used by any strip.
127  * each of the strips uses a different sequence structure.
128  *
129  * \warning The first part identical to ID (for use in ipo's)
130  * the comment above is historic, probably we can drop the ID compatibility,
131  * but take care making this change.
132  *
133  * \warning This is really a 'Strip' in the UI!, name is highly confusing.
134  */
135 typedef struct Sequence {
136         struct Sequence *next, *prev;
137         void *tmp; /* tmp var for copying, and tagging for linked selection */
138         void *lib; /* needed (to be like ipo), else it will raise libdata warnings, this should never be used */
139         char name[64]; /* SEQ_NAME_MAXSTR - name, set by default and needs to be unique, for RNA paths */
140
141         int flag, type; /*flags bitmap (see below) and the type of sequence*/
142         int len; /* the length of the contents of this strip - before handles are applied */
143         int start; /* start frame of contents of strip in absolute frame coordinates. For metastrips start of first strip startdisp */
144         int startofs, endofs; /* frames after the first frame where display starts, frames before the last frame where display ends */
145         int startstill, endstill; /* frames that use the first frame before data begins, frames that use the last frame after data ends */
146         int machine, depth; /*machine - the strip channel, depth - the depth in the sequence when dealing with metastrips */
147         int startdisp, enddisp; /* starting and ending points of the strip in the sequence*/
148         float sat;
149         float mul, handsize;
150
151         short anim_preseek;
152         short streamindex;    /* streamindex for movie or sound files with several streams */
153         int multicam_source;  /* for multicam source selection */
154         int clip_flag;        /* MOVIECLIP render flags */
155
156         Strip *strip;
157
158         struct Ipo *ipo DNA_DEPRECATED;   /* old animation system, deprecated for 2.5 */
159
160         /** these ID vars should never be NULL but can be when linked libs fail to load,
161          * so check on access */
162         struct Scene     *scene;
163         struct Object    *scene_camera;  /* override scene camera */
164         struct MovieClip *clip;          /* for MOVIECLIP strips */
165         struct Mask      *mask;          /* for MASK strips */
166         ListBase anims;                  /* for MOVIE strips */
167
168         float effect_fader;
169         float speed_fader;
170
171         /* pointers for effects: */
172         struct Sequence *seq1, *seq2, *seq3;
173
174         ListBase seqbase;       /* list of strips for metastrips */
175
176         struct bSound *sound;   /* the linked "bSound" object */
177         void *scene_sound;
178         float volume;
179
180         float pitch, pan;     /* pitch (-0.1..10), pan -2..2 */
181         float strobe;
182
183         void *effectdata;     /* Struct pointer for effect settings */
184
185         int anim_startofs;    /* only use part of animation file */
186         int anim_endofs;      /* is subtle different to startofs / endofs */
187
188
189         int blend_mode;
190         float blend_opacity;
191
192         /* is sfra needed anymore? - it looks like its only used in one place */
193         int sfra;  /* starting frame according to the timeline of the scene. */
194
195         char alpha_mode;
196         char pad[2];
197
198         /* Multiview */
199         char views_format;
200         struct Stereo3dFormat *stereo3d_format;
201
202         struct IDProperty *prop;
203
204         /* modifiers */
205         ListBase modifiers;
206 } Sequence;
207
208 typedef struct MetaStack {
209         struct MetaStack *next, *prev;
210         ListBase *oldbasep;
211         Sequence *parseq;
212         /* the startdisp/enddisp when entering the meta */
213         int disp_range[2];
214 } MetaStack;
215
216 typedef struct Editing {
217         ListBase *seqbasep; /* pointer to the current list of seq's being edited (can be within a meta strip) */
218         ListBase seqbase;   /* pointer to the top-most seq's */
219         ListBase metastack;
220
221         /* Context vars, used to be static */
222         Sequence *act_seq;
223         char act_imagedir[1024]; /* 1024 = FILE_MAX */
224         char act_sounddir[1024]; /* 1024 = FILE_MAX */
225         char proxy_dir[1024]; /* 1024 = FILE_MAX */
226
227         int over_ofs, over_cfra;
228         int over_flag, proxy_storage;
229         rctf over_border;
230 } Editing;
231
232 /* ************* Effect Variable Structs ********* */
233 typedef struct WipeVars {
234         float edgeWidth, angle;
235         short forward, wipetype;
236 } WipeVars;
237
238 typedef struct GlowVars {
239         float fMini;    /*      Minimum intensity to trigger a glow */
240         float fClamp;
241         float fBoost;   /*      Amount to multiply glow intensity */
242         float dDist;    /*      Radius of glow blurring */
243         int dQuality;
244         int bNoComp;    /*      SHOW/HIDE glow buffer */
245 } GlowVars;
246
247 typedef struct TransformVars {
248         float ScalexIni;
249         float ScaleyIni;
250         float xIni;
251         float yIni;
252         float rotIni;
253         int percent;
254         int interpolation;
255         int uniform_scale; /* preserve aspect/ratio when scaling */
256 } TransformVars;
257
258 typedef struct SolidColorVars {
259         float col[3];
260         float pad;
261 } SolidColorVars;
262
263 typedef struct SpeedControlVars {
264         float *frameMap;
265         float globalSpeed;
266         int flags;
267         int length;
268         int lastValidFrame;
269 } SpeedControlVars;
270
271 typedef struct GaussianBlurVars {
272         float size_x;
273         float size_y;
274 } GaussianBlurVars;
275
276 typedef struct TextVars {
277         char text[512];
278         VFont *text_font;
279         int text_blf_id;
280         int text_size;
281         float color[4], shadow_color[4];
282         float loc[2];
283         float wrap_width;
284         char flag;
285         char align, align_y;
286         char pad[1];
287 } TextVars;
288
289 /* TextVars.flag */
290 enum {
291         SEQ_TEXT_SHADOW =       (1 << 0),
292 };
293
294 /* TextVars.align */
295 enum {
296         SEQ_TEXT_ALIGN_X_LEFT = 0,
297         SEQ_TEXT_ALIGN_X_CENTER = 1,
298         SEQ_TEXT_ALIGN_X_RIGHT = 2,
299 };
300
301 /* TextVars.align_y */
302 enum {
303         SEQ_TEXT_ALIGN_Y_TOP = 0,
304         SEQ_TEXT_ALIGN_Y_CENTER = 1,
305         SEQ_TEXT_ALIGN_Y_BOTTOM = 2,
306 };
307
308 #define SEQ_FONT_NOT_LOADED -2
309
310 typedef struct ColorMixVars {
311         int blend_effect;    /* value from SEQ_TYPE_XXX enumeration */
312         float factor;        /* blend factor [0.0f, 1.0f]           */
313 } ColorMixVars;
314
315 /* ***************** Sequence modifiers ****************** */
316
317 typedef struct SequenceModifierData {
318         struct SequenceModifierData *next, *prev;
319         int type, flag;
320         char name[64]; /* MAX_NAME */
321
322         /* mask input, either sequence or mask ID */
323         int mask_input_type;
324         int mask_time;
325
326         struct Sequence *mask_sequence;
327         struct Mask     *mask_id;
328 } SequenceModifierData;
329
330 typedef struct ColorBalanceModifierData {
331         SequenceModifierData modifier;
332
333         StripColorBalance color_balance;
334         float color_multiply;
335 } ColorBalanceModifierData;
336
337 typedef struct CurvesModifierData {
338         SequenceModifierData modifier;
339
340         struct CurveMapping curve_mapping;
341 } CurvesModifierData;
342
343 typedef struct HueCorrectModifierData {
344         SequenceModifierData modifier;
345
346         struct CurveMapping curve_mapping;
347 } HueCorrectModifierData;
348
349 typedef struct BrightContrastModifierData {
350         SequenceModifierData modifier;
351
352         float bright;
353         float contrast;
354 } BrightContrastModifierData;
355
356 typedef struct SequencerMaskModifierData {
357         SequenceModifierData modifier;
358 } SequencerMaskModifierData;
359
360 typedef struct WhiteBalanceModifierData {
361         SequenceModifierData modifier;
362
363         float white_value[3];
364         float pad;
365 } WhiteBalanceModifierData;
366
367 typedef struct SequencerTonemapModifierData {
368         SequenceModifierData modifier;
369
370         float key, offset, gamma;
371         float intensity, contrast, adaptation, correction;
372         int type;
373 } SequencerTonemapModifierData;
374
375 enum {
376         SEQ_TONEMAP_RH_SIMPLE = 0,
377         SEQ_TONEMAP_RD_PHOTORECEPTOR = 1,
378 };
379
380 /* ***************** Scopes ****************** */
381
382 typedef struct SequencerScopes {
383         struct ImBuf *reference_ibuf;
384
385         struct ImBuf *zebra_ibuf;
386         struct ImBuf *waveform_ibuf;
387         struct ImBuf *sep_waveform_ibuf;
388         struct ImBuf *vector_ibuf;
389         struct ImBuf *histogram_ibuf;
390 } SequencerScopes;
391
392 #define MAXSEQ          32
393
394 #define SELECT 1
395
396 /* Editor->over_flag */
397 #define SEQ_EDIT_OVERLAY_SHOW           1
398 #define SEQ_EDIT_OVERLAY_ABS            2
399
400 #define SEQ_STRIP_OFSBOTTOM     0.2f
401 #define SEQ_STRIP_OFSTOP        0.8f
402
403 /* Editor->proxy_storage */
404 /* store proxies in project directory */
405 #define SEQ_EDIT_PROXY_DIR_STORAGE 1
406
407 /* SpeedControlVars->flags */
408 #define SEQ_SPEED_INTEGRATE      1
409 /* #define SEQ_SPEED_BLEND          2 */ /* DEPRECATED */
410 #define SEQ_SPEED_COMPRESS_IPO_Y 4
411
412 /* ***************** SEQUENCE ****************** */
413 #define SEQ_NAME_MAXSTR         64
414
415 /* seq->flag */
416 enum {
417         SEQ_LEFTSEL                 = (1 << 1),
418         SEQ_RIGHTSEL                = (1 << 2),
419         SEQ_OVERLAP                 = (1 << 3),
420         SEQ_FILTERY                 = (1 << 4),
421         SEQ_MUTE                    = (1 << 5),
422 #ifdef DNA_DEPRECATED
423         SEQ_MAKE_PREMUL             = (1 << 6), /* deprecated, used for compatibility code only */
424 #endif
425         SEQ_REVERSE_FRAMES          = (1 << 7),
426         SEQ_IPO_FRAME_LOCKED        = (1 << 8),
427         SEQ_EFFECT_NOT_LOADED       = (1 << 9),
428         SEQ_FLAG_DELETE             = (1 << 10),
429         SEQ_FLIPX                   = (1 << 11),
430         SEQ_FLIPY                   = (1 << 12),
431         SEQ_MAKE_FLOAT              = (1 << 13),
432         SEQ_LOCK                    = (1 << 14),
433         SEQ_USE_PROXY               = (1 << 15),
434         SEQ_USE_TRANSFORM           = (1 << 16),
435         SEQ_USE_CROP                = (1 << 17),
436         /* SEQ_USE_COLOR_BALANCE       = (1 << 18), */ /* DEPRECATED */
437         /* SEQ_USE_PROXY_CUSTOM_DIR    = (1 << 19), */ /* DEPRECATED */
438
439         /* SEQ_USE_PROXY_CUSTOM_FILE   = (1 << 21), */ /* DEPRECATED */
440         SEQ_USE_EFFECT_DEFAULT_FADE = (1 << 22),
441         SEQ_USE_LINEAR_MODIFIERS    = (1 << 23),
442
443         /* flags for whether those properties are animated or not */
444         SEQ_AUDIO_VOLUME_ANIMATED   = (1 << 24),
445         SEQ_AUDIO_PITCH_ANIMATED    = (1 << 25),
446         SEQ_AUDIO_PAN_ANIMATED      = (1 << 26),
447         SEQ_AUDIO_DRAW_WAVEFORM     = (1 << 27),
448
449         /* don't include Grease Pencil in OpenGL previews of Scene strips */
450         SEQ_SCENE_NO_GPENCIL        = (1 << 28),
451         SEQ_USE_VIEWS               = (1 << 29),
452
453         /* access scene strips directly (like a metastrip) */
454         SEQ_SCENE_STRIPS            = (1 << 30),
455
456         SEQ_INVALID_EFFECT          = (1u << 31),
457 };
458
459 /* StripProxy->storage */
460 enum {
461         SEQ_STORAGE_PROXY_CUSTOM_FILE   = (1 << 1), /* store proxy in custom directory */
462         SEQ_STORAGE_PROXY_CUSTOM_DIR    = (1 << 2), /* store proxy in custom file */
463 };
464
465 /* convenience define for all selection flags */
466 #define SEQ_ALLSEL  (SELECT + SEQ_LEFTSEL + SEQ_RIGHTSEL)
467
468 /* deprecated, don't use a flag anymore*/
469 /*#define SEQ_ACTIVE                            1048576*/
470
471 #define SEQ_COLOR_BALANCE_INVERSE_GAIN 1
472 #define SEQ_COLOR_BALANCE_INVERSE_GAMMA 2
473 #define SEQ_COLOR_BALANCE_INVERSE_LIFT 4
474
475 /* !!! has to be same as IMB_imbuf.h IMB_PROXY_... and IMB_TC_... */
476
477 #define SEQ_PROXY_IMAGE_SIZE_25                 1
478 #define SEQ_PROXY_IMAGE_SIZE_50                 2
479 #define SEQ_PROXY_IMAGE_SIZE_75                 4
480 #define SEQ_PROXY_IMAGE_SIZE_100                8
481
482 #define SEQ_PROXY_TC_NONE                       0
483 #define SEQ_PROXY_TC_RECORD_RUN                 1
484 #define SEQ_PROXY_TC_FREE_RUN                   2
485 #define SEQ_PROXY_TC_INTERP_REC_DATE_FREE_RUN   4
486 #define SEQ_PROXY_TC_RECORD_RUN_NO_GAPS         8
487 #define SEQ_PROXY_TC_ALL                        15
488
489 /* SeqProxy->build_flags */
490 enum {
491         SEQ_PROXY_SKIP_EXISTING = 1,
492 };
493
494 /* seq->alpha_mode */
495 enum {
496         SEQ_ALPHA_STRAIGHT = 0,
497         SEQ_ALPHA_PREMUL   = 1,
498 };
499
500 /* seq->type WATCH IT: SEQ_TYPE_EFFECT BIT is used to determine if this is an effect strip!!! */
501 enum {
502         SEQ_TYPE_IMAGE       = 0,
503         SEQ_TYPE_META        = 1,
504         SEQ_TYPE_SCENE       = 2,
505         SEQ_TYPE_MOVIE       = 3,
506         SEQ_TYPE_SOUND_RAM   = 4,
507         SEQ_TYPE_SOUND_HD    = 5,
508         SEQ_TYPE_MOVIECLIP   = 6,
509         SEQ_TYPE_MASK        = 7,
510
511         SEQ_TYPE_EFFECT      = 8,
512         SEQ_TYPE_CROSS       = 8,
513         SEQ_TYPE_ADD         = 9,
514         SEQ_TYPE_SUB         = 10,
515         SEQ_TYPE_ALPHAOVER   = 11,
516         SEQ_TYPE_ALPHAUNDER  = 12,
517         SEQ_TYPE_GAMCROSS    = 13,
518         SEQ_TYPE_MUL         = 14,
519         SEQ_TYPE_OVERDROP    = 15,
520         /* SEQ_TYPE_PLUGIN      = 24, */ /* Deprecated */
521         SEQ_TYPE_WIPE        = 25,
522         SEQ_TYPE_GLOW        = 26,
523         SEQ_TYPE_TRANSFORM   = 27,
524         SEQ_TYPE_COLOR       = 28,
525         SEQ_TYPE_SPEED       = 29,
526         SEQ_TYPE_MULTICAM    = 30,
527         SEQ_TYPE_ADJUSTMENT  = 31,
528         SEQ_TYPE_GAUSSIAN_BLUR = 40,
529         SEQ_TYPE_TEXT = 41,
530         SEQ_TYPE_COLORMIX    = 42,
531
532         /* Blend modes */
533         SEQ_TYPE_SCREEN      = 43,
534         SEQ_TYPE_LIGHTEN     = 44,
535         SEQ_TYPE_DODGE       = 45,
536         SEQ_TYPE_DARKEN      = 46,
537         SEQ_TYPE_BURN        = 47,
538         SEQ_TYPE_LINEAR_BURN = 48,
539         SEQ_TYPE_OVERLAY     = 49,
540         SEQ_TYPE_HARD_LIGHT  = 50,
541         SEQ_TYPE_SOFT_LIGHT  = 51,
542         SEQ_TYPE_PIN_LIGHT   = 52,
543         SEQ_TYPE_LIN_LIGHT   = 53,
544         SEQ_TYPE_VIVID_LIGHT = 54,
545         SEQ_TYPE_HUE         = 55,
546         SEQ_TYPE_SATURATION  = 56,
547         SEQ_TYPE_VALUE       = 57,
548         SEQ_TYPE_BLEND_COLOR = 58,
549         SEQ_TYPE_DIFFERENCE  = 59,
550         SEQ_TYPE_EXCLUSION   = 60,
551
552         SEQ_TYPE_MAX         = 60,
553 };
554
555 #define SEQ_MOVIECLIP_RENDER_UNDISTORTED (1 << 0)
556 #define SEQ_MOVIECLIP_RENDER_STABILIZED  (1 << 1)
557
558 #define SEQ_BLEND_REPLACE      0
559 /* all other BLEND_MODEs are simple SEQ_TYPE_EFFECT ids and therefore identical
560  * to the table above. (Only those effects that handle _exactly_ two inputs,
561  * otherwise, you can't really blend, right :) !)
562  */
563
564
565 #define SEQ_HAS_PATH(_seq) (ELEM((_seq)->type, SEQ_TYPE_MOVIE, SEQ_TYPE_IMAGE, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD))
566
567 /* modifiers */
568
569 /* SequenceModifierData->type */
570 enum {
571         seqModifierType_ColorBalance   = 1,
572         seqModifierType_Curves         = 2,
573         seqModifierType_HueCorrect     = 3,
574         seqModifierType_BrightContrast = 4,
575         seqModifierType_Mask           = 5,
576         seqModifierType_WhiteBalance   = 6,
577         seqModifierType_Tonemap        = 7,
578
579         NUM_SEQUENCE_MODIFIER_TYPES
580 };
581
582 /* SequenceModifierData->flag */
583 enum {
584         SEQUENCE_MODIFIER_MUTE      = (1 << 0),
585         SEQUENCE_MODIFIER_EXPANDED  = (1 << 1),
586 };
587
588 enum {
589         SEQUENCE_MASK_INPUT_STRIP   = 0,
590         SEQUENCE_MASK_INPUT_ID      = 1,
591 };
592
593 enum {
594         /* Mask animation will be remapped relative to the strip start frame. */
595         SEQUENCE_MASK_TIME_RELATIVE = 0,
596         /* Global (scene) frame number will be used to access the mask. */
597         SEQUENCE_MASK_TIME_ABSOLUTE = 1,
598 };
599
600 #endif  /* __DNA_SEQUENCE_TYPES_H__ */