Color Management, Stage 2: Switch color pipeline to use OpenColorIO
[blender.git] / source / blender / editors / space_clip / clip_editor.c
index 0bad9f86ea10a54c24827d9a3ee054c7c0d5080d..f2a48f299cfd1d50c8324d150ffa352fe13313b1 100644 (file)
@@ -44,6 +44,7 @@
 
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
+#include "BLI_rect.h"
 
 #include "GPU_extensions.h"
 
@@ -91,7 +92,7 @@ int ED_space_clip_tracking_poll(bContext *C)
        SpaceClip *sc = CTX_wm_space_clip(C);
 
        if (sc && sc->clip)
-               return ED_space_clip_show_trackedit(sc);
+               return ED_space_clip_check_show_trackedit(sc);
 
        return FALSE;
 }
@@ -101,7 +102,7 @@ int ED_space_clip_maskedit_poll(bContext *C)
        SpaceClip *sc = CTX_wm_space_clip(C);
 
        if (sc && sc->clip) {
-               return ED_space_clip_show_maskedit(sc);
+               return ED_space_clip_check_show_maskedit(sc);
        }
 
        return FALSE;
@@ -115,59 +116,102 @@ int ED_space_clip_maskedit_mask_poll(bContext *C)
                if (clip) {
                        SpaceClip *sc = CTX_wm_space_clip(C);
 
-                       return sc->mask != NULL;
+                       return sc->mask_info.mask != NULL;
                }
        }
 
        return FALSE;
 }
 
-/* ******** editing functions ******** */
+/* ******** common editing functions ******** */
 
-void ED_space_clip_set(bContext *C, bScreen *screen, SpaceClip *sc, MovieClip *clip)
+void ED_space_clip_get_size(SpaceClip *sc, int *width, int *height)
 {
-       MovieClip *old_clip;
+       if (sc->clip) {
+               BKE_movieclip_get_size(sc->clip, &sc->user, width, height);
+       }
+       else {
+               *width = *height = IMG_SIZE_FALLBACK;
+       }
+}
 
-       if (!screen && C)
-               screen = CTX_wm_screen(C);
+void ED_space_clip_get_size_fl(SpaceClip *sc, float size[2])
+{
+       int size_i[2];
+       ED_space_clip_get_size(sc, &size_i[0], &size_i[1]);
+       size[0] = size_i[0];
+       size[1] = size_i[1];
+}
 
