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_view3d/view3d_draw.c')
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c63
1 files changed, 51 insertions, 12 deletions
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index aa69e7121e0..51bbf591bb3 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -51,6 +51,7 @@
#include "BLI_utildefines.h"
#include "BKE_anim.h"
+#include "BKE_camera.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_image.h"
@@ -61,6 +62,7 @@
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_unit.h"
+#include "BKE_movieclip.h"
#include "RE_engine.h"
#include "RE_pipeline.h" // make_stars
@@ -1486,7 +1488,8 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
RegionView3D *rv3d= ar->regiondata;
BGpic *bgpic;
Image *ima;
- ImBuf *ibuf= NULL;
+ MovieClip *clip;
+ ImBuf *ibuf= NULL, *freeibuf;
float vec[4], fac, asp, zoomx, zoomy;
float x1, y1, x2, y2, cx, cy;
@@ -1497,15 +1500,46 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
(bgpic->view & (1<<rv3d->view)) || /* check agaist flags */
(rv3d->persp==RV3D_CAMOB && bgpic->view == (1<<RV3D_VIEW_CAMERA))
) {
- ima= bgpic->ima;
- if(ima==NULL)
- continue;
- BKE_image_user_calc_frame(&bgpic->iuser, CFRA, 0);
- ibuf= BKE_image_get_ibuf(ima, &bgpic->iuser);
- if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL) )
+ freeibuf= NULL;
+ if(bgpic->source==V3D_BGPIC_IMAGE) {
+ ima= bgpic->ima;
+ if(ima==NULL)
+ continue;
+ BKE_image_user_calc_frame(&bgpic->iuser, CFRA, 0);
+ ibuf= BKE_image_get_ibuf(ima, &bgpic->iuser);
+ } else {
+ clip= NULL;
+
+ if(bgpic->flag&V3D_BGPIC_CAMERACLIP) {
+ if(!scene->camera)
+ scene->camera= scene_find_camera(scene);
+
+ if(scene->camera)
+ clip= object_get_movieclip(scene, scene->camera, 1);
+ } else clip= bgpic->clip;
+
+ if(clip==NULL)
+ continue;
+
+ BKE_movieclip_user_set_frame(&bgpic->cuser, CFRA);
+ ibuf= BKE_movieclip_get_ibuf(clip, &bgpic->cuser);
+
+ /* working with ibuf from image and clip has got different workflow now.
+ ibuf acquired from clip is referenced by cache system and should
+ be dereferenced after usage. */
+ freeibuf= ibuf;
+ }
+
+ if(ibuf==NULL)
continue;
- if(ibuf->channels!=4)
+
+ if((ibuf->rect==NULL && ibuf->rect_float==NULL) || ibuf->channels!=4) { /* invalid image format */
+ if(freeibuf)
+ IMB_freeImBuf(freeibuf);
+
continue;
+ }
+
if(ibuf->rect==NULL)
IMB_rect_from_float(ibuf);
@@ -1544,10 +1578,12 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
/* complete clip? */
- if(x2 < 0 ) continue;
- if(y2 < 0 ) continue;
- if(x1 > ar->winx ) continue;
- if(y1 > ar->winy ) continue;
+ if(x2 < 0 || y2 < 0 || x1 > ar->winx || y1 > ar->winy) {
+ if(freeibuf)
+ IMB_freeImBuf(freeibuf);
+
+ continue;
+ }
zoomx= (x2-x1)/ibuf->x;
zoomy= (y2-y1)/ibuf->y;
@@ -1602,6 +1638,9 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
glDepthMask(1);
if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
+
+ if(freeibuf)
+ IMB_freeImBuf(freeibuf);
}
}
}