diff options
Diffstat (limited to 'source/blender/editors/space_image')
-rw-r--r-- | source/blender/editors/space_image/image_buttons.c | 6 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_draw.c | 11 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_edit.c | 11 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_ops.c | 425 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_sequence.c | 23 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_undo.c | 41 | ||||
-rw-r--r-- | source/blender/editors/space_image/space_image.c | 97 |
7 files changed, 131 insertions, 483 deletions
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index 873091bd68d..6f3ef44fe94 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -656,8 +656,8 @@ static void uiblock_layer_pass_buttons( /* pass */ rpass = (rl ? BLI_findlink(&rl->passes, iuser->pass) : NULL); - if (rpass && RE_passes_have_name(rl)) { - display_name = rpass->name; + if (rl && RE_passes_have_name(rl)) { + display_name = rpass ? rpass->name : ""; rnd_pt = ui_imageuser_data_copy(&rnd_pt_local); but = uiDefMenuBut(block, ui_imageuser_pass_menu, @@ -1276,7 +1276,7 @@ void uiTemplateImageInfo(uiLayout *layout, bContext *C, Image *ima, ImageUser *i } else if (ima->source == IMA_SRC_SEQUENCE && ibuf) { /* Image sequence frame number + filename */ - const char *filename = BLI_last_slash(ibuf->name); + const char *filename = BLI_path_slash_rfind(ibuf->name); filename = (filename == NULL) ? ibuf->name : filename + 1; BLI_snprintf(str, MAX_IMAGE_INFO_LEN, TIP_("Frame %d: %s"), framenr, filename); } diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 85f7f744abc..9040ca5e79c 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -476,7 +476,7 @@ static void sima_draw_zbuf_pixels( IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR); GPU_shader_uniform_vector( - state.shader, GPU_shader_get_uniform_ensure(state.shader, "shuffle"), 4, 1, red); + state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, red); immDrawPixelsTex( &state, x1, y1, rectx, recty, GL_RED, GL_INT, GL_NEAREST, recti, zoomx, zoomy, NULL); @@ -524,7 +524,7 @@ static void sima_draw_zbuffloat_pixels(Scene *scene, IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR); GPU_shader_uniform_vector( - state.shader, GPU_shader_get_uniform_ensure(state.shader, "shuffle"), 4, 1, red); + state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, red); immDrawPixelsTex( &state, x1, y1, rectx, recty, GL_RED, GL_FLOAT, GL_NEAREST, rectf, zoomx, zoomy, NULL); @@ -575,6 +575,9 @@ static void draw_image_buffer(const bContext *C, float zoomx, float zoomy) { + /* Image are still drawn in display space. */ + glDisable(GL_FRAMEBUFFER_SRGB); + int x, y; int sima_flag = sima->flag & ED_space_image_get_display_channel_mask(ibuf); @@ -634,7 +637,7 @@ static void draw_image_buffer(const bContext *C, IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR); GPU_shader_uniform_vector( - state.shader, GPU_shader_get_uniform_ensure(state.shader, "shuffle"), 4, 1, shuffle); + state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, shuffle); IMB_colormanagement_display_settings_from_ctx(C, &view_settings, &display_settings); display_buffer = IMB_display_buffer_acquire( @@ -666,6 +669,8 @@ static void draw_image_buffer(const bContext *C, GPU_blend(false); } } + + glEnable(GL_FRAMEBUFFER_SRGB); } static void draw_image_buffer_repeated(const bContext *C, diff --git a/source/blender/editors/space_image/image_edit.c b/source/blender/editors/space_image/image_edit.c index 7f911113b7c..c9f2ec38354 100644 --- a/source/blender/editors/space_image/image_edit.c +++ b/source/blender/editors/space_image/image_edit.c @@ -264,7 +264,10 @@ void ED_space_image_get_aspect(SpaceImage *sima, float *r_aspx, float *r_aspy) } } -void ED_space_image_get_zoom(SpaceImage *sima, ARegion *region, float *r_zoomx, float *r_zoomy) +void ED_space_image_get_zoom(SpaceImage *sima, + const ARegion *region, + float *r_zoomx, + float *r_zoomy) { int width, height; @@ -314,7 +317,7 @@ void ED_image_get_uv_aspect(Image *ima, ImageUser *iuser, float *r_aspx, float * } /* takes event->mval */ -void ED_image_mouse_pos(SpaceImage *sima, ARegion *region, const int mval[2], float co[2]) +void ED_image_mouse_pos(SpaceImage *sima, const ARegion *region, const int mval[2], float co[2]) { int sx, sy, width, height; float zoomx, zoomy; @@ -341,7 +344,7 @@ void ED_image_view_center_to_point(SpaceImage *sima, float x, float y) } void ED_image_point_pos( - SpaceImage *sima, ARegion *region, float x, float y, float *r_x, float *r_y) + SpaceImage *sima, const ARegion *region, float x, float y, float *r_x, float *r_y) { int sx, sy, width, height; float zoomx, zoomy; @@ -356,7 +359,7 @@ void ED_image_point_pos( } void ED_image_point_pos__reverse(SpaceImage *sima, - ARegion *region, + const ARegion *region, const float co[2], float r_co[2]) { diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 7bd1b8e8291..8cb85ce9800 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -58,6 +58,7 @@ #include "BKE_icons.h" #include "BKE_image.h" #include "BKE_image_save.h" +#include "BKE_layer.h" #include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_packedFile.h" @@ -91,6 +92,7 @@ #include "ED_screen.h" #include "ED_space_api.h" #include "ED_util.h" +#include "ED_util_imbuf.h" #include "ED_uvedit.h" #include "UI_interface.h" @@ -277,28 +279,6 @@ static bool space_image_main_area_not_uv_brush_poll(bContext *C) return 0; } -static bool image_sample_poll(bContext *C) -{ - SpaceImage *sima = CTX_wm_space_image(C); - if (sima == NULL) { - return false; - } - - Object *obedit = CTX_data_edit_object(C); - if (obedit) { - /* Disable when UV editing so it doesn't swallow all click events - * (use for setting cursor). */ - if (ED_space_image_show_uvedit(sima, obedit)) { - return false; - } - } - else if (sima->mode != SI_MODE_VIEW) { - return false; - } - - return true; -} - /** \} */ /* -------------------------------------------------------------------- */ @@ -846,7 +826,7 @@ void IMAGE_OT_view_all(wmOperatorType *ot) PropertyRNA *prop; /* identifiers */ - ot->name = "View All"; + ot->name = "Frame All"; ot->idname = "IMAGE_OT_view_all"; ot->description = "View the entire image"; @@ -905,7 +885,6 @@ static int image_view_selected_exec(bContext *C, wmOperator *UNUSED(op)) Scene *scene; ViewLayer *view_layer; Object *obedit; - Image *ima; /* retrieve state */ sima = CTX_wm_space_image(C); @@ -914,12 +893,15 @@ static int image_view_selected_exec(bContext *C, wmOperator *UNUSED(op)) view_layer = CTX_data_view_layer(C); obedit = CTX_data_edit_object(C); - ima = ED_space_image(sima); - /* get bounds */ float min[2], max[2]; if (ED_space_image_show_uvedit(sima, obedit)) { - if (!ED_uvedit_minmax(scene, ima, obedit, min, max)) { + uint objects_len = 0; + Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs( + view_layer, ((View3D *)NULL), &objects_len); + bool success = ED_uvedit_minmax_multi(scene, objects, objects_len, min, max); + MEM_freeN(objects); + if (!success) { return OPERATOR_CANCELLED; } } @@ -1001,7 +983,7 @@ void IMAGE_OT_view_zoom_in(wmOperatorType *ot) PropertyRNA *prop; /* identifiers */ - ot->name = "View Zoom In"; + ot->name = "Zoom In"; ot->idname = "IMAGE_OT_view_zoom_in"; ot->description = "Zoom in the image (centered around 2D cursor)"; @@ -1060,7 +1042,7 @@ void IMAGE_OT_view_zoom_out(wmOperatorType *ot) PropertyRNA *prop; /* identifiers */ - ot->name = "View Zoom Out"; + ot->name = "Zoom Out"; ot->idname = "IMAGE_OT_view_zoom_out"; ot->description = "Zoom out the image (centered around 2D cursor)"; @@ -1275,7 +1257,7 @@ static Image *image_open_single(Main *bmain, if ((range->length > 1) && (ima->source == IMA_SRC_FILE)) { if (range->udim_tiles.first && range->offset == 1001) { ima->source = IMA_SRC_TILED; - for (LinkData *node = range->udim_tiles.first; node; node = node->next) { + LISTBASE_FOREACH (LinkData *, node, &range->udim_tiles) { BKE_image_add_tile(ima, POINTER_AS_INT(node->data), NULL); } } @@ -1291,7 +1273,7 @@ static Image *image_open_single(Main *bmain, static int image_open_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); - ScrArea *sa = CTX_wm_area(C); + ScrArea *area = CTX_wm_area(C); Scene *scene = CTX_data_scene(C); Object *obedit = CTX_data_edit_object(C); ImageUser *iuser = NULL; @@ -1309,7 +1291,7 @@ static int image_open_exec(bContext *C, wmOperator *op) } ListBase ranges = ED_image_filesel_detect_sequences(bmain, op, use_udim); - for (ImageFrameRange *range = ranges.first; range; range = range->next) { + LISTBASE_FOREACH (ImageFrameRange *, range, &ranges) { Image *ima_range = image_open_single( bmain, op, range, BKE_main_blendfile_path(bmain), is_relative_path, use_multiview); @@ -1345,8 +1327,8 @@ static int image_open_exec(bContext *C, wmOperator *op) if (iod->iuser) { iuser = iod->iuser; } - else if (sa && sa->spacetype == SPACE_IMAGE) { - SpaceImage *sima = sa->spacedata.first; + else if (area && area->spacetype == SPACE_IMAGE) { + SpaceImage *sima = area->spacedata.first; ED_space_image_set(bmain, sima, obedit, ima, false); iuser = &sima->iuser; } @@ -1359,7 +1341,7 @@ static int image_open_exec(bContext *C, wmOperator *op) if (iuser == NULL) { Camera *cam = CTX_data_pointer_get_type(C, "camera", &RNA_Camera).data; if (cam) { - for (CameraBGImage *bgpic = cam->bg_images.first; bgpic; bgpic = bgpic->next) { + LISTBASE_FOREACH (CameraBGImage *, bgpic, &cam->bg_images) { if (bgpic->ima == ima) { iuser = &bgpic->iuser; break; @@ -1794,7 +1776,8 @@ static int image_save_options_init(Main *bmain, } /* append UDIM numbering if not present */ - if (ima->source == IMA_SRC_TILED && (BLI_stringdec(ima->name, NULL, NULL, NULL) != 1001)) { + if (ima->source == IMA_SRC_TILED && + (BLI_path_sequence_decode(ima->name, NULL, NULL, NULL) != 1001)) { int len = strlen(opts->filepath); STR_CONCAT(opts->filepath, len, ".1001"); } @@ -3098,85 +3081,6 @@ void IMAGE_OT_unpack(wmOperatorType *ot) /** \name Sample Image Operator * \{ */ -typedef struct ImageSampleInfo { - ARegionType *art; - void *draw_handle; - int x, y; - int channels; - - int width, height; - int sample_size; - - unsigned char col[4]; - float colf[4]; - float linearcol[4]; - int z; - float zf; - - unsigned char *colp; - const float *colfp; - int *zp; - float *zfp; - - bool draw; - bool color_manage; - int use_default_view; -} ImageSampleInfo; - -static void image_sample_draw(const bContext *C, ARegion *region, void *arg_info) -{ - ImageSampleInfo *info = arg_info; - if (!info->draw) { - return; - } - - Scene *scene = CTX_data_scene(C); - ED_image_draw_info(scene, - region, - info->color_manage, - info->use_default_view, - info->channels, - info->x, - info->y, - info->colp, - info->colfp, - info->linearcol, - info->zp, - info->zfp); - - if (info->sample_size > 1) { - const wmWindow *win = CTX_wm_window(C); - const wmEvent *event = win->eventstate; - - SpaceImage *sima = CTX_wm_space_image(C); - GPUVertFormat *format = immVertexFormat(); - uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); - - const float color[3] = {1, 1, 1}; - immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); - immUniformColor3fv(color); - - /* TODO(campbell): lock to pixels. */ - rctf sample_rect_fl; - BLI_rctf_init_pt_radius( - &sample_rect_fl, - (float[2]){event->x - region->winrct.xmin, event->y - region->winrct.ymin}, - (float)(info->sample_size / 2.0f) * sima->zoom); - - glEnable(GL_COLOR_LOGIC_OP); - glLogicOp(GL_XOR); - GPU_line_width(1.0f); - imm_draw_box_wire_2d(pos, - (float)sample_rect_fl.xmin, - (float)sample_rect_fl.ymin, - (float)sample_rect_fl.xmax, - (float)sample_rect_fl.ymax); - glDisable(GL_COLOR_LOGIC_OP); - - immUnbindProgram(); - } -} - /* Returns color in linear space, matching ED_space_node_color_sample(). */ bool ED_space_image_color_sample(SpaceImage *sima, ARegion *region, int mval[2], float r_col[3]) { @@ -3198,7 +3102,7 @@ bool ED_space_image_color_sample(SpaceImage *sima, ARegion *region, int mval[2], if (uv[0] >= 0.0f && uv[1] >= 0.0f && uv[0] < 1.0f && uv[1] < 1.0f) { const float *fp; - unsigned char *cp; + uchar *cp; int x = (int)(uv[0] * ibuf->x), y = (int)(uv[1] * ibuf->y); CLAMP(x, 0, ibuf->x - 1); @@ -3210,7 +3114,7 @@ bool ED_space_image_color_sample(SpaceImage *sima, ARegion *region, int mval[2], ret = true; } else if (ibuf->rect) { - cp = (unsigned char *)(ibuf->rect + y * ibuf->x + x); + cp = (uchar *)(ibuf->rect + y * ibuf->x + x); rgb_uchar_to_float(r_col, cp); IMB_colormanagement_colorspace_to_scene_linear_v3(r_col, ibuf->rect_colorspace); ret = true; @@ -3221,279 +3125,6 @@ bool ED_space_image_color_sample(SpaceImage *sima, ARegion *region, int mval[2], return ret; } -/* -------------------------------------------------------------------- */ -/** \name Image Pixel Sample - * \{ */ - -static void image_sample_pixel_color_ubyte(const ImBuf *ibuf, - const int coord[2], - uchar r_col[4], - float r_col_linear[4]) -{ - const uchar *cp = (unsigned char *)(ibuf->rect + coord[1] * ibuf->x + coord[0]); - copy_v4_v4_uchar(r_col, cp); - rgba_uchar_to_float(r_col_linear, r_col); - IMB_colormanagement_colorspace_to_scene_linear_v4(r_col_linear, false, ibuf->rect_colorspace); -} - -static void image_sample_pixel_color_float(ImBuf *ibuf, const int coord[2], float r_col[4]) -{ - const float *cp = ibuf->rect_float + (ibuf->channels) * (coord[1] * ibuf->x + coord[0]); - copy_v4_v4(r_col, cp); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Image Pixel Region Sample - * \{ */ - -static void image_sample_rect_color_ubyte(const ImBuf *ibuf, - const rcti *rect, - uchar r_col[4], - float r_col_linear[4]) -{ - uint col_accum_ub[4] = {0, 0, 0, 0}; - zero_v4(r_col_linear); - int col_tot = 0; - int coord[2]; - for (coord[0] = rect->xmin; coord[0] <= rect->xmax; coord[0]++) { - for (coord[1] = rect->ymin; coord[1] <= rect->ymax; coord[1]++) { - float col_temp_fl[4]; - uchar col_temp_ub[4]; - image_sample_pixel_color_ubyte(ibuf, coord, col_temp_ub, col_temp_fl); - add_v4_v4(r_col_linear, col_temp_fl); - col_accum_ub[0] += (uint)col_temp_ub[0]; - col_accum_ub[1] += (uint)col_temp_ub[1]; - col_accum_ub[2] += (uint)col_temp_ub[2]; - col_accum_ub[3] += (uint)col_temp_ub[3]; - col_tot += 1; - } - } - mul_v4_fl(r_col_linear, 1.0 / (float)col_tot); - - r_col[0] = MIN2(col_accum_ub[0] / col_tot, 255); - r_col[1] = MIN2(col_accum_ub[1] / col_tot, 255); - r_col[2] = MIN2(col_accum_ub[2] / col_tot, 255); - r_col[3] = MIN2(col_accum_ub[3] / col_tot, 255); -} - -static void image_sample_rect_color_float(ImBuf *ibuf, const rcti *rect, float r_col[4]) -{ - zero_v4(r_col); - int col_tot = 0; - int coord[2]; - for (coord[0] = rect->xmin; coord[0] <= rect->xmax; coord[0]++) { - for (coord[1] = rect->ymin; coord[1] <= rect->ymax; coord[1]++) { - float col_temp_fl[4]; - image_sample_pixel_color_float(ibuf, coord, col_temp_fl); - add_v4_v4(r_col, col_temp_fl); - col_tot += 1; - } - } - mul_v4_fl(r_col, 1.0 / (float)col_tot); -} - -/** \} */ - -static void image_sample_apply(bContext *C, wmOperator *op, const wmEvent *event) -{ - SpaceImage *sima = CTX_wm_space_image(C); - ARegion *region = CTX_wm_region(C); - Image *image = ED_space_image(sima); - - float uv[2]; - UI_view2d_region_to_view(®ion->v2d, event->mval[0], event->mval[1], &uv[0], &uv[1]); - int tile = BKE_image_get_tile_from_pos(sima->image, uv, uv, NULL); - - void *lock; - ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock, tile); - ImageSampleInfo *info = op->customdata; - Scene *scene = CTX_data_scene(C); - CurveMapping *curve_mapping = scene->view_settings.curve_mapping; - - if (ibuf == NULL) { - ED_space_image_release_buffer(sima, ibuf, lock); - info->draw = false; - return; - } - - if (uv[0] >= 0.0f && uv[1] >= 0.0f && uv[0] < 1.0f && uv[1] < 1.0f) { - int x = (int)(uv[0] * ibuf->x), y = (int)(uv[1] * ibuf->y); - - CLAMP(x, 0, ibuf->x - 1); - CLAMP(y, 0, ibuf->y - 1); - - info->width = ibuf->x; - info->height = ibuf->y; - info->x = x; - info->y = y; - - info->draw = true; - info->channels = ibuf->channels; - - info->colp = NULL; - info->colfp = NULL; - info->zp = NULL; - info->zfp = NULL; - - info->use_default_view = (image->flag & IMA_VIEW_AS_RENDER) ? false : true; - - rcti sample_rect; - sample_rect.xmin = max_ii(0, x - info->sample_size / 2); - sample_rect.ymin = max_ii(0, y - info->sample_size / 2); - sample_rect.xmax = min_ii(ibuf->x, sample_rect.xmin + info->sample_size) - 1; - sample_rect.ymax = min_ii(ibuf->y, sample_rect.ymin + info->sample_size) - 1; - - if (ibuf->rect) { - image_sample_rect_color_ubyte(ibuf, &sample_rect, info->col, info->linearcol); - rgba_uchar_to_float(info->colf, info->col); - - info->colp = info->col; - info->colfp = info->colf; - info->color_manage = true; - } - if (ibuf->rect_float) { - image_sample_rect_color_float(ibuf, &sample_rect, info->colf); - - if (ibuf->channels == 4) { - /* pass */ - } - else if (ibuf->channels == 3) { - info->colf[3] = 1.0f; - } - else { - info->colf[1] = info->colf[0]; - info->colf[2] = info->colf[0]; - info->colf[3] = 1.0f; - } - info->colfp = info->colf; - - copy_v4_v4(info->linearcol, info->colf); - - info->color_manage = true; - } - - if (ibuf->zbuf) { - /* TODO, blend depth (not urgent). */ - info->z = ibuf->zbuf[y * ibuf->x + x]; - info->zp = &info->z; - if (ibuf->zbuf == (int *)ibuf->rect) { - info->colp = NULL; - } - } - if (ibuf->zbuf_float) { - /* TODO, blend depth (not urgent). */ - info->zf = ibuf->zbuf_float[y * ibuf->x + x]; - info->zfp = &info->zf; - if (ibuf->zbuf_float == ibuf->rect_float) { - info->colfp = NULL; - } - } - - if (curve_mapping && ibuf->channels == 4) { - /* we reuse this callback for set curves point operators */ - if (RNA_struct_find_property(op->ptr, "point")) { - int point = RNA_enum_get(op->ptr, "point"); - - if (point == 1) { - BKE_curvemapping_set_black_white(curve_mapping, NULL, info->linearcol); - } - else if (point == 0) { - BKE_curvemapping_set_black_white(curve_mapping, info->linearcol, NULL); - } - WM_event_add_notifier(C, NC_WINDOW, NULL); - } - } - - // XXX node curve integration .. -#if 0 - { - ScrArea *sa, *cur = curarea; - - node_curvemap_sample(fp); /* sends global to node editor */ - for (sa = G.curscreen->areabase.first; sa; sa = sa->next) { - if (sa->spacetype == SPACE_NODE) { - areawinset(sa->win); - scrarea_do_windraw(sa); - } - } - node_curvemap_sample(NULL); /* clears global in node editor */ - curarea = cur; - } -#endif - } - else { - info->draw = 0; - } - - ED_space_image_release_buffer(sima, ibuf, lock); - ED_area_tag_redraw(CTX_wm_area(C)); -} - -static void image_sample_exit(bContext *C, wmOperator *op) -{ - ImageSampleInfo *info = op->customdata; - - ED_region_draw_cb_exit(info->art, info->draw_handle); - ED_area_tag_redraw(CTX_wm_area(C)); - MEM_freeN(info); -} - -static int image_sample_invoke(bContext *C, wmOperator *op, const wmEvent *event) -{ - SpaceImage *sima = CTX_wm_space_image(C); - ARegion *region = CTX_wm_region(C); - ImageSampleInfo *info; - - if (region->regiontype == RGN_TYPE_WINDOW) { - if (event->mval[1] <= 16 && ED_space_image_show_cache(sima)) { - return OPERATOR_PASS_THROUGH; - } - } - - if (!ED_space_image_has_buffer(sima)) { - return OPERATOR_CANCELLED; - } - - info = MEM_callocN(sizeof(ImageSampleInfo), "ImageSampleInfo"); - - info->art = region->type; - info->draw_handle = ED_region_draw_cb_activate( - region->type, image_sample_draw, info, REGION_DRAW_POST_PIXEL); - info->sample_size = RNA_int_get(op->ptr, "size"); - op->customdata = info; - - image_sample_apply(C, op, event); - - WM_event_add_modal_handler(C, op); - - return OPERATOR_RUNNING_MODAL; -} - -static int image_sample_modal(bContext *C, wmOperator *op, const wmEvent *event) -{ - switch (event->type) { - case LEFTMOUSE: - case RIGHTMOUSE: // XXX hardcoded - if (event->val == KM_RELEASE) { - image_sample_exit(C, op); - return OPERATOR_CANCELLED; - } - break; - case MOUSEMOVE: - image_sample_apply(C, op, event); - break; - } - - return OPERATOR_RUNNING_MODAL; -} - -static void image_sample_cancel(bContext *C, wmOperator *op) -{ - image_sample_exit(C, op); -} - void IMAGE_OT_sample(wmOperatorType *ot) { /* identifiers */ @@ -3502,10 +3133,10 @@ void IMAGE_OT_sample(wmOperatorType *ot) ot->description = "Use mouse to sample a color in current image"; /* api callbacks */ - ot->invoke = image_sample_invoke; - ot->modal = image_sample_modal; - ot->cancel = image_sample_cancel; - ot->poll = image_sample_poll; + ot->invoke = ED_imbuf_sample_invoke; + ot->modal = ED_imbuf_sample_modal; + ot->cancel = ED_imbuf_sample_cancel; + ot->poll = ED_imbuf_sample_poll; /* flags */ ot->flag = OPTYPE_BLOCKING; @@ -3631,9 +3262,9 @@ void IMAGE_OT_curves_point_set(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; /* api callbacks */ - ot->invoke = image_sample_invoke; - ot->modal = image_sample_modal; - ot->cancel = image_sample_cancel; + ot->invoke = ED_imbuf_sample_invoke; + ot->modal = ED_imbuf_sample_modal; + ot->cancel = ED_imbuf_sample_cancel; ot->poll = space_image_main_area_not_uv_brush_poll; /* properties */ diff --git a/source/blender/editors/space_image/image_sequence.c b/source/blender/editors/space_image/image_sequence.c index cc6fe38866d..0817bdda88d 100644 --- a/source/blender/editors/space_image/image_sequence.c +++ b/source/blender/editors/space_image/image_sequence.c @@ -64,22 +64,27 @@ static void image_sequence_get_frame_ranges(wmOperator *op, ListBase *ranges) char dir[FILE_MAXDIR]; const bool do_frame_range = RNA_boolean_get(op->ptr, "use_sequence_detection"); ImageFrameRange *range = NULL; + int range_first_frame = 0; RNA_string_get(op->ptr, "directory", dir); RNA_BEGIN (op->ptr, itemptr, "files") { char base_head[FILE_MAX], base_tail[FILE_MAX]; char head[FILE_MAX], tail[FILE_MAX]; - unsigned short digits; + ushort digits; char *filename = RNA_string_get_alloc(&itemptr, "name", NULL, 0); ImageFrame *frame = MEM_callocN(sizeof(ImageFrame), "image_frame"); /* use the first file in the list as base filename */ - frame->framenr = BLI_stringdec(filename, head, tail, &digits); + frame->framenr = BLI_path_sequence_decode(filename, head, tail, &digits); /* still in the same sequence */ if (do_frame_range && (range != NULL) && (STREQLEN(base_head, head, FILE_MAX)) && (STREQLEN(base_tail, tail, FILE_MAX))) { - /* pass */ + /* Set filepath to first frame in the range. */ + if (frame->framenr < range_first_frame) { + BLI_join_dirfile(range->filepath, sizeof(range->filepath), dir, filename); + range_first_frame = frame->framenr; + } } else { /* start a new frame range */ @@ -89,6 +94,8 @@ static void image_sequence_get_frame_ranges(wmOperator *op, ListBase *ranges) BLI_strncpy(base_head, head, sizeof(base_head)); BLI_strncpy(base_tail, tail, sizeof(base_tail)); + + range_first_frame = frame->framenr; } BLI_addtail(&range->frames, frame); @@ -125,9 +132,9 @@ static int image_get_udim(char *filepath, ListBase *udim_tiles) char filename[FILE_MAX], dirname[FILE_MAXDIR]; BLI_split_dirfile(filepath, dirname, filename, sizeof(dirname), sizeof(filename)); - unsigned short digits; + ushort digits; char base_head[FILE_MAX], base_tail[FILE_MAX]; - int id = BLI_stringdec(filename, base_head, base_tail, &digits); + int id = BLI_path_sequence_decode(filename, base_head, base_tail, &digits); if (id < 1001 || id >= IMA_UDIM_MAX) { return 0; @@ -144,7 +151,7 @@ static int image_get_udim(char *filepath, ListBase *udim_tiles) continue; } char head[FILE_MAX], tail[FILE_MAX]; - id = BLI_stringdec(dir[i].relname, head, tail, &digits); + id = BLI_path_sequence_decode(dir[i].relname, head, tail, &digits); if (digits > 4 || !(STREQLEN(base_head, head, FILE_MAX)) || !(STREQLEN(base_tail, tail, FILE_MAX))) { @@ -166,7 +173,7 @@ static int image_get_udim(char *filepath, ListBase *udim_tiles) if (is_udim && has_primary) { char primary_filename[FILE_MAX]; - BLI_stringenc(primary_filename, base_head, base_tail, digits, 1001); + BLI_path_sequence_encode(primary_filename, base_head, base_tail, digits, 1001); BLI_join_dirfile(filepath, FILE_MAX, dirname, primary_filename); return max_udim - 1000; } @@ -226,7 +233,7 @@ ListBase ED_image_filesel_detect_sequences(Main *bmain, wmOperator *op, const bo const bool was_relative = BLI_path_is_rel(filepath); image_sequence_get_frame_ranges(op, &ranges); - for (ImageFrameRange *range = ranges.first; range; range = range->next) { + LISTBASE_FOREACH (ImageFrameRange *, range, &ranges) { image_detect_frame_range(range, detect_udim); BLI_freelistN(&range->frames); diff --git a/source/blender/editors/space_image/image_undo.c b/source/blender/editors/space_image/image_undo.c index 1394c05d7bc..e0c44c3a0ba 100644 --- a/source/blender/editors/space_image/image_undo.c +++ b/source/blender/editors/space_image/image_undo.c @@ -145,7 +145,7 @@ static void ptile_free_list(ListBase *paint_tiles) static void ptile_invalidate_list(ListBase *paint_tiles) { - for (PaintTile *ptile = paint_tiles->first; ptile; ptile = ptile->next) { + LISTBASE_FOREACH (PaintTile *, ptile, paint_tiles) { ptile->valid = false; } } @@ -159,7 +159,7 @@ void *ED_image_paint_tile_find(ListBase *paint_tiles, ushort **r_mask, bool validate) { - for (PaintTile *ptile = paint_tiles->first; ptile; ptile = ptile->next) { + LISTBASE_FOREACH (PaintTile *, ptile, paint_tiles) { if (ptile->x_tile == x_tile && ptile->y_tile == y_tile) { if (ptile->image == image && ptile->ibuf == ibuf && ptile->iuser.tile == iuser->tile) { if (r_mask) { @@ -225,9 +225,9 @@ void *ED_image_paint_tile_push(ListBase *paint_tiles, "PaintTile.mask"); } - ptile->rect.pt = MEM_mapallocN((ibuf->rect_float ? sizeof(float[4]) : sizeof(char[4])) * - square_i(ED_IMAGE_UNDO_TILE_SIZE), - "PaintTile.rect"); + ptile->rect.pt = MEM_callocN((ibuf->rect_float ? sizeof(float[4]) : sizeof(char[4])) * + square_i(ED_IMAGE_UNDO_TILE_SIZE), + "PaintTile.rect"); ptile->use_float = has_float; ptile->valid = true; @@ -267,7 +267,7 @@ static void ptile_restore_runtime_list(ListBase *paint_tiles) { ImBuf *tmpibuf = imbuf_alloc_temp_tile(); - for (PaintTile *ptile = paint_tiles->first; ptile; ptile = ptile->next) { + LISTBASE_FOREACH (PaintTile *, ptile, paint_tiles) { Image *image = ptile->image; ImBuf *ibuf = BKE_image_acquire_ibuf(image, &ptile->iuser, NULL); const bool has_float = (ibuf->rect_float != NULL); @@ -542,7 +542,7 @@ static void uhandle_restore_list(ListBase *undo_handles, bool use_init) { ImBuf *tmpibuf = imbuf_alloc_temp_tile(); - for (UndoImageHandle *uh = undo_handles->first; uh; uh = uh->next) { + LISTBASE_FOREACH (UndoImageHandle *, uh, undo_handles) { /* Tiles only added to second set of tiles. */ Image *image = uh->image_ref.ptr; @@ -552,7 +552,7 @@ static void uhandle_restore_list(ListBase *undo_handles, bool use_init) continue; } bool changed = false; - for (UndoImageBuf *ubuf_iter = uh->buffers.first; ubuf_iter; ubuf_iter = ubuf_iter->next) { + LISTBASE_FOREACH (UndoImageBuf *, ubuf_iter, &uh->buffers) { UndoImageBuf *ubuf = use_init ? ubuf_iter : ubuf_iter->post; ubuf_ensure_compat_ibuf(ubuf, ibuf); @@ -611,7 +611,7 @@ static UndoImageBuf *uhandle_lookup_ubuf(UndoImageHandle *uh, const Image *UNUSED(image), const char *ibuf_name) { - for (UndoImageBuf *ubuf = uh->buffers.first; ubuf; ubuf = ubuf->next) { + LISTBASE_FOREACH (UndoImageBuf *, ubuf, &uh->buffers) { if (STREQ(ubuf->ibuf_name, ibuf_name)) { return ubuf; } @@ -643,7 +643,7 @@ static UndoImageHandle *uhandle_lookup_by_name(ListBase *undo_handles, const Image *image, int tile_number) { - for (UndoImageHandle *uh = undo_handles->first; uh; uh = uh->next) { + LISTBASE_FOREACH (UndoImageHandle *, uh, undo_handles) { if (STREQ(image->id.name + 2, uh->image_ref.name + 2) && uh->iuser.tile == tile_number) { return uh; } @@ -653,7 +653,7 @@ static UndoImageHandle *uhandle_lookup_by_name(ListBase *undo_handles, static UndoImageHandle *uhandle_lookup(ListBase *undo_handles, const Image *image, int tile_number) { - for (UndoImageHandle *uh = undo_handles->first; uh; uh = uh->next) { + LISTBASE_FOREACH (UndoImageHandle *, uh, undo_handles) { if (image == uh->image_ref.ptr && uh->iuser.tile == tile_number) { return uh; } @@ -667,7 +667,7 @@ static UndoImageHandle *uhandle_add(ListBase *undo_handles, Image *image, ImageU UndoImageHandle *uh = MEM_callocN(sizeof(*uh), __func__); uh->image_ref.ptr = image; uh->iuser = *iuser; - BLI_assert(uh->iuser.scene == NULL); + uh->iuser.scene = NULL; uh->iuser.ok = 1; BLI_addtail(undo_handles, uh); return uh; @@ -714,7 +714,7 @@ static UndoImageBuf *ubuf_lookup_from_reference(ImageUndoStep *us_prev, int tile_number, const UndoImageBuf *ubuf) { - /* Use name lookup because because the pointer is cleared for previous steps. */ + /* Use name lookup because the pointer is cleared for previous steps. */ UndoImageHandle *uh_prev = uhandle_lookup_by_name(&us_prev->handles, image, tile_number); if (uh_prev != NULL) { UndoImageBuf *ubuf_reference = uhandle_lookup_ubuf(uh_prev, image, ubuf->ibuf_name); @@ -733,9 +733,9 @@ static bool image_undosys_poll(bContext *C) { Object *obact = CTX_data_active_object(C); - ScrArea *sa = CTX_wm_area(C); - if (sa && (sa->spacetype == SPACE_IMAGE)) { - SpaceImage *sima = (SpaceImage *)sa->spacedata.first; + ScrArea *area = CTX_wm_area(C); + if (area && (area->spacetype == SPACE_IMAGE)) { + SpaceImage *sima = (SpaceImage *)area->spacedata.first; if ((obact && (obact->mode & OB_MODE_TEXTURE_PAINT)) || (sima->mode == SI_MODE_PAINT)) { return true; } @@ -799,8 +799,8 @@ static bool image_undosys_step_encode(struct bContext *C, } BLI_listbase_clear(&us->paint_tiles); - for (UndoImageHandle *uh = us->handles.first; uh; uh = uh->next) { - for (UndoImageBuf *ubuf_pre = uh->buffers.first; ubuf_pre; ubuf_pre = ubuf_pre->next) { + LISTBASE_FOREACH (UndoImageHandle *, uh, &us->handles) { + LISTBASE_FOREACH (UndoImageBuf *, ubuf_pre, &uh->buffers) { ImBuf *ibuf = BKE_image_acquire_ibuf(uh->image_ref.ptr, &uh->iuser, NULL); @@ -958,7 +958,7 @@ static void image_undosys_step_decode( } if (us->paint_mode == PAINT_MODE_TEXTURE_3D) { - ED_object_mode_set(C, OB_MODE_TEXTURE_PAINT); + ED_object_mode_set_ex(C, OB_MODE_TEXTURE_PAINT, false, NULL); } /* Refresh texture slots. */ @@ -979,7 +979,7 @@ static void image_undosys_foreach_ID_ref(UndoStep *us_p, void *user_data) { ImageUndoStep *us = (ImageUndoStep *)us_p; - for (UndoImageHandle *uh = us->handles.first; uh; uh = uh->next) { + LISTBASE_FOREACH (UndoImageHandle *, uh, &us->handles) { foreach_ID_ref_fn(user_data, ((UndoRefID *)&uh->image_ref)); } } @@ -1083,6 +1083,7 @@ void ED_image_undo_push_end(void) { UndoStack *ustack = ED_undo_stack_get(); BKE_undosys_step_push(ustack, NULL, NULL); + BKE_undosys_stack_limit_steps_and_memory_defaults(ustack); WM_file_tag_modified(); } diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 14cc6a9e151..51da5270f6e 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -83,13 +83,13 @@ /**************************** common state *****************************/ -static void image_scopes_tag_refresh(ScrArea *sa) +static void image_scopes_tag_refresh(ScrArea *area) { - SpaceImage *sima = (SpaceImage *)sa->spacedata.first; + SpaceImage *sima = (SpaceImage *)area->spacedata.first; ARegion *region; /* only while histogram is visible */ - for (region = sa->regionbase.first; region; region = region->next) { + for (region = area->regionbase.first; region; region = region->next) { if (region->regiontype == RGN_TYPE_TOOL_PROPS && region->flag & RGN_FLAG_HIDDEN) { return; } @@ -127,6 +127,7 @@ static SpaceLink *image_new(const ScrArea *UNUSED(area), const Scene *UNUSED(sce simage->zoom = 1.0f; simage->lock = true; simage->flag = SI_SHOW_GPENCIL | SI_USE_ALPHA | SI_COORDFLOATS; + simage->uv_opacity = 1.0f; BKE_imageuser_default(&simage->iuser); simage->iuser.flag = IMA_SHOW_STEREO | IMA_ANIM_ALWAYS; @@ -256,10 +257,10 @@ static void image_keymap(struct wmKeyConfig *keyconf) * \note take care not to get into feedback loop here, * calling composite job causes viewer to refresh. */ -static void image_refresh(const bContext *C, ScrArea *sa) +static void image_refresh(const bContext *C, ScrArea *area) { Scene *scene = CTX_data_scene(C); - SpaceImage *sima = sa->spacedata.first; + SpaceImage *sima = area->spacedata.first; Image *ima; ima = ED_space_image(sima); @@ -276,53 +277,53 @@ static void image_refresh(const bContext *C, ScrArea *sa) } } -static void image_listener(wmWindow *win, ScrArea *sa, wmNotifier *wmn, Scene *UNUSED(scene)) +static void image_listener(wmWindow *win, ScrArea *area, wmNotifier *wmn, Scene *UNUSED(scene)) { - SpaceImage *sima = (SpaceImage *)sa->spacedata.first; + SpaceImage *sima = (SpaceImage *)area->spacedata.first; /* context changes */ switch (wmn->category) { case NC_WINDOW: /* notifier comes from editing color space */ - image_scopes_tag_refresh(sa); - ED_area_tag_redraw(sa); + image_scopes_tag_refresh(area); + ED_area_tag_redraw(area); break; case NC_SCENE: switch (wmn->data) { case ND_FRAME: - image_scopes_tag_refresh(sa); - ED_area_tag_refresh(sa); - ED_area_tag_redraw(sa); + image_scopes_tag_refresh(area); + ED_area_tag_refresh(area); + ED_area_tag_redraw(area); break; case ND_MODE: if (wmn->subtype == NS_EDITMODE_MESH) { - ED_area_tag_refresh(sa); + ED_area_tag_refresh(area); } - ED_area_tag_redraw(sa); + ED_area_tag_redraw(area); break; case ND_RENDER_RESULT: case ND_RENDER_OPTIONS: case ND_COMPO_RESULT: if (ED_space_image_show_render(sima)) { - image_scopes_tag_refresh(sa); + image_scopes_tag_refresh(area); } - ED_area_tag_redraw(sa); + ED_area_tag_redraw(area); break; } break; case NC_IMAGE: if (wmn->reference == sima->image || !wmn->reference) { if (wmn->action != NA_PAINTING) { - image_scopes_tag_refresh(sa); - ED_area_tag_refresh(sa); - ED_area_tag_redraw(sa); + image_scopes_tag_refresh(area); + ED_area_tag_refresh(area); + ED_area_tag_redraw(area); } } break; case NC_SPACE: if (wmn->data == ND_SPACE_IMAGE) { - image_scopes_tag_refresh(sa); - ED_area_tag_redraw(sa); + image_scopes_tag_refresh(area); + ED_area_tag_redraw(area); } break; case NC_MASK: { @@ -332,23 +333,23 @@ static void image_listener(wmWindow *win, ScrArea *sa, wmNotifier *wmn, Scene *U if (sima->mode == SI_MODE_MASK) { switch (wmn->data) { case ND_SELECT: - ED_area_tag_redraw(sa); + ED_area_tag_redraw(area); break; case ND_DATA: case ND_DRAW: /* causes node-recalc */ - ED_area_tag_redraw(sa); - ED_area_tag_refresh(sa); + ED_area_tag_redraw(area); + ED_area_tag_refresh(area); break; } switch (wmn->action) { case NA_SELECTED: - ED_area_tag_redraw(sa); + ED_area_tag_redraw(area); break; case NA_EDITED: /* causes node-recalc */ - ED_area_tag_redraw(sa); - ED_area_tag_refresh(sa); + ED_area_tag_redraw(area); + ED_area_tag_refresh(area); break; } } @@ -358,9 +359,9 @@ static void image_listener(wmWindow *win, ScrArea *sa, wmNotifier *wmn, Scene *U switch (wmn->data) { case ND_DATA: case ND_SELECT: - image_scopes_tag_refresh(sa); - ED_area_tag_refresh(sa); - ED_area_tag_redraw(sa); + image_scopes_tag_refresh(area); + ED_area_tag_refresh(area); + ED_area_tag_redraw(area); break; } break; @@ -373,8 +374,8 @@ static void image_listener(wmWindow *win, ScrArea *sa, wmNotifier *wmn, Scene *U Object *ob = OBACT(view_layer); if (ob && (ob == wmn->reference) && (ob->mode & OB_MODE_EDIT)) { if (sima->lock && (sima->flag & SI_DRAWSHADOW)) { - ED_area_tag_refresh(sa); - ED_area_tag_redraw(sa); + ED_area_tag_refresh(area); + ED_area_tag_redraw(area); } } break; @@ -385,14 +386,14 @@ static void image_listener(wmWindow *win, ScrArea *sa, wmNotifier *wmn, Scene *U } case NC_ID: { if (wmn->action == NA_RENAME) { - ED_area_tag_redraw(sa); + ED_area_tag_redraw(area); } break; } case NC_WM: if (wmn->data == ND_UNDO) { - ED_area_tag_redraw(sa); - ED_area_tag_refresh(sa); + ED_area_tag_redraw(area); + ED_area_tag_refresh(area); } break; } @@ -611,13 +612,13 @@ static void image_main_region_draw(const bContext *C, ARegion *region) GPU_clear(GPU_COLOR_BIT); GPU_framebuffer_bind(fbl->overlay_fb); - glDisable(GL_FRAMEBUFFER_SRGB); /* XXX not supported yet, disabling for now */ scene->r.scemode &= ~R_COMP_CROP; /* clear and setup matrix */ UI_GetThemeColor3fv(TH_BACK, col); + srgb_to_linearrgb_v3_v3(col, col); GPU_clear_color(col[0], col[1], col[2], 1.0f); GPU_clear(GPU_COLOR_BIT); GPU_depth_test(false); @@ -714,7 +715,7 @@ static void image_main_region_draw(const bContext *C, ARegion *region) } static void image_main_region_listener(wmWindow *UNUSED(win), - ScrArea *sa, + ScrArea *area, ARegion *region, wmNotifier *wmn, const Scene *UNUSED(scene)) @@ -742,7 +743,7 @@ static void image_main_region_listener(wmWindow *UNUSED(win), break; case NC_MATERIAL: if (wmn->data == ND_SHADING_LINKS) { - SpaceImage *sima = sa->spacedata.first; + SpaceImage *sima = area->spacedata.first; if (sima->iuser.scene && (sima->iuser.scene->toolsettings->uv_flag & UV_SHOW_SAME_IMAGE)) { ED_region_tag_redraw(region); @@ -831,7 +832,7 @@ static void image_buttons_region_draw(const bContext *C, ARegion *region) } static void image_buttons_region_listener(wmWindow *UNUSED(win), - ScrArea *UNUSED(sa), + ScrArea *UNUSED(area), ARegion *region, wmNotifier *wmn, const Scene *UNUSED(scene)) @@ -894,7 +895,7 @@ static void image_tools_region_draw(const bContext *C, ARegion *region) } static void image_tools_region_listener(wmWindow *UNUSED(win), - ScrArea *UNUSED(sa), + ScrArea *UNUSED(area), ARegion *region, wmNotifier *wmn, const Scene *UNUSED(scene)) @@ -942,8 +943,8 @@ static void image_header_region_init(wmWindowManager *UNUSED(wm), ARegion *regio static void image_header_region_draw(const bContext *C, ARegion *region) { - ScrArea *sa = CTX_wm_area(C); - SpaceImage *sima = sa->spacedata.first; + ScrArea *area = CTX_wm_area(C); + SpaceImage *sima = area->spacedata.first; image_user_refresh_scene(C, sima); @@ -951,7 +952,7 @@ static void image_header_region_draw(const bContext *C, ARegion *region) } static void image_header_region_listener(wmWindow *UNUSED(win), - ScrArea *UNUSED(sa), + ScrArea *UNUSED(area), ARegion *region, wmNotifier *wmn, const Scene *UNUSED(scene)) @@ -982,7 +983,7 @@ static void image_header_region_listener(wmWindow *UNUSED(win), } } -static void image_id_remap(ScrArea *UNUSED(sa), SpaceLink *slink, ID *old_id, ID *new_id) +static void image_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_id, ID *new_id) { SpaceImage *simg = (SpaceImage *)slink; @@ -1012,15 +1013,15 @@ static void image_id_remap(ScrArea *UNUSED(sa), SpaceLink *slink, ID *old_id, ID * The previous non-uv-edit mode is stored so switching back to the * image doesn't always reset the sub-mode. */ -static int image_space_subtype_get(ScrArea *sa) +static int image_space_subtype_get(ScrArea *area) { - SpaceImage *sima = sa->spacedata.first; + SpaceImage *sima = area->spacedata.first; return sima->mode == SI_MODE_UV ? SI_MODE_UV : SI_MODE_VIEW; } -static void image_space_subtype_set(ScrArea *sa, int value) +static void image_space_subtype_set(ScrArea *area, int value) { - SpaceImage *sima = sa->spacedata.first; + SpaceImage *sima = area->spacedata.first; if (value == SI_MODE_UV) { if (sima->mode != SI_MODE_UV) { sima->mode_prev = sima->mode; |