Blender V4.3
interface_icons.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "MEM_guardedalloc.h"
10
11#include "GPU_immediate.hh"
12
13#include "BLF_api.hh"
14
15#include "BLI_blenlib.h"
16
21#include "DNA_screen_types.h"
22#include "DNA_sequence_types.h"
23#include "DNA_space_types.h"
24
25#include "RNA_access.hh"
26#include "RNA_prototypes.hh"
27
28#include "BKE_context.hh"
29#include "BKE_global.hh"
30#include "BKE_icons.h"
31#include "BKE_paint.hh"
32#include "BKE_preview_image.hh"
33#include "BKE_studiolight.h"
34
35#include "IMB_imbuf.hh"
36#include "IMB_thumbs.hh"
37
38#include "BIF_glutil.hh"
39
40#include "ED_datafiles.h"
41#include "ED_keyframes_draw.hh"
43#include "ED_render.hh"
44
45#include "UI_interface.hh"
46#include "UI_interface_icons.hh"
47
48#include "WM_api.hh"
49
50#include "interface_intern.hh"
51
52#include "fmt/format.h"
53
54struct IconImage {
55 int w;
56 int h;
60};
61
62using VectorDrawFunc = void (*)(int x, int y, int w, int h, float alpha);
63
64#define ICON_TYPE_PREVIEW 0
65#define ICON_TYPE_SVG_COLOR 1
66#define ICON_TYPE_SVG_MONO 2
67#define ICON_TYPE_BUFFER 3
68#define ICON_TYPE_IMBUF 4
69#define ICON_TYPE_VECTOR 5
70#define ICON_TYPE_GEOM 6
71#define ICON_TYPE_EVENT 7 /* draw keymap entries using custom renderer. */
72#define ICON_TYPE_GPLAYER 8
73#define ICON_TYPE_BLANK 9
74
75struct DrawInfo {
76 int type;
77
78 union {
79 /* type specific data */
80 struct {
83 struct {
87 struct {
90 struct {
93 struct {
94 /* Can be packed into a single int. */
97 int icon;
98 /* Allow lookups. */
102};
103
104struct IconType {
105 int type;
107};
108
109#ifndef WITH_HEADLESS
110
111static const IconType icontypes[] = {
112# define DEF_ICON(name) {ICON_TYPE_SVG_MONO, 0},
113# define DEF_ICON_COLOR(name) {ICON_TYPE_SVG_COLOR, 0},
114# define DEF_ICON_SCENE(name) {ICON_TYPE_SVG_MONO, TH_ICON_SCENE},
115# define DEF_ICON_COLLECTION(name) {ICON_TYPE_SVG_MONO, TH_ICON_COLLECTION},
116# define DEF_ICON_OBJECT(name) {ICON_TYPE_SVG_MONO, TH_ICON_OBJECT},
117# define DEF_ICON_OBJECT_DATA(name) {ICON_TYPE_SVG_MONO, TH_ICON_OBJECT_DATA},
118# define DEF_ICON_MODIFIER(name) {ICON_TYPE_SVG_MONO, TH_ICON_MODIFIER},
119# define DEF_ICON_SHADING(name) {ICON_TYPE_SVG_MONO, TH_ICON_SHADING},
120# define DEF_ICON_FOLDER(name) {ICON_TYPE_SVG_MONO, TH_ICON_FOLDER},
121# define DEF_ICON_FUND(name) {ICON_TYPE_SVG_MONO, TH_ICON_FUND},
122# define DEF_ICON_VECTOR(name) {ICON_TYPE_VECTOR, 0},
123# define DEF_ICON_BLANK(name) {ICON_TYPE_BLANK, 0},
124# include "UI_icons.hh"
125};
126
127/* **************************************************** */
128
130 ImBuf *bbuf, int icon_id, int xofs, int yofs, int size, int type, int theme_color)
131{
132 Icon *new_icon = MEM_cnew<Icon>(__func__);
133
134 new_icon->obj = nullptr; /* icon is not for library object */
135 new_icon->id_type = 0;
136
137 DrawInfo *di = MEM_cnew<DrawInfo>(__func__);
138 di->type = type;
139
140 if (type == ICON_TYPE_SVG_MONO) {
141 di->data.texture.theme_color = theme_color;
142 }
143 else if (type == ICON_TYPE_BUFFER) {
144 IconImage *iimg = MEM_cnew<IconImage>(__func__);
145 iimg->w = size;
146 iimg->h = size;
147
148 /* icon buffers can get initialized runtime now, via datatoc */
149 if (bbuf) {
150 int y, imgsize;
151
152 iimg->rect = static_cast<uint8_t *>(MEM_mallocN(size * size * sizeof(uint), __func__));
153
154 /* Here we store the rect in the icon - same as before */
155 if (size == bbuf->x && size == bbuf->y && xofs == 0 && yofs == 0) {
156 memcpy(iimg->rect, bbuf->byte_buffer.data, size * size * 4 * sizeof(uint8_t));
157 }
158 else {
159 /* this code assumes square images */
160 imgsize = bbuf->x;
161 for (y = 0; y < size; y++) {
162 memcpy(&iimg->rect[y * size],
163 &bbuf->byte_buffer.data[(y + yofs) * imgsize + xofs],
164 size * 4 * sizeof(uint8_t));
165 }
166 }
167 }
168 di->data.buffer.image = iimg;
169 }
170
172 new_icon->drawinfo = di;
173
174 BKE_icon_set(icon_id, new_icon);
175
176 return di;
177}
178
179static void def_internal_vicon(int icon_id, VectorDrawFunc drawFunc)
180{
181 Icon *new_icon = MEM_cnew<Icon>("texicon");
182
183 new_icon->obj = nullptr; /* icon is not for library object */
184 new_icon->id_type = 0;
185
186 DrawInfo *di = MEM_cnew<DrawInfo>("drawinfo");
188 di->data.vector.func = drawFunc;
189
190 new_icon->drawinfo_free = nullptr;
191 new_icon->drawinfo = di;
192
193 BKE_icon_set(icon_id, new_icon);
194}
195
196/* Vector Icon Drawing Routines */
197
198/* Utilities */
199
200static void vicon_keytype_draw_wrapper(const int x,
201 const int y,
202 const int w,
203 const int h,
204 const float alpha,
205 const eBezTriple_KeyframeType key_type,
206 const short handle_type)
207{
208 /* Initialize dummy theme state for Action Editor - where these colors are defined
209 * (since we're doing this off-screen, free from any particular space_id). */
210 bThemeState theme_state;
211
212 UI_Theme_Store(&theme_state);
214
215 /* The "x" and "y" given are the bottom-left coordinates of the icon,
216 * while the #draw_keyframe_shape() function needs the midpoint for the keyframe. */
217 const float xco = x + w / 2 + 0.5f;
218 const float yco = y + h / 2 + 0.5f;
219
221 KeyframeShaderBindings sh_bindings;
224 sh_bindings.color_id = GPU_vertformat_attr_add(
227 format, "outlineColor", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
229
232 immUniform1f("outline_scale", 1.0f);
233 immUniform2f("ViewportSize", -1.0f, -1.0f);
235
236 /* draw keyframe
237 * - size: (default icon size == 16, default dopesheet icon size == 10)
238 * - sel: true unless in handletype icons (so that "keyframe" state shows the iconic yellow icon)
239 */
240 const bool sel = (handle_type == KEYFRAME_HANDLE_NONE);
241
243 yco,
244 (10.0f / 16.0f) * h,
245 sel,
246 key_type,
248 alpha,
249 &sh_bindings,
250 handle_type,
252
253 immEnd();
256
257 UI_Theme_Restore(&theme_state);
258}
259
260static void vicon_keytype_keyframe_draw(int x, int y, int w, int h, float alpha)
261{
263}
264
265static void vicon_keytype_breakdown_draw(int x, int y, int w, int h, float alpha)
266{
268}
269
270static void vicon_keytype_extreme_draw(int x, int y, int w, int h, float alpha)
271{
273}
274
275static void vicon_keytype_jitter_draw(int x, int y, int w, int h, float alpha)
276{
278}
279
280static void vicon_keytype_moving_hold_draw(int x, int y, int w, int h, float alpha)
281{
283}
284
285static void vicon_keytype_generated_draw(int x, int y, int w, int h, float alpha)
286{
288}
289
290static void vicon_handletype_free_draw(int x, int y, int w, int h, float alpha)
291{
293}
294
295static void vicon_handletype_aligned_draw(int x, int y, int w, int h, float alpha)
296{
298}
299
300static void vicon_handletype_vector_draw(int x, int y, int w, int h, float alpha)
301{
303}
304
305static void vicon_handletype_auto_draw(int x, int y, int w, int h, float alpha)
306{
308}
309
310static void vicon_handletype_auto_clamp_draw(int x, int y, int w, int h, float alpha)
311{
313}
314
315static void vicon_colorset_draw(int index, int x, int y, int w, int h, float /*alpha*/)
316{
317 bTheme *btheme = UI_GetTheme();
318 const ThemeWireColor *cs = &btheme->tarm[index];
319
320 /* Draw three bands of color: One per color
321 * x-----a-----b-----c
322 * | N | S | A |
323 * x-----a-----b-----c
324 */
325 const int a = x + w / 3;
326 const int b = x + w / 3 * 2;
327 const int c = x + w;
328
332
333 /* XXX: Include alpha into this... */
334 /* normal */
336 immRecti(pos, x, y, a, y + h);
337
338 /* selected */
340 immRecti(pos, a, y, b, y + h);
341
342 /* active */
344 immRecti(pos, b, y, c, y + h);
345
347}
348
349# define DEF_ICON_VECTOR_COLORSET_DRAW_NTH(prefix, index) \
350 static void vicon_colorset_draw_##prefix(int x, int y, int w, int h, float alpha) \
351 { \
352 vicon_colorset_draw(index, x, y, w, h, alpha); \
353 }
354
375
376# undef DEF_ICON_VECTOR_COLORSET_DRAW_NTH
377
379 short color_tag, int x, int y, int w, int /*h*/, float /*alpha*/)
380{
381 bTheme *btheme = UI_GetTheme();
382 const ThemeCollectionColor *collection_color = &btheme->collection_color[color_tag];
383
384 const float aspect = float(ICON_DEFAULT_WIDTH) / float(w);
385
387 y,
388 ICON_OUTLINER_COLLECTION,
389 aspect,
390 1.0f,
391 0.0f,
392 collection_color->color,
393 btheme->tui.icon_border_intensity > 0.0f,
395}
396
397# define DEF_ICON_COLLECTION_COLOR_DRAW(index, color) \
398 static void vicon_collection_color_draw_##index(int x, int y, int w, int h, float alpha) \
399 { \
400 vicon_collection_color_draw(color, x, y, w, h, alpha); \
401 }
402
411
412# undef DEF_ICON_COLLECTION_COLOR_DRAW
413
415 short color_tag, int x, int y, int w, int /*h*/, float /*alpha*/)
416{
417 bTheme *btheme = UI_GetTheme();
418 const ThemeStripColor *strip_color = &btheme->strip_color[color_tag];
419
420 const float aspect = float(ICON_DEFAULT_WIDTH) / float(w);
421
423 y,
424 ICON_SNAP_FACE,
425 aspect,
426 1.0f,
427 0.0f,
428 strip_color->color,
429 btheme->tui.icon_border_intensity > 0.0f,
431}
432
433# define DEF_ICON_STRIP_COLOR_DRAW(index, color) \
434 static void vicon_strip_color_draw_##index(int x, int y, int w, int h, float alpha) \
435 { \
436 vicon_strip_color_draw(color, x, y, w, h, alpha); \
437 }
438
448
449# undef DEF_ICON_STRIP_COLOR_DRAW
450
451# define ICON_INDIRECT_DATA_ALPHA 0.6f
452
454 int x, int y, int w, int /*h*/, float alpha)
455{
456 const float aspect = float(ICON_DEFAULT_WIDTH) / float(w);
457
459 y,
460 ICON_LIBRARY_DATA_DIRECT,
461 aspect,
463 0.0f,
464 nullptr,
465 false,
467}
468
470 int x, int y, int w, int /*h*/, float alpha)
471{
472 const float aspect = float(ICON_DEFAULT_WIDTH) / float(w);
473
475 y,
476 ICON_LIBRARY_DATA_OVERRIDE,
477 aspect,
478 ICON_INDIRECT_DATA_ALPHA * alpha * 0.75f,
479 0.0f,
480 nullptr,
481 false,
483}
484
486 short color_tag, int x, int y, int w, int /*h*/, float /*alpha*/)
487{
488 bTheme *btheme = UI_GetTheme();
489 const ThemeCollectionColor *layergroup_color = &btheme->collection_color[color_tag];
490
491 const float aspect = float(ICON_DEFAULT_WIDTH) / float(w);
492
494 y,
495 ICON_GREASEPENCIL_LAYER_GROUP,
496 aspect,
497 1.0f,
498 0.0f,
499 layergroup_color->color,
500 btheme->tui.icon_border_intensity > 0.0f,
502}
503
504# define DEF_ICON_LAYERGROUP_COLOR_DRAW(index, color) \
505 static void vicon_layergroup_color_draw_##index(int x, int y, int w, int h, float alpha) \
506 { \
507 vicon_layergroup_color_draw(color, x, y, w, h, alpha); \
508 }
509
518
519# undef DEF_ICON_LAYERGROUP_COLOR_DRAW
520/* Dynamically render icon instead of rendering a plain color to a texture/buffer
521 * This is not strictly a "vicon", as it needs access to icon->obj to get the color info,
522 * but it works in a very similar way.
523 */
524static void vicon_gplayer_color_draw(Icon *icon, int x, int y, int w, int h)
525{
526 bGPDlayer *gpl = (bGPDlayer *)icon->obj;
527
528 /* Just draw a colored rect - Like for vicon_colorset_draw() */
529 /* TODO: Make this have rounded corners, and maybe be a bit smaller.
530 * However, UI_draw_roundbox_aa() draws the colors too dark, so can't be used.
531 */
535
537 immRecti(pos, x, y, x + w - 1, y + h - 1);
538
540}
541
542static DrawInfo *g_di_event_list = nullptr;
543
544int UI_icon_from_event_type(short event_type, short event_value)
545{
546 if (event_type == EVT_RIGHTSHIFTKEY) {
547 event_type = EVT_LEFTSHIFTKEY;
548 }
549 else if (event_type == EVT_RIGHTCTRLKEY) {
550 event_type = EVT_LEFTCTRLKEY;
551 }
552 else if (event_type == EVT_RIGHTALTKEY) {
553 event_type = EVT_LEFTALTKEY;
554 }
555
557 do {
558 if (di->data.input.event_type == event_type) {
559 return di->data.input.icon;
560 }
561 } while ((di = di->data.input.next));
562
563 if (event_type == LEFTMOUSE) {
564 if (event_value == KM_DBL_CLICK) {
565 return ICON_MOUSE_LMB_2X;
566 }
567 return (event_value == KM_CLICK_DRAG) ? ICON_MOUSE_LMB_DRAG : ICON_MOUSE_LMB;
568 }
569 if (event_type == MIDDLEMOUSE) {
570 return (event_value == KM_CLICK_DRAG) ? ICON_MOUSE_MMB_DRAG : ICON_MOUSE_MMB;
571 }
572 if (event_type == RIGHTMOUSE) {
573 return (event_value == KM_CLICK_DRAG) ? ICON_MOUSE_MMB_DRAG : ICON_MOUSE_RMB;
574 }
575
576 return ICON_NONE;
577}
578
579int UI_icon_from_keymap_item(const wmKeyMapItem *kmi, int r_icon_mod[4])
580{
581 if (r_icon_mod) {
582 memset(r_icon_mod, 0x0, sizeof(int[4]));
583 int i = 0;
584 if (!ELEM(kmi->ctrl, KM_NOTHING, KM_ANY)) {
585 r_icon_mod[i++] = ICON_EVENT_CTRL;
586 }
587 if (!ELEM(kmi->alt, KM_NOTHING, KM_ANY)) {
588 r_icon_mod[i++] = ICON_EVENT_ALT;
589 }
590 if (!ELEM(kmi->shift, KM_NOTHING, KM_ANY)) {
591 r_icon_mod[i++] = ICON_EVENT_SHIFT;
592 }
593 if (!ELEM(kmi->oskey, KM_NOTHING, KM_ANY)) {
594 r_icon_mod[i++] = ICON_EVENT_OS;
595 }
596 }
597 return UI_icon_from_event_type(kmi->type, kmi->val);
598}
599
600static void init_event_icons()
601{
602 DrawInfo *di_next = nullptr;
603
604# define INIT_EVENT_ICON(icon_id, type, value) \
605 { \
606 DrawInfo *di = def_internal_icon(nullptr, icon_id, 0, 0, w, ICON_TYPE_EVENT, 0); \
607 di->data.input.event_type = type; \
608 di->data.input.event_value = value; \
609 di->data.input.icon = icon_id; \
610 di->data.input.next = di_next; \
611 di_next = di; \
612 } \
613 ((void)0)
614 /* end INIT_EVENT_ICON */
615
616 const int w = 16; /* DUMMY */
617
618 INIT_EVENT_ICON(ICON_EVENT_A, EVT_AKEY, KM_ANY);
619 INIT_EVENT_ICON(ICON_EVENT_B, EVT_BKEY, KM_ANY);
620 INIT_EVENT_ICON(ICON_EVENT_C, EVT_CKEY, KM_ANY);
621 INIT_EVENT_ICON(ICON_EVENT_D, EVT_DKEY, KM_ANY);
622 INIT_EVENT_ICON(ICON_EVENT_E, EVT_EKEY, KM_ANY);
623 INIT_EVENT_ICON(ICON_EVENT_F, EVT_FKEY, KM_ANY);
624 INIT_EVENT_ICON(ICON_EVENT_G, EVT_GKEY, KM_ANY);
625 INIT_EVENT_ICON(ICON_EVENT_H, EVT_HKEY, KM_ANY);
626 INIT_EVENT_ICON(ICON_EVENT_I, EVT_IKEY, KM_ANY);
627 INIT_EVENT_ICON(ICON_EVENT_J, EVT_JKEY, KM_ANY);
628 INIT_EVENT_ICON(ICON_EVENT_K, EVT_KKEY, KM_ANY);
629 INIT_EVENT_ICON(ICON_EVENT_L, EVT_LKEY, KM_ANY);
630 INIT_EVENT_ICON(ICON_EVENT_M, EVT_MKEY, KM_ANY);
631 INIT_EVENT_ICON(ICON_EVENT_N, EVT_NKEY, KM_ANY);
632 INIT_EVENT_ICON(ICON_EVENT_O, EVT_OKEY, KM_ANY);
633 INIT_EVENT_ICON(ICON_EVENT_P, EVT_PKEY, KM_ANY);
634 INIT_EVENT_ICON(ICON_EVENT_Q, EVT_QKEY, KM_ANY);
635 INIT_EVENT_ICON(ICON_EVENT_R, EVT_RKEY, KM_ANY);
636 INIT_EVENT_ICON(ICON_EVENT_S, EVT_SKEY, KM_ANY);
637 INIT_EVENT_ICON(ICON_EVENT_T, EVT_TKEY, KM_ANY);
638 INIT_EVENT_ICON(ICON_EVENT_U, EVT_UKEY, KM_ANY);
639 INIT_EVENT_ICON(ICON_EVENT_V, EVT_VKEY, KM_ANY);
640 INIT_EVENT_ICON(ICON_EVENT_W, EVT_WKEY, KM_ANY);
641 INIT_EVENT_ICON(ICON_EVENT_X, EVT_XKEY, KM_ANY);
642 INIT_EVENT_ICON(ICON_EVENT_Y, EVT_YKEY, KM_ANY);
643 INIT_EVENT_ICON(ICON_EVENT_Z, EVT_ZKEY, KM_ANY);
644 INIT_EVENT_ICON(ICON_EVENT_SHIFT, EVT_LEFTSHIFTKEY, KM_ANY);
645 INIT_EVENT_ICON(ICON_EVENT_CTRL, EVT_LEFTCTRLKEY, KM_ANY);
646 INIT_EVENT_ICON(ICON_EVENT_ALT, EVT_LEFTALTKEY, KM_ANY);
647 INIT_EVENT_ICON(ICON_EVENT_OS, EVT_OSKEY, KM_ANY);
648 INIT_EVENT_ICON(ICON_EVENT_F1, EVT_F1KEY, KM_ANY);
649 INIT_EVENT_ICON(ICON_EVENT_F2, EVT_F2KEY, KM_ANY);
650 INIT_EVENT_ICON(ICON_EVENT_F3, EVT_F3KEY, KM_ANY);
651 INIT_EVENT_ICON(ICON_EVENT_F4, EVT_F4KEY, KM_ANY);
652 INIT_EVENT_ICON(ICON_EVENT_F5, EVT_F5KEY, KM_ANY);
653 INIT_EVENT_ICON(ICON_EVENT_F6, EVT_F6KEY, KM_ANY);
654 INIT_EVENT_ICON(ICON_EVENT_F7, EVT_F7KEY, KM_ANY);
655 INIT_EVENT_ICON(ICON_EVENT_F8, EVT_F8KEY, KM_ANY);
656 INIT_EVENT_ICON(ICON_EVENT_F9, EVT_F9KEY, KM_ANY);
657 INIT_EVENT_ICON(ICON_EVENT_F10, EVT_F10KEY, KM_ANY);
658 INIT_EVENT_ICON(ICON_EVENT_F11, EVT_F11KEY, KM_ANY);
659 INIT_EVENT_ICON(ICON_EVENT_F12, EVT_F12KEY, KM_ANY);
660 INIT_EVENT_ICON(ICON_EVENT_ESC, EVT_ESCKEY, KM_ANY);
661 INIT_EVENT_ICON(ICON_EVENT_TAB, EVT_TABKEY, KM_ANY);
662 INIT_EVENT_ICON(ICON_EVENT_PAGEUP, EVT_PAGEUPKEY, KM_ANY);
663 INIT_EVENT_ICON(ICON_EVENT_PAGEDOWN, EVT_PAGEDOWNKEY, KM_ANY);
664 INIT_EVENT_ICON(ICON_EVENT_RETURN, EVT_RETKEY, KM_ANY);
665 INIT_EVENT_ICON(ICON_EVENT_SPACEKEY, EVT_SPACEKEY, KM_ANY);
666
667 INIT_EVENT_ICON(ICON_EVENT_ZEROKEY, EVT_ZEROKEY, KM_ANY);
668 INIT_EVENT_ICON(ICON_EVENT_ONEKEY, EVT_ONEKEY, KM_ANY);
669 INIT_EVENT_ICON(ICON_EVENT_TWOKEY, EVT_TWOKEY, KM_ANY);
670 INIT_EVENT_ICON(ICON_EVENT_THREEKEY, EVT_THREEKEY, KM_ANY);
671 INIT_EVENT_ICON(ICON_EVENT_FOURKEY, EVT_FOURKEY, KM_ANY);
672 INIT_EVENT_ICON(ICON_EVENT_FIVEKEY, EVT_FIVEKEY, KM_ANY);
673 INIT_EVENT_ICON(ICON_EVENT_SIXKEY, EVT_SIXKEY, KM_ANY);
674 INIT_EVENT_ICON(ICON_EVENT_SEVENKEY, EVT_SEVENKEY, KM_ANY);
675 INIT_EVENT_ICON(ICON_EVENT_EIGHTKEY, EVT_EIGHTKEY, KM_ANY);
676 INIT_EVENT_ICON(ICON_EVENT_NINEKEY, EVT_NINEKEY, KM_ANY);
677
678 INIT_EVENT_ICON(ICON_EVENT_PAD0, EVT_PAD0, KM_ANY);
679 INIT_EVENT_ICON(ICON_EVENT_PAD1, EVT_PAD1, KM_ANY);
680 INIT_EVENT_ICON(ICON_EVENT_PAD2, EVT_PAD2, KM_ANY);
681 INIT_EVENT_ICON(ICON_EVENT_PAD3, EVT_PAD3, KM_ANY);
682 INIT_EVENT_ICON(ICON_EVENT_PAD4, EVT_PAD4, KM_ANY);
683 INIT_EVENT_ICON(ICON_EVENT_PAD5, EVT_PAD5, KM_ANY);
684 INIT_EVENT_ICON(ICON_EVENT_PAD6, EVT_PAD6, KM_ANY);
685 INIT_EVENT_ICON(ICON_EVENT_PAD7, EVT_PAD7, KM_ANY);
686 INIT_EVENT_ICON(ICON_EVENT_PAD8, EVT_PAD8, KM_ANY);
687 INIT_EVENT_ICON(ICON_EVENT_PAD9, EVT_PAD9, KM_ANY);
688 INIT_EVENT_ICON(ICON_EVENT_PADASTER, EVT_PADASTERKEY, KM_ANY);
689 INIT_EVENT_ICON(ICON_EVENT_PADSLASH, EVT_PADSLASHKEY, KM_ANY);
690 INIT_EVENT_ICON(ICON_EVENT_PADMINUS, EVT_PADMINUS, KM_ANY);
691 INIT_EVENT_ICON(ICON_EVENT_PADENTER, EVT_PADENTER, KM_ANY);
692 INIT_EVENT_ICON(ICON_EVENT_PADPLUS, EVT_PADPLUSKEY, KM_ANY);
693 INIT_EVENT_ICON(ICON_EVENT_PADPERIOD, EVT_PADPERIOD, KM_ANY);
694
695 INIT_EVENT_ICON(ICON_EVENT_MOUSE_4, BUTTON4MOUSE, KM_ANY);
696 INIT_EVENT_ICON(ICON_EVENT_MOUSE_5, BUTTON5MOUSE, KM_ANY);
697 INIT_EVENT_ICON(ICON_EVENT_MOUSE_6, BUTTON6MOUSE, KM_ANY);
698 INIT_EVENT_ICON(ICON_EVENT_MOUSE_7, BUTTON7MOUSE, KM_ANY);
699 INIT_EVENT_ICON(ICON_EVENT_TABLET_STYLUS, TABLET_STYLUS, KM_ANY);
700 INIT_EVENT_ICON(ICON_EVENT_TABLET_ERASER, TABLET_ERASER, KM_ANY);
701 INIT_EVENT_ICON(ICON_EVENT_LEFT_ARROW, EVT_LEFTARROWKEY, KM_ANY);
702 INIT_EVENT_ICON(ICON_EVENT_DOWN_ARROW, EVT_DOWNARROWKEY, KM_ANY);
703 INIT_EVENT_ICON(ICON_EVENT_RIGHT_ARROW, EVT_RIGHTARROWKEY, KM_ANY);
704 INIT_EVENT_ICON(ICON_EVENT_UP_ARROW, EVT_UPARROWKEY, KM_ANY);
705 INIT_EVENT_ICON(ICON_EVENT_PAUSE, EVT_PAUSEKEY, KM_ANY);
706 INIT_EVENT_ICON(ICON_EVENT_INSERT, EVT_INSERTKEY, KM_ANY);
707 INIT_EVENT_ICON(ICON_EVENT_HOME, EVT_HOMEKEY, KM_ANY);
708 INIT_EVENT_ICON(ICON_EVENT_END, EVT_ENDKEY, KM_ANY);
709 INIT_EVENT_ICON(ICON_EVENT_UNKNOWN, EVT_UNKNOWNKEY, KM_ANY);
710 INIT_EVENT_ICON(ICON_EVENT_GRLESS, EVT_GRLESSKEY, KM_ANY);
711 INIT_EVENT_ICON(ICON_EVENT_MEDIAPLAY, EVT_MEDIAPLAY, KM_ANY);
712 INIT_EVENT_ICON(ICON_EVENT_MEDIASTOP, EVT_MEDIASTOP, KM_ANY);
713 INIT_EVENT_ICON(ICON_EVENT_MEDIAFIRST, EVT_MEDIAFIRST, KM_ANY);
714 INIT_EVENT_ICON(ICON_EVENT_MEDIALAST, EVT_MEDIALAST, KM_ANY);
715 INIT_EVENT_ICON(ICON_EVENT_APP, EVT_APPKEY, KM_ANY);
716 INIT_EVENT_ICON(ICON_EVENT_CAPSLOCK, EVT_CAPSLOCKKEY, KM_ANY);
717 INIT_EVENT_ICON(ICON_EVENT_BACKSPACE, EVT_BACKSPACEKEY, KM_ANY);
718 INIT_EVENT_ICON(ICON_EVENT_DEL, EVT_DELKEY, KM_ANY);
719 INIT_EVENT_ICON(ICON_EVENT_SEMICOLON, EVT_SEMICOLONKEY, KM_ANY);
720 INIT_EVENT_ICON(ICON_EVENT_PERIOD, EVT_PERIODKEY, KM_ANY);
721 INIT_EVENT_ICON(ICON_EVENT_COMMA, EVT_COMMAKEY, KM_ANY);
722 INIT_EVENT_ICON(ICON_EVENT_QUOTE, EVT_QUOTEKEY, KM_ANY);
723 INIT_EVENT_ICON(ICON_EVENT_ACCENTGRAVE, EVT_ACCENTGRAVEKEY, KM_ANY);
724 INIT_EVENT_ICON(ICON_EVENT_MINUS, EVT_MINUSKEY, KM_ANY);
725 INIT_EVENT_ICON(ICON_EVENT_PLUS, EVT_PLUSKEY, KM_ANY);
726 INIT_EVENT_ICON(ICON_EVENT_SLASH, EVT_SLASHKEY, KM_ANY);
727 INIT_EVENT_ICON(ICON_EVENT_BACKSLASH, EVT_BACKSLASHKEY, KM_ANY);
728 INIT_EVENT_ICON(ICON_EVENT_EQUAL, EVT_EQUALKEY, KM_ANY);
729 INIT_EVENT_ICON(ICON_EVENT_LEFTBRACKET, EVT_LEFTBRACKETKEY, KM_ANY);
730 INIT_EVENT_ICON(ICON_EVENT_RIGHTBRACKET, EVT_RIGHTBRACKETKEY, KM_ANY);
731
732 INIT_EVENT_ICON(ICON_EVENT_F13, EVT_F13KEY, KM_ANY);
733 INIT_EVENT_ICON(ICON_EVENT_F14, EVT_F14KEY, KM_ANY);
734 INIT_EVENT_ICON(ICON_EVENT_F15, EVT_F15KEY, KM_ANY);
735 INIT_EVENT_ICON(ICON_EVENT_F16, EVT_F16KEY, KM_ANY);
736 INIT_EVENT_ICON(ICON_EVENT_F17, EVT_F17KEY, KM_ANY);
737 INIT_EVENT_ICON(ICON_EVENT_F18, EVT_F18KEY, KM_ANY);
738 INIT_EVENT_ICON(ICON_EVENT_F19, EVT_F19KEY, KM_ANY);
739 INIT_EVENT_ICON(ICON_EVENT_F20, EVT_F20KEY, KM_ANY);
740 INIT_EVENT_ICON(ICON_EVENT_F21, EVT_F21KEY, KM_ANY);
741 INIT_EVENT_ICON(ICON_EVENT_F22, EVT_F22KEY, KM_ANY);
742 INIT_EVENT_ICON(ICON_EVENT_F23, EVT_F23KEY, KM_ANY);
743 INIT_EVENT_ICON(ICON_EVENT_F24, EVT_F24KEY, KM_ANY);
744
745 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_V1, NDOF_BUTTON_V1, KM_ANY);
746 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_V2, NDOF_BUTTON_V2, KM_ANY);
747 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_V3, NDOF_BUTTON_V3, KM_ANY);
748 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_SAVE_V1, NDOF_BUTTON_SAVE_V1, KM_ANY);
749 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_SAVE_V2, NDOF_BUTTON_SAVE_V2, KM_ANY);
750 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_SAVE_V3, NDOF_BUTTON_SAVE_V3, KM_ANY);
751 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_1, NDOF_BUTTON_1, KM_ANY);
752 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_2, NDOF_BUTTON_2, KM_ANY);
753 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_3, NDOF_BUTTON_3, KM_ANY);
754 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_4, NDOF_BUTTON_4, KM_ANY);
755 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_5, NDOF_BUTTON_5, KM_ANY);
756 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_6, NDOF_BUTTON_6, KM_ANY);
757 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_7, NDOF_BUTTON_7, KM_ANY);
758 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_8, NDOF_BUTTON_8, KM_ANY);
759 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_9, NDOF_BUTTON_9, KM_ANY);
760 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_10, NDOF_BUTTON_10, KM_ANY);
761 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_11, NDOF_BUTTON_11, KM_ANY);
762 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_12, NDOF_BUTTON_12, KM_ANY);
763 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_MENU, NDOF_BUTTON_MENU, KM_ANY);
764 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_FIT, NDOF_BUTTON_FIT, KM_ANY);
765 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_TOP, NDOF_BUTTON_TOP, KM_ANY);
766 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_BOTTOM, NDOF_BUTTON_BOTTOM, KM_ANY);
767 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_LEFT, NDOF_BUTTON_LEFT, KM_ANY);
768 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_RIGHT, NDOF_BUTTON_RIGHT, KM_ANY);
769 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_FRONT, NDOF_BUTTON_FRONT, KM_ANY);
770 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_BACK, NDOF_BUTTON_BACK, KM_ANY);
771 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_ISO1, NDOF_BUTTON_ISO1, KM_ANY);
772 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_ISO2, NDOF_BUTTON_ISO2, KM_ANY);
773 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_ROLL_CW, NDOF_BUTTON_ROLL_CW, KM_ANY);
774 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_ROLL_CCW, NDOF_BUTTON_ROLL_CCW, KM_ANY);
775 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_SPIN_CW, NDOF_BUTTON_SPIN_CW, KM_ANY);
776 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_SPIN_CCW, NDOF_BUTTON_SPIN_CCW, KM_ANY);
777 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_TILT_CW, NDOF_BUTTON_TILT_CW, KM_ANY);
778 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_TILT_CCW, NDOF_BUTTON_TILT_CCW, KM_ANY);
779 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_ROTATE, NDOF_BUTTON_ROTATE, KM_ANY);
780 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_PANZOOM, NDOF_BUTTON_PANZOOM, KM_ANY);
781 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_DOMINANT, NDOF_BUTTON_DOMINANT, KM_ANY);
782 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_PLUS, NDOF_BUTTON_PLUS, KM_ANY);
783 INIT_EVENT_ICON(ICON_EVENT_NDOF_BUTTON_MINUS, NDOF_BUTTON_MINUS, KM_ANY);
784
785 g_di_event_list = di_next;
786
787# undef INIT_EVENT_ICON
788}
789
791{
792 /* if it has own rect, things are all OK */
793 if (iimg->rect) {
794 return;
795 }
796
797 if (iimg->datatoc_rect) {
799 iimg->datatoc_rect, iimg->datatoc_size, IB_rect, nullptr, "<matcap icon>");
800 /* w and h were set on initialize */
801 if (bbuf->x != iimg->h && bbuf->y != iimg->w) {
802 IMB_scale(bbuf, iimg->w, iimg->h, IMBScaleFilter::Box, false);
803 }
804
805 iimg->rect = IMB_steal_byte_buffer(bbuf);
806 IMB_freeImBuf(bbuf);
807 }
808}
809
811{
812 /* Define icons. */
813 for (int x = ICON_NONE; x < ICON_BLANK_LAST_SVG_ITEM; x++) {
814 const IconType icontype = icontypes[x];
816 continue;
817 }
818 def_internal_icon(nullptr, x, 0, 0, 0, icontype.type, icontype.theme_color);
819 }
820
821 def_internal_vicon(ICON_KEYTYPE_KEYFRAME_VEC, vicon_keytype_keyframe_draw);
822 def_internal_vicon(ICON_KEYTYPE_BREAKDOWN_VEC, vicon_keytype_breakdown_draw);
823 def_internal_vicon(ICON_KEYTYPE_EXTREME_VEC, vicon_keytype_extreme_draw);
824 def_internal_vicon(ICON_KEYTYPE_JITTER_VEC, vicon_keytype_jitter_draw);
825 def_internal_vicon(ICON_KEYTYPE_MOVING_HOLD_VEC, vicon_keytype_moving_hold_draw);
826 def_internal_vicon(ICON_KEYTYPE_GENERATED_VEC, vicon_keytype_generated_draw);
827
828 def_internal_vicon(ICON_HANDLETYPE_FREE_VEC, vicon_handletype_free_draw);
829 def_internal_vicon(ICON_HANDLETYPE_ALIGNED_VEC, vicon_handletype_aligned_draw);
830 def_internal_vicon(ICON_HANDLETYPE_VECTOR_VEC, vicon_handletype_vector_draw);
831 def_internal_vicon(ICON_HANDLETYPE_AUTO_VEC, vicon_handletype_auto_draw);
832 def_internal_vicon(ICON_HANDLETYPE_AUTO_CLAMP_VEC, vicon_handletype_auto_clamp_draw);
833
834 def_internal_vicon(ICON_COLORSET_01_VEC, vicon_colorset_draw_01);
835 def_internal_vicon(ICON_COLORSET_02_VEC, vicon_colorset_draw_02);
836 def_internal_vicon(ICON_COLORSET_03_VEC, vicon_colorset_draw_03);
837 def_internal_vicon(ICON_COLORSET_04_VEC, vicon_colorset_draw_04);
838 def_internal_vicon(ICON_COLORSET_05_VEC, vicon_colorset_draw_05);
839 def_internal_vicon(ICON_COLORSET_06_VEC, vicon_colorset_draw_06);
840 def_internal_vicon(ICON_COLORSET_07_VEC, vicon_colorset_draw_07);
841 def_internal_vicon(ICON_COLORSET_08_VEC, vicon_colorset_draw_08);
842 def_internal_vicon(ICON_COLORSET_09_VEC, vicon_colorset_draw_09);
843 def_internal_vicon(ICON_COLORSET_10_VEC, vicon_colorset_draw_10);
844 def_internal_vicon(ICON_COLORSET_11_VEC, vicon_colorset_draw_11);
845 def_internal_vicon(ICON_COLORSET_12_VEC, vicon_colorset_draw_12);
846 def_internal_vicon(ICON_COLORSET_13_VEC, vicon_colorset_draw_13);
847 def_internal_vicon(ICON_COLORSET_14_VEC, vicon_colorset_draw_14);
848 def_internal_vicon(ICON_COLORSET_15_VEC, vicon_colorset_draw_15);
849 def_internal_vicon(ICON_COLORSET_16_VEC, vicon_colorset_draw_16);
850 def_internal_vicon(ICON_COLORSET_17_VEC, vicon_colorset_draw_17);
851 def_internal_vicon(ICON_COLORSET_18_VEC, vicon_colorset_draw_18);
852 def_internal_vicon(ICON_COLORSET_19_VEC, vicon_colorset_draw_19);
853 def_internal_vicon(ICON_COLORSET_20_VEC, vicon_colorset_draw_20);
854
855 def_internal_vicon(ICON_COLLECTION_COLOR_01, vicon_collection_color_draw_01);
856 def_internal_vicon(ICON_COLLECTION_COLOR_02, vicon_collection_color_draw_02);
857 def_internal_vicon(ICON_COLLECTION_COLOR_03, vicon_collection_color_draw_03);
858 def_internal_vicon(ICON_COLLECTION_COLOR_04, vicon_collection_color_draw_04);
859 def_internal_vicon(ICON_COLLECTION_COLOR_05, vicon_collection_color_draw_05);
860 def_internal_vicon(ICON_COLLECTION_COLOR_06, vicon_collection_color_draw_06);
861 def_internal_vicon(ICON_COLLECTION_COLOR_07, vicon_collection_color_draw_07);
862 def_internal_vicon(ICON_COLLECTION_COLOR_08, vicon_collection_color_draw_08);
863
864 def_internal_vicon(ICON_SEQUENCE_COLOR_01, vicon_strip_color_draw_01);
865 def_internal_vicon(ICON_SEQUENCE_COLOR_02, vicon_strip_color_draw_02);
866 def_internal_vicon(ICON_SEQUENCE_COLOR_03, vicon_strip_color_draw_03);
867 def_internal_vicon(ICON_SEQUENCE_COLOR_04, vicon_strip_color_draw_04);
868 def_internal_vicon(ICON_SEQUENCE_COLOR_05, vicon_strip_color_draw_05);
869 def_internal_vicon(ICON_SEQUENCE_COLOR_06, vicon_strip_color_draw_06);
870 def_internal_vicon(ICON_SEQUENCE_COLOR_07, vicon_strip_color_draw_07);
871 def_internal_vicon(ICON_SEQUENCE_COLOR_08, vicon_strip_color_draw_08);
872 def_internal_vicon(ICON_SEQUENCE_COLOR_09, vicon_strip_color_draw_09);
873
875 def_internal_vicon(ICON_LIBRARY_DATA_OVERRIDE_NONEDITABLE,
877
878 def_internal_vicon(ICON_LAYERGROUP_COLOR_01, vicon_layergroup_color_draw_01);
879 def_internal_vicon(ICON_LAYERGROUP_COLOR_02, vicon_layergroup_color_draw_02);
880 def_internal_vicon(ICON_LAYERGROUP_COLOR_03, vicon_layergroup_color_draw_03);
881 def_internal_vicon(ICON_LAYERGROUP_COLOR_04, vicon_layergroup_color_draw_04);
882 def_internal_vicon(ICON_LAYERGROUP_COLOR_05, vicon_layergroup_color_draw_05);
883 def_internal_vicon(ICON_LAYERGROUP_COLOR_06, vicon_layergroup_color_draw_06);
884 def_internal_vicon(ICON_LAYERGROUP_COLOR_07, vicon_layergroup_color_draw_07);
885 def_internal_vicon(ICON_LAYERGROUP_COLOR_08, vicon_layergroup_color_draw_08);
886}
887
888#else
889
890#endif /* WITH_HEADLESS */
891
897
898void UI_icons_free_drawinfo(void *drawinfo)
899{
900 DrawInfo *di = static_cast<DrawInfo *>(drawinfo);
901
902 if (di == nullptr) {
903 return;
904 }
905
906 if (di->type == ICON_TYPE_BUFFER) {
907 if (di->data.buffer.image) {
908 if (di->data.buffer.image->rect) {
910 }
912 }
913 }
914 else if (di->type == ICON_TYPE_GEOM) {
915 if (di->data.geom.image_cache) {
917 }
918 }
919
920 MEM_freeN(di);
921}
922
927{
928 const int icon_data_type = icon->obj_type;
929
930 DrawInfo *di = MEM_cnew<DrawInfo>("di_icon");
931
932 if (ELEM(icon_data_type, ICON_DATA_ID, ICON_DATA_PREVIEW)) {
934 }
935 else if (icon_data_type == ICON_DATA_IMBUF) {
936 di->type = ICON_TYPE_IMBUF;
937 }
938 else if (icon_data_type == ICON_DATA_GEOM) {
939 di->type = ICON_TYPE_GEOM;
940 }
941 else if (icon_data_type == ICON_DATA_STUDIOLIGHT) {
943 }
944 else if (icon_data_type == ICON_DATA_GPLAYER) {
946 }
947 else {
948 BLI_assert(0);
949 }
950
951 return di;
952}
953
955{
956 if (icon->drawinfo) {
957 return static_cast<DrawInfo *>(icon->drawinfo);
958 }
959 DrawInfo *di = icon_create_drawinfo(icon);
960 icon->drawinfo = di;
962 return di;
963}
964
966{
967 Icon *icon = BKE_icon_get(icon_id);
968 if (icon == nullptr) {
969 return false;
970 }
971
972 DrawInfo *di = icon_ensure_drawinfo(icon);
974}
975
977{
978#ifndef WITH_HEADLESS
981#endif
982}
983
985{
986 switch (size) {
987 case ICON_SIZE_ICON:
991 default:
992 return 0;
993 }
994}
995
996/* Create rect for the icon
997 */
998static void icon_create_rect(PreviewImage *prv_img, enum eIconSizes size)
999{
1000 const uint render_size = UI_icon_preview_to_render_size(size);
1001
1002 if (!prv_img) {
1003 if (G.debug & G_DEBUG) {
1004 printf("%s, error: requested preview image does not exist", __func__);
1005 }
1006 }
1007 else if (!prv_img->rect[size]) {
1008 prv_img->w[size] = render_size;
1009 prv_img->h[size] = render_size;
1010 prv_img->flag[size] |= PRV_CHANGED;
1011 prv_img->changed_timestamp[size] = 0;
1012 prv_img->rect[size] = static_cast<uint *>(
1013 MEM_callocN(render_size * render_size * sizeof(uint), "prv_rect"));
1014 }
1015}
1016
1018 const bContext *C, Scene *scene, ID *id, PreviewImage *pi, int size, const bool use_job);
1019
1020static void ui_studiolight_icon_job_exec(void *customdata, wmJobWorkerStatus * /*worker_status*/)
1021{
1022 Icon **tmp = (Icon **)customdata;
1023 Icon *icon = *tmp;
1024 DrawInfo *di = icon_ensure_drawinfo(icon);
1025 StudioLight *sl = static_cast<StudioLight *>(icon->obj);
1027 reinterpret_cast<uint *>(di->data.buffer.image->rect), sl, icon->id_type);
1028}
1029
1031{
1032 Icon *icon = BKE_icon_get(icon_id);
1034 icon->obj = nullptr;
1035}
1036
1038{
1039 wmWindowManager *wm = static_cast<wmWindowManager *>(data);
1040
1041 /* Happens if job was canceled or already finished. */
1042 if (wm == nullptr) {
1043 return;
1044 }
1045
1046 /* get icons_id, get icons and kill wm jobs */
1047 if (sl->icon_id_radiance) {
1049 }
1050 if (sl->icon_id_irradiance) {
1052 }
1053 if (sl->icon_id_matcap) {
1055 }
1056 if (sl->icon_id_matcap_flipped) {
1058 }
1059}
1060
1061static void ui_studiolight_icon_job_end(void *customdata)
1062{
1063 Icon **tmp = (Icon **)customdata;
1064 Icon *icon = *tmp;
1065 StudioLight *sl = static_cast<StudioLight *>(icon->obj);
1067}
1068
1069void ui_icon_ensure_deferred(const bContext *C, const int icon_id, const bool big)
1070{
1071 Icon *icon = BKE_icon_get(icon_id);
1072
1073 if (icon == nullptr) {
1074 return;
1075 }
1076
1077 DrawInfo *di = icon_ensure_drawinfo(icon);
1078
1079 if (di == nullptr) {
1080 return;
1081 }
1082
1083 switch (di->type) {
1084 case ICON_TYPE_PREVIEW: {
1085 ID *id = (icon->id_type != 0) ? static_cast<ID *>(icon->obj) : nullptr;
1086 PreviewImage *prv = id ? BKE_previewimg_id_ensure(id) :
1087 static_cast<PreviewImage *>(icon->obj);
1088 /* Using jobs for screen previews crashes due to off-screen rendering.
1089 * XXX: would be nicer if #PreviewImage could store if it supports jobs. */
1090 const bool use_jobs = !id || (GS(id->name) != ID_SCR);
1091
1092 if (prv) {
1093 const int size = big ? ICON_SIZE_PREVIEW : ICON_SIZE_ICON;
1094
1095 if (id || prv->runtime->deferred_loading_data) {
1096 ui_id_preview_image_render_size(C, nullptr, id, prv, size, use_jobs);
1097 }
1098 }
1099 break;
1100 }
1101 case ICON_TYPE_BUFFER: {
1102 if (icon->obj_type == ICON_DATA_STUDIOLIGHT) {
1103 if (di->data.buffer.image == nullptr) {
1105 StudioLight *sl = static_cast<StudioLight *>(icon->obj);
1107 IconImage *img = MEM_cnew<IconImage>(__func__);
1108
1109 img->w = STUDIOLIGHT_ICON_SIZE;
1110 img->h = STUDIOLIGHT_ICON_SIZE;
1111 const size_t size = STUDIOLIGHT_ICON_SIZE * STUDIOLIGHT_ICON_SIZE * sizeof(uint);
1112 img->rect = static_cast<uint8_t *>(MEM_mallocN(size, __func__));
1113 memset(img->rect, 0, size);
1114 di->data.buffer.image = img;
1115
1116 wmJob *wm_job = WM_jobs_get(wm,
1118 icon,
1119 "StudioLight Icon",
1120 eWM_JobFlag(0),
1122 Icon **tmp = MEM_cnew<Icon *>(__func__);
1123 *tmp = icon;
1124 WM_jobs_customdata_set(wm_job, tmp, MEM_freeN);
1125 WM_jobs_timer(wm_job, 0.01, 0, NC_WINDOW);
1128 WM_jobs_start(CTX_wm_manager(C), wm_job);
1129 }
1130 }
1131 break;
1132 }
1133 }
1134}
1135
1142static void icon_set_image(const bContext *C,
1143 Scene *scene,
1144 ID *id,
1145 PreviewImage *prv_img,
1146 enum eIconSizes size,
1147 const bool use_job)
1148{
1149 if (!prv_img) {
1150 if (G.debug & G_DEBUG) {
1151 printf("%s: no preview image for this ID: %s\n", __func__, id->name);
1152 }
1153 return;
1154 }
1155
1156 if (prv_img->flag[size] & PRV_USER_EDITED) {
1157 /* user-edited preview, do not auto-update! */
1158 return;
1159 }
1160
1161 const bool delay = prv_img->rect[size] != nullptr;
1162 icon_create_rect(prv_img, size);
1163
1164 if (use_job && (!id || BKE_previewimg_id_supports_jobs(id))) {
1165 /* Job (background) version */
1166 ED_preview_icon_job(C, prv_img, id, size, delay);
1167 }
1168 else {
1169 if (!scene) {
1170 scene = CTX_data_scene(C);
1171 }
1172 /* Immediate version */
1173 ED_preview_icon_render(C, scene, prv_img, id, size);
1174 }
1175}
1176
1178{
1179 Icon *icon = BKE_icon_get(icon_id);
1180
1181 if (icon == nullptr) {
1182 return nullptr;
1183 }
1184
1185 DrawInfo *di = (DrawInfo *)icon->drawinfo;
1186
1187 if (di == nullptr) {
1188 return nullptr;
1189 }
1190
1191 if (di->type == ICON_TYPE_PREVIEW) {
1192 const PreviewImage *prv = (icon->id_type != 0) ? BKE_previewimg_id_ensure((ID *)icon->obj) :
1193 static_cast<const PreviewImage *>(icon->obj);
1194
1195 if (prv) {
1196 return BKE_previewimg_copy(prv);
1197 }
1198 }
1199 else if (di->data.buffer.image) {
1200 ImBuf *bbuf;
1201
1204 IB_rect,
1205 nullptr,
1206 __func__);
1207 if (bbuf) {
1209
1210 prv->rect[0] = reinterpret_cast<uint *>(IMB_steal_byte_buffer(bbuf));
1211
1212 prv->w[0] = bbuf->x;
1213 prv->h[0] = bbuf->y;
1214
1215 IMB_freeImBuf(bbuf);
1216
1217 return prv;
1218 }
1219 }
1220
1221 return nullptr;
1222}
1223
1224static void icon_draw_rect(float x,
1225 float y,
1226 int w,
1227 int h,
1228 int rw,
1229 int rh,
1230 const uint8_t *rect,
1231 float alpha,
1232 const float desaturate)
1233{
1234 int draw_w = w;
1235 int draw_h = h;
1236 int draw_x = x;
1237 /* We need to round y, to avoid the icon jittering in some cases. */
1238 int draw_y = round_fl_to_int(y);
1239
1240 /* sanity check */
1241 if (w <= 0 || h <= 0 || w > 2000 || h > 2000) {
1242 printf("%s: icons are %i x %i pixels?\n", __func__, w, h);
1243 BLI_assert_msg(0, "invalid icon size");
1244 return;
1245 }
1246 /* modulate color */
1247 const float col[4] = {alpha, alpha, alpha, alpha};
1248
1249 float scale_x = 1.0f;
1250 float scale_y = 1.0f;
1251 /* rect contains image in 'rendersize', we only scale if needed */
1252 if (rw != w || rh != h) {
1253 /* preserve aspect ratio and center */
1254 if (rw > rh) {
1255 draw_w = w;
1256 draw_h = int((float(rh) / float(rw)) * float(w));
1257 draw_y += (h - draw_h) / 2;
1258 }
1259 else if (rw < rh) {
1260 draw_w = int((float(rw) / float(rh)) * float(h));
1261 draw_h = h;
1262 draw_x += (w - draw_w) / 2;
1263 }
1264 scale_x = draw_w / float(rw);
1265 scale_y = draw_h / float(rh);
1266 /* If the image is squared, the `draw_*` initialization values are good. */
1267 }
1268
1269 /* draw */
1270 eGPUBuiltinShader shader;
1271 if (desaturate != 0.0f) {
1273 }
1274 else {
1276 }
1278
1280 immUniform1f("factor", desaturate);
1281 }
1282
1284 &state, draw_x, draw_y, rw, rh, GPU_RGBA8, true, rect, scale_x, scale_y, 1.0f, 1.0f, col);
1285}
1286
1287/* Drawing size for preview images */
1289{
1290 switch (size) {
1291 case ICON_SIZE_ICON:
1292 return ICON_DEFAULT_HEIGHT;
1293 case ICON_SIZE_PREVIEW:
1295 default:
1296 return 0;
1297 }
1298}
1299
1300static void svg_replace_color_attributes(std::string &svg,
1301 const std::string &name,
1302 const size_t start,
1303 const size_t end)
1304{
1305 bTheme *btheme = UI_GetTheme();
1306
1307 uchar white[] = {255, 255, 255, 255};
1308 uchar black[] = {0, 0, 0, 255};
1309 uchar logo_orange[] = {232, 125, 13, 255};
1310 uchar logo_blue[] = {38, 87, 135, 255};
1311
1312 /* Tool colors hardcoded for now. */
1313 uchar tool_add[] = {117, 255, 175, 255};
1314 uchar tool_remove[] = {245, 107, 91, 255};
1315 uchar tool_select[] = {255, 176, 43, 255};
1316 uchar tool_transform[] = {217, 175, 245, 255};
1317 uchar tool_white[] = {255, 255, 255, 255};
1318 uchar tool_red[] = {214, 45, 48, 255};
1319
1320 struct ColorItem {
1321 const char *name;
1322 uchar *col = nullptr;
1323 int colorid = TH_UNDEFINED;
1324 int spacetype = SPACE_TYPE_ANY;
1325 } items[] = {
1326 {"blender_white", white},
1327 {"blender_black", black},
1328 {"blender_logo_orange", logo_orange},
1329 {"blender_logo_blue", logo_blue},
1330 {"blender_selected", btheme->tui.wcol_regular.inner},
1331 {"blender_mesh_selected", btheme->space_view3d.vertex_select},
1332 {"blender_back", nullptr, TH_BACK},
1333 {"blender_text", nullptr, TH_TEXT},
1334 {"blender_text_hi", nullptr, TH_TEXT_HI},
1335 {"blender_red_alert", nullptr, TH_REDALERT},
1336 {"blender_error", nullptr, TH_INFO_ERROR, SPACE_INFO},
1337 {"blender_warning", nullptr, TH_INFO_WARNING, SPACE_INFO},
1338 {"blender_info", nullptr, TH_INFO_INFO, SPACE_INFO},
1339 {"blender_scene", nullptr, TH_ICON_SCENE},
1340 {"blender_collection", nullptr, TH_ICON_COLLECTION},
1341 {"blender_object", nullptr, TH_ICON_OBJECT},
1342 {"blender_object_data", nullptr, TH_ICON_OBJECT_DATA},
1343 {"blender_modifier", nullptr, TH_ICON_MODIFIER},
1344 {"blender_shading", nullptr, TH_ICON_SHADING},
1345 {"blender_folder", nullptr, TH_ICON_FOLDER},
1346 {"blender_fund", nullptr, TH_ICON_FUND},
1347 {"blender_autokey", nullptr, TH_ICON_AUTOKEY},
1348 {"blender_tool_add", tool_add},
1349 {"blender_tool_remove", tool_remove},
1350 {"blender_tool_select", tool_select},
1351 {"blender_tool_transform", tool_transform},
1352 {"blender_tool_white", tool_white},
1353 {"blender_tool_red", tool_red},
1354 };
1355
1356 for (const ColorItem &item : items) {
1357 if (name != item.name) {
1358 continue;
1359 }
1360
1361 uchar color[4];
1362 if (item.col) {
1363 memcpy(color, item.col, sizeof(color));
1364 }
1365 else if (item.colorid != TH_UNDEFINED) {
1366 if (item.spacetype != SPACE_TYPE_ANY) {
1367 UI_GetThemeColorType4ubv(item.colorid, item.spacetype, color);
1368 }
1369 else {
1370 UI_GetThemeColor4ubv(item.colorid, color);
1371 }
1372 }
1373 else {
1374 continue;
1375 }
1376
1377 std::string hexcolor = fmt::format(
1378 "{:02x}{:02x}{:02x}{:02x}", color[0], color[1], color[2], color[3]);
1379
1380 size_t att_start = start;
1381 while (true) {
1382 constexpr static blender::StringRef key = "fill=\"";
1383 att_start = svg.find(key, att_start);
1384 if (att_start == std::string::npos || att_start > end) {
1385 break;
1386 }
1387 const size_t att_end = svg.find("\"", att_start + key.size());
1388 if (att_end != std::string::npos && att_end < end) {
1389 svg.replace(att_start, att_end - att_start, key + "#" + hexcolor);
1390 }
1391 att_start += blender::StringRef(key + "#rrggbbaa\"").size();
1392 }
1393
1394 att_start = start;
1395 while (true) {
1396 constexpr static blender::StringRef key = "fill:";
1397 att_start = svg.find(key, att_start);
1398 if (att_start == std::string::npos || att_start > end) {
1399 break;
1400 }
1401 const size_t att_end = svg.find(";", att_start + key.size());
1402 if (att_end != std::string::npos && att_end - att_start < end) {
1403 svg.replace(att_start, att_end - att_start, key + "#" + hexcolor);
1404 }
1405 att_start += blender::StringRef(key + "#rrggbbaa").size();
1406 }
1407 }
1408}
1409
1410static void icon_source_edit_cb(std::string &svg)
1411{
1412 size_t g_start = 0;
1413
1414 /* Scan string, processing only groups with our keyword ids. */
1415
1416 while (true) {
1417 /* Look for a blender id, quick exit if not found. */
1418 constexpr static blender::StringRef key = "id=\"";
1419 const size_t id_start = svg.find(key + "blender_", g_start);
1420 if (id_start == std::string::npos) {
1421 return;
1422 }
1423
1424 /* Scan back to beginning of this group element. */
1425 g_start = svg.rfind("<g", id_start);
1426 if (g_start == std::string::npos) {
1427 /* Malformed. */
1428 return;
1429 }
1430
1431 /* Scan forward to end of the group. */
1432 const size_t g_end = svg.find("</g>", id_start);
1433 if (g_end == std::string::npos) {
1434 /* Malformed. */
1435 return;
1436 }
1437
1438 /* Get group id name. */
1439 const size_t id_end = svg.find("\"", id_start + key.size());
1440 if (id_end != std::string::npos) {
1441 std::string id_name = svg.substr(id_start + key.size(), id_end - id_start - key.size());
1442 /* Replace this group's colors. */
1443 svg_replace_color_attributes(svg, id_name, g_start, g_end);
1444 }
1445
1446 g_start = g_end;
1447 }
1448}
1449
1450static void icon_draw_size(float x,
1451 float y,
1452 int icon_id,
1453 float aspect,
1454 float alpha,
1455 enum eIconSizes size,
1456 int draw_size,
1457 const float desaturate,
1458 const uchar mono_rgba[4],
1459 const bool mono_border,
1460 const IconTextOverlay *text_overlay,
1461 const bool inverted = false)
1462{
1463 if (icon_id == ICON_NONE) {
1464 return;
1465 }
1466
1467 bTheme *btheme = UI_GetTheme();
1468 const float fdraw_size = float(draw_size);
1469
1470 Icon *icon = BKE_icon_get(icon_id);
1471 alpha *= btheme->tui.icon_alpha;
1472
1473 if (icon == nullptr) {
1474 if (G.debug & G_DEBUG) {
1475 printf("%s: Internal error, no icon for icon ID: %d\n", __func__, icon_id);
1476 }
1477 return;
1478 }
1479
1480 /* scale width and height according to aspect */
1481 int w = int(fdraw_size / aspect + 0.5f);
1482 int h = int(fdraw_size / aspect + 0.5f);
1483
1484 DrawInfo *di = icon_ensure_drawinfo(icon);
1485
1486 /* We need to flush widget base first to ensure correct ordering. */
1488
1489 if (di->type == ICON_TYPE_IMBUF) {
1490 const ImBuf *ibuf = static_cast<const ImBuf *>(icon->obj);
1491
1493 icon_draw_rect(x, y, w, h, ibuf->x, ibuf->y, ibuf->byte_buffer.data, alpha, desaturate);
1495 }
1496 else if (di->type == ICON_TYPE_VECTOR) {
1497 /* vector icons use the uiBlock transformation, they are not drawn
1498 * with untransformed coordinates like the other icons */
1499 di->data.vector.func(int(x), int(y), w, h, 1.0f);
1500 }
1501 else if (di->type == ICON_TYPE_GEOM) {
1502#ifdef USE_UI_TOOLBAR_HACK
1503 /* TODO(@ideasman42): scale icons up for toolbar,
1504 * we need a way to detect larger buttons and do this automatic. */
1505 {
1507 y = (y + (h / 2)) - ((h * scale) / 2);
1508 w *= scale;
1509 h *= scale;
1510 }
1511#endif
1512
1513 /* If the theme is light, we will adjust the icon colors. */
1514 const bool invert = (rgb_to_grayscale_byte(btheme->tui.wcol_toolbar_item.inner) > 128);
1515 const bool geom_inverted = di->data.geom.inverted;
1516
1517 /* This could re-generate often if rendered at different sizes in the one interface.
1518 * TODO(@ideasman42): support caching multiple sizes. */
1519 ImBuf *ibuf = di->data.geom.image_cache;
1520 if ((ibuf == nullptr) || (ibuf->x != w) || (ibuf->y != h) || (invert != geom_inverted)) {
1521 if (ibuf) {
1522 IMB_freeImBuf(ibuf);
1523 }
1524 if (invert != geom_inverted) {
1525 BKE_icon_geom_invert_lightness(static_cast<Icon_Geom *>(icon->obj));
1526 }
1527 ibuf = BKE_icon_geom_rasterize(static_cast<Icon_Geom *>(icon->obj), w, h);
1528 di->data.geom.image_cache = ibuf;
1529 di->data.geom.inverted = invert;
1530 }
1531
1533 icon_draw_rect(x, y, w, h, w, h, ibuf->byte_buffer.data, alpha, desaturate);
1535 }
1536 else if (di->type == ICON_TYPE_EVENT) {
1537 icon_draw_rect_input(x, y, w, h, icon_id, aspect, alpha, inverted);
1538 }
1540 float outline_intensity = mono_border ? (btheme->tui.icon_border_intensity > 0.0f ?
1541 btheme->tui.icon_border_intensity :
1542 0.3f) :
1543 0.0f;
1544 float color[4];
1545 if (mono_rgba) {
1546 rgba_uchar_to_float(color, (const uchar *)mono_rgba);
1547 }
1548 else {
1550 }
1551
1552 color[3] *= alpha;
1553
1554 if (di->type == ICON_TYPE_SVG_COLOR) {
1555 BLF_draw_svg_icon(uint(icon_id),
1556 x,
1557 y,
1558 float(draw_size) / aspect,
1559 color,
1560 outline_intensity,
1561 true,
1563 }
1564 else {
1565 BLF_draw_svg_icon(uint(icon_id),
1566 x,
1567 y,
1568 float(draw_size) / aspect,
1569 color,
1570 outline_intensity,
1571 false,
1572 nullptr);
1573 }
1574
1575 if (text_overlay && text_overlay->text[0] != '\0') {
1576 /* Handle the little numbers on top of the icon. */
1577 uchar text_color[4];
1578 if (text_overlay->color[3]) {
1579 copy_v4_v4_uchar(text_color, text_overlay->color);
1580 }
1581 else {
1582 UI_GetThemeColor4ubv(TH_TEXT, text_color);
1583 }
1584 const bool is_light = rgb_to_grayscale_byte(text_color) > 96;
1585 const float zoom_factor = w / UI_ICON_SIZE;
1586 uiFontStyle fstyle_small = *UI_FSTYLE_WIDGET;
1587 fstyle_small.points *= zoom_factor * 0.8f;
1589 fstyle_small.shadx = 0;
1590 fstyle_small.shady = 0;
1591 rcti text_rect = {int(x), int(x + UI_UNIT_X * zoom_factor), int(y), int(y)};
1593 UI_fontstyle_draw(&fstyle_small,
1594 &text_rect,
1595 text_overlay->text,
1596 sizeof(text_overlay->text),
1597 text_color,
1598 &params);
1599 }
1600 }
1601
1602 else if (di->type == ICON_TYPE_BUFFER) {
1603 /* it is a builtin icon */
1604 IconImage *iimg = di->data.buffer.image;
1605#ifndef WITH_HEADLESS
1606 icon_verify_datatoc(iimg);
1607#endif
1608 if (!iimg->rect) {
1609 /* something has gone wrong! */
1610 return;
1611 }
1612
1613 icon_draw_rect(x, y, w, h, iimg->w, iimg->h, iimg->rect, alpha, desaturate);
1614 }
1615 else if (di->type == ICON_TYPE_PREVIEW) {
1616 PreviewImage *pi = (icon->id_type != 0) ? BKE_previewimg_id_ensure((ID *)icon->obj) :
1617 static_cast<PreviewImage *>(icon->obj);
1618
1619 if (pi) {
1620 /* no create icon on this level in code */
1621 if (!pi->rect[size]) {
1622 /* Something has gone wrong! */
1623 return;
1624 }
1625
1626 /* Preview images use premultiplied alpha. */
1629 y,
1630 w,
1631 h,
1632 pi->w[size],
1633 pi->h[size],
1634 reinterpret_cast<const uint8_t *>(pi->rect[size]),
1635 alpha,
1636 desaturate);
1638 }
1639 }
1640 else if (di->type == ICON_TYPE_GPLAYER) {
1641 BLI_assert(icon->obj != nullptr);
1642
1643 /* Just draw a colored rect - Like for vicon_colorset_draw() */
1644#ifndef WITH_HEADLESS
1645 vicon_gplayer_color_draw(icon, int(x), int(y), w, h);
1646#endif
1647 }
1648}
1649
1651 const bContext *C, Scene *scene, ID *id, PreviewImage *pi, int size, const bool use_job)
1652{
1653 /* changed only ever set by dynamic icons */
1654 if ((pi->flag[size] & PRV_CHANGED) || !pi->rect[size]) {
1655 /* create the rect if necessary */
1656 icon_set_image(C, scene, id, pi, eIconSizes(size), use_job);
1657
1658 pi->flag[size] &= ~PRV_CHANGED;
1659 }
1660}
1661
1663 Scene *scene,
1664 ID *id_to_render,
1665 const enum eIconSizes size,
1666 const bool use_job,
1667 PreviewImage *r_preview_image)
1668{
1669 ui_id_preview_image_render_size(C, scene, id_to_render, r_preview_image, size, use_job);
1670}
1671
1673 const bContext *C, Scene *scene, ID *id, const enum eIconSizes size, const bool use_job)
1674{
1676 if (pi == nullptr) {
1677 return;
1678 }
1679
1680 ID *id_to_render = id;
1681
1682 /* For objects, first try if a preview can created via the object data. */
1683 if (GS(id->name) == ID_OB) {
1684 Object *ob = (Object *)id;
1685 if (ED_preview_id_is_supported(static_cast<const ID *>(ob->data))) {
1686 id_to_render = static_cast<ID *>(ob->data);
1687 }
1688 }
1689
1690 if (!ED_preview_id_is_supported(id_to_render)) {
1691 return;
1692 }
1693
1694 UI_icon_render_id_ex(C, scene, id_to_render, size, use_job, pi);
1695}
1696
1697static void ui_id_icon_render(const bContext *C, ID *id, bool use_jobs)
1698{
1700
1701 if (!pi) {
1702 return;
1703 }
1704
1705 for (int i = 0; i < NUM_ICON_SIZES; i++) {
1706 ui_id_preview_image_render_size(C, nullptr, id, pi, i, use_jobs);
1707 }
1708}
1709
1710static int ui_id_screen_get_icon(const bContext *C, ID *id)
1711{
1713 /* Don't use jobs here, off-screen rendering doesn't like this and crashes. */
1714 ui_id_icon_render(C, id, false);
1715
1716 return id->icon_id;
1717}
1718
1719int ui_id_icon_get(const bContext *C, ID *id, const bool big)
1720{
1721 int iconid = 0;
1722
1723 /* icon */
1724 switch (GS(id->name)) {
1725 case ID_MA: /* fall through */
1726 case ID_TE: /* fall through */
1727 case ID_IM: /* fall through */
1728 case ID_WO: /* fall through */
1729 case ID_LA: /* fall through */
1730 iconid = BKE_icon_id_ensure(id);
1731 /* checks if not exists, or changed */
1732 UI_icon_render_id(C, nullptr, id, big ? ICON_SIZE_PREVIEW : ICON_SIZE_ICON, true);
1733 break;
1734 case ID_SCR:
1735 iconid = ui_id_screen_get_icon(C, id);
1736 break;
1737 case ID_GR:
1739 break;
1740 default:
1741 break;
1742 }
1743
1744 return iconid;
1745}
1746
1748{
1749 if (ID_IS_LINKED(id)) {
1750 if (id->tag & ID_TAG_MISSING) {
1751 return ICON_LIBRARY_DATA_BROKEN;
1752 }
1753 if (id->tag & ID_TAG_INDIRECT) {
1754 return ICON_LIBRARY_DATA_INDIRECT;
1755 }
1756 return ICON_LIBRARY_DATA_DIRECT;
1757 }
1758 if (ID_IS_OVERRIDE_LIBRARY(id)) {
1759 if (!ID_IS_OVERRIDE_LIBRARY_REAL(id) ||
1761 {
1762 return ICON_LIBRARY_DATA_OVERRIDE_NONEDITABLE;
1763 }
1764 return ICON_LIBRARY_DATA_OVERRIDE;
1765 }
1766 if (ID_IS_ASSET(id)) {
1767 return ICON_ASSET_MANAGER;
1768 }
1769
1770 return ICON_NONE;
1771}
1772
1773int UI_icon_from_rnaptr(const bContext *C, PointerRNA *ptr, int rnaicon, const bool big)
1774{
1775 ID *id = nullptr;
1776
1777 if (!ptr->data) {
1778 return rnaicon;
1779 }
1780
1781 /* Try ID, material, texture or dynamic-paint slot. */
1782 if (RNA_struct_is_ID(ptr->type)) {
1783 id = ptr->owner_id;
1784 }
1785 else if (RNA_struct_is_a(ptr->type, &RNA_MaterialSlot)) {
1786 id = static_cast<ID *>(RNA_pointer_get(ptr, "material").data);
1787 }
1788 else if (RNA_struct_is_a(ptr->type, &RNA_TextureSlot)) {
1789 id = static_cast<ID *>(RNA_pointer_get(ptr, "texture").data);
1790 }
1791 else if (RNA_struct_is_a(ptr->type, &RNA_FileBrowserFSMenuEntry)) {
1792 return RNA_int_get(ptr, "icon");
1793 }
1794 else if (RNA_struct_is_a(ptr->type, &RNA_DynamicPaintSurface)) {
1795 const DynamicPaintSurface *surface = static_cast<const DynamicPaintSurface *>(ptr->data);
1796
1797 if (surface->format == MOD_DPAINT_SURFACE_F_PTEX) {
1798 return ICON_SHADING_TEXTURE;
1799 }
1800 if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
1801 return ICON_OUTLINER_DATA_MESH;
1802 }
1803 if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
1804 return ICON_FILE_IMAGE;
1805 }
1806 }
1807 else if (RNA_struct_is_a(ptr->type, &RNA_StudioLight)) {
1808 StudioLight *sl = static_cast<StudioLight *>(ptr->data);
1809 switch (sl->flag & STUDIOLIGHT_FLAG_ORIENTATIONS) {
1811 return sl->icon_id_irradiance;
1813 default:
1814 return sl->icon_id_radiance;
1816 return sl->icon_id_matcap;
1817 }
1818 }
1819
1820 /* get icon from ID */
1821 if (id) {
1822 const int icon = ui_id_icon_get(C, id, big);
1823
1824 return icon ? icon : rnaicon;
1825 }
1826
1827 return rnaicon;
1828}
1829
1830int UI_icon_from_idcode(const int idcode)
1831{
1832 switch ((ID_Type)idcode) {
1833 case ID_AC:
1834 return ICON_ACTION;
1835 case ID_AR:
1836 return ICON_ARMATURE_DATA;
1837 case ID_BR:
1838 return ICON_BRUSH_DATA;
1839 case ID_CA:
1840 return ICON_CAMERA_DATA;
1841 case ID_CF:
1842 return ICON_FILE;
1843 case ID_CU_LEGACY:
1844 return ICON_CURVE_DATA;
1845 case ID_GD_LEGACY:
1846 return ICON_OUTLINER_DATA_GREASEPENCIL;
1847 case ID_GR:
1848 return ICON_OUTLINER_COLLECTION;
1849 case ID_IM:
1850 return ICON_IMAGE_DATA;
1851 case ID_LA:
1852 return ICON_LIGHT_DATA;
1853 case ID_LS:
1854 return ICON_LINE_DATA;
1855 case ID_LT:
1856 return ICON_LATTICE_DATA;
1857 case ID_MA:
1858 return ICON_MATERIAL_DATA;
1859 case ID_MB:
1860 return ICON_META_DATA;
1861 case ID_MC:
1862 return ICON_TRACKER;
1863 case ID_ME:
1864 return ICON_MESH_DATA;
1865 case ID_MSK:
1866 return ICON_MOD_MASK; /* TODO: this would need its own icon! */
1867 case ID_NT:
1868 return ICON_NODETREE;
1869 case ID_OB:
1870 return ICON_OBJECT_DATA;
1871 case ID_PA:
1872 return ICON_PARTICLE_DATA;
1873 case ID_PAL:
1874 return ICON_COLOR; /* TODO: this would need its own icon! */
1875 case ID_PC:
1876 return ICON_CURVE_BEZCURVE; /* TODO: this would need its own icon! */
1877 case ID_LP:
1878 return ICON_OUTLINER_DATA_LIGHTPROBE;
1879 case ID_SCE:
1880 return ICON_SCENE_DATA;
1881 case ID_SPK:
1882 return ICON_SPEAKER;
1883 case ID_SO:
1884 return ICON_SOUND;
1885 case ID_TE:
1886 return ICON_TEXTURE_DATA;
1887 case ID_TXT:
1888 return ICON_TEXT;
1889 case ID_VF:
1890 return ICON_FONT_DATA;
1891 case ID_CV:
1892 return ICON_CURVES_DATA;
1893 case ID_PT:
1894 return ICON_POINTCLOUD_DATA;
1895 case ID_VO:
1896 return ICON_VOLUME_DATA;
1897 case ID_WO:
1898 return ICON_WORLD_DATA;
1899 case ID_WS:
1900 return ICON_WORKSPACE;
1901 case ID_GP:
1902 return ICON_OUTLINER_DATA_GREASEPENCIL;
1903
1904 /* No icons for these ID-types. */
1905 case ID_LI:
1906 case ID_IP:
1907 case ID_KE:
1908 case ID_SCR:
1909 case ID_WM:
1910 break;
1911 }
1912 return ICON_NONE;
1913}
1914
1915int UI_icon_from_object_mode(const int mode)
1916{
1917 switch ((eObjectMode)mode) {
1918 case OB_MODE_OBJECT:
1919 return ICON_OBJECT_DATAMODE;
1920 case OB_MODE_EDIT:
1922 return ICON_EDITMODE_HLT;
1923 case OB_MODE_SCULPT:
1926 return ICON_SCULPTMODE_HLT;
1929 return ICON_VPAINT_HLT;
1932 return ICON_WPAINT_HLT;
1934 return ICON_TPAINT_HLT;
1936 return ICON_PARTICLEMODE;
1937 case OB_MODE_POSE:
1938 return ICON_POSE_HLT;
1940 return ICON_GREASEPENCIL;
1941 }
1942 return ICON_NONE;
1943}
1944
1946{
1947 int icon = ICON_OUTLINER_COLLECTION;
1948
1949 if (collection->color_tag != COLLECTION_COLOR_NONE) {
1950 icon = ICON_COLLECTION_COLOR_01 + collection->color_tag;
1951 }
1952
1953 return icon;
1954}
1955
1956void UI_icon_draw(float x, float y, int icon_id)
1957{
1959 x, y, icon_id, UI_INV_SCALE_FAC, 1.0f, 0.0f, nullptr, false, UI_NO_ICON_OVERLAY_TEXT);
1960}
1961
1962void UI_icon_draw_alpha(float x, float y, int icon_id, float alpha)
1963{
1965 x, y, icon_id, UI_INV_SCALE_FAC, alpha, 0.0f, nullptr, false, UI_NO_ICON_OVERLAY_TEXT);
1966}
1967
1968void UI_icon_draw_preview(float x, float y, int icon_id, float aspect, float alpha, int size)
1969{
1971 y,
1972 icon_id,
1973 aspect,
1974 alpha,
1976 size,
1977 false,
1978 nullptr,
1979 false,
1981}
1982
1984 float y,
1985 int icon_id,
1986 float aspect,
1987 float alpha,
1988 float desaturate,
1989 const uchar mono_color[4],
1990 const bool mono_border,
1991 const IconTextOverlay *text_overlay,
1992 const bool inverted)
1993{
1994 const int draw_size = get_draw_size(ICON_SIZE_ICON);
1996 y,
1997 icon_id,
1998 aspect,
1999 alpha,
2001 draw_size,
2002 desaturate,
2003 mono_color,
2004 mono_border,
2005 text_overlay,
2006 inverted);
2007}
2008
2009ImBuf *UI_svg_icon_bitmap(uint icon_id, float size, bool multicolor)
2010{
2011 if (icon_id >= ICON_BLANK_LAST_SVG_ITEM) {
2012 return nullptr;
2013 }
2014
2015 ImBuf *ibuf = nullptr;
2016 int width;
2017 int height;
2018 blender::Array<uchar> bitmap;
2019
2020 if (multicolor) {
2021 bitmap = BLF_svg_icon_bitmap(icon_id, size, &width, &height, true, icon_source_edit_cb);
2022 }
2023 else {
2024 bitmap = BLF_svg_icon_bitmap(icon_id, size, &width, &height, false, nullptr);
2025 }
2026
2027 if (!bitmap.is_empty()) {
2028 ibuf = IMB_allocFromBuffer(bitmap.data(), nullptr, width, height, 4);
2029 }
2030
2031 if (ibuf) {
2032 IMB_flipy(ibuf);
2033 if (multicolor) {
2035 }
2036 }
2037
2038 return ibuf;
2039}
2040
2042 const int icon_indicator_number)
2043{
2044 /* The icon indicator is used as an aggregator, no need to show if it is 1. */
2045 if (icon_indicator_number < 2) {
2046 text_overlay->text[0] = '\0';
2047 return;
2048 }
2049 BLI_str_format_integer_unit(text_overlay->text, icon_indicator_number);
2050}
2051
2052/* ********** Alert Icons ********** */
2053
2055{
2056#ifdef WITH_HEADLESS
2057 UNUSED_VARS(icon, size);
2058 return nullptr;
2059#else
2060
2061 int icon_id = ICON_NONE;
2062 switch (icon) {
2063 case ALERT_ICON_WARNING:
2064 icon_id = ICON_WARNING_LARGE;
2065 break;
2067 icon_id = ICON_QUESTION_LARGE;
2068 break;
2069 case ALERT_ICON_ERROR:
2070 icon_id = ICON_CANCEL_LARGE;
2071 break;
2072 case ALERT_ICON_INFO:
2073 icon_id = ICON_INFO_LARGE;
2074 break;
2075 default:
2076 icon_id = ICON_NONE;
2077 }
2078
2079 if (icon_id == ICON_NONE) {
2080 return nullptr;
2081 }
2082
2083 return UI_svg_icon_bitmap(icon_id, size, false);
2084#endif
2085}
void immDrawPixelsTexScaledFullSize(const IMMDrawPixelsTexState *state, float x, float y, int img_w, int img_h, eGPUTextureFormat gpu_format, bool use_filter, const void *rect, float scaleX, float scaleY, float xzoom, float yzoom, const float color[4])
Definition glutil.cc:55
IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin)
Definition glutil.cc:40
wmWindow * CTX_wm_window(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
@ G_DEBUG
#define ICON_RENDER_DEFAULT_HEIGHT
Definition BKE_icons.h:159
void BKE_icon_set(int icon_id, struct Icon *icon)
Definition icons.cc:429
void BKE_icons_free(void)
Definition icons.cc:179
struct Icon * BKE_icon_get(int icon_id)
Definition icons.cc:401
@ ICON_DATA_IMBUF
Definition BKE_icons.h:34
@ ICON_DATA_STUDIOLIGHT
Definition BKE_icons.h:40
@ ICON_DATA_PREVIEW
Definition BKE_icons.h:36
@ ICON_DATA_ID
Definition BKE_icons.h:32
@ ICON_DATA_GPLAYER
Definition BKE_icons.h:42
@ ICON_DATA_GEOM
Definition BKE_icons.h:38
struct ImBuf * BKE_icon_geom_rasterize(const struct Icon_Geom *geom, unsigned int size_x, unsigned int size_y)
void BKE_icon_geom_invert_lightness(struct Icon_Geom *geom)
int BKE_icon_id_ensure(struct ID *id)
Definition icons.cc:268
PreviewImage * BKE_previewimg_create()
bool BKE_previewimg_id_supports_jobs(const ID *id)
PreviewImage * BKE_previewimg_id_ensure(ID *id)
void BKE_preview_images_free()
PreviewImage * BKE_previewimg_copy(const PreviewImage *prv)
@ STUDIOLIGHT_TYPE_MATCAP
@ STUDIOLIGHT_TYPE_WORLD
@ STUDIOLIGHT_TYPE_STUDIO
#define STUDIOLIGHT_ICON_SIZE
void BKE_studiolight_set_free_function(StudioLight *sl, StudioLightFreeFunction *free_function, void *data)
#define STUDIOLIGHT_FLAG_ORIENTATIONS
void BKE_studiolight_preview(uint *icon_buffer, StudioLight *sl, int icon_id_type)
void BLF_draw_svg_icon(uint icon_id, float x, float y, float size, const float color[4]=nullptr, float outline_alpha=1.0f, bool multicolor=false, blender::FunctionRef< void(std::string &)> edit_source_cb=nullptr)
Definition blf.cc:612
blender::Array< uchar > BLF_svg_icon_bitmap(uint icon_id, float size, int *r_width, int *r_height, bool multicolor=false, blender::FunctionRef< void(std::string &)> edit_source_cb=nullptr)
Definition blf.cc:635
#define BLI_assert(a)
Definition BLI_assert.h:50
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:57
MINLINE int round_fl_to_int(float a)
MINLINE unsigned char rgb_to_grayscale_byte(const unsigned char rgb[3])
void rgba_uchar_to_float(float r_col[4], const unsigned char col_ub[4])
MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
void BLI_str_format_integer_unit(char dst[BLI_STR_FORMAT_INT32_INTEGER_UNIT_SIZE], int number_to_format) ATTR_NONNULL(1)
Definition string.c:1279
unsigned char uchar
unsigned int uint
#define UNUSED_VARS(...)
#define ELEM(...)
@ LIBOVERRIDE_FLAG_SYSTEM_DEFINED
Definition DNA_ID.h:367
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
Definition DNA_ID.h:676
#define ID_IS_LINKED(_id)
Definition DNA_ID.h:654
#define ID_IS_ASSET(_id)
Definition DNA_ID.h:690
@ ID_TAG_INDIRECT
Definition DNA_ID.h:794
@ ID_TAG_MISSING
Definition DNA_ID.h:813
#define ID_IS_OVERRIDE_LIBRARY(_id)
Definition DNA_ID.h:683
@ PRV_CHANGED
Definition DNA_ID.h:581
@ PRV_USER_EDITED
Definition DNA_ID.h:583
eIconSizes
@ ICON_SIZE_PREVIEW
@ ICON_SIZE_ICON
@ NUM_ICON_SIZES
ID_Type
@ ID_WM
@ ID_CA
@ ID_AR
@ ID_MC
@ ID_CF
@ ID_LI
@ ID_TE
@ ID_IM
@ ID_VO
@ ID_WS
@ ID_NT
@ ID_LA
@ ID_KE
@ ID_TXT
@ ID_SO
@ ID_SCE
@ ID_LS
@ ID_MSK
@ ID_CV
@ ID_PAL
@ ID_BR
@ ID_LP
@ ID_WO
@ ID_MA
@ ID_AC
@ ID_SCR
@ ID_CU_LEGACY
@ ID_GD_LEGACY
@ ID_VF
@ ID_ME
@ ID_IP
@ ID_GR
@ ID_SPK
@ ID_MB
@ ID_LT
@ ID_OB
@ ID_GP
@ ID_PA
@ ID_PT
@ ID_PC
Object groups, one object can be in many groups at once.
@ COLLECTION_COLOR_NONE
@ COLLECTION_COLOR_02
@ COLLECTION_COLOR_05
@ COLLECTION_COLOR_07
@ COLLECTION_COLOR_06
@ COLLECTION_COLOR_04
@ COLLECTION_COLOR_01
@ COLLECTION_COLOR_08
@ COLLECTION_COLOR_03
eBezTriple_KeyframeType
@ BEZT_KEYTYPE_EXTREME
@ BEZT_KEYTYPE_JITTER
@ BEZT_KEYTYPE_BREAKDOWN
@ BEZT_KEYTYPE_MOVEHOLD
@ BEZT_KEYTYPE_GENERATED
@ BEZT_KEYTYPE_KEYFRAME
@ MOD_DPAINT_SURFACE_F_PTEX
@ MOD_DPAINT_SURFACE_F_VERTEX
@ MOD_DPAINT_SURFACE_F_IMAGESEQ
@ LAYERGROUP_COLOR_01
@ LAYERGROUP_COLOR_06
@ LAYERGROUP_COLOR_04
@ LAYERGROUP_COLOR_05
@ LAYERGROUP_COLOR_03
@ LAYERGROUP_COLOR_08
@ LAYERGROUP_COLOR_07
@ LAYERGROUP_COLOR_02
eObjectMode
@ OB_MODE_VERTEX_GREASE_PENCIL
@ OB_MODE_PARTICLE_EDIT
@ OB_MODE_EDIT_GPENCIL_LEGACY
@ OB_MODE_EDIT
@ OB_MODE_WEIGHT_PAINT
@ OB_MODE_SCULPT
@ OB_MODE_SCULPT_CURVES
@ OB_MODE_PAINT_GREASE_PENCIL
@ OB_MODE_SCULPT_GREASE_PENCIL
@ OB_MODE_POSE
@ OB_MODE_TEXTURE_PAINT
@ OB_MODE_OBJECT
@ OB_MODE_WEIGHT_GREASE_PENCIL
@ OB_MODE_VERTEX_PAINT
@ RGN_TYPE_WINDOW
@ SEQUENCE_COLOR_05
@ SEQUENCE_COLOR_02
@ SEQUENCE_COLOR_04
@ SEQUENCE_COLOR_06
@ SEQUENCE_COLOR_01
@ SEQUENCE_COLOR_09
@ SEQUENCE_COLOR_08
@ SEQUENCE_COLOR_03
@ SEQUENCE_COLOR_07
@ SPACE_ACTION
@ SPACE_INFO
#define SPACE_TYPE_ANY
#define UI_INV_SCALE_FAC
#define UI_ICON_SIZE
@ KEYFRAME_SHAPE_BOTH
@ KEYFRAME_HANDLE_VECTOR
@ KEYFRAME_HANDLE_FREE
@ KEYFRAME_HANDLE_AUTO_CLAMP
@ KEYFRAME_HANDLE_NONE
@ KEYFRAME_HANDLE_AUTO
@ KEYFRAME_HANDLE_ALIGNED
@ KEYFRAME_EXTREME_NONE
bool ED_preview_id_is_supported(const ID *id, const char **r_disabled_hint=nullptr)
void ED_preview_icon_job(const bContext *C, PreviewImage *prv_img, ID *id, enum eIconSizes icon_size, bool delay)
void ED_preview_icon_render(const bContext *C, Scene *scene, PreviewImage *prv_img, ID *id, enum eIconSizes icon_size)
void immEnd()
void immUnbindProgram()
void immUniform2f(const char *name, float x, float y)
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
void immUniformColor3ubv(const unsigned char rgb[3])
void immUniform1f(const char *name, float x)
GPUVertFormat * immVertexFormat()
void immBegin(GPUPrimType, uint vertex_len)
void immUniformColor3fv(const float rgb[3])
void immRecti(uint pos, int x1, int y1, int x2, int y2)
@ GPU_PRIM_POINTS
eGPUBuiltinShader
@ GPU_SHADER_KEYFRAME_SHAPE
@ GPU_SHADER_2D_IMAGE_DESATURATE_COLOR
@ GPU_SHADER_3D_UNIFORM_COLOR
@ GPU_SHADER_3D_IMAGE_COLOR
void GPU_program_point_size(bool enable)
Definition gpu_state.cc:175
@ GPU_BLEND_ALPHA
Definition GPU_state.hh:87
@ GPU_BLEND_ALPHA_PREMULT
Definition GPU_state.hh:88
void GPU_blend(eGPUBlend blend)
Definition gpu_state.cc:42
@ GPU_FETCH_FLOAT
@ GPU_FETCH_INT_TO_FLOAT_UNIT
@ GPU_FETCH_INT
@ GPU_FETCH_INT_TO_FLOAT
uint GPU_vertformat_attr_add(GPUVertFormat *, const char *name, GPUVertCompType, uint comp_len, GPUVertFetchMode)
@ GPU_COMP_F32
@ GPU_COMP_I32
@ GPU_COMP_U32
@ GPU_COMP_U8
void IMB_flipy(ImBuf *ibuf)
void IMB_premultiply_alpha(ImBuf *ibuf)
Definition filter.cc:579
uint8_t * IMB_steal_byte_buffer(ImBuf *ibuf)
bool IMB_scale(ImBuf *ibuf, unsigned int newx, unsigned int newy, IMBScaleFilter filter, bool threaded=true)
Definition scaling.cc:779
@ IB_rect
#define PREVIEW_RENDER_DEFAULT_HEIGHT
Definition IMB_thumbs.hh:38
Read Guarded memory(de)allocation.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a color
#define C
Definition RandGen.cpp:29
@ UI_STYLE_TEXT_RIGHT
void UI_fontstyle_draw(const uiFontStyle *fs, const rcti *rect, const char *str, size_t str_len, const uchar col[4], const uiFontStyleDraw_Params *fs_params)
#define UI_FSTYLE_WIDGET
#define UI_UNIT_X
void UI_widgetbase_draw_cache_flush()
void UI_icons_free_drawinfo(void *drawinfo)
#define ICON_DEFAULT_HEIGHT
#define ICON_DEFAULT_HEIGHT_TOOLBAR
#define PREVIEW_DEFAULT_HEIGHT
#define UI_NO_ICON_OVERLAY_TEXT
@ ALERT_ICON_INFO
@ ALERT_ICON_WARNING
@ ALERT_ICON_QUESTION
@ ALERT_ICON_ERROR
#define ICON_DEFAULT_WIDTH
void UI_Theme_Store(bThemeState *theme_state)
void UI_Theme_Restore(const bThemeState *theme_state)
#define TH_UNDEFINED
@ TH_ICON_MODIFIER
@ TH_ICON_AUTOKEY
@ TH_ICON_OBJECT
@ TH_ICON_FOLDER
@ TH_BACK
@ TH_INFO_INFO
@ TH_ICON_COLLECTION
@ TH_ICON_OBJECT_DATA
@ TH_ICON_SHADING
@ TH_ICON_SCENE
@ TH_INFO_ERROR
@ TH_REDALERT
@ TH_INFO_WARNING
@ TH_ICON_FUND
@ TH_TEXT
@ TH_TEXT_HI
void UI_GetThemeColorType4ubv(int colorid, int spacetype, unsigned char col[4])
void UI_GetThemeColor4fv(int colorid, float col[4])
bool UI_GetIconThemeColor4ubv(int colorid, unsigned char col[4])
bTheme * UI_GetTheme()
void UI_SetTheme(int spacetype, int regionid)
void UI_GetThemeColor4ubv(int colorid, unsigned char col[4])
@ WM_JOB_TYPE_STUDIOLIGHT
Definition WM_api.hh:1601
eWM_JobFlag
Definition WM_api.hh:1559
#define NC_WINDOW
Definition WM_types.hh:342
@ KM_NOTHING
Definition WM_types.hh:283
@ KM_ANY
Definition WM_types.hh:282
@ KM_CLICK_DRAG
Definition WM_types.hh:292
@ KM_DBL_CLICK
Definition WM_types.hh:287
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
const T * data() const
Definition BLI_array.hh:301
bool is_empty() const
Definition BLI_array.hh:253
constexpr int64_t find(char c, int64_t pos=0) const
constexpr int64_t size() const
std::string id_name(void *id)
local_group_size(16, 16) .push_constant(Type b
local_group_size(16, 16) .push_constant(Type texture
#define printf
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
RAYTRACE_GROUP_SIZE additional_info("eevee_shared", "eevee_gbuffer_data", "eevee_global_ubo", "eevee_sampling_data", "eevee_utility_texture", "eevee_hiz_data", "draw_view") .specialization_constant(Type RAYTRACE_GROUP_SIZE in_sh_0_tx in_sh_2_tx screen_normal_tx GPU_RGBA8
uint col
struct ImBuf * IMB_ibImageFromMemory(const unsigned char *, size_t, int, char[IM_MAX_SPACE], const char *)
struct ImBuf * IMB_allocFromBuffer(const uint8_t *, const float *, unsigned int, unsigned int, unsigned int)
void IMB_freeImBuf(ImBuf *)
void UI_icons_free_drawinfo(void *drawinfo)
int UI_icon_from_object_mode(const int mode)
static void vicon_collection_color_draw(short color_tag, int x, int y, int w, int, float)
static void init_event_icons()
static void ui_id_preview_image_render_size(const bContext *C, Scene *scene, ID *id, PreviewImage *pi, int size, const bool use_job)
#define DEF_ICON_VECTOR_COLORSET_DRAW_NTH(prefix, index)
static void vicon_handletype_aligned_draw(int x, int y, int w, int h, float alpha)
PreviewImage * UI_icon_to_preview(int icon_id)
#define DEF_ICON_COLLECTION_COLOR_DRAW(index, color)
void UI_icon_text_overlay_init_from_count(IconTextOverlay *text_overlay, const int icon_indicator_number)
int UI_icon_from_rnaptr(const bContext *C, PointerRNA *ptr, int rnaicon, const bool big)
static void vicon_strip_color_draw(short color_tag, int x, int y, int w, int, float)
static DrawInfo * icon_ensure_drawinfo(Icon *icon)
static DrawInfo * def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs, int size, int type, int theme_color)
static void vicon_handletype_auto_clamp_draw(int x, int y, int w, int h, float alpha)
ImBuf * UI_svg_icon_bitmap(uint icon_id, float size, bool multicolor)
static void vicon_keytype_keyframe_draw(int x, int y, int w, int h, float alpha)
static void vicon_strip_color_draw_library_data_override_noneditable(int x, int y, int w, int, float alpha)
void ui_icon_ensure_deferred(const bContext *C, const int icon_id, const bool big)
static const IconType icontypes[]
#define ICON_INDIRECT_DATA_ALPHA
int UI_icon_from_idcode(const int idcode)
void UI_icon_draw_alpha(float x, float y, int icon_id, float alpha)
static void init_internal_icons()
static void vicon_gplayer_color_draw(Icon *icon, int x, int y, int w, int h)
static void svg_replace_color_attributes(std::string &svg, const std::string &name, const size_t start, const size_t end)
static void vicon_keytype_jitter_draw(int x, int y, int w, int h, float alpha)
void UI_icon_draw(float x, float y, int icon_id)
static void icon_draw_rect(float x, float y, int w, int h, int rw, int rh, const uint8_t *rect, float alpha, const float desaturate)
static void vicon_keytype_generated_draw(int x, int y, int w, int h, float alpha)
#define ICON_TYPE_SVG_MONO
static void vicon_colorset_draw(int index, int x, int y, int w, int h, float)
static void vicon_handletype_vector_draw(int x, int y, int w, int h, float alpha)
void UI_icon_draw_ex(float x, float y, int icon_id, float aspect, float alpha, float desaturate, const uchar mono_color[4], const bool mono_border, const IconTextOverlay *text_overlay, const bool inverted)
static void vicon_keytype_draw_wrapper(const int x, const int y, const int w, const int h, const float alpha, const eBezTriple_KeyframeType key_type, const short handle_type)
static void vicon_strip_color_draw_library_data_indirect(int x, int y, int w, int, float alpha)
static void icon_verify_datatoc(IconImage *iimg)
static void vicon_handletype_free_draw(int x, int y, int w, int h, float alpha)
static void ui_studiolight_icon_job_end(void *customdata)
void UI_icon_render_id(const bContext *C, Scene *scene, ID *id, const enum eIconSizes size, const bool use_job)
int ui_id_icon_get(const bContext *C, ID *id, const bool big)
#define DEF_ICON_LAYERGROUP_COLOR_DRAW(index, color)
static int ui_id_screen_get_icon(const bContext *C, ID *id)
#define ICON_TYPE_GEOM
#define ICON_TYPE_EVENT
int UI_icon_from_keymap_item(const wmKeyMapItem *kmi, int r_icon_mod[4])
static void icon_create_rect(PreviewImage *prv_img, enum eIconSizes size)
bool UI_icon_get_theme_color(int icon_id, uchar color[4])
static void vicon_keytype_moving_hold_draw(int x, int y, int w, int h, float alpha)
void UI_icon_render_id_ex(const bContext *C, Scene *scene, ID *id_to_render, const enum eIconSizes size, const bool use_job, PreviewImage *r_preview_image)
static void icon_draw_size(float x, float y, int icon_id, float aspect, float alpha, enum eIconSizes size, int draw_size, const float desaturate, const uchar mono_rgba[4], const bool mono_border, const IconTextOverlay *text_overlay, const bool inverted=false)
static void vicon_handletype_auto_draw(int x, int y, int w, int h, float alpha)
static void def_internal_vicon(int icon_id, VectorDrawFunc drawFunc)
#define ICON_TYPE_BUFFER
#define ICON_TYPE_SVG_COLOR
int UI_icon_from_library(const ID *id)
static void ui_studiolight_free_function(StudioLight *sl, void *data)
static void icon_source_edit_cb(std::string &svg)
void UI_icons_init()
static void vicon_layergroup_color_draw(short color_tag, int x, int y, int w, int, float)
int UI_icon_from_event_type(short event_type, short event_value)
int UI_icon_color_from_collection(const Collection *collection)
void(*)(int x, int y, int w, int h, float alpha) VectorDrawFunc
static DrawInfo * icon_create_drawinfo(Icon *icon)
void UI_icon_draw_preview(float x, float y, int icon_id, float aspect, float alpha, int size)
#define ICON_TYPE_GPLAYER
static void vicon_keytype_extreme_draw(int x, int y, int w, int h, float alpha)
#define DEF_ICON_STRIP_COLOR_DRAW(index, color)
#define ICON_TYPE_PREVIEW
#define ICON_TYPE_IMBUF
#define ICON_TYPE_VECTOR
static int get_draw_size(enum eIconSizes size)
int UI_icon_preview_to_render_size(enum eIconSizes size)
ImBuf * UI_icon_alert_imbuf_get(eAlertIcon icon, float size)
static DrawInfo * g_di_event_list
static void ui_studiolight_kill_icon_preview_job(wmWindowManager *wm, int icon_id)
static void vicon_keytype_breakdown_draw(int x, int y, int w, int h, float alpha)
#define INIT_EVENT_ICON(icon_id, type, value)
static void ui_studiolight_icon_job_exec(void *customdata, wmJobWorkerStatus *)
static void ui_id_icon_render(const bContext *C, ID *id, bool use_jobs)
void UI_icons_free()
static void icon_set_image(const bContext *C, Scene *scene, ID *id, PreviewImage *prv_img, enum eIconSizes size, const bool use_job)
void icon_draw_rect_input(const float x, const float y, const int w, const int h, const int icon_id, const float aspect, const float alpha, const bool inverted)
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
CCL_NAMESPACE_BEGIN ccl_device float invert(float color, float factor)
Definition invert.h:9
#define GS(x)
Definition iris.cc:202
void draw_keyframe_shape(const float x, const float y, float size, const bool sel, const eBezTriple_KeyframeType key_type, const eKeyframeShapeDrawOpts mode, const float alpha, const KeyframeShaderBindings *sh_bindings, const short handle_type, const short extreme_type)
format
void *(* MEM_mallocN)(size_t len, const char *str)
Definition mallocn.cc:44
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
static ulong state[N]
#define G(x, y, z)
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
bool RNA_struct_is_ID(const StructRNA *type)
int RNA_int_get(PointerRNA *ptr, const char *name)
unsigned char uint8_t
Definition stdint.h:78
struct DrawInfo::@260101342222167342067021017126021335210111345054::@355375114275107061340035214140064122050054301327 geom
IconImage * image
struct DrawInfo::@260101342222167342067021017126021335210111345054::@253154132357313152321163034061055275127334367105 texture
VectorDrawFunc func
struct DrawInfo::@260101342222167342067021017126021335210111345054::@370050240331011224160340157307277173357235327105 vector
ImBuf * image_cache
short event_value
struct DrawInfo::@260101342222167342067021017126021335210111345054::@373143134066316002052325201146341112054014106126 buffer
DrawInfo * next
struct DrawInfo::@260101342222167342067021017126021335210111345054::@244304217060310343225106273140376370131167310156 input
union DrawInfo::@260101342222167342067021017126021335210111345054 data
unsigned int flag
Definition DNA_ID.h:352
Definition DNA_ID.h:413
int tag
Definition DNA_ID.h:434
IDOverrideLibrary * override_library
Definition DNA_ID.h:459
char name[66]
Definition DNA_ID.h:425
uint8_t * rect
const uchar * datatoc_rect
void * obj
Definition BKE_icons.h:55
char obj_type
Definition BKE_icons.h:56
void * drawinfo
Definition BKE_icons.h:49
short id_type
Definition BKE_icons.h:60
DrawInfoFreeFP drawinfo_free
Definition BKE_icons.h:61
ImBufByteBuffer byte_buffer
void * data
Definition RNA_types.hh:42
PreviewImageRuntimeHandle * runtime
Definition DNA_ID.h:609
unsigned int h[2]
Definition DNA_ID.h:604
short changed_timestamp[2]
Definition DNA_ID.h:606
short flag[2]
Definition DNA_ID.h:605
unsigned int * rect[2]
Definition DNA_ID.h:607
unsigned int w[2]
Definition DNA_ID.h:603
int icon_id_matcap_flipped
unsigned char vertex_select[4]
unsigned char color[4]
float icon_border_intensity
uiWidgetColors wcol_regular
uiWidgetColors wcol_toolbar_item
unsigned char select[4]
unsigned char solid[4]
unsigned char active[4]
ThemeStripColor strip_color[9]
ThemeSpace space_view3d
ThemeWireColor tarm[20]
ThemeCollectionColor collection_color[8]
unsigned char inner[4]
ccl_device_inline bool is_light(const ccl_global KernelLightTreeEmitter *kemitter)
Definition tree.h:64
@ EVT_PAD8
@ EVT_F14KEY
@ EVT_PAD2
@ BUTTON7MOUSE
@ RIGHTMOUSE
@ EVT_SIXKEY
@ EVT_QUOTEKEY
@ EVT_PADPERIOD
@ NDOF_BUTTON_SPIN_CW
@ EVT_OKEY
@ NDOF_BUTTON_TILT_CCW
@ EVT_EKEY
@ EVT_PAD4
@ EVT_JKEY
@ EVT_PADASTERKEY
@ NDOF_BUTTON_7
@ BUTTON6MOUSE
@ NDOF_BUTTON_V2
@ EVT_F18KEY
@ EVT_PLUSKEY
@ EVT_PAD0
@ EVT_F7KEY
@ EVT_FOURKEY
@ NDOF_BUTTON_2
@ EVT_YKEY
@ EVT_RIGHTCTRLKEY
@ EVT_F17KEY
@ EVT_SKEY
@ EVT_VKEY
@ NDOF_BUTTON_8
@ EVT_IKEY
@ NDOF_BUTTON_MENU
@ EVT_F1KEY
@ EVT_PERIODKEY
@ EVT_PADSLASHKEY
@ EVT_XKEY
@ NDOF_BUTTON_1
@ EVT_COMMAKEY
@ NDOF_BUTTON_BOTTOM
@ EVT_MEDIAPLAY
@ EVT_LEFTBRACKETKEY
@ EVT_MEDIAFIRST
@ EVT_F23KEY
@ EVT_ZEROKEY
@ EVT_F10KEY
@ EVT_FKEY
@ EVT_PAD9
@ EVT_DELKEY
@ EVT_SEVENKEY
@ NDOF_BUTTON_V1
@ EVT_F20KEY
@ EVT_CKEY
@ EVT_F2KEY
@ EVT_GKEY
@ EVT_KKEY
@ EVT_TABKEY
@ EVT_DOWNARROWKEY
@ NDOF_BUTTON_BACK
@ EVT_UKEY
@ EVT_MEDIASTOP
@ EVT_AKEY
@ EVT_PAD3
@ EVT_MINUSKEY
@ EVT_PAGEUPKEY
@ EVT_OSKEY
@ EVT_F4KEY
@ EVT_PAGEDOWNKEY
@ NDOF_BUTTON_5
@ EVT_F8KEY
@ NDOF_BUTTON_SAVE_V2
@ NDOF_BUTTON_RIGHT
@ EVT_LEFTCTRLKEY
@ NDOF_BUTTON_ROLL_CW
@ NDOF_BUTTON_10
@ TABLET_ERASER
@ EVT_EQUALKEY
@ NDOF_BUTTON_3
@ EVT_RIGHTARROWKEY
@ EVT_F6KEY
@ EVT_F5KEY
@ EVT_PADENTER
@ EVT_F22KEY
@ EVT_F19KEY
@ EVT_NINEKEY
@ NDOF_BUTTON_PLUS
@ EVT_SPACEKEY
@ EVT_CAPSLOCKKEY
@ BUTTON4MOUSE
@ EVT_PAD6
@ NDOF_BUTTON_ISO2
@ EVT_PAD5
@ EVT_HOMEKEY
@ TABLET_STYLUS
@ EVT_RIGHTBRACKETKEY
@ EVT_WKEY
@ NDOF_BUTTON_PANZOOM
@ EVT_UNKNOWNKEY
@ EVT_ENDKEY
@ EVT_RIGHTALTKEY
@ EVT_MEDIALAST
@ EVT_MKEY
@ EVT_TKEY
@ EVT_HKEY
@ NDOF_BUTTON_MINUS
@ EVT_BACKSLASHKEY
@ EVT_FIVEKEY
@ EVT_APPKEY
@ EVT_F24KEY
@ EVT_ACCENTGRAVEKEY
@ EVT_PADMINUS
@ EVT_F21KEY
@ EVT_ONEKEY
@ EVT_UPARROWKEY
@ LEFTMOUSE
@ EVT_F11KEY
@ EVT_SLASHKEY
@ EVT_EIGHTKEY
@ EVT_F13KEY
@ NDOF_BUTTON_DOMINANT
@ EVT_F15KEY
@ EVT_LEFTARROWKEY
@ EVT_INSERTKEY
@ EVT_NKEY
@ EVT_QKEY
@ MIDDLEMOUSE
@ NDOF_BUTTON_TILT_CW
@ EVT_LEFTALTKEY
@ EVT_ZKEY
@ EVT_ESCKEY
@ NDOF_BUTTON_9
@ NDOF_BUTTON_LEFT
@ NDOF_BUTTON_FIT
@ EVT_THREEKEY
@ NDOF_BUTTON_V3
@ EVT_BACKSPACEKEY
@ EVT_F12KEY
@ EVT_DKEY
@ NDOF_BUTTON_SAVE_V3
@ EVT_F16KEY
@ NDOF_BUTTON_4
@ EVT_PAD1
@ EVT_TWOKEY
@ EVT_GRLESSKEY
@ EVT_LKEY
@ NDOF_BUTTON_12
@ EVT_RIGHTSHIFTKEY
@ NDOF_BUTTON_FRONT
@ NDOF_BUTTON_SAVE_V1
@ NDOF_BUTTON_11
@ EVT_PAUSEKEY
@ EVT_PAD7
@ NDOF_BUTTON_SPIN_CCW
@ EVT_LEFTSHIFTKEY
@ NDOF_BUTTON_ISO1
@ EVT_PADPLUSKEY
@ NDOF_BUTTON_6
@ EVT_F3KEY
@ NDOF_BUTTON_TOP
@ EVT_F9KEY
@ EVT_RKEY
@ EVT_SEMICOLONKEY
@ EVT_BKEY
@ EVT_PKEY
@ NDOF_BUTTON_ROTATE
@ EVT_RETKEY
@ BUTTON5MOUSE
@ NDOF_BUTTON_ROLL_CCW
PointerRNA * ptr
Definition wm_files.cc:4126
void WM_jobs_timer(wmJob *wm_job, double time_step, uint note, uint endnote)
Definition wm_jobs.cc:352
void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
Definition wm_jobs.cc:455
void WM_jobs_kill_type(wmWindowManager *wm, const void *owner, int job_type)
Definition wm_jobs.cc:597
wmJob * WM_jobs_get(wmWindowManager *wm, wmWindow *win, const void *owner, const char *name, const eWM_JobFlag flag, const eWM_JobType job_type)
Definition wm_jobs.cc:189
void WM_jobs_callbacks(wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *))
Definition wm_jobs.cc:364
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *customdata))
Definition wm_jobs.cc:336