diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-09-13 09:29:38 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-09-13 09:29:38 +0400 |
commit | 05755d307a140934aba98e55e9c7536c0cba0947 (patch) | |
tree | adb0988fa03ea2ae11d785e78a164d4c90e82df2 /source/blender/editors/transform | |
parent | c5310521f8d9099fc36431bae76dd0a402cc077e (diff) |
fix [#31946] Masking doesn't respect pixel ratio
Diffstat (limited to 'source/blender/editors/transform')
-rw-r--r-- | source/blender/editors/transform/transform.c | 63 |
1 files changed, 50 insertions, 13 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 23af0d6f8d6..a3fb4e851e2 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -65,6 +65,7 @@ #include "BKE_particle.h" #include "BKE_pointcache.h" #include "BKE_unit.h" +#include "BKE_mask.h" #include "ED_image.h" #include "ED_keyframing.h" @@ -228,9 +229,27 @@ void projectIntView(TransInfo *t, const float vec[3], int adr[2]) project_int_noclip(t->ar, vec, adr); } else if (t->spacetype == SPACE_IMAGE) { + SpaceImage *sima = t->sa->spacedata.first; + if (t->options & CTX_MASK) { + /* not working quite right, TODO (see below too) */ + float aspx, aspy; float v[2]; - ED_mask_point_pos__reverse(t->sa, t->ar, vec[0], vec[1], &v[0], &v[1]); + + ED_space_image_get_aspect(sima, &aspx, &aspy); + + copy_v2_v2(v, vec); + + v[0] = v[0] / aspx; + v[1] = v[1] / aspy; + + BKE_mask_coord_to_image(sima->image, &sima->iuser, v, v); + + v[0] = v[0] / aspx; + v[1] = v[1] / aspy; + + ED_image_point_pos__reverse(sima, t->ar, v, v); + adr[0] = v[0]; adr[1] = v[1]; } @@ -278,23 +297,41 @@ void projectIntView(TransInfo *t, const float vec[3], int adr[2]) adr[1] = out[1]; } else if (t->spacetype == SPACE_CLIP) { - float v[2]; - float aspx = 1.0f, aspy = 1.0f; + SpaceClip *sc = t->sa->spacedata.first; - copy_v2_v2(v, vec); + if (t->options & CTX_MASK) { + /* not working quite right, TODO (see above too) */ + float aspx, aspy; + float v[2]; - if (t->options & CTX_MOVIECLIP) { - ED_space_clip_get_aspect_dimension_aware(t->sa->spacedata.first, &aspx, &aspy); - } - else if (t->options & CTX_MASK) { - /* MASKTODO - not working as expected */ - ED_space_clip_get_aspect(t->sa->spacedata.first, &aspx, &aspy); + ED_space_clip_get_aspect(sc, &aspx, &aspy); + + copy_v2_v2(v, vec); + + v[0] = v[0] / aspx; + v[1] = v[1] / aspy; + + BKE_mask_coord_to_movieclip(sc->clip, &sc->user, v, v); + + v[0] = v[0] / aspx; + v[1] = v[1] / aspy; + + ED_clip_point_stable_pos__reverse(sc, t->ar, v, v); + + adr[0] = v[0]; + adr[1] = v[1]; } + else if (t->options & CTX_MOVIECLIP) { + float v[2], aspx, aspy; - v[0] /= aspx; - v[1] /= aspy; + copy_v2_v2(v, vec); + ED_space_clip_get_aspect_dimension_aware(t->sa->spacedata.first, &aspx, &aspy); - UI_view2d_to_region_no_clip(t->view, v[0], v[1], adr, adr + 1); + v[0] /= aspx; + v[1] /= aspy; + + UI_view2d_to_region_no_clip(t->view, v[0], v[1], adr, adr + 1); + } } else if (t->spacetype == SPACE_NODE) { UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], adr, adr + 1); |