-       old_clip = sc->clip;
-       sc->clip = clip;
+void ED_space_clip_get_zoom(SpaceClip *sc, ARegion *ar, float *zoomx, float *zoomy)
+{
+       int width, height;
 
-       if (sc->clip && sc->clip->id.us == 0)
-               sc->clip->id.us = 1;
+       ED_space_clip_get_size(sc, &width, &height);
 
-       if (screen && sc->view == SC_VIEW_CLIP) {
-               ScrArea *area;
-               SpaceLink *sl;
+       *zoomx = (float)(BLI_RCT_SIZE_X(&ar->winrct) + 1) / (float)(BLI_RCT_SIZE_X(&ar->v2d.cur) * width);
+       *zoomy = (float)(BLI_RCT_SIZE_Y(&ar->winrct) + 1) / (float)(BLI_RCT_SIZE_Y(&ar->v2d.cur) * height);
+}
 
-               for (area = screen->areabase.first; area; area = area->next) {
-                       for (sl = area->spacedata.first; sl; sl = sl->next) {
-                               if (sl->spacetype == SPACE_CLIP) {
-                                       SpaceClip *cur_sc = (SpaceClip *) sl;
+void ED_space_clip_get_aspect(SpaceClip *sc, float *aspx, float *aspy)
+{
+       MovieClip *clip = ED_space_clip_get_clip(sc);
 
-                                       if (cur_sc != sc && cur_sc->view != SC_VIEW_CLIP) {
-                                               if (cur_sc->clip == old_clip || cur_sc->clip == NULL) {
-                                                       cur_sc->clip = clip;
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
+       if (clip)
+               BKE_movieclip_get_aspect(clip, aspx, aspy);
+       else
+               *aspx = *aspy = 1.0f;
 
-       if (C)
-               WM_event_add_notifier(C, NC_MOVIECLIP | NA_SELECTED, sc->clip);
+       if (*aspx < *aspy) {
+               *aspy = *aspy / *aspx;
+               *aspx = 1.0f;
+       }
+       else {
+               *aspx = *aspx / *aspy;
+               *aspy = 1.0f;
+       }
 }
 
-MovieClip *ED_space_clip(SpaceClip *sc)
+void ED_space_clip_get_aspect_dimension_aware(SpaceClip *sc, float *aspx, float *aspy)
 {
-       return sc->clip;
+       int w, h;
+
+       /* most of tools does not require aspect to be returned with dimensions correction
+        * due to they're invariant to this stuff, but some transformation tools like rotation
+        * should be aware of aspect correction caused by different resolution in different
+        * directions.
+        * mainly this is sued for transformation stuff
+        */
+
+       if (!sc->clip) {
+               *aspx = 1.0f;
+               *aspy = 1.0f;
+
+               return;
+       }
+
+       ED_space_clip_get_aspect(sc, aspx, aspy);
+       BKE_movieclip_get_size(sc->clip, &sc->user, &w, &h);
+
+       *aspx *= (float) w;
+       *aspy *= (float) h;
+
+       if (*aspx < *aspy) {
+               *aspy = *aspy / *aspx;
+               *aspx = 1.0f;
+       }
+       else {
+               *aspx = *aspx / *aspy;
+               *aspy = 1.0f;
+       }
 }
 
-Mask *ED_space_clip_mask(SpaceClip *sc)
+/* return current frame number in clip space */
+int ED_space_clip_get_clip_frame_number(SpaceClip *sc)
 {
-       return sc->mask;
+       MovieClip *clip = ED_space_clip_get_clip(sc);
+
+       return BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr);
 }
 
 ImBuf *ED_space_clip_get_buffer(SpaceClip *sc)
@@ -204,106 +248,46 @@ ImBuf *ED_space_clip_get_stable_buffer(SpaceClip *sc, float loc[2], float *scale
        return NULL;
 }
 
-void ED_space_clip_size(SpaceClip *sc, int *width, int *height)
+/* returns color in SRGB */
+/* matching ED_space_image_color_sample() */
+int ED_space_clip_color_sample(SpaceClip *sc, ARegion *ar, int mval[2], float r_col[3])
 {
-       if (!sc->clip) {
-               *width = *height = 0;
-       }
-       else {
-               BKE_movieclip_get_size(sc->clip, &sc->user, width, height);
-       }
-}
-
-void ED_space_clip_mask_size(SpaceClip *sc, int *width, int *height)
-{
-       /* quite the same as ED_space_clip_size, but it also runs aspect correction on output resolution
-        * this is needed because mask should be rasterized with exactly the same resolution as
-        * currently displaying frame and it doesn't have access to aspect correction currently
-        * used for display. (sergey)
-        */
-
-       if (!sc->mask) {
-               *width = 0;
-               *height = 0;
-       } else {
-               float aspx, aspy;
-
-               ED_space_clip_size(sc, width, height);
-               ED_space_clip_aspect(sc, &aspx, &aspy);
-
-               *width *= aspx;
-               *height *= aspy;
-       }
-}
-
-void ED_space_clip_mask_aspect(SpaceClip *sc, float *aspx, float *aspy)
-{
-       int w, h;
+       ImBuf *ibuf;
+       float fx, fy, co[2];
+       int ret = FALSE;
 
-       ED_space_clip_aspect(sc, aspx, aspy);
-       ED_space_clip_size(sc, &w, &h);
-
-       /* now this is not accounted for! */
-#if 0
-       *aspx *= (float)w;
-       *aspy *= (float)h;
-#endif
-
-       if (*aspx < *aspy) {
-               *aspy = *aspy / *aspx;
-               *aspx = 1.0f;
-       }
-       else {
-               *aspx = *aspx / *aspy;
-               *aspy = 1.0f;
+       ibuf = ED_space_clip_get_buffer(sc);
+       if (!ibuf) {
+               return FALSE;
        }
-}
-
-void ED_space_clip_zoom(SpaceClip *sc, ARegion *ar, float *zoomx, float *zoomy)
-{
-       int width, height;
 
-       ED_space_clip_size(sc, &width, &height);
-
-       *zoomx = (float)(ar->winrct.xmax - ar->winrct.xmin + 1) / (float)((ar->v2d.cur.xmax - ar->v2d.cur.xmin) * width);
-       *zoomy = (float)(ar->winrct.ymax - ar->winrct.ymin + 1) / (float)((ar->v2d.cur.ymax - ar->v2d.cur.ymin) * height);
-}
+       /* map the mouse coords to the backdrop image space */
+       ED_clip_mouse_pos(sc, ar, mval, co);
 
-void ED_space_clip_aspect(SpaceClip *sc, float *aspx, float *aspy)
-{
-       MovieClip *clip = ED_space_clip(sc);
-
-       if (clip)
-               BKE_movieclip_aspect(clip, aspx, aspy);
-       else
-               *aspx = *aspy = 1.0f;
-}
-
-void ED_space_clip_aspect_dimension_aware(SpaceClip *sc, float *aspx, float *aspy)
-{
-       int w, h;
-
-       /* most of tools does not require aspect to be returned with dimensions correction
-        * due to they're invariant to this stuff, but some transformation tools like rotation
-        * should be aware of aspect correction caused by different resolution in different
-        * directions.
-        * mainly this is sued for transformation stuff
-        */
+       fx = co[0];
+       fy = co[1];
 
-       ED_space_clip_aspect(sc, aspx, aspy);
-       ED_space_clip_size(sc, &w, &h);
+       if (fx >= 0.0f && fy >= 0.0f && fx < 1.0f && fy < 1.0f) {
+               float *fp;
+               unsigned char *cp;
+               int x = (int)(fx * ibuf->x), y = (int)(fy * ibuf->y);
 
-       *aspx *= (float)w;
-       *aspy *= (float)h;
+               CLAMP(x, 0, ibuf->x - 1);
+               CLAMP(y, 0, ibuf->y - 1);
 
-       if (*aspx < *aspy) {
-               *aspy = *aspy / *aspx;
-               *aspx = 1.0f;
-       }
-       else {
-               *aspx = *aspx / *aspy;
-               *aspy = 1.0f;
+               if (ibuf->rect_float) {
+                       fp = (ibuf->rect_float + (ibuf->channels) * (y * ibuf->x + x));
+                       linearrgb_to_srgb_v3_v3(r_col, fp);
+                       ret = TRUE;
+               }
+               else if (ibuf->rect) {
+                       cp = (unsigned char *)(ibuf->rect + y * ibuf->x + x);
+                       rgb_uchar_to_float(r_col, cp);
+                       ret = TRUE;
+               }
        }
+
+       return ret;
 }
 
 void ED_clip_update_frame(const Main *mainp, int cfra)
@@ -329,29 +313,22 @@ void ED_clip_update_frame(const Main *mainp, int cfra)
        }
 }
 
-/* return current frame number in clip space */
-int ED_space_clip_clip_framenr(SpaceClip *sc)
-{
-       MovieClip *clip = ED_space_clip(sc);
-
-       return BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr);
-}
-
 static int selected_boundbox(SpaceClip *sc, float min[2], float max[2])
 {
-       MovieClip *clip = ED_space_clip(sc);
+       MovieClip *clip = ED_space_clip_get_clip(sc);
        MovieTrackingTrack *track;
        int width, height, ok = FALSE;
        ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
+       int framenr = ED_space_clip_get_clip_frame_number(sc);
 
        INIT_MINMAX2(min, max);
 
-       ED_space_clip_size(sc, &width, &height);
+       ED_space_clip_get_size(sc, &width, &height);
 
        track = tracksbase->first;
        while (track) {
                if (TRACK_VIEW_SELECTED(sc, track)) {
-                       MovieTrackingMarker *marker = BKE_tracking_marker_get(track, sc->user.framenr);
+                       MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
 
                        if (marker) {
                                float pos[3];
@@ -383,12 +360,13 @@ static int selected_boundbox(SpaceClip *sc, float min[2], float max[2])
        return ok;
 }
 
-int ED_clip_view_selection(SpaceClip *sc, ARegion *ar, int fit)
+int ED_clip_view_selection(const bContext *C, ARegion *ar, int fit)
 {
+       SpaceClip *sc = CTX_wm_space_clip(C);
        int w, h, frame_width, frame_height;
        float min[2], max[2];
 
-       ED_space_clip_size(sc, &frame_width, &frame_height);
+       ED_space_clip_get_size(sc, &frame_width, &frame_height);
 
        if (frame_width == 0 || frame_height == 0)
                return FALSE;
@@ -398,7 +376,7 @@ int ED_clip_view_selection(SpaceClip *sc, ARegion *ar, int fit)
 
        /* center view */
        clip_view_center_to_point(sc, (max[0] + min[0]) / (2 * frame_width),
-                                 (max[1] + min[1]) / (2 * frame_height));
+                                     (max[1] + min[1]) / (2 * frame_height));
 
        w = max[0] - min[0];
        h = max[1] - min[1];
@@ -408,15 +386,15 @@ int ED_clip_view_selection(SpaceClip *sc, ARegion *ar, int fit)
                int width, height;
                float zoomx, zoomy, newzoom, aspx, aspy;
 
-               ED_space_clip_aspect(sc, &aspx, &aspy);
+               ED_space_clip_get_aspect(sc, &aspx, &aspy);
 
-               width = ar->winrct.xmax - ar->winrct.xmin + 1;
-               height = ar->winrct.ymax - ar->winrct.ymin + 1;
+               width  = BLI_RCT_SIZE_X(&ar->winrct) + 1;
+               height = BLI_RCT_SIZE_Y(&ar->winrct) + 1;
 
                zoomx = (float)width / w / aspx;
                zoomy = (float)height / h / aspy;
 
-               newzoom = 1.0f / power_of_2(1.0f / MIN2(zoomx, zoomy));
+               newzoom = 1.0f / power_of_2(1.0f / minf(zoomx, zoomy));
 
                if (fit || sc->zoom > newzoom)
                        sc->zoom = newzoom;
@@ -430,11 +408,11 @@ void ED_clip_point_undistorted_pos(SpaceClip *sc, const float co[2], float r_co[
        copy_v2_v2(r_co, co);
 
        if (sc->user.render_flag & MCLIP_PROXY_RENDER_UNDISTORT) {
-               MovieClip *clip = ED_space_clip(sc);
+               MovieClip *clip = ED_space_clip_get_clip(sc);
                float aspy = 1.0f / clip->tracking.camera.pixel_aspect;
                int width, height;
 
-               ED_space_clip_size(sc, &width, &height);
+               BKE_movieclip_get_size(sc->clip, &sc->user, &width, &height);
 
                r_co[0] *= width;
                r_co[1] *= height * aspy;
@@ -446,15 +424,13 @@ void ED_clip_point_undistorted_pos(SpaceClip *sc, const float co[2], float r_co[
        }
 }
 
-void ED_clip_point_stable_pos(bContext *C, float x, float y, float *xr, float *yr)
+void ED_clip_point_stable_pos(SpaceClip *sc, ARegion *ar, float x, float y, float *xr, float *yr)
 {
-       ARegion *ar = CTX_wm_region(C);
-       SpaceClip *sc = CTX_wm_space_clip(C);
        int sx, sy, width, height;
        float zoomx, zoomy, pos[3], imat[4][4];
 
-       ED_space_clip_zoom(sc, ar, &zoomx, &zoomy);
-       ED_space_clip_size(sc, &width, &height);
+       ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy);
+       ED_space_clip_get_size(sc, &width, &height);
 
        UI_view2d_to_region_no_clip(&ar->v2d, 0.0f, 0.0f, &sx, &sy);
 
@@ -469,7 +445,7 @@ void ED_clip_point_stable_pos(bContext *C, float x, float y, float *xr, float *y
        *yr = pos[1] / height;
 
        if (sc->user.render_flag & MCLIP_PROXY_RENDER_UNDISTORT) {
-               MovieClip *clip = ED_space_clip(sc);
+               MovieClip *clip = ED_space_clip_get_clip(sc);
                MovieTracking *tracking = &clip->tracking;
                float aspy = 1.0f / tracking->camera.pixel_aspect;
                float tmp[2] = {*xr * width, *yr * height * aspy};
@@ -493,8 +469,8 @@ void ED_clip_point_stable_pos__reverse(SpaceClip *sc, ARegion *ar, const float c
        int sx, sy;
 
        UI_view2d_to_region_no_clip(&ar->v2d, 0.0f, 0.0f, &sx, &sy);
-       ED_space_clip_size(sc, &width, &height);
-       ED_space_clip_zoom(sc, ar, &zoomx, &zoomy);
+       ED_space_clip_get_size(sc, &width, &height);
+       ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy);
 
        ED_clip_point_undistorted_pos(sc, co, pos);
        pos[2] = 0.0f;
@@ -506,9 +482,91 @@ void ED_clip_point_stable_pos__reverse(SpaceClip *sc, ARegion *ar, const float c
        r_co[1] = (pos[1] * height * zoomy) + (float)sy;
 }
 
-void ED_clip_mouse_pos(bContext *C, wmEvent *event, float co[2])
+/* takes event->mval */
+void ED_clip_mouse_pos(SpaceClip *sc, ARegion *ar, const int mval[2], float co[2])
 {
-       ED_clip_point_stable_pos(C, event->mval[0], event->mval[1], &co[0], &co[1]);
+       ED_clip_point_stable_pos(sc, ar, mval[0], mval[1], &co[0], &co[1]);
+}
+
+int ED_space_clip_check_show_trackedit(SpaceClip *sc)
+{
+       if (sc) {
+               return ELEM3(sc->mode, SC_MODE_TRACKING, SC_MODE_RECONSTRUCTION, SC_MODE_DISTORTION);
+       }
+
+       return FALSE;
+}
+
+int ED_space_clip_check_show_maskedit(SpaceClip *sc)
+{
+       if (sc) {
+               return sc->mode == SC_MODE_MASKEDIT;
+       }
+
+       return FALSE;
+}
+
+/* ******** clip editing functions ******** */
+
+MovieClip *ED_space_clip_get_clip(SpaceClip *sc)
+{
+       return sc->clip;
+}
+
+void ED_space_clip_set_clip(bContext *C, bScreen *screen, SpaceClip *sc, MovieClip *clip)
+{
+       MovieClip *old_clip;
+
+       if (!screen && C)
+               screen = CTX_wm_screen(C);
+
+       old_clip = sc->clip;
+       sc->clip = clip;
+
+       if (sc->clip && sc->clip->id.us == 0)
+               sc->clip->id.us = 1;
+
+       if (screen && sc->view == SC_VIEW_CLIP) {
+               ScrArea *area;
+               SpaceLink *sl;
+
+               for (area = screen->areabase.first; area; area = area->next) {
+                       for (sl = area->spacedata.first; sl; sl = sl->next) {
+                               if (sl->spacetype == SPACE_CLIP) {
+                                       SpaceClip *cur_sc = (SpaceClip *) sl;
+
+                                       if (cur_sc != sc && cur_sc->view != SC_VIEW_CLIP) {
+                                               if (cur_sc->clip == old_clip || cur_sc->clip == NULL) {
+                                                       cur_sc->clip = clip;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       if (C)
+               WM_event_add_notifier(C, NC_MOVIECLIP | NA_SELECTED, sc->clip);
+}
+
+/* ******** masking editing functions ******** */
+
+Mask *ED_space_clip_get_mask(SpaceClip *sc)
+{
+       return sc->mask_info.mask;
+}
+
+void ED_space_clip_set_mask(bContext *C, SpaceClip *sc, Mask *mask)
+{
+       sc->mask_info.mask = mask;
+
+       if (sc->mask_info.mask && sc->mask_info.mask->id.us == 0) {
+               sc->mask_info.mask->id.us = 1;
+       }
+
+       if (C) {
+               WM_event_add_notifier(C, NC_MASK | NA_SELECTED, mask);
+       }
 }
 
 /* OpenGL draw context */
@@ -519,12 +577,15 @@ typedef struct SpaceClipDrawContext {
        GLuint texture;                 /* OGL texture ID */
        short texture_allocated;        /* flag if texture was allocated by glGenTextures */
        struct ImBuf *texture_ibuf;     /* image buffer for which texture was created */
+       const unsigned char *display_buffer; /* display buffer for which texture was created */
        int image_width, image_height;  /* image width and height for which texture was created */
        unsigned last_texture;          /* ID of previously used texture, so it'll be restored after clip drawing */
 
        /* fields to check if cache is still valid */
        int framenr, start_frame, frame_offset;
        short render_size, render_flag;
+
+       char colorspace[64];
 } SpaceClipDrawContext;
 
 int ED_space_clip_texture_buffer_supported(SpaceClip *sc)
@@ -549,10 +610,10 @@ int ED_space_clip_texture_buffer_supported(SpaceClip *sc)
        return context->buffers_supported;
 }
 
-int ED_space_clip_load_movieclip_buffer(SpaceClip *sc, ImBuf *ibuf)
+int ED_space_clip_load_movieclip_buffer(SpaceClip *sc, ImBuf *ibuf, const unsigned char *display_buffer)
 {
        SpaceClipDrawContext *context = sc->draw_context;
-       MovieClip *clip = ED_space_clip(sc);
+       MovieClip *clip = ED_space_clip_get_clip(sc);
        int need_rebind = 0;
 
        context->last_texture = glaGetOneInteger(GL_TEXTURE_2D);
@@ -561,12 +622,22 @@ int ED_space_clip_load_movieclip_buffer(SpaceClip *sc, ImBuf *ibuf)
         * assuming displaying happens of footage frames only on which painting doesn't heppen.
         * so not changed image buffer pointer means unchanged image content */
        need_rebind |= context->texture_ibuf != ibuf;
+       need_rebind |= context->display_buffer != display_buffer;
        need_rebind |= context->framenr != sc->user.framenr;
        need_rebind |= context->render_size != sc->user.render_size;
        need_rebind |= context->render_flag != sc->user.render_flag;
        need_rebind |= context->start_frame != clip->start_frame;
        need_rebind |= context->frame_offset != clip->frame_offset;
 
+       if (!need_rebind) {
+               /* OCIO_TODO: not entirely nice, but currently it seems to be easiest way
+                *            to deal with changing input color space settings
+                *            pointer-based check could fail due to new buffers could be
+                *            be allocated on on old memory
+                */
+               need_rebind = strcmp(context->colorspace, clip->colorspace_settings.name) != 0;
+       }
+
        if (need_rebind) {
                int width = ibuf->x, height = ibuf->y;
                int need_recreate = 0;
@@ -606,16 +677,12 @@ int ED_space_clip_load_movieclip_buffer(SpaceClip *sc, ImBuf *ibuf)
                        glBindTexture(GL_TEXTURE_2D, context->texture);
                }
 
-               if (ibuf->rect_float) {
-                       if (ibuf->rect == NULL)
-                               IMB_rect_from_float(ibuf);
-               }
-
-               if (ibuf->rect)
-                       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+               if (display_buffer)
+                       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, display_buffer);
 
                /* store settings */
                context->texture_allocated = 1;
+               context->display_buffer = display_buffer;
                context->texture_ibuf = ibuf;
                context->image_width = ibuf->x;
                context->image_height = ibuf->y;
@@ -624,6 +691,8 @@ int ED_space_clip_load_movieclip_buffer(SpaceClip *sc, ImBuf *ibuf)
                context->render_flag = sc->user.render_flag;
                context->start_frame = clip->start_frame;
                context->frame_offset = clip->frame_offset;
+
+               strcpy(context->colorspace, clip->colorspace_settings.name);
        }
        else {
                /* displaying exactly the same image which was loaded t oa texture,
@@ -654,36 +723,3 @@ void ED_space_clip_free_texture_buffer(SpaceClip *sc)
                MEM_freeN(context);
        }
 }
-
-/* ******** masking editing related functions ******** */
-
-int ED_space_clip_show_trackedit(SpaceClip *sc)
-{
-       if (sc) {
-               return ELEM3(sc->mode, SC_MODE_TRACKING, SC_MODE_RECONSTRUCTION, SC_MODE_DISTORTION);
-       }
-
-       return FALSE;
-}
-
-int ED_space_clip_show_maskedit(SpaceClip *sc)
-{
-       if (sc) {
-               return sc->mode == SC_MODE_MASKEDIT;
-       }
-
-       return FALSE;
-}
-
-void ED_space_clip_set_mask(bContext *C, SpaceClip *sc, Mask *mask)
-{
-       sc->mask = mask;
-
-       if (sc->mask && sc->mask->id.us == 0) {
-               sc->clip->id.us = 1;
-       }
-
-       if (C) {
-               WM_event_add_notifier(C, NC_MASK | NA_SELECTED, mask);
-       }
-}