Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_image/image_buttons.c')
-rw-r--r--source/blender/editors/space_image/image_buttons.c278
1 files changed, 150 insertions, 128 deletions
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index 3af210f376b..f22152651e2 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -53,6 +53,7 @@
#include "ED_gpencil.h"
#include "ED_screen.h"
+#include "ED_image.h"
#include "RNA_access.h"
@@ -149,7 +150,7 @@ struct ImageUser *ntree_get_active_iuser(bNodeTree *ntree)
/* 0: disable preview
* otherwise refresh preview
*
- * XXX if you put this back, also check XXX in image_main_area_draw() */
+ * XXX if you put this back, also check XXX in image_main_region_draw() */
* /
void image_preview_event(int event)
{
@@ -310,6 +311,19 @@ static void ui_imageuser_slot_menu(bContext *UNUSED(C), uiLayout *layout, void *
}
}
+static bool ui_imageuser_slot_menu_step(bContext *C, int direction, void *image_p)
+{
+ Image *image = image_p;
+
+ if (ED_image_slot_cycle(image, direction)) {
+ WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+ return true;
+ }
+ else {
+ return true;
+ }
+}
+
static const char *ui_imageuser_layer_fake_name(RenderResult *rr)
{
RenderView *rv = RE_RenderViewGetById(rr, 0);
@@ -324,12 +338,19 @@ static const char *ui_imageuser_layer_fake_name(RenderResult *rr)
}
}
+/* workaround for passing many args */
+struct ImageUI_Data {
+ Image *image;
+ ImageUser *iuser;
+ int rpass_index;
+};
+
static void ui_imageuser_layer_menu(bContext *UNUSED(C), uiLayout *layout, void *rnd_pt)
{
- void **rnd_data = rnd_pt;
+ struct ImageUI_Data *rnd_data = rnd_pt;
uiBlock *block = uiLayoutGetBlock(layout);
- Image *image = rnd_data[0];
- ImageUser *iuser = rnd_data[1];
+ Image *image = rnd_data->image;
+ ImageUser *iuser = rnd_data->iuser;
Scene *scene = iuser->scene;
RenderResult *rr;
RenderLayer *rl;
@@ -387,12 +408,12 @@ static const char *ui_imageuser_pass_fake_name(RenderLayer *rl)
static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void *rnd_pt)
{
- void **rnd_data = rnd_pt;
+ struct ImageUI_Data *rnd_data = rnd_pt;
uiBlock *block = uiLayoutGetBlock(layout);
- Image *image = rnd_data[0];
- ImageUser *iuser = rnd_data[1];
+ Image *image = rnd_data->image;
+ ImageUser *iuser = rnd_data->iuser;
/* (rpass_index == -1) means composite result */
- const int rpass_index = GET_INT_FROM_POINTER(rnd_data[2]);
+ const int rpass_index = rnd_data->rpass_index;
Scene *scene = iuser->scene;
RenderResult *rr;
RenderLayer *rl;
@@ -454,10 +475,10 @@ final:
/**************************** view menus *****************************/
static void ui_imageuser_view_menu_rr(bContext *UNUSED(C), uiLayout *layout, void *rnd_pt)
{
- void **rnd_data = rnd_pt;
+ struct ImageUI_Data *rnd_data = rnd_pt;
uiBlock *block = uiLayoutGetBlock(layout);
- Image *image = rnd_data[0];
- ImageUser *iuser = rnd_data[1];
+ Image *image = rnd_data->image;
+ ImageUser *iuser = rnd_data->iuser;
RenderResult *rr;
RenderView *rview;
int nr;
@@ -488,10 +509,10 @@ static void ui_imageuser_view_menu_rr(bContext *UNUSED(C), uiLayout *layout, voi
static void ui_imageuser_view_menu_multiview(bContext *UNUSED(C), uiLayout *layout, void *rnd_pt)
{
- void **rnd_data = rnd_pt;
+ struct ImageUI_Data *rnd_data = rnd_pt;
uiBlock *block = uiLayoutGetBlock(layout);
- Image *image = rnd_data[0];
- ImageUser *iuser = rnd_data[1];
+ Image *image = rnd_data->image;
+ ImageUser *iuser = rnd_data->iuser;
int nr;
ImageView *iv;
@@ -519,93 +540,125 @@ static void image_multi_cb(bContext *C, void *rr_v, void *iuser_v)
WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
}
-static void image_multi_inclay_cb(bContext *C, void *rr_v, void *iuser_v)
+static bool ui_imageuser_layer_menu_step(bContext *C, int direction, void *rnd_pt)
{
- RenderResult *rr = rr_v;
- ImageUser *iuser = iuser_v;
- int tot = BLI_listbase_count(&rr->layers);
+ Scene *scene = CTX_data_scene(C);
+ struct ImageUI_Data *rnd_data = rnd_pt;
+ Image *image = rnd_data->image;
+ ImageUser *iuser = rnd_data->iuser;
+ RenderResult *rr;
+ bool changed = false;
- if (RE_HasFakeLayer(rr))
- tot++; /* fake compo/sequencer layer */
+ rr = BKE_image_acquire_renderresult(scene, image);
+ if (UNLIKELY(rr == NULL)) {
+ return false;
+ }
- if (iuser->layer < tot - 1) {
- iuser->layer++;
- BKE_image_multilayer_index(rr, iuser);
- WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+ if (direction == -1) {
+ if (iuser->layer > 0) {
+ iuser->layer--;
+ changed = true;
+ }
}
-}
-static void image_multi_declay_cb(bContext *C, void *rr_v, void *iuser_v)
-{
- ImageUser *iuser = iuser_v;
+ else if (direction == 1) {
+ int tot = BLI_listbase_count(&rr->layers);
+
+ if (RE_HasFakeLayer(rr))
+ tot++; /* fake compo/sequencer layer */
- if (iuser->layer > 0) {
- iuser->layer--;
- BKE_image_multilayer_index(rr_v, iuser);
+ if (iuser->layer < tot - 1) {
+ iuser->layer++;
+ changed = true;
+ }
+ }
+ else {
+ BLI_assert(0);
+ }
+
+ if (changed) {
+ BKE_image_multilayer_index(rr, iuser);
WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
}
+
+ return changed;
}
-static void image_multi_incpass_cb(bContext *C, void *rr_v, void *iuser_v)
+
+static bool ui_imageuser_pass_menu_step(bContext *C, int direction, void *rnd_pt)
{
- RenderResult *rr = rr_v;
- ImageUser *iuser = iuser_v;
- RenderLayer *rl;
- RenderPass *rp;
+ Scene *scene = CTX_data_scene(C);
+ struct ImageUI_Data *rnd_data = rnd_pt;
+ Image *image = rnd_data->image;
+ ImageUser *iuser = rnd_data->iuser;
+ RenderResult *rr;
+ bool changed = false;
int layer = iuser->layer;
+ RenderLayer *rl;
+ RenderPass *rpass;
+
+ rr = BKE_image_acquire_renderresult(scene, image);
+ if (UNLIKELY(rr == NULL)) {
+ BKE_image_release_renderresult(scene, image);
+ return false;
+ }
- if (RE_HasFakeLayer(rr))
+ if (RE_HasFakeLayer(rr)) {
layer -= 1;
+ }
rl = BLI_findlink(&rr->layers, layer);
+ if (rl == NULL) {
+ BKE_image_release_renderresult(scene, image);
+ return false;
+ }
- if (rl) {
- RenderPass *rpass = BLI_findlink(&rl->passes, iuser->pass);
- int rp_index = iuser->pass + 1;
+ rpass = BLI_findlink(&rl->passes, iuser->pass);
+ if (rpass == NULL) {
+ BKE_image_release_renderresult(scene, image);
+ return false;
+ }
- if (rpass == NULL)
- return;
+ /* note, this looks reversed, but matches menu direction */
+ if (direction == -1) {
+ RenderPass *rp;
+ int rp_index = iuser->pass + 1;
for (rp = rpass->next; rp; rp = rp->next, rp_index++) {
if (rp->passtype != rpass->passtype) {
iuser->pass = rp_index;
- BKE_image_multilayer_index(rr, iuser);
- WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+ changed = true;
break;
}
}
}
-}
-static void image_multi_decpass_cb(bContext *C, void *rr_v, void *iuser_v)
-{
- RenderResult *rr = rr_v;
- ImageUser *iuser = iuser_v;
- RenderLayer *rl;
- RenderPass *rp;
- int layer = iuser->layer;
-
- if (iuser->pass == 0)
- return;
-
- if (RE_HasFakeLayer(rr))
- layer -= 1;
-
- rl = BLI_findlink(&rr->layers, layer);
-
- if (rl) {
- RenderPass *rpass = BLI_findlink(&rl->passes, iuser->pass);
+ else if (direction == 1) {
+ RenderPass *rp;
int rp_index = 0;
- if (rpass == NULL)
- return;
+ if (iuser->pass == 0) {
+ BKE_image_release_renderresult(scene, image);
+ return false;
+ }
for (rp = rl->passes.first; rp; rp = rp->next, rp_index++) {
if (rp->passtype == rpass->passtype) {
iuser->pass = rp_index - 1;
- BKE_image_multilayer_index(rr, iuser);
- WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+ changed = true;
break;
}
}
}
+ else {
+ BLI_assert(0);
+ }
+
+ BKE_image_release_renderresult(scene, image);
+
+ if (changed) {
+ BKE_image_multilayer_index(rr, iuser);
+ WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+ }
+
+ return changed;
}
/* 5 view button callbacks... */
@@ -635,16 +688,18 @@ static void image_user_change(bContext *C, void *iuser_v, void *unused)
}
#endif
-static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderResult *rr, ImageUser *iuser, int w, short *render_slot)
+static void uiblock_layer_pass_buttons(
+ uiLayout *layout, Image *image, RenderResult *rr, ImageUser *iuser, int w,
+ short *render_slot)
{
- static void *rnd_pt[4]; /* XXX, workaround */
+ static struct ImageUI_Data rnd_pt; /* XXX, workaround */
uiBlock *block = uiLayoutGetBlock(layout);
uiBut *but;
RenderLayer *rl = NULL;
int wmenu1, wmenu2, wmenu3, wmenu4;
const char *fake_name;
const char *display_name = "";
- const bool show_stereo = (iuser->flag & IMA_SHOW_STEREO);
+ const bool show_stereo = (iuser->flag & IMA_SHOW_STEREO) != 0;
uiLayoutRow(layout, true);
@@ -654,9 +709,9 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes
wmenu3 = (3 * w) / 6;
wmenu4 = (3 * w) / 6;
- rnd_pt[0] = image;
- rnd_pt[1] = iuser;
- rnd_pt[2] = NULL;
+ rnd_pt.image = image;
+ rnd_pt.iuser = iuser;
+ rnd_pt.rpass_index = 0;
/* menu buts */
if (render_slot) {
@@ -667,7 +722,9 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes
else {
BLI_snprintf(str, sizeof(str), IFACE_("Slot %d"), *render_slot + 1);
}
+
but = uiDefMenuBut(block, ui_imageuser_slot_menu, image, str, 0, 0, wmenu1, UI_UNIT_Y, TIP_("Select Slot"));
+ UI_but_func_menu_step_set(but, ui_imageuser_slot_menu_step);
UI_but_func_set(but, image_multi_cb, rr, iuser);
UI_but_type_set_menu_from_pulldown(but);
}
@@ -681,12 +738,13 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes
fake_name = ui_imageuser_layer_fake_name(rr);
rpass_index = iuser->layer - (fake_name ? 1 : 0);
rl = BLI_findlink(&rr->layers, rpass_index);
- rnd_pt[2] = SET_INT_IN_POINTER(rpass_index);
+ rnd_pt.rpass_index = rpass_index;
if (RE_layers_have_name(rr)) {
display_name = rl ? rl->name : (fake_name ? fake_name : "");
- but = uiDefMenuBut(block, ui_imageuser_layer_menu, rnd_pt, display_name,
+ but = uiDefMenuBut(block, ui_imageuser_layer_menu, &rnd_pt, display_name,
0, 0, wmenu2, UI_UNIT_Y, TIP_("Select Layer"));
+ UI_but_func_menu_step_set(but, ui_imageuser_layer_menu_step);
UI_but_func_set(but, image_multi_cb, rr, iuser);
UI_but_type_set_menu_from_pulldown(but);
}
@@ -696,25 +754,28 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes
rpass = (rl ? BLI_findlink(&rl->passes, iuser->pass - (fake_name ? 1 : 0)) : NULL);
display_name = rpass ? rpass->internal_name : (fake_name ? fake_name : "");
- but = uiDefMenuBut(block, ui_imageuser_pass_menu, rnd_pt, IFACE_(display_name),
+ but = uiDefMenuBut(block, ui_imageuser_pass_menu, &rnd_pt, IFACE_(display_name),
0, 0, wmenu3, UI_UNIT_Y, TIP_("Select Pass"));
+ UI_but_func_menu_step_set(but, ui_imageuser_pass_menu_step);
UI_but_func_set(but, image_multi_cb, rr, iuser);
UI_but_type_set_menu_from_pulldown(but);
/* view */
- if (BLI_listbase_count_ex(&rr->views, 2) > 1 && !show_stereo) {
+ if (BLI_listbase_count_ex(&rr->views, 2) > 1 &&
+ ((!show_stereo) || (!RE_RenderResult_is_stereo(rr))))
+ {
rview = BLI_findlink(&rr->views, iuser->view);
display_name = rview ? rview->name : "";
- but = uiDefMenuBut(block, ui_imageuser_view_menu_rr, rnd_pt, display_name, 0, 0, wmenu4, UI_UNIT_Y, TIP_("Select View"));
+ but = uiDefMenuBut(block, ui_imageuser_view_menu_rr, &rnd_pt, display_name, 0, 0, wmenu4, UI_UNIT_Y, TIP_("Select View"));
UI_but_func_set(but, image_multi_cb, rr, iuser);
UI_but_type_set_menu_from_pulldown(but);
}
}
/* stereo image */
- else if (((image->flag & IMA_IS_STEREO) && (!show_stereo)) ||
- ((image->flag & IMA_IS_MULTIVIEW) && ((image->flag & IMA_IS_STEREO) == 0)))
+ else if ((BKE_image_is_stereo(image) && (!show_stereo)) ||
+ (BKE_image_is_multiview(image) && !BKE_image_is_stereo(image)))
{
ImageView *iv;
int nr = 0;
@@ -726,45 +787,12 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes
}
}
- but = uiDefMenuBut(block, ui_imageuser_view_menu_multiview, rnd_pt, display_name, 0, 0, wmenu1, UI_UNIT_Y, TIP_("Select View"));
+ but = uiDefMenuBut(block, ui_imageuser_view_menu_multiview, &rnd_pt, display_name, 0, 0, wmenu1, UI_UNIT_Y, TIP_("Select View"));
UI_but_func_set(but, image_multiview_cb, image, iuser);
UI_but_type_set_menu_from_pulldown(but);
}
}
-static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, Image *image, RenderResult *rr, ImageUser *iuser,
- int menus_width, short *render_slot)
-{
- uiBlock *block = uiLayoutGetBlock(layout);
- uiLayout *row;
- uiBut *but;
-
- row = uiLayoutRow(layout, true);
-
- if (rr == NULL || iuser == NULL)
- return;
- if (BLI_listbase_is_empty(&rr->layers)) {
- uiItemL(row, IFACE_("No Layers in Render Result"), ICON_NONE);
- return;
- }
-
- /* decrease, increase arrows */
- but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_TRIA_LEFT, 0, 0, 0.85f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Previous Layer"));
- UI_but_func_set(but, image_multi_declay_cb, rr, iuser);
- but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_TRIA_RIGHT, 0, 0, 0.90f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Next Layer"));
- UI_but_func_set(but, image_multi_inclay_cb, rr, iuser);
-
- uiblock_layer_pass_buttons(row, image, rr, iuser, menus_width, render_slot);
-
- /* decrease, increase arrows */
- but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_TRIA_LEFT, 0, 0, 0.85f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Previous Pass"));
- UI_but_func_set(but, image_multi_decpass_cb, rr, iuser);
- but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_TRIA_RIGHT, 0, 0, 0.90f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Next Pass"));
- UI_but_func_set(but, image_multi_incpass_cb, rr, iuser);
-
- UI_block_align_end(block);
-}
-
// XXX HACK!
// static int packdummy=0;
@@ -876,12 +904,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
/* use BKE_image_acquire_renderresult so we get the correct slot in the menu */
rr = BKE_image_acquire_renderresult(scene, ima);
- if (rr) {
- uiblock_layer_pass_arrow_buttons(layout, ima, rr, iuser, menus_width, &ima->render_slot);
- }
- else {
- uiblock_layer_pass_buttons(layout, ima, rr, iuser, menus_width, &ima->render_slot);
- }
+ uiblock_layer_pass_buttons(layout, ima, rr, iuser, menus_width, &ima->render_slot);
BKE_image_release_renderresult(scene, ima);
}
}
@@ -915,7 +938,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
/* multilayer? */
if (ima->type == IMA_TYPE_MULTILAYER && ima->rr) {
const float dpi_fac = UI_DPI_FAC;
- uiblock_layer_pass_arrow_buttons(layout, ima, ima->rr, iuser, 230 * dpi_fac, NULL);
+ uiblock_layer_pass_buttons(layout, ima, ima->rr, iuser, 230 * dpi_fac, NULL);
}
else if (ima->source != IMA_SRC_GENERATED) {
if (compact == 0) {
@@ -1110,6 +1133,10 @@ void uiTemplateImageSettings(uiLayout *layout, PointerRNA *imfptr, int color_man
#endif
}
+ if (imf->imtype == R_IMF_IMTYPE_TIFF) {
+ uiItemR(col, imfptr, "tiff_codec", 0, NULL, ICON_NONE);
+ }
+
/* color management */
if (color_management &&
(!BKE_imtype_requires_linear_float(imf->imtype) ||
@@ -1232,13 +1259,8 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser
/* use BKE_image_acquire_renderresult so we get the correct slot in the menu */
rr = BKE_image_acquire_renderresult(scene, ima);
- if (rr && is_render_result) {
- uiblock_layer_pass_arrow_buttons(layout, ima, rr, iuser, menus_width, &ima->render_slot);
- }
- else {
- uiblock_layer_pass_buttons(layout, ima, rr, iuser, menus_width,
- is_render_result ? &ima->render_slot : NULL);
- }
+ uiblock_layer_pass_buttons(layout, ima, rr, iuser, menus_width,
+ is_render_result ? &ima->render_slot : NULL);
BKE_image_release_renderresult(scene, ima);
}
}