4 * ***** BEGIN GPL LICENSE BLOCK *****
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 * The Original Code is Copyright (C) 2008 Blender Foundation.
21 * All rights reserved.
24 * Contributor(s): Blender Foundation
26 * ***** END GPL LICENSE BLOCK *****
32 #include "DNA_image_types.h"
33 #include "DNA_mesh_types.h"
34 #include "DNA_meshdata_types.h"
35 #include "DNA_object_types.h"
36 #include "DNA_space_types.h"
37 #include "DNA_scene_types.h"
38 #include "DNA_screen_types.h"
40 #include "MEM_guardedalloc.h"
42 #include "BLI_blenlib.h"
43 #include "BLI_arithb.h"
44 #include "BLI_editVert.h"
47 #include "BKE_colortools.h"
48 #include "BKE_context.h"
49 #include "BKE_image.h"
51 #include "BKE_screen.h"
52 #include "BKE_utildefines.h"
54 #include "IMB_imbuf.h"
55 #include "IMB_imbuf_types.h"
59 #include "ED_space_api.h"
60 #include "ED_screen.h"
61 #include "ED_uvedit.h"
64 #include "BIF_glutil.h"
66 #include "RNA_access.h"
71 #include "UI_interface.h"
72 #include "UI_resources.h"
73 #include "UI_view2d.h"
75 #include "image_intern.h"
77 /* ******************** manage regions ********************* */
79 ARegion *image_has_buttons_region(ScrArea *sa)
83 for(ar= sa->regionbase.first; ar; ar= ar->next)
84 if(ar->regiontype==RGN_TYPE_UI)
87 /* add subdiv level; after header */
88 for(ar= sa->regionbase.first; ar; ar= ar->next)
89 if(ar->regiontype==RGN_TYPE_HEADER)
93 if(ar==NULL) return NULL;
95 arnew= MEM_callocN(sizeof(ARegion), "buttons for image");
97 BLI_insertlinkafter(&sa->regionbase, ar, arnew);
98 arnew->regiontype= RGN_TYPE_UI;
99 arnew->alignment= RGN_ALIGN_LEFT;
101 arnew->flag = RGN_FLAG_HIDDEN;
106 /* ******************** default callbacks for image space ***************** */
108 static SpaceLink *image_new(const bContext *C)
113 simage= MEM_callocN(sizeof(SpaceImage), "initimage");
114 simage->spacetype= SPACE_IMAGE;
118 simage->iuser.fie_ima= 2;
119 simage->iuser.frames= 100;
122 ar= MEM_callocN(sizeof(ARegion), "header for image");
124 BLI_addtail(&simage->regionbase, ar);
125 ar->regiontype= RGN_TYPE_HEADER;
126 ar->alignment= RGN_ALIGN_BOTTOM;
128 /* buttons/list view */
129 ar= MEM_callocN(sizeof(ARegion), "buttons for image");
131 BLI_addtail(&simage->regionbase, ar);
132 ar->regiontype= RGN_TYPE_UI;
133 ar->alignment= RGN_ALIGN_LEFT;
134 ar->flag = RGN_FLAG_HIDDEN;
137 ar= MEM_callocN(sizeof(ARegion), "main area for image");
139 BLI_addtail(&simage->regionbase, ar);
140 ar->regiontype= RGN_TYPE_WINDOW;
142 return (SpaceLink *)simage;
145 /* not spacelink itself */
146 static void image_free(SpaceLink *sl)
148 SpaceImage *simage= (SpaceImage*) sl;
151 curvemapping_free(simage->cumap);
153 // XXX free_gpencil_data(simage->gpd);
158 /* spacetype; init callback */
159 static void image_init(struct wmWindowManager *wm, ScrArea *sa)
164 static SpaceLink *image_duplicate(SpaceLink *sl)
166 SpaceImage *simagen= MEM_dupallocN(sl);
168 /* clear or remove stuff from old */
170 simagen->cumap= curvemapping_copy(simagen->cumap);
172 return (SpaceLink *)simagen;
175 void image_operatortypes(void)
177 WM_operatortype_append(IMAGE_OT_view_all);
178 WM_operatortype_append(IMAGE_OT_view_pan);
179 WM_operatortype_append(IMAGE_OT_view_selected);
180 WM_operatortype_append(IMAGE_OT_view_zoom);
181 WM_operatortype_append(IMAGE_OT_view_zoom_in);
182 WM_operatortype_append(IMAGE_OT_view_zoom_out);
183 WM_operatortype_append(IMAGE_OT_view_zoom_ratio);
185 WM_operatortype_append(IMAGE_OT_new);
186 WM_operatortype_append(IMAGE_OT_open);
187 WM_operatortype_append(IMAGE_OT_replace);
188 WM_operatortype_append(IMAGE_OT_reload);
189 WM_operatortype_append(IMAGE_OT_save);
190 WM_operatortype_append(IMAGE_OT_save_as);
191 WM_operatortype_append(IMAGE_OT_save_sequence);
192 WM_operatortype_append(IMAGE_OT_pack);
193 WM_operatortype_append(IMAGE_OT_unpack);
195 WM_operatortype_append(IMAGE_OT_sample);
196 WM_operatortype_append(IMAGE_OT_curves_point_set);
198 WM_operatortype_append(IMAGE_OT_record_composite);
200 WM_operatortype_append(IMAGE_OT_toolbox);
201 WM_operatortype_append(IMAGE_OT_properties);
204 void image_keymap(struct wmWindowManager *wm)
206 ListBase *keymap= WM_keymap_listbase(wm, "Image Generic", SPACE_IMAGE, 0);
208 WM_keymap_add_item(keymap, "IMAGE_OT_new", NKEY, KM_PRESS, KM_ALT, 0);
209 WM_keymap_add_item(keymap, "IMAGE_OT_open", OKEY, KM_PRESS, KM_ALT, 0);
210 WM_keymap_add_item(keymap, "IMAGE_OT_reload", RKEY, KM_PRESS, KM_ALT, 0);
211 WM_keymap_add_item(keymap, "IMAGE_OT_save", SKEY, KM_PRESS, KM_ALT, 0);
212 WM_keymap_add_item(keymap, "IMAGE_OT_properties", NKEY, KM_PRESS, 0, 0);
214 keymap= WM_keymap_listbase(wm, "Image", SPACE_IMAGE, 0);
216 WM_keymap_add_item(keymap, "IMAGE_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
217 WM_keymap_add_item(keymap, "IMAGE_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
218 WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
220 WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_in", WHEELINMOUSE, KM_PRESS, 0, 0);
221 WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_out", WHEELOUTMOUSE, KM_PRESS, 0, 0);
222 WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_in", PADPLUSKEY, KM_PRESS, 0, 0);
223 WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_out", PADMINUS, KM_PRESS, 0, 0);
224 WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
226 RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD8, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 8.0f);
227 RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD4, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 4.0f);
228 RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD2, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 2.0f);
229 RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD1, KM_PRESS, 0, 0)->ptr, "ratio", 1.0f);
230 RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD2, KM_PRESS, 0, 0)->ptr, "ratio", 0.5f);
231 RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD4, KM_PRESS, 0, 0)->ptr, "ratio", 0.25f);
232 RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD8, KM_PRESS, 0, 0)->ptr, "ratio", 0.125f);
234 WM_keymap_add_item(keymap, "PAINT_OT_image_paint", ACTIONMOUSE, KM_PRESS, 0, 0);
235 WM_keymap_add_item(keymap, "PAINT_OT_grab_clone", SELECTMOUSE, KM_PRESS, 0, 0);
236 WM_keymap_add_item(keymap, "PAINT_OT_sample_color", SELECTMOUSE, KM_PRESS, 0, 0);
237 RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_image_paint_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
238 RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_image_paint_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
240 WM_keymap_add_item(keymap, "IMAGE_OT_sample", ACTIONMOUSE, KM_PRESS, 0, 0);
241 RNA_enum_set(WM_keymap_add_item(keymap, "IMAGE_OT_curves_point_set", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "point", 0);
242 RNA_enum_set(WM_keymap_add_item(keymap, "IMAGE_OT_curves_point_set", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "point", 1);
244 WM_keymap_add_item(keymap, "IMAGE_OT_toolbox", SPACEKEY, KM_PRESS, 0, 0);
247 static void image_refresh(const bContext *C, ScrArea *sa)
249 SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
250 Object *obedit= CTX_data_edit_object(C);
253 ima= ED_space_image(sima);
255 /* check if we have to set the image from the editmesh */
256 if(ima && (ima->source==IMA_SRC_VIEWER || sima->pin));
257 else if(obedit && obedit->type == OB_MESH) {
258 Mesh *me= (Mesh*)obedit->data;
259 EditMesh *em= BKE_mesh_get_editmesh(me);
262 if(em && EM_texFaceCheck(em)) {
263 sima->image= ima= NULL;
265 tf = EM_get_active_mtface(em, NULL, NULL, 1); /* partially selected face is ok */
267 if(tf && (tf->mode & TF_TEX)) {
268 /* don't need to check for pin here, see above */
269 sima->image= ima= tf->tpage;
271 if(sima->flag & SI_EDITTILE);
272 else sima->curtile= tf->tile;
276 BKE_mesh_end_editmesh(obedit->data, em);
280 static void image_listener(ScrArea *sa, wmNotifier *wmn)
282 /* context changes */
283 switch(wmn->category) {
287 case ND_RENDER_RESULT:
288 case ND_COMPO_RESULT:
289 ED_area_tag_refresh(sa);
290 ED_area_tag_redraw(sa);
295 ED_area_tag_redraw(sa);
300 static int image_context(const bContext *C, const char *member, bContextDataResult *result)
302 SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
304 if(CTX_data_dir(member)) {
305 static const char *dir[] = {"edit_image", NULL};
306 CTX_data_dir_set(result, dir);
308 else if(CTX_data_equals(member, "edit_image")) {
309 CTX_data_id_pointer_set(result, (ID*)ED_space_image(sima));
316 /************************** main region ***************************/
318 /* sets up the fields of the View2D from zoom and offset */
319 static void image_main_area_set_view2d(SpaceImage *sima, ARegion *ar, Scene *scene)
321 Image *ima= ED_space_image(sima);
323 int width, height, winx, winy;
326 if(image_preview_active(curarea, &width, &height));
329 ImBuf *ibuf= ED_space_image_buffer(sima);
335 else if(sima->image->type==IMA_TYPE_R_RESULT) {
336 /* not very important, just nice */
337 width= (scene->r.xsch*scene->r.size)/100;
338 height= (scene->r.ysch*scene->r.size)/100;
341 ED_space_image_size(sima, &width, &height);
344 ED_space_image_size(sima, &width, &height);
350 h *= ima->aspy/ima->aspx;
352 winx= ar->winrct.xmax - ar->winrct.xmin + 1;
353 winy= ar->winrct.ymax - ar->winrct.ymin + 1;
360 ar->v2d.mask.xmin= ar->v2d.mask.ymin= 0;
361 ar->v2d.mask.xmax= winx;
362 ar->v2d.mask.ymax= winy;
364 /* which part of the image space do we see? */
365 /* same calculation as in lrectwrite: area left and down*/
366 x1= ar->winrct.xmin+(winx-sima->zoom*w)/2;
367 y1= ar->winrct.ymin+(winy-sima->zoom*h)/2;
369 x1-= sima->zoom*sima->xof;
370 y1-= sima->zoom*sima->yof;
372 /* relative display right */
373 ar->v2d.cur.xmin= ((ar->winrct.xmin - (float)x1)/sima->zoom);
374 ar->v2d.cur.xmax= ar->v2d.cur.xmin + ((float)winx/sima->zoom);
376 /* relative display left */
377 ar->v2d.cur.ymin= ((ar->winrct.ymin-(float)y1)/sima->zoom);
378 ar->v2d.cur.ymax= ar->v2d.cur.ymin + ((float)winy/sima->zoom);
380 /* normalize 0.0..1.0 */
381 ar->v2d.cur.xmin /= w;
382 ar->v2d.cur.xmax /= w;
383 ar->v2d.cur.ymin /= h;
384 ar->v2d.cur.ymax /= h;
387 /* add handlers, stuff you only do once or on area/region changes */
388 static void image_main_area_init(wmWindowManager *wm, ARegion *ar)
392 // image space manages own v2d
393 // UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_STANDARD, ar->winx, ar->winy);
395 /* image paint polls for mode */
396 keymap= WM_keymap_listbase(wm, "ImagePaint", SPACE_IMAGE, 0);
397 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
400 keymap= WM_keymap_listbase(wm, "Image Generic", SPACE_IMAGE, 0);
401 WM_event_add_keymap_handler(&ar->handlers, keymap);
402 keymap= WM_keymap_listbase(wm, "Image", SPACE_IMAGE, 0);
403 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
406 static void image_main_area_draw(const bContext *C, ARegion *ar)
408 /* draw entirely, view changes should be handled here */
409 SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
410 Object *obedit= CTX_data_edit_object(C);
411 Scene *scene= CTX_data_scene(C);
412 View2D *v2d= &ar->v2d;
413 //View2DScrollers *scrollers;
416 /* clear and setup matrix */
417 UI_GetThemeColor3fv(TH_BACK, col);
418 glClearColor(col[0], col[1], col[2], 0.0);
419 glClear(GL_COLOR_BUFFER_BIT);
421 /* we set view2d from own zoom and offset each time */
422 image_main_area_set_view2d(sima, ar, scene);
424 /* we draw image in pixelspace */
425 draw_image_main(sima, ar, scene);
427 /* and uvs in 0.0-1.0 space */
428 UI_view2d_view_ortho(C, v2d);
429 draw_uvedit_main(sima, ar, scene, obedit);
430 ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST);
431 UI_view2d_view_restore(C);
434 /*scrollers= UI_view2d_scrollers_calc(C, v2d, V2D_UNIT_VALUES, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
435 UI_view2d_scrollers_draw(C, v2d, scrollers);
436 UI_view2d_scrollers_free(scrollers);*/
439 static void image_modal_keymaps(wmWindowManager *wm, ARegion *ar, int stype)
443 keymap= WM_keymap_listbase(wm, "UVEdit", 0, 0);
445 if(stype==NS_EDITMODE_MESH)
446 WM_event_add_keymap_handler(&ar->handlers, keymap);
448 WM_event_remove_keymap_handler(&ar->handlers, keymap);
451 static void image_main_area_listener(ARegion *ar, wmNotifier *wmn)
453 /* context changes */
454 switch(wmn->category) {
458 image_modal_keymaps(wmn->wm, ar, wmn->subtype);
466 ED_region_tag_redraw(ar);
472 /* *********************** buttons region ************************ */
474 /* add handlers, stuff you only do once or on area/region changes */
475 static void image_buttons_area_init(wmWindowManager *wm, ARegion *ar)
479 ED_region_panels_init(wm, ar);
481 keymap= WM_keymap_listbase(wm, "Image Generic", SPACE_IMAGE, 0);
482 WM_event_add_keymap_handler(&ar->handlers, keymap);
485 static void image_buttons_area_draw(const bContext *C, ARegion *ar)
487 ED_region_panels(C, ar, 1, NULL);
490 static void image_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
492 /* context changes */
493 switch(wmn->category) {
498 /************************* header region **************************/
500 /* add handlers, stuff you only do once or on area/region changes */
501 static void image_header_area_init(wmWindowManager *wm, ARegion *ar)
504 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
506 ED_region_header_init(ar);
510 static void image_header_area_draw(const bContext *C, ARegion *ar)
512 ED_region_header(C, ar);
517 if(ED_screen_area_active(C))
518 UI_GetThemeColor3fv(TH_HEADER, col);
520 UI_GetThemeColor3fv(TH_HEADERDESEL, col);
522 glClearColor(col[0], col[1], col[2], 0.0);
523 glClear(GL_COLOR_BUFFER_BIT);
525 /* set view2d view matrix for scrolling (without scrollers) */
526 UI_view2d_view_ortho(C, &ar->v2d);
528 image_header_buttons(C, ar);
530 /* restore view matrix? */
531 UI_view2d_view_restore(C);
535 /**************************** spacetype *****************************/
537 /* only called once, from space/spacetypes.c */
538 void ED_spacetype_image(void)
540 SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype image");
543 st->spaceid= SPACE_IMAGE;
546 st->free= image_free;
547 st->init= image_init;
548 st->duplicate= image_duplicate;
549 st->operatortypes= image_operatortypes;
550 st->keymap= image_keymap;
551 st->refresh= image_refresh;
552 st->listener= image_listener;
553 st->context= image_context;
555 /* regions: main window */
556 art= MEM_callocN(sizeof(ARegionType), "spacetype image region");
557 art->regionid = RGN_TYPE_WINDOW;
558 art->keymapflag= ED_KEYMAP_FRAMES;
559 art->init= image_main_area_init;
560 art->draw= image_main_area_draw;
561 art->listener= image_main_area_listener;
564 BLI_addhead(&st->regiontypes, art);
566 /* regions: listview/buttons */
567 art= MEM_callocN(sizeof(ARegionType), "spacetype image region");
568 art->regionid = RGN_TYPE_UI;
569 art->minsizex= 220; // XXX
570 art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES;
571 art->listener= image_buttons_area_listener;
572 art->init= image_buttons_area_init;
573 art->draw= image_buttons_area_draw;
574 BLI_addhead(&st->regiontypes, art);
576 image_buttons_register(art);
578 /* regions: header */
579 art= MEM_callocN(sizeof(ARegionType), "spacetype image region");
580 art->regionid = RGN_TYPE_HEADER;
581 art->minsizey= HEADERY;
582 art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES;
583 art->init= image_header_area_init;
584 art->draw= image_header_area_draw;
586 BLI_addhead(&st->regiontypes, art);
589 BKE_spacetype_register(st);
592 /**************************** common state *****************************/
594 /* note; image_panel_properties() uses pointer to sima->image directly */
595 Image *ED_space_image(SpaceImage *sima)
600 /* called to assign images to UV faces */
601 void ED_space_image_set(bContext *C, SpaceImage *sima, Scene *scene, Object *obedit, Image *ima)
603 ED_uvedit_assign_image(scene, obedit, ima, sima->image);
605 /* change the space ima after because uvedit_face_visible uses the space ima
606 * to check if the face is displayed in UV-localview */
609 if(ima == NULL || ima->type==IMA_TYPE_R_RESULT || ima->type==IMA_TYPE_COMPOSITE)
610 sima->flag &= ~SI_DRAWTOOL;
613 BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE);
615 if(sima->image && sima->image->id.us==0)
616 sima->image->id.us= 1;
620 WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
622 ED_area_tag_redraw(CTX_wm_area(C));
626 ImBuf *ED_space_image_buffer(SpaceImage *sima)
632 if(sima->image->type==IMA_TYPE_R_RESULT && BIF_show_render_spare())
633 return BIF_render_spare_imbuf();
636 ibuf= BKE_image_get_ibuf(sima->image, &sima->iuser);
638 if(ibuf && (ibuf->rect || ibuf->rect_float))
645 void ED_image_size(Image *ima, int *width, int *height)
649 ibuf= (ima)? BKE_image_get_ibuf(ima, NULL): NULL;
651 if(ibuf && ibuf->x > 0 && ibuf->y > 0) {
661 void ED_space_image_size(SpaceImage *sima, int *width, int *height)
665 ibuf= ED_space_image_buffer(sima);
667 if(ibuf && ibuf->x > 0 && ibuf->y > 0) {
671 /* I know a bit weak... but preview uses not actual image size */
672 // XXX else if(image_preview_active(sima, width, height));
679 void ED_image_aspect(Image *ima, float *aspx, float *aspy)
683 if((ima == NULL) || (ima->type == IMA_TYPE_R_RESULT) || (ima->type == IMA_TYPE_COMPOSITE) ||
684 (ima->aspx==0.0 || ima->aspy==0.0))
688 *aspy = ima->aspy/ima->aspx;
691 void ED_space_image_aspect(SpaceImage *sima, float *aspx, float *aspy)
693 ED_image_aspect(ED_space_image(sima), aspx, aspy);
696 void ED_space_image_zoom(SpaceImage *sima, ARegion *ar, float *zoomx, float *zoomy)
700 ED_space_image_size(sima, &width, &height);
702 *zoomx= (float)(ar->winrct.xmax - ar->winrct.xmin)/(float)((ar->v2d.cur.xmax - ar->v2d.cur.xmin)*width);
703 *zoomy= (float)(ar->winrct.ymax - ar->winrct.ymin)/(float)((ar->v2d.cur.ymax - ar->v2d.cur.ymin)*height);
706 void ED_space_image_uv_aspect(SpaceImage *sima, float *aspx, float *aspy)
710 ED_space_image_aspect(sima, aspx, aspy);
711 ED_space_image_size(sima, &w, &h);
713 *aspx *= (float)w/256.0f;
714 *aspy *= (float)h/256.0f;
717 void ED_image_uv_aspect(Image *ima, float *aspx, float *aspy)
721 ED_image_aspect(ima, aspx, aspy);
722 ED_image_size(ima, &w, &h);
728 int ED_space_image_show_render(SpaceImage *sima)
730 return (sima->image && ELEM(sima->image->type, IMA_TYPE_R_RESULT, IMA_TYPE_COMPOSITE));
733 int ED_space_image_show_paint(SpaceImage *sima)
735 if(ED_space_image_show_render(sima))
738 return (sima->flag & SI_DRAWTOOL);
741 int ED_space_image_show_uvedit(SpaceImage *sima, Object *obedit)
743 if(ED_space_image_show_render(sima))
745 if(ED_space_image_show_paint(sima))
748 if(obedit && obedit->type == OB_MESH) {
749 EditMesh *em = BKE_mesh_get_editmesh(obedit->data);
752 ret = EM_texFaceCheck(em);
754 BKE_mesh_end_editmesh(obedit->data, em);
761 int ED_space_image_show_uvshadow(SpaceImage *sima, Object *obedit)
763 if(ED_space_image_show_render(sima))
766 if(ED_space_image_show_paint(sima))
767 if(obedit && obedit->type == OB_MESH) {
768 EditMesh *em = BKE_mesh_get_editmesh(obedit->data);
771 ret = EM_texFaceCheck(em);
773 BKE_mesh_end_editmesh(obedit->data, em);