Merge branch 'blender-v2.81-release'
[blender.git] / source / blender / blenkernel / BKE_icons.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2006-2007 Blender Foundation.
17  * All rights reserved.
18  */
19
20 #ifndef __BKE_ICONS_H__
21 #define __BKE_ICONS_H__
22
23 /** \file
24  * \ingroup bke
25  *
26  * Resizable Icons for Blender
27  */
28
29 typedef void (*DrawInfoFreeFP)(void *drawinfo);
30
31 enum {
32   /** ID preview: obj is #ID. */
33   ICON_DATA_ID = 0,
34   /** Preview: obj is #PreviewImage */
35   ICON_DATA_PREVIEW,
36   /** 2D triangles: obj is #Icon_Geom */
37   ICON_DATA_GEOM,
38   /** Studiolight */
39   ICON_DATA_STUDIOLIGHT,
40   /** GPencil Layer color preview (annotations): obj is #bGPDlayer */
41   ICON_DATA_GPLAYER,
42 };
43
44 struct Icon {
45   void *drawinfo;
46   /**
47    * Data defined by #obj_type
48    * \note for #ICON_DATA_GEOM the memory is owned by the icon,
49    * could be made into a flag if we want that to be optional.
50    */
51   void *obj;
52   char obj_type;
53   /** Internal use only. */
54   char flag;
55   /** #ID_Type or 0 when not used for ID preview. */
56   short id_type;
57   DrawInfoFreeFP drawinfo_free;
58 };
59
60 /** Used for #ICON_DATA_GEOM, assigned to #Icon.obj. */
61 struct Icon_Geom {
62   int icon_id;
63   int coords_len;
64   int coords_range[2];
65   const unsigned char (*coords)[2];
66   const unsigned char (*colors)[4];
67   /* when not NULL, the memory of coords and colors is a sub-region of this pointer. */
68   const void *mem;
69 };
70
71 typedef struct Icon Icon;
72
73 struct ID;
74 struct ImBuf;
75 struct PreviewImage;
76 struct StudioLight;
77 struct bGPDlayer;
78
79 enum eIconSizes;
80
81 void BKE_icons_init(int first_dyn_id);
82
83 /* return icon id for library object or create new icon if not found */
84 int BKE_icon_id_ensure(struct ID *id);
85
86 /* return icon id for Grease Pencil layer (color preview) or create new icon if not found */
87 int BKE_icon_gplayer_color_ensure(struct bGPDlayer *gpl);
88
89 int BKE_icon_preview_ensure(struct ID *id, struct PreviewImage *preview);
90
91 /* retrieve icon for id */
92 struct Icon *BKE_icon_get(const int icon_id);
93
94 /* set icon for id if not already defined */
95 /* used for inserting the internal icons */
96 void BKE_icon_set(const int icon_id, struct Icon *icon);
97
98 /* remove icon and free data if library object becomes invalid */
99 void BKE_icon_id_delete(struct ID *id);
100
101 bool BKE_icon_delete(const int icon_id);
102 bool BKE_icon_delete_unmanaged(const int icon_id);
103
104 /* report changes - icon needs to be recalculated */
105 void BKE_icon_changed(const int icon_id);
106
107 /* free all icons */
108 void BKE_icons_free(void);
109
110 /* free all icons marked for deferred deletion */
111 void BKE_icons_deferred_free(void);
112
113 /* free the preview image for use in list */
114 void BKE_previewimg_freefunc(void *link);
115
116 /* free the preview image */
117 void BKE_previewimg_free(struct PreviewImage **prv);
118
119 /* clear the preview image or icon, but does not free it */
120 void BKE_previewimg_clear(struct PreviewImage *prv);
121
122 /* clear the preview image or icon at a specific size */
123 void BKE_previewimg_clear_single(struct PreviewImage *prv, enum eIconSizes size);
124
125 /* get the preview from any pointer */
126 struct PreviewImage **BKE_previewimg_id_get_p(const struct ID *id);
127
128 /* free the preview image belonging to the id */
129 void BKE_previewimg_id_free(struct ID *id);
130
131 /* create a new preview image */
132 struct PreviewImage *BKE_previewimg_create(void);
133
134 /* create a copy of the preview image */
135 struct PreviewImage *BKE_previewimg_copy(const struct PreviewImage *prv);
136
137 void BKE_previewimg_id_copy(struct ID *new_id, const struct ID *old_id);
138
139 /* retrieve existing or create new preview image */
140 struct PreviewImage *BKE_previewimg_id_ensure(struct ID *id);
141
142 void BKE_previewimg_ensure(struct PreviewImage *prv, const int size);
143
144 struct PreviewImage *BKE_previewimg_cached_get(const char *name);
145
146 struct PreviewImage *BKE_previewimg_cached_ensure(const char *name);
147
148 struct PreviewImage *BKE_previewimg_cached_thumbnail_read(const char *name,
149                                                           const char *path,
150                                                           const int source,
151                                                           bool force_update);
152
153 void BKE_previewimg_cached_release(const char *name);
154 void BKE_previewimg_cached_release_pointer(struct PreviewImage *prv);
155
156 int BKE_icon_geom_ensure(struct Icon_Geom *geom);
157 struct Icon_Geom *BKE_icon_geom_from_memory(const uchar *data, size_t data_len);
158 struct Icon_Geom *BKE_icon_geom_from_file(const char *filename);
159
160 struct ImBuf *BKE_icon_geom_rasterize(const struct Icon_Geom *geom,
161                                       const unsigned int size_x,
162                                       const unsigned int size_y);
163
164 int BKE_icon_ensure_studio_light(struct StudioLight *sl, int id_type);
165
166 #define ICON_RENDER_DEFAULT_HEIGHT 32
167
168 #endif /*  __BKE_ICONS_H__ */