| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |  * of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							|  |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is Copyright (C) 2008 Blender Foundation. | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 08:08:12 +11:00
										 |  |  | /** \file
 | 
					
						
							|  |  |  |  * \ingroup spimage | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-21 12:02:05 +02:00
										 |  |  | #include "DNA_brush_types.h"
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | #include "DNA_mask_types.h"
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | #include "DNA_object_types.h"
 | 
					
						
							|  |  |  | #include "DNA_scene_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-20 23:06:17 +00:00
										 |  |  | #include "BLI_rect.h"
 | 
					
						
							| 
									
										
										
										
											2018-06-14 22:46:30 +02:00
										 |  |  | #include "BLI_listbase.h"
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-12 14:21:23 +01:00
										 |  |  | #include "BKE_colortools.h"
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | #include "BKE_context.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-07 18:00:24 +01:00
										 |  |  | #include "BKE_editmesh.h"
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | #include "BKE_global.h"
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | #include "BKE_image.h"
 | 
					
						
							| 
									
										
										
										
											2012-12-18 08:41:38 +00:00
										 |  |  | #include "BKE_library.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-31 18:23:20 +02:00
										 |  |  | #include "BKE_main.h"
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "IMB_imbuf_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-06 17:28:00 +11:00
										 |  |  | #include "DEG_depsgraph.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | #include "ED_image.h"  /* own include */
 | 
					
						
							|  |  |  | #include "ED_mesh.h"
 | 
					
						
							|  |  |  | #include "ED_screen.h"
 | 
					
						
							|  |  |  | #include "ED_uvedit.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 20:39:49 +00:00
										 |  |  | #include "UI_view2d.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | #include "WM_api.h"
 | 
					
						
							|  |  |  | #include "WM_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* note; image_panel_properties() uses pointer to sima->image directly */ | 
					
						
							|  |  |  | Image *ED_space_image(SpaceImage *sima) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return sima->image; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-11 12:44:14 +01:00
										 |  |  | void ED_space_image_set(Main *bmain, SpaceImage *sima, Object *obedit, Image *ima, bool automatic) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-03-11 12:44:14 +01:00
										 |  |  | 	/* Automatically pin image when manually assigned, otherwise it follows object. */ | 
					
						
							|  |  |  | 	if (!automatic && sima->image != ima && sima->mode == SI_MODE_UV) { | 
					
						
							|  |  |  | 		sima->pin = true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 	/* change the space ima after because uvedit_face_visible_test uses the space ima
 | 
					
						
							|  |  |  | 	 * to check if the face is displayed in UV-localview */ | 
					
						
							|  |  |  | 	sima->image = ima; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 11:25:10 +00:00
										 |  |  | 	if (ima == NULL || ima->type == IMA_TYPE_R_RESULT || ima->type == IMA_TYPE_COMPOSITE) { | 
					
						
							|  |  |  | 		if (sima->mode == SI_MODE_PAINT) { | 
					
						
							|  |  |  | 			sima->mode = SI_MODE_VIEW; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	if (sima->image) { | 
					
						
							| 
									
										
										
										
											2018-06-11 15:40:37 +02:00
										 |  |  | 		BKE_image_signal(bmain, sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE); | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-18 08:41:38 +00:00
										 |  |  | 	id_us_ensure_real((ID *)sima->image); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	if (obedit) { | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 		WM_main_add_notifier(NC_GEOM | ND_DATA, obedit->data); | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	WM_main_add_notifier(NC_SPACE | ND_SPACE_IMAGE, NULL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-11 12:44:14 +01:00
										 |  |  | void ED_space_image_auto_set(const bContext *C, SpaceImage *sima) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (sima->mode != SI_MODE_UV || sima->pin) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Track image assigned to active face in edit mode. */ | 
					
						
							|  |  |  | 	Object *ob = CTX_data_active_object(C); | 
					
						
							|  |  |  | 	if (!(ob && (ob->mode & OB_MODE_EDIT) && ED_space_image_show_uvedit(sima, ob))) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BMEditMesh *em = BKE_editmesh_from_object(ob); | 
					
						
							|  |  |  | 	BMesh *bm = em->bm; | 
					
						
							|  |  |  | 	BMFace *efa = BM_mesh_active_face_get(bm, true, false); | 
					
						
							|  |  |  | 	if (efa == NULL) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Image *ima = NULL; | 
					
						
							|  |  |  | 	ED_object_get_active_image(ob, efa->mat_nr + 1, &ima, NULL, NULL, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (ima != sima->image) { | 
					
						
							|  |  |  | 		sima->image = ima; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (sima->image) { | 
					
						
							|  |  |  | 			Main *bmain = CTX_data_main(C); | 
					
						
							|  |  |  | 			BKE_image_signal(bmain, sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | Mask *ED_space_image_get_mask(SpaceImage *sima) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return sima->mask_info.mask; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ED_space_image_set_mask(bContext *C, SpaceImage *sima, Mask *mask) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	sima->mask_info.mask = mask; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-31 17:31:34 +00:00
										 |  |  | 	/* weak, but same as image/space */ | 
					
						
							| 
									
										
										
										
											2012-12-18 08:41:38 +00:00
										 |  |  | 	id_us_ensure_real((ID *)sima->mask_info.mask); | 
					
						
							| 
									
										
										
										
											2012-07-31 17:31:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | 	if (C) { | 
					
						
							|  |  |  | 		WM_event_add_notifier(C, NC_MASK | NA_SELECTED, mask); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 07:25:39 +10:00
										 |  |  | ImBuf *ED_space_image_acquire_buffer(SpaceImage *sima, void **r_lock) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	ImBuf *ibuf; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (sima && sima->image) { | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  | 		if (sima->image->type == IMA_TYPE_R_RESULT && BIF_show_render_spare()) | 
					
						
							|  |  |  | 			return BIF_render_spare_imbuf(); | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-05-08 07:25:39 +10:00
										 |  |  | 		ibuf = BKE_image_acquire_ibuf(sima->image, &sima->iuser, r_lock); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-15 15:59:58 +00:00
										 |  |  | 		if (ibuf) { | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 			if (ibuf->rect || ibuf->rect_float) { | 
					
						
							| 
									
										
										
										
											2012-11-15 15:59:58 +00:00
										 |  |  | 				return ibuf; | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-02-01 17:10:40 +01:00
										 |  |  | 			BKE_image_release_ibuf(sima->image, ibuf, *r_lock); | 
					
						
							|  |  |  | 			*r_lock = NULL; | 
					
						
							| 
									
										
										
										
											2012-11-15 15:59:58 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2015-05-08 07:25:39 +10:00
										 |  |  | 		*r_lock = NULL; | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-15 15:59:58 +00:00
										 |  |  | void ED_space_image_release_buffer(SpaceImage *sima, ImBuf *ibuf, void *lock) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	if (sima && sima->image) { | 
					
						
							| 
									
										
										
										
											2012-11-15 15:59:58 +00:00
										 |  |  | 		BKE_image_release_ibuf(sima->image, ibuf, lock); | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 03:52:21 +11:00
										 |  |  | bool ED_space_image_has_buffer(SpaceImage *sima) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	ImBuf *ibuf; | 
					
						
							|  |  |  | 	void *lock; | 
					
						
							| 
									
										
										
										
											2014-01-28 03:52:21 +11:00
										 |  |  | 	bool has_buffer; | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ibuf = ED_space_image_acquire_buffer(sima, &lock); | 
					
						
							|  |  |  | 	has_buffer = (ibuf != NULL); | 
					
						
							| 
									
										
										
										
											2012-11-15 15:59:58 +00:00
										 |  |  | 	ED_space_image_release_buffer(sima, ibuf, lock); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return has_buffer; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 16:30:53 +00:00
										 |  |  | void ED_space_image_get_size(SpaceImage *sima, int *width, int *height) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	Scene *scene = sima->iuser.scene; | 
					
						
							|  |  |  | 	ImBuf *ibuf; | 
					
						
							|  |  |  | 	void *lock; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ibuf = ED_space_image_acquire_buffer(sima, &lock); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (ibuf && ibuf->x > 0 && ibuf->y > 0) { | 
					
						
							|  |  |  | 		*width = ibuf->x; | 
					
						
							|  |  |  | 		*height = ibuf->y; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else if (sima->image && sima->image->type == IMA_TYPE_R_RESULT && scene) { | 
					
						
							|  |  |  | 		/* not very important, just nice */ | 
					
						
							|  |  |  | 		*width = (scene->r.xsch * scene->r.size) / 100; | 
					
						
							|  |  |  | 		*height = (scene->r.ysch * scene->r.size) / 100; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ((scene->r.mode & R_BORDER) && (scene->r.mode & R_CROP)) { | 
					
						
							| 
									
										
										
										
											2012-09-15 11:48:20 +00:00
										 |  |  | 			*width  *= BLI_rctf_size_x(&scene->r.border); | 
					
						
							|  |  |  | 			*height *= BLI_rctf_size_y(&scene->r.border); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	/* I know a bit weak... but preview uses not actual image size */ | 
					
						
							|  |  |  | 	// XXX else if (image_preview_active(sima, width, height));
 | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2012-07-25 19:36:59 +00:00
										 |  |  | 		*width  = IMG_SIZE_FALLBACK; | 
					
						
							|  |  |  | 		*height = IMG_SIZE_FALLBACK; | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-15 15:59:58 +00:00
										 |  |  | 	ED_space_image_release_buffer(sima, ibuf, lock); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-26 11:47:47 +00:00
										 |  |  | void ED_space_image_get_size_fl(SpaceImage *sima, float size[2]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int size_i[2]; | 
					
						
							|  |  |  | 	ED_space_image_get_size(sima, &size_i[0], &size_i[1]); | 
					
						
							|  |  |  | 	size[0] = size_i[0]; | 
					
						
							|  |  |  | 	size[1] = size_i[1]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-13 05:29:38 +00:00
										 |  |  | void ED_space_image_get_aspect(SpaceImage *sima, float *aspx, float *aspy) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Image *ima = sima->image; | 
					
						
							| 
									
										
										
										
											2012-12-14 09:19:13 +00:00
										 |  |  | 	if ((ima == NULL) || (ima->aspx == 0.0f || ima->aspy == 0.0f)) { | 
					
						
							| 
									
										
										
										
											2012-09-13 05:29:38 +00:00
										 |  |  | 		*aspx = *aspy = 1.0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		BKE_image_get_aspect(ima, aspx, aspy); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 16:30:53 +00:00
										 |  |  | void ED_space_image_get_zoom(SpaceImage *sima, ARegion *ar, float *zoomx, float *zoomy) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int width, height; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 16:30:53 +00:00
										 |  |  | 	ED_space_image_get_size(sima, &width, &height); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-15 11:48:20 +00:00
										 |  |  | 	*zoomx = (float)(BLI_rcti_size_x(&ar->winrct) + 1) / (float)(BLI_rctf_size_x(&ar->v2d.cur) * width); | 
					
						
							|  |  |  | 	*zoomy = (float)(BLI_rcti_size_y(&ar->winrct) + 1) / (float)(BLI_rctf_size_y(&ar->v2d.cur) * height); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 16:30:53 +00:00
										 |  |  | void ED_space_image_get_uv_aspect(SpaceImage *sima, float *aspx, float *aspy) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int w, h; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 16:30:53 +00:00
										 |  |  | 	ED_space_image_get_aspect(sima, aspx, aspy); | 
					
						
							|  |  |  | 	ED_space_image_get_size(sima, &w, &h); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	*aspx *= (float)w; | 
					
						
							|  |  |  | 	*aspy *= (float)h; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (*aspx < *aspy) { | 
					
						
							|  |  |  | 		*aspy = *aspy / *aspx; | 
					
						
							|  |  |  | 		*aspx = 1.0f; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		*aspx = *aspx / *aspy; | 
					
						
							|  |  |  | 		*aspy = 1.0f; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-13 05:29:38 +00:00
										 |  |  | void ED_image_get_uv_aspect(Image *ima, ImageUser *iuser, float *aspx, float *aspy) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-09-13 13:29:10 +00:00
										 |  |  | 	if (ima) { | 
					
						
							|  |  |  | 		int w, h; | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-13 13:29:10 +00:00
										 |  |  | 		BKE_image_get_aspect(ima, aspx, aspy); | 
					
						
							|  |  |  | 		BKE_image_get_size(ima, iuser, &w, &h); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-13 13:29:10 +00:00
										 |  |  | 		*aspx *= (float)w; | 
					
						
							|  |  |  | 		*aspy *= (float)h; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		*aspx = 1.0f; | 
					
						
							|  |  |  | 		*aspy = 1.0f; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-27 15:15:55 +00:00
										 |  |  | /* takes event->mval */ | 
					
						
							|  |  |  | void ED_image_mouse_pos(SpaceImage *sima, ARegion *ar, const int mval[2], float co[2]) | 
					
						
							| 
									
										
										
										
											2012-07-25 20:39:49 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int sx, sy, width, height; | 
					
						
							|  |  |  | 	float zoomx, zoomy; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ED_space_image_get_zoom(sima, ar, &zoomx, &zoomy); | 
					
						
							|  |  |  | 	ED_space_image_get_size(sima, &width, &height); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-21 16:47:16 +10:00
										 |  |  | 	UI_view2d_view_to_region(&ar->v2d, 0.0f, 0.0f, &sx, &sy); | 
					
						
							| 
									
										
										
										
											2012-07-25 20:39:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-27 15:15:55 +00:00
										 |  |  | 	co[0] = ((mval[0] - sx) / zoomx) / width; | 
					
						
							|  |  |  | 	co[1] = ((mval[1] - sy) / zoomy) / height; | 
					
						
							| 
									
										
										
										
											2012-07-25 20:39:49 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-26 09:54:52 +00:00
										 |  |  | void ED_image_point_pos(SpaceImage *sima, ARegion *ar, float x, float y, float *xr, float *yr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int sx, sy, width, height; | 
					
						
							|  |  |  | 	float zoomx, zoomy; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ED_space_image_get_zoom(sima, ar, &zoomx, &zoomy); | 
					
						
							|  |  |  | 	ED_space_image_get_size(sima, &width, &height); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-21 16:47:16 +10:00
										 |  |  | 	UI_view2d_view_to_region(&ar->v2d, 0.0f, 0.0f, &sx, &sy); | 
					
						
							| 
									
										
										
										
											2012-07-26 09:54:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	*xr = ((x - sx) / zoomx) / width; | 
					
						
							|  |  |  | 	*yr = ((y - sy) / zoomy) / height; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ED_image_point_pos__reverse(SpaceImage *sima, ARegion *ar, const float co[2], float r_co[2]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	float zoomx, zoomy; | 
					
						
							|  |  |  | 	int width, height; | 
					
						
							|  |  |  | 	int sx, sy; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-21 16:47:16 +10:00
										 |  |  | 	UI_view2d_view_to_region(&ar->v2d, 0.0f, 0.0f, &sx, &sy); | 
					
						
							| 
									
										
										
										
											2012-07-26 09:54:52 +00:00
										 |  |  | 	ED_space_image_get_size(sima, &width, &height); | 
					
						
							|  |  |  | 	ED_space_image_get_zoom(sima, ar, &zoomx, &zoomy); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	r_co[0] = (co[0] * width  * zoomx) + (float)sx; | 
					
						
							|  |  |  | 	r_co[1] = (co[1] * height * zoomy) + (float)sy; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-16 07:13:40 +11:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * This is more a user-level functionality, for going to next/prev used slot, | 
					
						
							|  |  |  |  * Stepping onto the last unused slot too. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | bool ED_image_slot_cycle(struct Image *image, int direction) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	const int cur = image->render_slot; | 
					
						
							|  |  |  | 	int i, slot; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BLI_assert(ELEM(direction, -1, 1)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 22:46:30 +02:00
										 |  |  | 	int num_slots = BLI_listbase_count(&image->renderslots); | 
					
						
							|  |  |  | 	for (i = 1; i < num_slots; i++) { | 
					
						
							|  |  |  | 		slot = (cur + ((direction == -1) ? -i : i)) % num_slots; | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 		if (slot < 0) { | 
					
						
							|  |  |  | 			slot += num_slots; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-11-16 07:13:40 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 16:07:10 +02:00
										 |  |  | 		RenderSlot *render_slot = BKE_image_get_renderslot(image, slot); | 
					
						
							|  |  |  | 		if ((render_slot && render_slot->render) || slot == image->last_render_slot) { | 
					
						
							| 
									
										
										
										
											2015-11-16 07:13:40 +11:00
										 |  |  | 			image->render_slot = slot; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 22:46:30 +02:00
										 |  |  | 	if (i == num_slots) { | 
					
						
							| 
									
										
										
										
											2015-11-16 07:13:40 +11:00
										 |  |  | 		image->render_slot = ((cur == 1) ? 0 : 1); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return (cur != image->render_slot); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-12 14:21:23 +01:00
										 |  |  | void ED_space_image_scopes_update(const struct bContext *C, struct SpaceImage *sima, struct ImBuf *ibuf, bool use_view_settings) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Scene *scene = CTX_data_scene(C); | 
					
						
							|  |  |  | 	Object *ob = CTX_data_active_object(C); | 
					
						
							| 
									
										
										
										
											2018-06-04 09:31:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-12 14:21:23 +01:00
										 |  |  | 	/* scope update can be expensive, don't update during paint modes */ | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	if (sima->mode == SI_MODE_PAINT) { | 
					
						
							| 
									
										
										
										
											2015-01-12 14:21:23 +01:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if (ob && ((ob->mode & (OB_MODE_TEXTURE_PAINT | OB_MODE_EDIT)) != 0)) { | 
					
						
							| 
									
										
										
										
											2015-01-12 14:21:23 +01:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-04-05 18:20:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-10 11:29:45 +05:00
										 |  |  | 	/* We also don't update scopes of render result during render. */ | 
					
						
							|  |  |  | 	if (G.is_rendering) { | 
					
						
							|  |  |  | 		const Image *image = sima->image; | 
					
						
							|  |  |  | 		if (image != NULL && | 
					
						
							|  |  |  | 		    (image->type == IMA_TYPE_R_RESULT || image->type == IMA_TYPE_COMPOSITE)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-06-04 09:31:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-12 14:21:23 +01:00
										 |  |  | 	scopes_update(&sima->scopes, ibuf, use_view_settings ? &scene->view_settings : NULL, &scene->display_settings); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 03:52:21 +11:00
										 |  |  | bool ED_space_image_show_render(SpaceImage *sima) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return (sima->image && ELEM(sima->image->type, IMA_TYPE_R_RESULT, IMA_TYPE_COMPOSITE)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 03:52:21 +11:00
										 |  |  | bool ED_space_image_show_paint(SpaceImage *sima) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	if (ED_space_image_show_render(sima)) { | 
					
						
							| 
									
										
										
										
											2014-07-21 12:02:05 +02:00
										 |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 11:25:10 +00:00
										 |  |  | 	return (sima->mode == SI_MODE_PAINT); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 03:52:21 +11:00
										 |  |  | bool ED_space_image_show_uvedit(SpaceImage *sima, Object *obedit) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-19 20:10:14 +11:00
										 |  |  | 	if (sima) { | 
					
						
							|  |  |  | 		if (ED_space_image_show_render(sima)) { | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (sima->mode != SI_MODE_UV) { | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (obedit && obedit->type == OB_MESH) { | 
					
						
							| 
									
										
										
										
											2013-04-16 05:59:48 +00:00
										 |  |  | 		struct BMEditMesh *em = BKE_editmesh_from_object(obedit); | 
					
						
							| 
									
										
										
										
											2014-07-21 12:02:05 +02:00
										 |  |  | 		bool ret; | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 15:11:00 +10:00
										 |  |  | 		ret = EDBM_uv_check(em); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return ret; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-21 12:02:05 +02:00
										 |  |  | 	return false; | 
					
						
							| 
									
										
										
										
											2012-07-25 10:15:24 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | /* matches clip function */ | 
					
						
							| 
									
										
										
										
											2018-04-05 18:20:27 +02:00
										 |  |  | bool ED_space_image_check_show_maskedit(SpaceImage *sima, ViewLayer *view_layer) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-07-31 14:16:27 +00:00
										 |  |  | 	/* check editmode - this is reserved for UV editing */ | 
					
						
							| 
									
										
										
										
											2017-11-23 13:51:49 -02:00
										 |  |  | 	Object *ob = OBACT(view_layer); | 
					
						
							| 
									
										
										
										
											2018-04-05 18:20:27 +02:00
										 |  |  | 	if (ob && ob->mode & OB_MODE_EDIT && ED_space_image_show_uvedit(sima, ob)) { | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2012-07-31 14:16:27 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 12:15:22 +00:00
										 |  |  | 	return (sima->mode == SI_MODE_MASK); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 11:47:00 +02:00
										 |  |  | bool ED_space_image_maskedit_poll(bContext *C) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	SpaceImage *sima = CTX_wm_space_image(C); | 
					
						
							| 
									
										
										
										
											2018-04-05 18:20:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-03 22:33:45 +00:00
										 |  |  | 	if (sima) { | 
					
						
							| 
									
										
										
										
											2017-11-23 13:51:49 -02:00
										 |  |  | 		ViewLayer *view_layer = CTX_data_view_layer(C); | 
					
						
							| 
									
										
										
										
											2018-04-05 18:20:27 +02:00
										 |  |  | 		return ED_space_image_check_show_maskedit(sima, view_layer); | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 	return false; | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-21 12:02:05 +02:00
										 |  |  | bool ED_space_image_paint_curve(const bContext *C) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	SpaceImage *sima = CTX_wm_space_image(C); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (sima && sima->mode == SI_MODE_PAINT) { | 
					
						
							|  |  |  | 		Brush *br = CTX_data_tool_settings(C)->imapaint.paint.brush; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 		if (br && (br->flag & BRUSH_CURVE)) { | 
					
						
							| 
									
										
										
										
											2014-07-21 12:02:05 +02:00
										 |  |  | 			return true; | 
					
						
							| 
									
										
										
										
											2019-03-26 21:16:47 +11:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-07-21 12:02:05 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 11:47:00 +02:00
										 |  |  | bool ED_space_image_maskedit_mask_poll(bContext *C) | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (ED_space_image_maskedit_poll(C)) { | 
					
						
							| 
									
										
										
										
											2012-08-03 22:33:45 +00:00
										 |  |  | 		SpaceImage *sima = CTX_wm_space_image(C); | 
					
						
							|  |  |  | 		return sima->mask_info.mask != NULL; | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 	return false; | 
					
						
							| 
									
										
										
										
											2012-07-25 10:39:54 +00:00
										 |  |  | } |