Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesdna / DNA_ID.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
28 /** \file DNA_ID.h
29  *  \ingroup DNA
30  *  \brief ID and Library types, which are fundamental for sdna.
31  */
32
33 #ifndef __DNA_ID_H__
34 #define __DNA_ID_H__
35
36 #include "DNA_listBase.h"
37
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41
42 struct Library;
43 struct FileData;
44 struct ID;
45 struct PackedFile;
46 struct GPUTexture;
47
48 /* Runtime display data */
49 struct DrawData;
50 typedef void (*DrawDataInitCb)(struct DrawData *engine_data);
51 typedef void (*DrawDataFreeCb)(struct DrawData *engine_data);
52
53 #
54 #
55 typedef struct DrawData {
56         struct DrawData *next, *prev;
57         struct DrawEngineType *engine_type;
58         /* Only nested data, NOT the engine data itself. */
59         DrawDataFreeCb free;
60         /* Accumulated recalc flags, which corresponds to ID->recalc flags. */
61         int recalc;
62 } DrawData;
63
64 typedef struct DrawDataList {
65         struct DrawData *first, *last;
66 } DrawDataList;
67
68
69 typedef struct IDPropertyData {
70         void *pointer;
71         ListBase group;
72         int val, val2;  /* note, we actually fit a double into these two ints */
73 } IDPropertyData;
74
75 typedef struct IDProperty {
76         struct IDProperty *next, *prev;
77         char type, subtype;
78         short flag;
79         char name[64];  /* MAX_IDPROP_NAME */
80
81         /* saved is used to indicate if this struct has been saved yet.
82          * seemed like a good idea as a pad var was needed anyway :) */
83         int saved;
84         IDPropertyData data;  /* note, alignment for 64 bits */
85
86         /* array length, also (this is important!) string length + 1.
87          * the idea is to be able to reuse array realloc functions on strings.*/
88         int len;
89
90         /* Strings and arrays are both buffered, though the buffer isn't saved. */
91         /* totallen is total length of allocated array/string, including a buffer.
92          * Note that the buffering is mild; the code comes from python's list implementation. */
93         int totallen;
94 } IDProperty;
95
96 #define MAX_IDPROP_NAME 64
97 #define DEFAULT_ALLOC_FOR_NULL_STRINGS  64
98
99 /*->type*/
100 enum {
101         IDP_STRING           = 0,
102         IDP_INT              = 1,
103         IDP_FLOAT            = 2,
104         IDP_ARRAY            = 5,
105         IDP_GROUP            = 6,
106         IDP_ID               = 7,
107         IDP_DOUBLE           = 8,
108         IDP_IDPARRAY         = 9,
109         IDP_NUMTYPES         = 10,
110 };
111
112 /*->subtype */
113
114 /* IDP_STRING */
115 enum {
116         IDP_STRING_SUB_UTF8  = 0,  /* default */
117         IDP_STRING_SUB_BYTE  = 1,  /* arbitrary byte array, _not_ null terminated */
118 };
119
120 /* IDP_GROUP */
121 enum {
122         IDP_GROUP_SUB_NONE              = 0,  /* default */
123         IDP_GROUP_SUB_MODE_OBJECT       = 1,  /* object mode settings */
124         IDP_GROUP_SUB_MODE_EDIT         = 2,  /* mesh edit mode settings */
125         IDP_GROUP_SUB_ENGINE_RENDER     = 3,  /* render engine settings */
126         IDP_GROUP_SUB_OVERRIDE          = 4,  /* data override */
127         IDP_GROUP_SUB_MODE_PAINT_WEIGHT = 5,  /* weight paint mode settings */
128         IDP_GROUP_SUB_MODE_PAINT_VERTEX = 6,  /* vertex paint mode settings */
129 };
130
131 /*->flag*/
132 enum {
133         /* This IDProp may be statically overridden. Should only be used/be relevant for custom properties. */
134         IDP_FLAG_OVERRIDABLE_STATIC = 1 << 0,
135
136         IDP_FLAG_GHOST       = 1 << 7,  /* this means the property is set but RNA will return false when checking
137                                          * 'RNA_property_is_set', currently this is a runtime flag */
138 };
139
140 /* add any future new id property types here.*/
141
142
143 /* Static ID override structs. */
144
145 typedef struct IDOverrideStaticPropertyOperation {
146         struct IDOverrideStaticPropertyOperation *next, *prev;
147
148         /* Type of override. */
149         short operation;
150         short flag;
151         short pad_s1[2];
152
153         /* Sub-item references, if needed (for arrays or collections only).
154          * We need both reference and local values to allow e.g. insertion into collections (constraints, modifiers...).
155          * In collection case, if names are defined, they are used in priority.
156          * Names are pointers (instead of char[64]) to save some space, NULL when unset.
157          * Indices are -1 when unset. */
158         char *subitem_reference_name;
159         char *subitem_local_name;
160         int subitem_reference_index;
161         int subitem_local_index;
162 } IDOverrideStaticPropertyOperation;
163
164 /* IDOverridePropertyOperation->operation. */
165 enum {
166         /* Basic operations. */
167         IDOVERRIDESTATIC_OP_NOOP          =   0,  /* Special value, forbids any overriding. */
168
169         IDOVERRIDESTATIC_OP_REPLACE       =   1,  /* Fully replace local value by reference one. */
170
171         /* Numeric-only operations. */
172         IDOVERRIDESTATIC_OP_ADD           = 101,  /* Add local value to reference one. */
173         /* Subtract local value from reference one (needed due to unsigned values etc.). */
174         IDOVERRIDESTATIC_OP_SUBTRACT      = 102,
175         /* Multiply reference value by local one (more useful than diff for scales and the like). */
176         IDOVERRIDESTATIC_OP_MULTIPLY      = 103,
177
178         /* Collection-only operations. */
179         IDOVERRIDESTATIC_OP_INSERT_AFTER  = 201,  /* Insert after given reference's subitem. */
180         IDOVERRIDESTATIC_OP_INSERT_BEFORE = 202,  /* Insert before given reference's subitem. */
181         /* We can add more if needed (move, delete, ...). */
182 };
183
184 /* IDOverridePropertyOperation->flag. */
185 enum {
186         IDOVERRIDESTATIC_FLAG_MANDATORY     =   1 << 0,  /* User cannot remove that override operation. */
187         IDOVERRIDESTATIC_FLAG_LOCKED        =   1 << 1,  /* User cannot change that override operation. */
188 };
189
190 /* A single overridden property, contain all operations on this one. */
191 typedef struct IDOverrideStaticProperty {
192         struct IDOverrideStaticProperty *next, *prev;
193
194         /* Path from ID to overridden property. *Does not* include indices/names for final arrays/collections items. */
195         char *rna_path;
196
197         ListBase operations;  /* List of overriding operations (IDOverridePropertyOperation) applied to this property. */
198 } IDOverrideStaticProperty;
199
200 /* Main container for all overriding data info of a data-block. */
201 typedef struct IDOverrideStatic {
202         struct ID *reference;  /* Reference linked ID which this one overrides. */
203         ListBase properties;  /* List of IDOverrideProperty structs. */
204
205         short flag;
206         short pad[3];
207
208         /* Read/write data. */
209         /* Temp ID storing extra override data (used for differential operations only currently).
210          * Always NULL outside of read/write context. */
211         struct ID *storage;
212 } IDOverrideStatic;
213
214 enum eStaticOverride_Flag {
215         STATICOVERRIDE_AUTO    = 1 << 0,  /* Allow automatic generation of overriding rules. */
216 };
217
218 /* watch it: Sequence has identical beginning. */
219 /**
220  * ID is the first thing included in all serializable types. It
221  * provides a common handle to place all data in double-linked lists.
222  * */
223
224 /* 2 characters for ID code and 64 for actual name */
225 #define MAX_ID_NAME  66
226
227 /* There's a nasty circular dependency here.... 'void *' to the rescue! I
228  * really wonder why this is needed. */
229 typedef struct ID {
230         void *next, *prev;
231         struct ID *newid;
232         struct Library *lib;
233         char name[66]; /* MAX_ID_NAME */
234         /**
235          * LIB_... flags report on status of the datablock this ID belongs to (persistent, saved to and read from .blend).
236          */
237         short flag;
238         /**
239          * LIB_TAG_... tags (runtime only, cleared at read time).
240          */
241         int tag;
242         int us;
243         int icon_id;
244         int recalc;
245         int pad;
246         IDProperty *properties;
247
248         IDOverrideStatic *override_static;  /* Reference linked ID which this one overrides. */
249
250         /* Only set for datablocks which are coming from copy-on-write, points to
251          * the original version of it.
252          */
253         struct ID *orig_id;
254
255         void *py_instance;
256 } ID;
257
258 /**
259  * For each library file used, a Library struct is added to Main
260  * WARNING: readfile.c, expand_doit() reads this struct without DNA check!
261  */
262 typedef struct Library {
263         ID id;
264         struct FileData *filedata;
265         char name[1024];  /* path name used for reading, can be relative and edited in the outliner */
266
267         /* absolute filepath, this is only for convenience, 'name' is the real path used on file read but in
268          * some cases its useful to access the absolute one.
269          * This is set on file read.
270          * Use BKE_library_filepath_set() rather than setting 'name' directly and it will be kept in sync - campbell */
271         char filepath[1024];
272
273         struct Library *parent; /* set for indirectly linked libs, used in the outliner and while reading */
274
275         struct PackedFile *packedfile;
276
277         /* Temp data needed by read/write code. */
278         int temp_index;
279         short versionfile, subversionfile;  /* see BLENDER_VERSION, BLENDER_SUBVERSION, needed for do_versions */
280 } Library;
281
282 enum eIconSizes {
283         ICON_SIZE_ICON = 0,
284         ICON_SIZE_PREVIEW = 1,
285
286         NUM_ICON_SIZES
287 };
288
289 /* for PreviewImage->flag */
290 enum ePreviewImage_Flag {
291         PRV_CHANGED          = (1 << 0),
292         PRV_USER_EDITED      = (1 << 1),  /* if user-edited, do not auto-update this anymore! */
293 };
294
295 /* for PreviewImage->tag */
296 enum  {
297         PRV_TAG_DEFFERED           = (1 << 0),  /* Actual loading of preview is deferred. */
298         PRV_TAG_DEFFERED_RENDERING = (1 << 1),  /* Deferred preview is being loaded. */
299         PRV_TAG_DEFFERED_DELETE    = (1 << 2),  /* Deferred preview should be deleted asap. */
300 };
301
302 typedef struct PreviewImage {
303         /* All values of 2 are really NUM_ICON_SIZES */
304         unsigned int w[2];
305         unsigned int h[2];
306         short flag[2];
307         short changed_timestamp[2];
308         unsigned int *rect[2];
309
310         /* Runtime-only data. */
311         struct GPUTexture *gputexture[2];
312         int icon_id;  /* Used by previews outside of ID context. */
313
314         short tag;  /* Runtime data. */
315         char pad[2];
316 } PreviewImage;
317
318 #define PRV_DEFERRED_DATA(prv) \
319         (CHECK_TYPE_INLINE(prv, PreviewImage *), BLI_assert((prv)->tag & PRV_TAG_DEFFERED), (void *)((prv) + 1))
320
321 /**
322  * Defines for working with IDs.
323  *
324  * The tags represent types! This is a dirty way of enabling RTTI. The
325  * sig_byte end endian defines aren't really used much.
326  *
327  **/
328
329 #ifdef __BIG_ENDIAN__
330    /* big endian */
331 #  define MAKE_ID2(c, d)  ((c) << 8 | (d))
332 #else
333    /* little endian  */
334 #  define MAKE_ID2(c, d)  ((d) << 8 | (c))
335 #endif
336
337 /**
338  * ID from database.
339  *
340  * Written to #BHead.code (for file IO)
341  * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro).
342  */
343 typedef enum ID_Type {
344         ID_SCE  = MAKE_ID2('S', 'C'), /* Scene */
345         ID_LI   = MAKE_ID2('L', 'I'), /* Library */
346         ID_OB   = MAKE_ID2('O', 'B'), /* Object */
347         ID_ME   = MAKE_ID2('M', 'E'), /* Mesh */
348         ID_CU   = MAKE_ID2('C', 'U'), /* Curve */
349         ID_MB   = MAKE_ID2('M', 'B'), /* MetaBall */
350         ID_MA   = MAKE_ID2('M', 'A'), /* Material */
351         ID_TE   = MAKE_ID2('T', 'E'), /* Tex (Texture) */
352         ID_IM   = MAKE_ID2('I', 'M'), /* Image */
353         ID_LT   = MAKE_ID2('L', 'T'), /* Lattice */
354         ID_LA   = MAKE_ID2('L', 'A'), /* Lamp */
355         ID_CA   = MAKE_ID2('C', 'A'), /* Camera */
356         ID_IP   = MAKE_ID2('I', 'P'), /* Ipo (depreciated, replaced by FCurves) */
357         ID_KE   = MAKE_ID2('K', 'E'), /* Key (shape key) */
358         ID_WO   = MAKE_ID2('W', 'O'), /* World */
359         ID_SCR  = MAKE_ID2('S', 'R'), /* Screen */
360         ID_VF   = MAKE_ID2('V', 'F'), /* VFont (Vector Font) */
361         ID_TXT  = MAKE_ID2('T', 'X'), /* Text */
362         ID_SPK  = MAKE_ID2('S', 'K'), /* Speaker */
363         ID_SO   = MAKE_ID2('S', 'O'), /* Sound */
364         ID_GR   = MAKE_ID2('G', 'R'), /* Group */
365         ID_AR   = MAKE_ID2('A', 'R'), /* bArmature */
366         ID_AC   = MAKE_ID2('A', 'C'), /* bAction */
367         ID_NT   = MAKE_ID2('N', 'T'), /* bNodeTree */
368         ID_BR   = MAKE_ID2('B', 'R'), /* Brush */
369         ID_PA   = MAKE_ID2('P', 'A'), /* ParticleSettings */
370         ID_GD   = MAKE_ID2('G', 'D'), /* bGPdata, (Grease Pencil) */
371         ID_WM   = MAKE_ID2('W', 'M'), /* WindowManager */
372         ID_MC   = MAKE_ID2('M', 'C'), /* MovieClip */
373         ID_MSK  = MAKE_ID2('M', 'S'), /* Mask */
374         ID_LS   = MAKE_ID2('L', 'S'), /* FreestyleLineStyle */
375         ID_PAL  = MAKE_ID2('P', 'L'), /* Palette */
376         ID_PC   = MAKE_ID2('P', 'C'), /* PaintCurve  */
377         ID_CF   = MAKE_ID2('C', 'F'), /* CacheFile */
378         ID_WS   = MAKE_ID2('W', 'S'), /* WorkSpace */
379         ID_LP   = MAKE_ID2('L', 'P'), /* LightProbe */
380 } ID_Type;
381
382 /* Only used as 'placeholder' in .blend files for directly linked datablocks. */
383 #define ID_ID       MAKE_ID2('I', 'D') /* (internal use only) */
384
385 /* Deprecated. */
386 #define ID_SCRN     MAKE_ID2('S', 'N')
387
388 /* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */
389 #define ID_SEQ          MAKE_ID2('S', 'Q')
390                         /* constraint */
391 #define ID_CO           MAKE_ID2('C', 'O')
392                         /* pose (action channel, used to be ID_AC in code, so we keep code for backwards compat) */
393 #define ID_PO           MAKE_ID2('A', 'C')
394                         /* used in outliner... */
395 #define ID_NLA          MAKE_ID2('N', 'L')
396                         /* fluidsim Ipo */
397 #define ID_FLUIDSIM     MAKE_ID2('F', 'S')
398
399 #define ID_FAKE_USERS(id) ((((ID *)id)->flag & LIB_FAKEUSER) ? 1 : 0)
400 #define ID_REAL_USERS(id) (((ID *)id)->us - ID_FAKE_USERS(id))
401 #define ID_EXTRA_USERS(id) (((ID *)id)->tag & LIB_TAG_EXTRAUSER ? 1 : 0)
402
403 #define ID_CHECK_UNDO(id) ((GS((id)->name) != ID_SCR) && (GS((id)->name) != ID_WM) && (GS((id)->name) != ID_WS))
404
405 #define ID_BLEND_PATH(_bmain, _id) ((_id)->lib ? (_id)->lib->filepath : BKE_main_blendfile_path((_bmain)))
406 #define ID_BLEND_PATH_FROM_GLOBAL(_id) ((_id)->lib ? (_id)->lib->filepath : BKE_main_blendfile_path_from_global())
407
408 #define ID_MISSING(_id) (((_id)->tag & LIB_TAG_MISSING) != 0)
409
410 #define ID_IS_LINKED(_id) (((ID *)(_id))->lib != NULL)
411
412 #define ID_IS_STATIC_OVERRIDE(_id) (((ID *)(_id))->override_static != NULL && \
413                                     ((ID *)(_id))->override_static->reference != NULL)
414
415 #define ID_IS_STATIC_OVERRIDE_TEMPLATE(_id) (((ID *)(_id))->override_static != NULL && \
416                                              ((ID *)(_id))->override_static->reference == NULL)
417
418 #define ID_IS_STATIC_OVERRIDE_AUTO(_id) (!ID_IS_LINKED((_id)) && \
419                                          ID_IS_STATIC_OVERRIDE((_id)) && \
420                                          (((ID *)(_id))->override_static->flag & STATICOVERRIDE_AUTO))
421
422 /* No copy-on-write for these types.
423  * Keep in sync with check_datablocks_copy_on_writable and deg_copy_on_write_is_needed */
424 #define ID_TYPE_IS_COW(_id_type) \
425         (!ELEM(_id_type, ID_BR, ID_LS, ID_PAL, ID_IM))
426
427 #ifdef GS
428 #  undef GS
429 #endif
430 #define GS(a)   (CHECK_TYPE_ANY(a, char *, const char *, char [66], const char[66]), (ID_Type)(*((const short *)(a))))
431
432 #define ID_NEW_SET(_id, _idn) \
433         (((ID *)(_id))->newid = (ID *)(_idn), ((ID *)(_id))->newid->tag |= LIB_TAG_NEW, (void *)((ID *)(_id))->newid)
434 #define ID_NEW_REMAP(a) if ((a) && (a)->id.newid) (a) = (void *)(a)->id.newid
435
436 /* id->flag (persitent). */
437 enum {
438         LIB_FAKEUSER                = 1 << 9,
439 };
440
441 /**
442  * id->tag (runtime-only).
443  *
444  * Those flags belong to three different categories, which have different expected handling in code:
445  *
446  *   - RESET_BEFORE_USE: piece of code that wants to use such flag has to ensure they are properly 'reset' first.
447  *   - RESET_AFTER_USE: piece of code that wants to use such flag has to ensure they are properly 'reset' after usage
448  *                      (though 'lifetime' of those flags is a bit fuzzy, e.g. _RECALC ones are reset on depsgraph
449  *                       evaluation...).
450  *   - RESET_NEVER: those flags are 'status' one, and never actually need any reset (except on initialization
451  *                  during .blend file reading).
452  */
453 enum {
454         /* RESET_NEVER Datablock is from current .blend file. */
455         LIB_TAG_LOCAL           = 0,
456         /* RESET_NEVER Datablock is from a library, but is used (linked) directly by current .blend file. */
457         LIB_TAG_EXTERN          = 1 << 0,
458         /* RESET_NEVER Datablock is from a library, and is only used (linked) inderectly through other libraries. */
459         LIB_TAG_INDIRECT        = 1 << 1,
460
461         /* RESET_AFTER_USE Three flags used internally in readfile.c, to mark IDs needing to be read (only done once). */
462         LIB_TAG_NEED_EXPAND     = 1 << 3,
463         LIB_TAG_TESTEXT         = (LIB_TAG_NEED_EXPAND | LIB_TAG_EXTERN),
464         LIB_TAG_TESTIND         = (LIB_TAG_NEED_EXPAND | LIB_TAG_INDIRECT),
465         /* RESET_AFTER_USE Flag used internally in readfile.c, to mark IDs needing to be linked from a library. */
466         LIB_TAG_READ            = 1 << 4,
467         /* RESET_AFTER_USE */
468         LIB_TAG_NEED_LINK       = 1 << 5,
469
470         /* RESET_NEVER tag datablock as a place-holder (because the real one could not be linked from its library e.g.). */
471         LIB_TAG_MISSING         = 1 << 6,
472
473         /* RESET_NEVER tag datablock as being up-to-date regarding its reference. */
474         LIB_TAG_OVERRIDESTATIC_REFOK = 1 << 9,
475         /* RESET_NEVER tag datablock as needing an auto-override execution, if enabled. */
476         LIB_TAG_OVERRIDESTATIC_AUTOREFRESH = 1 << 17,
477
478         /* tag datablock has having an extra user. */
479         LIB_TAG_EXTRAUSER       = 1 << 2,
480         /* tag datablock has having actually increased usercount for the extra virtual user. */
481         LIB_TAG_EXTRAUSER_SET   = 1 << 7,
482
483         /* RESET_AFTER_USE tag newly duplicated/copied IDs.
484          * Also used internally in readfile.c to mark datablocks needing do_versions. */
485         LIB_TAG_NEW             = 1 << 8,
486         /* RESET_BEFORE_USE free test flag.
487          * TODO make it a RESET_AFTER_USE too. */
488         LIB_TAG_DOIT            = 1 << 10,
489         /* RESET_AFTER_USE tag existing data before linking so we know what is new. */
490         LIB_TAG_PRE_EXISTING    = 1 << 11,
491
492         /* The datablock is a copy-on-write/localized version. */
493         LIB_TAG_COPIED_ON_WRITE               = 1 << 12,
494         LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT   = 1 << 13,
495         LIB_TAG_LOCALIZED = 1 << 14,
496
497         /* RESET_NEVER tag datablock for freeing etc. behavior (usually set when copying real one into temp/runtime one). */
498         LIB_TAG_NO_MAIN          = 1 << 15,  /* Datablock is not listed in Main database. */
499         LIB_TAG_NO_USER_REFCOUNT = 1 << 16,  /* Datablock does not refcount usages of other IDs. */
500         /* Datablock was not allocated by standard system (BKE_libblock_alloc), do not free its memory
501          * (usual type-specific freeing is called though). */
502         LIB_TAG_NOT_ALLOCATED     = 1 << 17,
503 };
504
505 /* WARNING - when adding flags check on PSYS_RECALC */
506 enum {
507         /* RESET_AFTER_USE, used by update code (depsgraph). */
508         ID_RECALC_NONE  = 0,
509         /* Generic recalc flag, when nothing else matches. */
510         ID_RECALC       = 1 << 0,
511         /* Per-component update flags. */
512         ID_RECALC_ANIMATION   = 1 << 1,
513         ID_RECALC_DRAW        = 1 << 2,
514         ID_RECALC_DRAW_CACHE  = 1 << 3,
515         ID_RECALC_GEOMETRY    = 1 << 4,
516         ID_RECALC_TRANSFORM   = 1 << 5,
517         ID_RECALC_COPY_ON_WRITE = 1 << 6,
518         /* Special flag to check if SOMETHING was changed. */
519         ID_RECALC_ALL   = (~(int)0),
520 };
521
522 /* To filter ID types (filter_id) */
523 /* XXX We cannot put all needed IDs inside an enum...
524  *     We'll have to see whether we can fit all needed ones inside 32 values,
525  *     or if we need to fallback to longlong defines :/
526  */
527 enum {
528         FILTER_ID_AC        = (1 << 0),
529         FILTER_ID_AR        = (1 << 1),
530         FILTER_ID_BR        = (1 << 2),
531         FILTER_ID_CA        = (1 << 3),
532         FILTER_ID_CU        = (1 << 4),
533         FILTER_ID_GD        = (1 << 5),
534         FILTER_ID_GR        = (1 << 6),
535         FILTER_ID_IM        = (1 << 7),
536         FILTER_ID_LA        = (1 << 8),
537         FILTER_ID_LS        = (1 << 9),
538         FILTER_ID_LT        = (1 << 10),
539         FILTER_ID_MA        = (1 << 11),
540         FILTER_ID_MB        = (1 << 12),
541         FILTER_ID_MC        = (1 << 13),
542         FILTER_ID_ME        = (1 << 14),
543         FILTER_ID_MSK       = (1 << 15),
544         FILTER_ID_NT        = (1 << 16),
545         FILTER_ID_OB        = (1 << 17),
546         FILTER_ID_PAL       = (1 << 18),
547         FILTER_ID_PC        = (1 << 19),
548         FILTER_ID_SCE       = (1 << 20),
549         FILTER_ID_SPK       = (1 << 21),
550         FILTER_ID_SO        = (1 << 22),
551         FILTER_ID_TE        = (1 << 23),
552         FILTER_ID_TXT       = (1 << 24),
553         FILTER_ID_VF        = (1 << 25),
554         FILTER_ID_WO        = (1 << 26),
555         FILTER_ID_PA        = (1 << 27),
556         FILTER_ID_CF        = (1 << 28),
557         FILTER_ID_WS        = (1 << 29),
558         FILTER_ID_LP        = (1u << 31),
559 };
560
561 /* IMPORTANT: this enum matches the order currently use in set_listbasepointers,
562  * keep them in sync! */
563 enum {
564         INDEX_ID_LI = 0,
565         INDEX_ID_IP,
566         INDEX_ID_AC,
567         INDEX_ID_KE,
568         INDEX_ID_PAL,
569         INDEX_ID_GD,
570         INDEX_ID_NT,
571         INDEX_ID_IM,
572         INDEX_ID_TE,
573         INDEX_ID_MA,
574         INDEX_ID_VF,
575         INDEX_ID_AR,
576         INDEX_ID_CF,
577         INDEX_ID_ME,
578         INDEX_ID_CU,
579         INDEX_ID_MB,
580         INDEX_ID_LT,
581         INDEX_ID_LA,
582         INDEX_ID_CA,
583         INDEX_ID_TXT,
584         INDEX_ID_SO,
585         INDEX_ID_GR,
586         INDEX_ID_PC,
587         INDEX_ID_BR,
588         INDEX_ID_PA,
589         INDEX_ID_SPK,
590         INDEX_ID_LP,
591         INDEX_ID_WO,
592         INDEX_ID_MC,
593         INDEX_ID_SCR,
594         INDEX_ID_OB,
595         INDEX_ID_LS,
596         INDEX_ID_SCE,
597         INDEX_ID_WS,
598         INDEX_ID_WM,
599         INDEX_ID_MSK,
600         INDEX_ID_NULL,
601         INDEX_ID_MAX,
602 };
603
604 #ifdef __cplusplus
605 }
606 #endif
607
608 #endif