Blender V4.3
space_image.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2008 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "DNA_defaults.h"
11#include "DNA_image_types.h"
12#include "DNA_mask_types.h"
13#include "DNA_object_types.h"
14#include "DNA_scene_types.h"
15
16#include "MEM_guardedalloc.h"
17
18#include "BLI_blenlib.h"
19#include "BLI_threads.h"
20
21#include "BKE_colortools.hh"
22#include "BKE_context.hh"
23#include "BKE_image.hh"
24#include "BKE_layer.hh"
25#include "BKE_lib_query.hh"
26#include "BKE_lib_remap.hh"
27#include "BKE_screen.hh"
28
29#include "RNA_access.hh"
30#include "RNA_define.hh"
31#include "RNA_enum_types.hh"
32
33#include "IMB_imbuf_types.hh"
34
35#include "ED_asset_shelf.hh"
36#include "ED_image.hh"
37#include "ED_mask.hh"
38#include "ED_node.hh"
39#include "ED_render.hh"
40#include "ED_screen.hh"
41#include "ED_space_api.hh"
42#include "ED_transform.hh"
43#include "ED_util.hh"
44#include "ED_uvedit.hh"
45
46#include "WM_api.hh"
47#include "WM_types.hh"
48
49#include "UI_interface.hh"
50#include "UI_resources.hh"
51#include "UI_view2d.hh"
52
53#include "BLO_read_write.hh"
54
55#include "DRW_engine.hh"
56
57#include "image_intern.hh"
58
59/**************************** common state *****************************/
60
62{
63 SpaceImage *sima = (SpaceImage *)area->spacedata.first;
64
65 /* only while histogram is visible */
66 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
67 if (region->regiontype == RGN_TYPE_TOOL_PROPS && region->flag & RGN_FLAG_HIDDEN) {
68 return;
69 }
70 }
71
72 sima->scopes.ok = 0;
73}
74
75static void image_user_refresh_scene(const bContext *C, SpaceImage *sima)
76{
77 /* Update scene image user for acquiring render results. */
78 sima->iuser.scene = CTX_data_scene(C);
79
80 if (sima->image && sima->image->type == IMA_TYPE_R_RESULT) {
81 /* While rendering, prefer scene that is being rendered. */
82 Scene *render_scene = ED_render_job_get_current_scene(C);
83 if (render_scene) {
84 sima->iuser.scene = render_scene;
85 }
86 }
87
88 /* Auto switch image to show in UV editor when selection changes. */
90}
91
92/* ******************** default callbacks for image space ***************** */
93
94static SpaceLink *image_create(const ScrArea * /*area*/, const Scene * /*scene*/)
95{
96 ARegion *region;
97 SpaceImage *simage;
98
99 simage = static_cast<SpaceImage *>(MEM_callocN(sizeof(SpaceImage), "initimage"));
100 simage->spacetype = SPACE_IMAGE;
101 simage->zoom = 1.0f;
102 simage->lock = true;
104 simage->uv_opacity = 1.0f;
105 simage->stretch_opacity = 1.0f;
107
110
111 BKE_scopes_new(&simage->scopes);
112 simage->sample_line_hist.height = 100;
113
114 simage->tile_grid_shape[0] = 1;
115 simage->tile_grid_shape[1] = 1;
116
117 simage->custom_grid_subdiv[0] = 10;
118 simage->custom_grid_subdiv[1] = 10;
119
121
122 /* header */
123 region = static_cast<ARegion *>(MEM_callocN(sizeof(ARegion), "header for image"));
124
125 BLI_addtail(&simage->regionbase, region);
126 region->regiontype = RGN_TYPE_HEADER;
127 region->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP;
128
129 /* asset shelf */
130 region = MEM_cnew<ARegion>("asset shelf for view3d");
131 BLI_addtail(&simage->regionbase, region);
132 region->regiontype = RGN_TYPE_ASSET_SHELF;
133 region->alignment = RGN_ALIGN_BOTTOM;
134 region->flag |= RGN_FLAG_HIDDEN;
135
136 /* asset shelf header */
137 region = MEM_cnew<ARegion>("asset shelf header for view3d");
138 BLI_addtail(&simage->regionbase, region);
139 region->regiontype = RGN_TYPE_ASSET_SHELF_HEADER;
140 region->alignment = RGN_ALIGN_BOTTOM | RGN_ALIGN_HIDE_WITH_PREV;
141
142 /* tool header */
143 region = static_cast<ARegion *>(MEM_callocN(sizeof(ARegion), "tool header for image"));
144
145 BLI_addtail(&simage->regionbase, region);
146 region->regiontype = RGN_TYPE_TOOL_HEADER;
147 region->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP;
149
150 /* buttons/list view */
151 region = static_cast<ARegion *>(MEM_callocN(sizeof(ARegion), "buttons for image"));
152
153 BLI_addtail(&simage->regionbase, region);
154 region->regiontype = RGN_TYPE_UI;
155 region->alignment = RGN_ALIGN_RIGHT;
156 region->flag = RGN_FLAG_HIDDEN;
157
158 /* scopes/uv sculpt/paint */
159 region = static_cast<ARegion *>(MEM_callocN(sizeof(ARegion), "buttons for image"));
160
161 BLI_addtail(&simage->regionbase, region);
162 region->regiontype = RGN_TYPE_TOOLS;
163 region->alignment = RGN_ALIGN_LEFT;
164 region->flag = RGN_FLAG_HIDDEN;
165
166 /* main area */
167 region = static_cast<ARegion *>(MEM_callocN(sizeof(ARegion), "main area for image"));
168
169 BLI_addtail(&simage->regionbase, region);
170 region->regiontype = RGN_TYPE_WINDOW;
171
172 return (SpaceLink *)simage;
173}
174
175/* Doesn't free the space-link itself. */
176static void image_free(SpaceLink *sl)
177{
178 SpaceImage *simage = (SpaceImage *)sl;
179
180 BKE_scopes_free(&simage->scopes);
181}
182
183/* spacetype; init callback, add handlers */
184static void image_init(wmWindowManager * /*wm*/, ScrArea *area)
185{
187
188 /* add drop boxes */
189 WM_event_add_dropbox_handler(&area->handlers, lb);
190}
191
193{
194 SpaceImage *simagen = static_cast<SpaceImage *>(MEM_dupallocN(sl));
195
196 /* clear or remove stuff from old */
197
198 BKE_scopes_new(&simagen->scopes);
199
200 return (SpaceLink *)simagen;
201}
202
204{
215#ifdef WITH_INPUT_NDOF
216 WM_operatortype_append(IMAGE_OT_view_ndof);
217#endif
218
233
238
243
247
249
253
257}
258
259static void image_keymap(wmKeyConfig *keyconf)
260{
261 WM_keymap_ensure(keyconf, "Image Generic", SPACE_IMAGE, RGN_TYPE_WINDOW);
262 WM_keymap_ensure(keyconf, "Image", SPACE_IMAGE, RGN_TYPE_WINDOW);
263}
264
265/* area+region dropbox definition */
266static void image_dropboxes() {}
267
272static void image_refresh(const bContext *C, ScrArea *area)
273{
274 Scene *scene = CTX_data_scene(C);
275 SpaceImage *sima = static_cast<SpaceImage *>(area->spacedata.first);
276 Image *ima;
277
278 ima = ED_space_image(sima);
279 BKE_image_user_frame_calc(ima, &sima->iuser, scene->r.cfra);
280
281 /* Check if we have to set the image from the edit-mesh. */
282 if (ima && (ima->source == IMA_SRC_VIEWER && sima->mode == SI_MODE_MASK)) {
283 if (scene->nodetree) {
284 Mask *mask = ED_space_image_get_mask(sima);
285 if (mask) {
286 ED_node_composite_job(C, scene->nodetree, scene);
287 }
288 }
289 }
290}
291
293{
294 wmWindow *win = params->window;
295 ScrArea *area = params->area;
296 const wmNotifier *wmn = params->notifier;
297 SpaceImage *sima = (SpaceImage *)area->spacedata.first;
298
299 /* context changes */
300 switch (wmn->category) {
301 case NC_WINDOW:
302 /* notifier comes from editing color space */
304 ED_area_tag_redraw(area);
305 break;
306 case NC_SCENE:
307 switch (wmn->data) {
308 case ND_FRAME:
311 ED_area_tag_redraw(area);
312 break;
313 case ND_MODE:
314 ED_paint_cursor_start(&params->scene->toolsettings->imapaint.paint,
316
317 if (wmn->subtype == NS_EDITMODE_MESH) {
319 }
320 ED_area_tag_redraw(area);
321 break;
322 case ND_RENDER_RESULT:
324 case ND_COMPO_RESULT:
325 if (ED_space_image_show_render(sima)) {
328 }
329 ED_area_tag_redraw(area);
330 break;
331 }
332 break;
333 case NC_IMAGE:
334 if (wmn->reference == sima->image || !wmn->reference) {
335 if (wmn->action != NA_PAINTING) {
338 ED_area_tag_redraw(area);
339 }
340 }
341 break;
342 case NC_SPACE:
343 if (wmn->data == ND_SPACE_IMAGE) {
345 ED_area_tag_redraw(area);
346 }
347 break;
348 case NC_MASK: {
349 Scene *scene = WM_window_get_active_scene(win);
351 BKE_view_layer_synced_ensure(scene, view_layer);
352 Object *obedit = BKE_view_layer_edit_object_get(view_layer);
353 if (ED_space_image_check_show_maskedit(sima, obedit)) {
354 switch (wmn->data) {
355 case ND_SELECT:
356 ED_area_tag_redraw(area);
357 break;
358 case ND_DATA:
359 case ND_DRAW:
360 /* causes node-recalc */
361 ED_area_tag_redraw(area);
363 break;
364 }
365 switch (wmn->action) {
366 case NA_SELECTED:
367 ED_area_tag_redraw(area);
368 break;
369 case NA_EDITED:
370 /* causes node-recalc */
371 ED_area_tag_redraw(area);
373 break;
374 }
375 }
376 break;
377 }
378 case NC_GEOM: {
379 switch (wmn->data) {
380 case ND_DATA:
381 case ND_SELECT:
384 ED_area_tag_redraw(area);
385 break;
386 }
387 break;
388 }
389 case NC_OBJECT: {
390 switch (wmn->data) {
391 case ND_TRANSFORM:
392 case ND_MODIFIER: {
393 const Scene *scene = WM_window_get_active_scene(win);
395 BKE_view_layer_synced_ensure(scene, view_layer);
397 /* \note With a geometry nodes modifier, the UVs on `ob` can change in response to
398 * any change on `wmn->reference`. If we could track the upstream dependencies,
399 * unnecessary redraws could be reduced. Until then, just redraw. See #98594. */
400 if (ob && (ob->mode & OB_MODE_EDIT)) {
401 if (sima->lock && (sima->flag & SI_DRAWSHADOW)) {
403 ED_area_tag_redraw(area);
404 }
405 }
406 break;
407 }
408 }
409
410 break;
411 }
412 case NC_ID: {
413 if (wmn->action == NA_RENAME) {
414 ED_area_tag_redraw(area);
415 }
416 break;
417 }
418 case NC_WM:
419 if (wmn->data == ND_UNDO) {
420 ED_area_tag_redraw(area);
422 }
423 break;
424 }
425}
426
427const char *image_context_dir[] = {"edit_image", "edit_mask", nullptr};
428
429static int /*eContextResult*/ image_context(const bContext *C,
430 const char *member,
431 bContextDataResult *result)
432{
434
435 if (CTX_data_dir(member)) {
437 // return CTX_RESULT_OK; /* TODO(@sybren). */
438 }
439 else if (CTX_data_equals(member, "edit_image")) {
440 CTX_data_id_pointer_set(result, (ID *)ED_space_image(sima));
441 return CTX_RESULT_OK;
442 }
443 else if (CTX_data_equals(member, "edit_mask")) {
444 Mask *mask = ED_space_image_get_mask(sima);
445 if (mask) {
446 CTX_data_id_pointer_set(result, &mask->id);
447 }
448 return CTX_RESULT_OK;
449 }
451}
452
454{
455 gzgt->name = "UV Transform Gizmo";
456 gzgt->idname = "IMAGE_GGT_gizmo2d";
457
460
463
465}
466
468{
469 gzgt->name = "UV Translate Gizmo";
470 gzgt->idname = "IMAGE_GGT_gizmo2d_translate";
471
474
477
479}
480
482{
483 gzgt->name = "UV Transform Gizmo Resize";
484 gzgt->idname = "IMAGE_GGT_gizmo2d_resize";
485
488
491
493}
494
496{
497 gzgt->name = "UV Transform Gizmo Resize";
498 gzgt->idname = "IMAGE_GGT_gizmo2d_rotate";
499
502
505
507}
508
510{
511 VIEW2D_GGT_navigate_impl(gzgt, "IMAGE_GGT_navigate");
512}
513
526
527/************************** main region ***************************/
528
529/* sets up the fields of the View2D from zoom and offset */
531{
532 Image *ima = ED_space_image(sima);
533
534 int width, height;
535 ED_space_image_get_size(sima, &width, &height);
536
537 float w = width;
538 float h = height;
539
540 if (ima) {
541 h *= ima->aspy / ima->aspx;
542 }
543
544 int winx = BLI_rcti_size_x(&region->winrct) + 1;
545 int winy = BLI_rcti_size_y(&region->winrct) + 1;
546
547 /* For region overlap, move center so image doesn't overlap header. */
548 const rcti *visible_rect = ED_region_visible_rect(region);
549 const int visible_winy = BLI_rcti_size_y(visible_rect) + 1;
550 int visible_centerx = 0;
551 int visible_centery = visible_rect->ymin + (visible_winy - winy) / 2;
552
553 region->v2d.tot.xmin = 0;
554 region->v2d.tot.ymin = 0;
555 region->v2d.tot.xmax = w;
556 region->v2d.tot.ymax = h;
557
558 region->v2d.mask.xmin = region->v2d.mask.ymin = 0;
559 region->v2d.mask.xmax = winx;
560 region->v2d.mask.ymax = winy;
561
562 /* which part of the image space do we see? */
563 float x1 = region->winrct.xmin + visible_centerx + (winx - sima->zoom * w) / 2.0f;
564 float y1 = region->winrct.ymin + visible_centery + (winy - sima->zoom * h) / 2.0f;
565
566 x1 -= sima->zoom * sima->xof;
567 y1 -= sima->zoom * sima->yof;
568
569 /* relative display right */
570 region->v2d.cur.xmin = ((region->winrct.xmin - float(x1)) / sima->zoom);
571 region->v2d.cur.xmax = region->v2d.cur.xmin + (float(winx) / sima->zoom);
572
573 /* relative display left */
574 region->v2d.cur.ymin = ((region->winrct.ymin - float(y1)) / sima->zoom);
575 region->v2d.cur.ymax = region->v2d.cur.ymin + (float(winy) / sima->zoom);
576
577 /* normalize 0.0..1.0 */
578 region->v2d.cur.xmin /= w;
579 region->v2d.cur.xmax /= w;
580 region->v2d.cur.ymin /= h;
581 region->v2d.cur.ymax /= h;
582}
583
584/* add handlers, stuff you only do once or on area/region changes */
586{
587 wmKeyMap *keymap;
588
589 /* NOTE: don't use `UI_view2d_region_reinit(&region->v2d, ...)`
590 * since the space clip manages own v2d in #image_main_region_set_view2d */
591
592 /* mask polls mode */
593 keymap = WM_keymap_ensure(wm->defaultconf, "Mask Editing", SPACE_EMPTY, RGN_TYPE_WINDOW);
594 WM_event_add_keymap_handler_v2d_mask(&region->handlers, keymap);
595
596 /* image paint polls for mode */
598 WM_event_add_keymap_handler_v2d_mask(&region->handlers, keymap);
599
600 keymap = WM_keymap_ensure(wm->defaultconf, "Paint Curve", SPACE_EMPTY, RGN_TYPE_WINDOW);
601 WM_event_add_keymap_handler(&region->handlers, keymap);
602
603 keymap = WM_keymap_ensure(wm->defaultconf, "Image Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
604 WM_event_add_keymap_handler_v2d_mask(&region->handlers, keymap);
605
606 keymap = WM_keymap_ensure(wm->defaultconf, "UV Editor", SPACE_EMPTY, RGN_TYPE_WINDOW);
607 WM_event_add_keymap_handler(&region->handlers, keymap);
608
609 /* own keymaps */
610 keymap = WM_keymap_ensure(wm->defaultconf, "Image Generic", SPACE_IMAGE, RGN_TYPE_WINDOW);
611 WM_event_add_keymap_handler(&region->handlers, keymap);
613 WM_event_add_keymap_handler_v2d_mask(&region->handlers, keymap);
614}
615
616static void image_main_region_draw(const bContext *C, ARegion *region)
617{
618 /* draw entirely, view changes should be handled here */
620 Object *obedit = CTX_data_edit_object(C);
622 Mask *mask = nullptr;
623 Scene *scene = CTX_data_scene(C);
624 View2D *v2d = &region->v2d;
625 Image *image = ED_space_image(sima);
626 const bool show_viewer = (image && image->source == IMA_SRC_VIEWER);
627
628 /* XXX not supported yet, disabling for now */
629 scene->r.scemode &= ~R_COMP_CROP;
630
632
633 /* we set view2d from own zoom and offset each time */
634 image_main_region_set_view2d(sima, region);
635
636 /* check for mask (delay draw) */
637 if (!ED_space_image_show_uvedit(sima, obedit) && sima->mode == SI_MODE_MASK) {
638 mask = ED_space_image_get_mask(sima);
639 }
640
641 if (show_viewer) {
643 }
644 DRW_draw_view(C);
645 if (show_viewer) {
647 }
648
649 draw_image_main_helpers(C, region);
650
651 /* Draw Meta data of the image isn't added to the DrawManager as it is
652 * used in other areas as well. */
654 void *lock;
655 /* `ED_space_image_get_zoom` temporarily locks the image, so this needs to be done before
656 * the image is locked when calling `ED_space_image_acquire_buffer`. */
657 float zoomx, zoomy;
658 ED_space_image_get_zoom(sima, region, &zoomx, &zoomy);
659 ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock, 0);
660 if (ibuf) {
661 int x, y;
662 rctf frame;
663 BLI_rctf_init(&frame, 0.0f, ibuf->x, 0.0f, ibuf->y);
664 UI_view2d_view_to_region(&region->v2d, 0.0f, 0.0f, &x, &y);
665 ED_region_image_metadata_draw(x, y, ibuf, &frame, zoomx, zoomy);
666 }
668 }
669
670 /* sample line */
674
675 if (mask) {
676 int width, height;
677 float aspx, aspy;
678
679 if (show_viewer) {
680 /* ED_space_image_get* will acquire image buffer which requires
681 * lock here by the same reason why lock is needed in draw_image_main
682 */
684 }
685
686 ED_space_image_get_size(sima, &width, &height);
687 ED_space_image_get_aspect(sima, &aspx, &aspy);
688
689 if (show_viewer) {
691 }
692
694 mask,
695 region, /* Mask overlay is drawn by image/overlay engine. */
697 sima->mask_info.draw_type,
700 width,
701 height,
702 aspx,
703 aspy,
704 true,
705 false,
706 nullptr,
707 C);
708 }
709 if ((sima->gizmo_flag & SI_GIZMO_HIDE) == 0) {
710 WM_gizmomap_draw(region->gizmo_map, C, WM_GIZMOMAP_DRAWSTEP_2D);
711 }
712 draw_image_cache(C, region);
713}
714
716{
717 ScrArea *area = params->area;
718 ARegion *region = params->region;
719 const wmNotifier *wmn = params->notifier;
720
721 /* context changes */
722 switch (wmn->category) {
723 case NC_GEOM:
724 if (ELEM(wmn->data, ND_DATA, ND_SELECT)) {
725 WM_gizmomap_tag_refresh(region->gizmo_map);
726 }
727 break;
728 case NC_GPENCIL:
729 if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
730 ED_region_tag_redraw(region);
731 }
732 else if (wmn->data & ND_GPENCIL_EDITMODE) {
733 ED_region_tag_redraw(region);
734 }
735 break;
736 case NC_IMAGE:
737 if (wmn->action == NA_PAINTING) {
738 ED_region_tag_redraw(region);
739 }
740 WM_gizmomap_tag_refresh(region->gizmo_map);
741 break;
742 case NC_MATERIAL:
743 if (wmn->data == ND_SHADING_LINKS) {
744 SpaceImage *sima = static_cast<SpaceImage *>(area->spacedata.first);
745
746 if (sima->iuser.scene && (sima->iuser.scene->toolsettings->uv_flag & UV_SHOW_SAME_IMAGE)) {
747 ED_region_tag_redraw(region);
748 }
749 }
750 break;
751 case NC_SCREEN:
752 if (ELEM(wmn->data, ND_LAYER)) {
753 ED_region_tag_redraw(region);
754 }
755 break;
756 }
757}
758
759/* *********************** buttons region ************************ */
760
761/* add handlers, stuff you only do once or on area/region changes */
763{
764 wmKeyMap *keymap;
765
766 region->v2d.scroll = V2D_SCROLL_RIGHT | V2D_SCROLL_VERTICAL_HIDE;
767 ED_region_panels_init(wm, region);
768
769 keymap = WM_keymap_ensure(wm->defaultconf, "Image Generic", SPACE_IMAGE, RGN_TYPE_WINDOW);
770 WM_event_add_keymap_handler(&region->handlers, keymap);
771}
772
773static void image_buttons_region_layout(const bContext *C, ARegion *region)
774{
775 const enum eContextObjectMode mode = CTX_data_mode_enum(C);
776 const char *contexts_base[3] = {nullptr};
777
778 const char **contexts = contexts_base;
779
781 switch (sima->mode) {
782 case SI_MODE_VIEW:
783 break;
784 case SI_MODE_PAINT:
785 ARRAY_SET_ITEMS(contexts, ".paint_common_2d", ".imagepaint_2d");
786 break;
787 case SI_MODE_MASK:
788 break;
789 case SI_MODE_UV:
790 if (mode == CTX_MODE_EDIT_MESH) {
791 ARRAY_SET_ITEMS(contexts, ".uv_sculpt");
792 }
793 break;
794 }
795
797 C, region, &region->type->paneltypes, WM_OP_INVOKE_REGION_WIN, contexts_base, nullptr);
798}
799
800static void image_buttons_region_draw(const bContext *C, ARegion *region)
801{
803 Scene *scene = CTX_data_scene(C);
804 void *lock;
805 /* TODO(lukas): Support tiles in scopes? */
806 ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock, 0);
807 /* XXX performance regression if name of scopes category changes! */
808 PanelCategoryStack *category = UI_panel_category_active_find(region, "Scopes");
809
810 /* only update scopes if scope category is active */
811 if (category) {
812 if (ibuf) {
813 if (!sima->scopes.ok) {
815 &sima->sample_line_hist, ibuf, &scene->view_settings, &scene->display_settings);
816 }
817 if (sima->image->flag & IMA_VIEW_AS_RENDER) {
818 ED_space_image_scopes_update(C, sima, ibuf, true);
819 }
820 else {
821 ED_space_image_scopes_update(C, sima, ibuf, false);
822 }
823 }
824 }
826
827 /* Layout handles details. */
828 ED_region_panels_draw(C, region);
829}
830
832{
833 ARegion *region = params->region;
834 const wmNotifier *wmn = params->notifier;
835
836 /* context changes */
837 switch (wmn->category) {
838 case NC_TEXTURE:
839 case NC_MATERIAL:
840 /* sending by texture render job and needed to properly update displaying
841 * brush texture icon */
842 ED_region_tag_redraw(region);
843 break;
844 case NC_SCENE:
845 switch (wmn->data) {
846 case ND_MODE:
847 case ND_RENDER_RESULT:
848 case ND_COMPO_RESULT:
849 ED_region_tag_redraw(region);
850 break;
851 }
852 break;
853 case NC_IMAGE:
854 if (wmn->action != NA_PAINTING) {
855 ED_region_tag_redraw(region);
856 }
857 break;
858 case NC_NODE:
859 ED_region_tag_redraw(region);
860 break;
861 case NC_GPENCIL:
862 if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
863 ED_region_tag_redraw(region);
864 }
865 break;
866 case NC_BRUSH:
867 if (wmn->action == NA_EDITED) {
868 ED_region_tag_redraw(region);
869 }
870 break;
871 }
872}
873
874/* *********************** scopes region ************************ */
875
876/* add handlers, stuff you only do once or on area/region changes */
878{
879 wmKeyMap *keymap;
880
881 region->v2d.scroll = V2D_SCROLL_RIGHT | V2D_SCROLL_VERTICAL_HIDE;
882 ED_region_panels_init(wm, region);
883
884 keymap = WM_keymap_ensure(wm->defaultconf, "Image Generic", SPACE_IMAGE, RGN_TYPE_WINDOW);
885 WM_event_add_keymap_handler(&region->handlers, keymap);
886}
887
888static void image_tools_region_draw(const bContext *C, ARegion *region)
889{
890 ED_region_panels(C, region);
891}
892
894{
895 ARegion *region = params->region;
896 const wmNotifier *wmn = params->notifier;
897
898 /* context changes */
899 switch (wmn->category) {
900 case NC_GPENCIL:
901 if (wmn->data == ND_DATA || ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
902 ED_region_tag_redraw(region);
903 }
904 break;
905 case NC_BRUSH:
906 /* NA_SELECTED is used on brush changes */
907 if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
908 ED_region_tag_redraw(region);
909 }
910 break;
911 case NC_SCENE:
912 switch (wmn->data) {
913 case ND_MODE:
914 case ND_RENDER_RESULT:
915 case ND_COMPO_RESULT:
916 ED_region_tag_redraw(region);
917 break;
918 }
919 break;
920 case NC_IMAGE:
921 if (wmn->action != NA_PAINTING) {
922 ED_region_tag_redraw(region);
923 }
924 break;
925 case NC_NODE:
926 ED_region_tag_redraw(region);
927 break;
928 }
929}
930
931/************************* Tool header region **************************/
932
933static void image_tools_header_region_draw(const bContext *C, ARegion *region)
934{
935 ScrArea *area = CTX_wm_area(C);
936 SpaceImage *sima = static_cast<SpaceImage *>(area->spacedata.first);
937
939
941 C,
942 region,
943 (RGN_ALIGN_ENUM_FROM_MASK(region->alignment) == RGN_ALIGN_TOP) ?
946}
947
948/************************* header region **************************/
949
950/* add handlers, stuff you only do once or on area/region changes */
952{
953 ED_region_header_init(region);
954}
955
956static void image_header_region_draw(const bContext *C, ARegion *region)
957{
958 ScrArea *area = CTX_wm_area(C);
959 SpaceImage *sima = static_cast<SpaceImage *>(area->spacedata.first);
960
962
963 ED_region_header(C, region);
964}
965
967{
968 ARegion *region = params->region;
969 const wmNotifier *wmn = params->notifier;
970
971 /* context changes */
972 switch (wmn->category) {
973 case NC_SCENE:
974 switch (wmn->data) {
975 case ND_MODE:
976 case ND_TOOLSETTINGS:
977 ED_region_tag_redraw(region);
978 break;
979 }
980 break;
981 case NC_GEOM:
982 switch (wmn->data) {
983 case ND_DATA:
984 case ND_SELECT:
985 ED_region_tag_redraw(region);
986 break;
987 }
988 break;
989 case NC_BRUSH:
990 if (wmn->action == NA_EDITED) {
991 ED_region_tag_redraw(region);
992 }
993 break;
994 case NC_GPENCIL:
995 if (wmn->data & ND_GPENCIL_EDITMODE) {
996 ED_region_tag_redraw(region);
997 }
998 else if (wmn->action == NA_EDITED) {
999 ED_region_tag_redraw(region);
1000 }
1001 break;
1002 }
1003}
1004
1005/* add handlers, stuff you only do once or on area/region changes */
1007{
1008 using namespace blender::ed;
1009 wmKeyMap *keymap = WM_keymap_ensure(
1010 wm->defaultconf, "Image Generic", SPACE_IMAGE, RGN_TYPE_WINDOW);
1011 WM_event_add_keymap_handler(&region->handlers, keymap);
1012
1013 asset::shelf::region_init(wm, region);
1014}
1015
1016static void image_id_remap(ScrArea * /*area*/,
1017 SpaceLink *slink,
1018 const blender::bke::id::IDRemapper &mappings)
1019{
1020 SpaceImage *simg = (SpaceImage *)slink;
1021
1023 return;
1024 }
1025
1026 mappings.apply(reinterpret_cast<ID **>(&simg->image), ID_REMAP_APPLY_ENSURE_REAL);
1027 mappings.apply(reinterpret_cast<ID **>(&simg->gpd), ID_REMAP_APPLY_UPDATE_REFCOUNT);
1028 mappings.apply(reinterpret_cast<ID **>(&simg->mask_info.mask), ID_REMAP_APPLY_ENSURE_REAL);
1029}
1030
1031static void image_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
1032{
1033 SpaceImage *simg = reinterpret_cast<SpaceImage *>(space_link);
1034 const int data_flags = BKE_lib_query_foreachid_process_flags_get(data);
1035 const bool is_readonly = (data_flags & IDWALK_READONLY) != 0;
1036
1043 if (!is_readonly) {
1044 simg->scopes.ok = 0;
1045 }
1046}
1047
1054{
1055 SpaceImage *sima = static_cast<SpaceImage *>(area->spacedata.first);
1056 return sima->mode == SI_MODE_UV ? SI_MODE_UV : SI_MODE_VIEW;
1057}
1058
1059static void image_space_subtype_set(ScrArea *area, int value)
1060{
1061 SpaceImage *sima = static_cast<SpaceImage *>(area->spacedata.first);
1062 if (value == SI_MODE_UV) {
1063 if (sima->mode != SI_MODE_UV) {
1064 sima->mode_prev = sima->mode;
1065 }
1066 sima->mode = value;
1067 }
1068 else {
1069 sima->mode = sima->mode_prev;
1070 }
1071}
1072
1074 EnumPropertyItem **item,
1075 int *totitem)
1076{
1078}
1079
1081{
1082 SpaceImage *sima = static_cast<SpaceImage *>(area->spacedata.first);
1084 if (index < 0) {
1085 index = SI_MODE_VIEW;
1086 }
1088 return item.name;
1089}
1090
1091static int image_space_icon_get(const ScrArea *area)
1092{
1093 SpaceImage *sima = static_cast<SpaceImage *>(area->spacedata.first);
1095 if (index < 0) {
1096 index = SI_MODE_VIEW;
1097 }
1099 return item.icon;
1100}
1101
1103{
1104 SpaceImage *sima = (SpaceImage *)sl;
1105
1106 sima->iuser.scene = nullptr;
1107 sima->scopes.waveform_1 = nullptr;
1108 sima->scopes.waveform_2 = nullptr;
1109 sima->scopes.waveform_3 = nullptr;
1110 sima->scopes.vecscope = nullptr;
1111 sima->scopes.vecscope_rgb = nullptr;
1112 sima->scopes.ok = 0;
1113
1114/* WARNING: gpencil data is no longer stored directly in sima after 2.5
1115 * so sacrifice a few old files for now to avoid crashes with new files!
1116 * committed: r28002 */
1117#if 0
1118 sima->gpd = newdataadr(fd, sima->gpd);
1119 if (sima->gpd) {
1121 }
1122#endif
1123}
1124
1126{
1127 BLO_write_struct(writer, SpaceImage, sl);
1128}
1129
1130/**************************** spacetype *****************************/
1131
1133{
1134 using namespace blender::ed;
1135 std::unique_ptr<SpaceType> st = std::make_unique<SpaceType>();
1136 ARegionType *art;
1137
1138 st->spaceid = SPACE_IMAGE;
1139 STRNCPY(st->name, "Image");
1140
1141 st->create = image_create;
1142 st->free = image_free;
1143 st->init = image_init;
1144 st->duplicate = image_duplicate;
1145 st->operatortypes = image_operatortypes;
1146 st->keymap = image_keymap;
1147 st->dropboxes = image_dropboxes;
1148 st->refresh = image_refresh;
1149 st->listener = image_listener;
1150 st->context = image_context;
1151 st->gizmos = image_widgets;
1152 st->id_remap = image_id_remap;
1153 st->foreach_id = image_foreach_id;
1154 st->space_subtype_item_extend = image_space_subtype_item_extend;
1155 st->space_subtype_get = image_space_subtype_get;
1156 st->space_subtype_set = image_space_subtype_set;
1157 st->space_name_get = image_space_name_get;
1158 st->space_icon_get = image_space_icon_get;
1159 st->blend_read_data = image_space_blend_read_data;
1160 st->blend_read_after_liblink = nullptr;
1161 st->blend_write = image_space_blend_write;
1162
1163 /* regions: main window */
1164 art = static_cast<ARegionType *>(MEM_callocN(sizeof(ARegionType), "spacetype image region"));
1170 BLI_addhead(&st->regiontypes, art);
1171
1172 /* regions: list-view/buttons/scopes */
1173 art = static_cast<ARegionType *>(MEM_callocN(sizeof(ARegionType), "spacetype image region"));
1174 art->regionid = RGN_TYPE_UI;
1182 BLI_addhead(&st->regiontypes, art);
1183
1186
1187 /* regions: tool(bar) */
1188 art = static_cast<ARegionType *>(MEM_callocN(sizeof(ARegionType), "spacetype image region"));
1189 art->regionid = RGN_TYPE_TOOLS;
1191 art->prefsizey = 50; /* XXX */
1198 BLI_addhead(&st->regiontypes, art);
1199
1200 /* regions: tool header */
1201 art = static_cast<ARegionType *>(
1202 MEM_callocN(sizeof(ARegionType), "spacetype image tool header region"));
1204 art->prefsizey = HEADERY;
1210 BLI_addhead(&st->regiontypes, art);
1211
1212 /* regions: header */
1213 art = static_cast<ARegionType *>(MEM_callocN(sizeof(ARegionType), "spacetype image region"));
1215 art->prefsizey = HEADERY;
1220
1221 BLI_addhead(&st->regiontypes, art);
1222
1223 /* regions: asset shelf */
1224 art = MEM_cnew<ARegionType>("spacetype image asset shelf region");
1227 art->duplicate = asset::shelf::region_duplicate;
1228 art->free = asset::shelf::region_free;
1229 art->on_poll_success = asset::shelf::region_on_poll_success;
1230 art->listener = asset::shelf::region_listen;
1231 art->message_subscribe = asset::shelf::region_message_subscribe;
1232 art->poll = asset::shelf::regions_poll;
1233 art->snap_size = asset::shelf::region_snap;
1234 art->on_user_resize = asset::shelf::region_on_user_resize;
1235 art->context = asset::shelf::context;
1237 art->layout = asset::shelf::region_layout;
1238 art->draw = asset::shelf::region_draw;
1239 BLI_addhead(&st->regiontypes, art);
1240
1241 /* regions: asset shelf header */
1242 art = MEM_cnew<ARegionType>("spacetype image asset shelf header region");
1245 art->init = asset::shelf::header_region_init;
1246 art->poll = asset::shelf::regions_poll;
1247 art->draw = asset::shelf::header_region;
1248 art->listener = asset::shelf::header_region_listen;
1249 art->context = asset::shelf::context;
1250 BLI_addhead(&st->regiontypes, art);
1251 asset::shelf::types_register(art, SPACE_IMAGE);
1252
1253 /* regions: hud */
1254 art = ED_area_type_hud(st->spaceid);
1255 BLI_addhead(&st->regiontypes, art);
1256
1257 BKE_spacetype_register(std::move(st));
1258}
void BKE_histogram_update_sample_line(Histogram *hist, ImBuf *ibuf, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings)
void BKE_scopes_new(Scopes *scopes)
void BKE_scopes_free(Scopes *scopes)
Depsgraph * CTX_data_expect_evaluated_depsgraph(const bContext *C)
void CTX_data_dir_set(bContextDataResult *result, const char **dir)
SpaceImage * CTX_wm_space_image(const bContext *C)
bool CTX_data_equals(const char *member, const char *str)
bool CTX_data_dir(const char *member)
void CTX_data_id_pointer_set(bContextDataResult *result, ID *id)
eContextObjectMode
@ CTX_MODE_EDIT_MESH
ScrArea * CTX_wm_area(const bContext *C)
@ CTX_RESULT_MEMBER_NOT_FOUND
@ CTX_RESULT_OK
Scene * CTX_data_scene(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
enum eContextObjectMode CTX_data_mode_enum(const bContext *C)
void BKE_gpencil_blend_read_data(struct BlendDataReader *reader, struct bGPdata *gpd)
void BKE_image_user_frame_calc(Image *ima, ImageUser *iuser, int cfra)
void BKE_imageuser_default(ImageUser *iuser)
void BKE_image_partial_update_mark_full_update(Image *image)
Mark the whole image to be updated.
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
Object * BKE_view_layer_edit_object_get(const ViewLayer *view_layer)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
@ IDWALK_CB_USER_ONE
@ IDWALK_CB_USER
@ IDWALK_CB_DIRECT_WEAK_LINK
int BKE_lib_query_foreachid_process_flags_get(const LibraryForeachIDData *data)
Definition lib_query.cc:120
@ IDWALK_READONLY
@ ID_REMAP_APPLY_UPDATE_REFCOUNT
@ ID_REMAP_APPLY_ENSURE_REAL
void BKE_spacetype_register(std::unique_ptr< SpaceType > st)
Definition screen.cc:268
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:90
#define LISTBASE_FOREACH(type, var, list)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition BLI_rect.h:193
void BLI_rctf_init(struct rctf *rect, float xmin, float xmax, float ymin, float ymax)
Definition rct.c:408
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition BLI_rect.h:189
#define STRNCPY(dst, src)
Definition BLI_string.h:593
void BLI_thread_unlock(int type)
Definition threads.cc:333
void BLI_thread_lock(int type)
Definition threads.cc:328
@ LOCK_DRAW_IMAGE
Definition BLI_threads.h:68
#define ARRAY_SET_ITEMS(...)
#define ELEM(...)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define FILTER_ID_GD_LEGACY
Definition DNA_ID.h:1169
#define FILTER_ID_MSK
Definition DNA_ID.h:1179
#define FILTER_ID_IM
Definition DNA_ID.h:1171
#define DNA_struct_default_get(struct_name)
@ IMA_ANIM_ALWAYS
@ IMA_SHOW_STEREO
@ IMA_SRC_VIEWER
@ IMA_TYPE_R_RESULT
@ IMA_VIEW_AS_RENDER
eMaskOverlayMode
@ MASK_DRAWFLAG_OVERLAY
@ OB_MODE_EDIT
Object is a sort of wrapper for general info.
@ UV_SHOW_SAME_IMAGE
#define HEADERY
#define RGN_ALIGN_ENUM_FROM_MASK(align)
@ RGN_ALIGN_HIDE_WITH_PREV
@ RGN_ALIGN_BOTTOM
@ RGN_ALIGN_LEFT
@ RGN_ALIGN_TOP
@ RGN_ALIGN_RIGHT
@ RGN_TYPE_TOOL_HEADER
@ RGN_TYPE_UI
@ RGN_TYPE_ASSET_SHELF_HEADER
@ RGN_TYPE_WINDOW
@ RGN_TYPE_ASSET_SHELF
@ RGN_TYPE_HEADER
@ RGN_TYPE_TOOLS
@ RGN_TYPE_TOOL_PROPS
@ RGN_FLAG_HIDDEN
@ RGN_FLAG_HIDDEN_BY_USER
@ SI_SHOW_GPENCIL
@ SI_DRAW_METADATA
@ SI_USE_ALPHA
@ SI_COORDFLOATS
@ SI_DRAWSHADOW
@ SI_OVERLAY_SHOW_OVERLAYS
@ SI_OVERLAY_SHOW_GRID_BACKGROUND
@ SPACE_EMPTY
@ SPACE_IMAGE
@ SI_GIZMO_HIDE
@ SI_MODE_PAINT
@ SI_MODE_VIEW
@ SI_MODE_MASK
@ SI_MODE_UV
@ USER_HEADER_BOTTOM
@ V2D_SCROLL_VERTICAL_HIDE
@ V2D_SCROLL_RIGHT
void DRW_draw_view(const bContext *C)
void ED_space_image_release_buffer(SpaceImage *sima, ImBuf *ibuf, void *lock)
void ED_space_image_auto_set(const bContext *C, SpaceImage *sima)
Definition image_edit.cc:95
void ED_space_image_get_size(SpaceImage *sima, int *r_width, int *r_height)
bool ED_image_tools_paint_poll(bContext *C)
ImBuf * ED_space_image_acquire_buffer(SpaceImage *sima, void **r_lock, int tile)
bool ED_space_image_check_show_maskedit(SpaceImage *sima, Object *obedit)
bool ED_space_image_show_render(const SpaceImage *sima)
bool ED_space_image_show_uvedit(const SpaceImage *sima, Object *obedit)
void ED_space_image_get_aspect(SpaceImage *sima, float *r_aspx, float *r_aspy)
void ED_space_image_scopes_update(const bContext *C, SpaceImage *sima, ImBuf *ibuf, bool use_view_settings)
void ED_space_image_get_zoom(SpaceImage *sima, const ARegion *region, float *r_zoomx, float *r_zoomy)
Image * ED_space_image(const SpaceImage *sima)
Definition image_edit.cc:40
void ED_paint_cursor_start(Paint *paint, bool(*poll)(bContext *C))
Mask * ED_space_image_get_mask(const SpaceImage *sima)
void ED_mask_draw_region(Depsgraph *depsgraph, Mask *mask, ARegion *region, char draw_flag, char draw_type, eMaskOverlayMode overlay_mode, float blend_factor, int width_i, int height_i, float aspx, float aspy, bool do_scale_applied, bool do_draw_cb, float stabmat[4][4], const bContext *C)
Definition mask_draw.cc:640
void ED_node_composite_job(const bContext *C, bNodeTree *nodetree, Scene *scene_owner)
Definition node_edit.cc:375
Scene * ED_render_job_get_current_scene(const bContext *C)
void ED_area_do_mgs_subscribe_for_tool_header(const wmRegionMessageSubscribeParams *params)
Definition area.cc:414
void ED_area_tag_redraw(ScrArea *area)
Definition area.cc:708
ARegionType * ED_area_type_hud(int space_type)
void ED_area_do_mgs_subscribe_for_tool_ui(const wmRegionMessageSubscribeParams *params)
Definition area.cc:429
void ED_region_panels(const bContext *C, ARegion *region)
Definition area.cc:3336
void ED_region_header(const bContext *C, ARegion *region)
Definition area.cc:3646
const rcti * ED_region_visible_rect(ARegion *region)
Definition area.cc:4010
void ED_region_header_init(ARegion *region)
Definition area.cc:3661
void ED_region_panels_layout_ex(const bContext *C, ARegion *region, ListBase *paneltypes, wmOperatorCallContext op_context, const char *contexts[], const char *category_override)
Definition area.cc:3099
void ED_region_header_with_button_sections(const bContext *C, ARegion *region, uiButtonSectionsAlign align)
Definition area.cc:3653
int ED_region_generic_tools_region_snap_size(const ARegion *region, int size, int axis)
Definition area_utils.cc:41
void ED_area_tag_refresh(ScrArea *area)
Definition area.cc:737
void ED_region_generic_tools_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
Definition area_utils.cc:29
void ED_region_panels_init(wmWindowManager *wm, ARegion *region)
Definition area.cc:3343
void ED_region_tag_redraw(ARegion *region)
Definition area.cc:634
@ ED_KEYMAP_ASSET_SHELF
Definition ED_screen.hh:735
@ ED_KEYMAP_UI
Definition ED_screen.hh:725
@ ED_KEYMAP_HEADER
Definition ED_screen.hh:731
@ ED_KEYMAP_TOOL
Definition ED_screen.hh:727
@ ED_KEYMAP_GPENCIL
Definition ED_screen.hh:733
@ ED_KEYMAP_GIZMO
Definition ED_screen.hh:726
@ ED_KEYMAP_VIEW2D
Definition ED_screen.hh:728
@ ED_KEYMAP_FRAMES
Definition ED_screen.hh:730
@ ED_KEYMAP_FOOTER
Definition ED_screen.hh:732
void ED_region_panels_draw(const bContext *C, ARegion *region)
Definition area.cc:3277
void ED_widgetgroup_gizmo2d_xform_no_cage_callbacks_set(wmGizmoGroupType *gzgt)
void ED_widgetgroup_gizmo2d_rotate_callbacks_set(wmGizmoGroupType *gzgt)
void ED_widgetgroup_gizmo2d_resize_callbacks_set(wmGizmoGroupType *gzgt)
void ED_widgetgroup_gizmo2d_xform_callbacks_set(wmGizmoGroupType *gzgt)
void ED_region_image_metadata_draw(int x, int y, ImBuf *ibuf, const rctf *frame, float zoomx, float zoomy)
Definition ed_draw.cc:876
void ED_uvedit_buttons_register(ARegionType *art)
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
#define UI_SIDEBAR_PANEL_WIDTH
#define UI_TOOLBAR_WIDTH
PanelCategoryStack * UI_panel_category_active_find(ARegion *region, const char *idname)
void UI_view2d_view_restore(const bContext *C)
Definition view2d.cc:1158
void VIEW2D_GGT_navigate_impl(wmGizmoGroupType *gzgt, const char *idname)
void UI_view2d_view_ortho(const View2D *v2d)
Definition view2d.cc:1091
void UI_view2d_view_to_region(const View2D *v2d, float x, float y, int *r_region_x, int *r_region_y) ATTR_NONNULL()
Definition view2d.cc:1718
@ WM_GIZMOMAP_DRAWSTEP_2D
@ WM_GIZMOGROUPTYPE_DRAW_MODAL_EXCLUDE
@ WM_GIZMOGROUPTYPE_TOOL_FALLBACK_KEYMAP
@ WM_GIZMOGROUPTYPE_DELAY_REFRESH_FOR_TWEAK
#define NS_EDITMODE_MESH
Definition WM_types.hh:528
#define NC_WINDOW
Definition WM_types.hh:342
#define NC_ID
Definition WM_types.hh:362
#define NC_NODE
Definition WM_types.hh:361
#define NC_GEOM
Definition WM_types.hh:360
#define ND_DRAW
Definition WM_types.hh:428
#define NC_BRUSH
Definition WM_types.hh:352
#define ND_RENDER_RESULT
Definition WM_types.hh:413
#define NC_WM
Definition WM_types.hh:341
#define ND_DATA
Definition WM_types.hh:475
#define ND_GPENCIL_EDITMODE
Definition WM_types.hh:470
#define ND_RENDER_OPTIONS
Definition WM_types.hh:402
#define ND_COMPO_RESULT
Definition WM_types.hh:414
#define NC_SCREEN
Definition WM_types.hh:344
#define ND_MODE
Definition WM_types.hh:412
#define NC_SCENE
Definition WM_types.hh:345
#define ND_TOOLSETTINGS
Definition WM_types.hh:416
#define ND_MODIFIER
Definition WM_types.hh:429
#define ND_SPACE_IMAGE
Definition WM_types.hh:488
#define NA_EDITED
Definition WM_types.hh:550
#define NC_MATERIAL
Definition WM_types.hh:347
#define NC_IMAGE
Definition WM_types.hh:351
#define ND_UNDO
Definition WM_types.hh:384
#define ND_FRAME
Definition WM_types.hh:401
#define ND_SELECT
Definition WM_types.hh:474
#define NC_GPENCIL
Definition WM_types.hh:366
#define NC_TEXTURE
Definition WM_types.hh:348
#define ND_TRANSFORM
Definition WM_types.hh:423
#define ND_LAYER
Definition WM_types.hh:417
@ WM_OP_INVOKE_REGION_WIN
Definition WM_types.hh:219
#define NC_MASK
Definition WM_types.hh:365
#define NA_RENAME
Definition WM_types.hh:554
#define NA_PAINTING
Definition WM_types.hh:557
#define NC_OBJECT
Definition WM_types.hh:346
#define ND_SHADING_LINKS
Definition WM_types.hh:446
#define NC_SPACE
Definition WM_types.hh:359
#define NA_SELECTED
Definition WM_types.hh:555
volatile int lock
unsigned int U
Definition btGjkEpa3.h:78
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
IDRemapperApplyResult apply(ID **r_id_ptr, IDRemapperApplyOptions options, ID *id_self=nullptr) const
bool contains_mappings_for_any(IDTypeFilter filter) const
const Depsgraph * depsgraph
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
void image_buttons_register(ARegionType *art)
void draw_image_main_helpers(const bContext *C, ARegion *region)
void draw_image_cache(const bContext *C, ARegion *region)
void draw_image_sample_line(SpaceImage *sima)
void IMAGE_OT_view_cursor_center(wmOperatorType *ot)
Definition image_ops.cc:886
void IMAGE_OT_change_frame(wmOperatorType *ot)
void IMAGE_OT_save_sequence(wmOperatorType *ot)
void IMAGE_OT_view_zoom(wmOperatorType *ot)
Definition image_ops.cc:722
void IMAGE_OT_cycle_render_slot(wmOperatorType *ot)
void IMAGE_OT_match_movie_length(wmOperatorType *ot)
void IMAGE_OT_save_all_modified(wmOperatorType *ot)
void IMAGE_OT_save_as(wmOperatorType *ot)
void IMAGE_OT_sample(wmOperatorType *ot)
void IMAGE_OT_tile_fill(wmOperatorType *ot)
void IMAGE_OT_remove_render_slot(wmOperatorType *ot)
void IMAGE_OT_view_zoom_border(wmOperatorType *ot)
void IMAGE_OT_reload(wmOperatorType *ot)
void IMAGE_OT_unpack(wmOperatorType *ot)
void IMAGE_OT_view_selected(wmOperatorType *ot)
Definition image_ops.cc:991
void IMAGE_OT_tile_add(wmOperatorType *ot)
void IMAGE_OT_pack(wmOperatorType *ot)
void IMAGE_OT_open(wmOperatorType *ot)
void IMAGE_OT_read_viewlayers(wmOperatorType *ot)
void IMAGE_OT_invert(wmOperatorType *ot)
void IMAGE_OT_resize(wmOperatorType *ot)
void IMAGE_OT_clear_render_slot(wmOperatorType *ot)
void IMAGE_OT_view_zoom_in(wmOperatorType *ot)
void IMAGE_OT_view_zoom_out(wmOperatorType *ot)
void IMAGE_OT_rotate_orthogonal(wmOperatorType *ot)
void IMAGE_OT_view_all(wmOperatorType *ot)
Definition image_ops.cc:840
void IMAGE_OT_render_border(wmOperatorType *ot)
void IMAGE_OT_view_pan(wmOperatorType *ot)
Definition image_ops.cc:464
void IMAGE_OT_clipboard_copy(wmOperatorType *ot)
void IMAGE_OT_save(wmOperatorType *ot)
void IMAGE_OT_file_browse(wmOperatorType *ot)
void IMAGE_OT_clipboard_paste(wmOperatorType *ot)
void IMAGE_OT_add_render_slot(wmOperatorType *ot)
void IMAGE_OT_tile_remove(wmOperatorType *ot)
void IMAGE_OT_flip(wmOperatorType *ot)
void IMAGE_OT_sample_line(wmOperatorType *ot)
void IMAGE_OT_replace(wmOperatorType *ot)
void IMAGE_OT_view_center_cursor(wmOperatorType *ot)
Definition image_ops.cc:922
void IMAGE_OT_view_zoom_ratio(wmOperatorType *ot)
void IMAGE_OT_new(wmOperatorType *ot)
void IMAGE_OT_clear_render_border(wmOperatorType *ot)
void IMAGE_OT_curves_point_set(wmOperatorType *ot)
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
void *(* MEM_dupallocN)(const void *vmemh)
Definition mallocn.cc:39
static void * newdataadr(FileData *fd, const void *adr)
Definition readfile.cc:1467
int RNA_enum_from_value(const EnumPropertyItem *item, const int value)
void RNA_enum_items_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
const EnumPropertyItem rna_enum_space_image_mode_items[]
Definition rna_space.cc:325
static void image_buttons_region_init(wmWindowManager *wm, ARegion *region)
static int image_context(const bContext *C, const char *member, bContextDataResult *result)
static void image_space_blend_write(BlendWriter *writer, SpaceLink *sl)
static void image_header_region_listener(const wmRegionListenerParams *params)
static void IMAGE_GGT_gizmo2d(wmGizmoGroupType *gzgt)
static void image_operatortypes()
static void IMAGE_GGT_gizmo2d_translate(wmGizmoGroupType *gzgt)
static void IMAGE_GGT_navigate(wmGizmoGroupType *gzgt)
static void image_widgets()
static void image_main_region_listener(const wmRegionListenerParams *params)
static void image_dropboxes()
static void image_space_blend_read_data(BlendDataReader *, SpaceLink *sl)
static void image_asset_shelf_region_init(wmWindowManager *wm, ARegion *region)
static void image_init(wmWindowManager *, ScrArea *area)
static void image_main_region_set_view2d(SpaceImage *sima, ARegion *region)
static void image_listener(const wmSpaceTypeListenerParams *params)
static void image_tools_region_draw(const bContext *C, ARegion *region)
static void image_space_subtype_set(ScrArea *area, int value)
static void image_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
void ED_spacetype_image()
static void IMAGE_GGT_gizmo2d_rotate(wmGizmoGroupType *gzgt)
static void image_tools_header_region_draw(const bContext *C, ARegion *region)
static SpaceLink * image_create(const ScrArea *, const Scene *)
static void image_tools_region_listener(const wmRegionListenerParams *params)
static void image_user_refresh_scene(const bContext *C, SpaceImage *sima)
const char * image_context_dir[]
static void image_keymap(wmKeyConfig *keyconf)
static void image_tools_region_init(wmWindowManager *wm, ARegion *region)
static void image_free(SpaceLink *sl)
static int image_space_subtype_get(ScrArea *area)
static void image_header_region_draw(const bContext *C, ARegion *region)
static SpaceLink * image_duplicate(SpaceLink *sl)
static void image_main_region_init(wmWindowManager *wm, ARegion *region)
static void image_refresh(const bContext *C, ScrArea *area)
static void image_buttons_region_listener(const wmRegionListenerParams *params)
static void image_buttons_region_layout(const bContext *C, ARegion *region)
static void IMAGE_GGT_gizmo2d_resize(wmGizmoGroupType *gzgt)
static blender::StringRefNull image_space_name_get(const ScrArea *area)
static void image_id_remap(ScrArea *, SpaceLink *slink, const blender::bke::id::IDRemapper &mappings)
static void image_scopes_tag_refresh(ScrArea *area)
static void image_main_region_draw(const bContext *C, ARegion *region)
static void image_buttons_region_draw(const bContext *C, ARegion *region)
static void image_header_region_init(wmWindowManager *, ARegion *region)
static int image_space_icon_get(const ScrArea *area)
static void image_space_subtype_item_extend(bContext *, EnumPropertyItem **item, int *totitem)
bool(* poll)(const RegionPollParams *params)
void(* free)(ARegion *)
void(* on_poll_success)(const bContext *C, ARegion *region)
void(* message_subscribe)(const wmRegionMessageSubscribeParams *params)
void(* listener)(const wmRegionListenerParams *params)
void *(* duplicate)(void *poin)
bContextDataCallback context
void(* draw)(const bContext *C, ARegion *region)
void(* layout)(const bContext *C, ARegion *region)
void(* on_user_resize)(const ARegion *region)
int(* snap_size)(const ARegion *region, int size, int axis)
void(* init)(wmWindowManager *wm, ARegion *region)
const char * name
Definition RNA_types.hh:510
Definition DNA_ID.h:413
struct Scene * scene
short source
struct Mask * mask
struct ToolSettings * toolsettings
float * waveform_3
float * waveform_2
float * vecscope_rgb
float * waveform_1
float * vecscope
struct Scopes scopes
int tile_grid_shape[2]
SpaceImageOverlay overlay
MaskSpaceInfo mask_info
struct Histogram sample_line_hist
int custom_grid_subdiv[2]
struct ImageUser iuser
struct bGPdata * gpd
struct Image * image
ListBase regionbase
int ymin
const char * idname
wmGizmoMapType_Params gzmap_params
eWM_GizmoFlagGroupTypeFlag flag
unsigned int data
Definition WM_types.hh:325
unsigned int action
Definition WM_types.hh:325
unsigned int category
Definition WM_types.hh:325
unsigned int subtype
Definition WM_types.hh:325
void * reference
Definition WM_types.hh:327
struct wmKeyConfig * defaultconf
ListBase * WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
wmEventHandler_Dropbox * WM_event_add_dropbox_handler(ListBase *handlers, ListBase *dropboxes)
wmEventHandler_Keymap * WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
wmEventHandler_Keymap * WM_event_add_keymap_handler_v2d_mask(ListBase *handlers, wmKeyMap *keymap)
wmGizmoGroupType * WM_gizmogrouptype_append(void(*wtfunc)(wmGizmoGroupType *))
wmGizmoGroupTypeRef * WM_gizmogrouptype_append_and_link(wmGizmoMapType *gzmap_type, void(*wtfunc)(wmGizmoGroupType *))
void WM_gizmomap_tag_refresh(wmGizmoMap *gzmap)
void WM_gizmomap_draw(wmGizmoMap *gzmap, const bContext *C, const eWM_GizmoFlagMapDrawStep drawstep)
wmGizmoMapType * WM_gizmomaptype_ensure(const wmGizmoMapType_Params *gzmap_params)
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
Definition wm_keymap.cc:897
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))
ViewLayer * WM_window_get_active_view_layer(const wmWindow *win)
Scene * WM_window_get_active_scene(const wmWindow *win)