[PATCH weston] Apply the zoom transformation before the output transformation

Kristian Høgsberg hoegsberg at gmail.com
Tue May 6 15:37:36 PDT 2014


On Tue, May 06, 2014 at 07:04:15PM +0100, Neil Roberts wrote:
> The zoom translation is just a scale and a translate. The translation
> is calculated based on the coordinates of the pointer which are in
> global space. Previously the calculated translation was transformed by
> the output transformation so that when the zoom transform is applied
> after the output transform then it will be correct. However if we just
> apply the zoom transformation first then we get the same result
> without the zoom code having to be aware of the output transformation.
> 
> This also fixes weston_output_transform_coordinate which was applying
> the output and zoom transforms in the wrong order.
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=78211
> ---
>  src/compositor.c |  4 ++--
>  src/zoom.c       | 47 -----------------------------------------------

I love it:

>  2 files changed, 2 insertions(+), 49 deletions(-)

Best bug fix ever.  Thanks, applied.

Kristian
 
> diff --git a/src/compositor.c b/src/compositor.c
> index 3d65e4c..cd1ca9a 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -3198,8 +3198,6 @@ weston_output_update_matrix(struct weston_output *output)
>  			    2.0 / output->width,
>  			    -2.0 / output->height, 1);
>  
> -	weston_output_compute_transform(output);
> -
>  	if (output->zoom.active) {
>  		magnification = 1 / (1 - output->zoom.spring_z.current);
>  		weston_output_update_zoom(output);
> @@ -3209,6 +3207,8 @@ weston_output_update_matrix(struct weston_output *output)
>  				    magnification, 1.0);
>  	}
>  
> +	weston_output_compute_transform(output);
> +
>  	output->dirty = 0;
>  }
>  
> diff --git a/src/zoom.c b/src/zoom.c
> index 622c0d7..7553849 100644
> --- a/src/zoom.c
> +++ b/src/zoom.c
> @@ -111,50 +111,6 @@ zoom_area_center_from_pointer(struct weston_output *output,
>  }
>  
>  static void
> -weston_zoom_apply_output_transform(struct weston_output *output,
> -						float *x, float *y)
> -{
> -	float tx, ty;
> -
> -	switch(output->transform) {
> -	case WL_OUTPUT_TRANSFORM_NORMAL:
> -	default:
> -		return;
> -	case WL_OUTPUT_TRANSFORM_90:
> -		tx = -*y;
> -		ty = *x;
> -		break;
> -	case WL_OUTPUT_TRANSFORM_180:
> -		tx = -*x;
> -		ty = -*y;
> -		break;
> -	case WL_OUTPUT_TRANSFORM_270:
> -		tx = *y;
> -		ty = -*x;
> -		break;
> -	case WL_OUTPUT_TRANSFORM_FLIPPED:
> -		tx = -*x;
> -		ty = *y;
> -		break;
> -	case WL_OUTPUT_TRANSFORM_FLIPPED_90:
> -		tx = -*y;
> -		ty = -*x;
> -		break;
> -	case WL_OUTPUT_TRANSFORM_FLIPPED_180:
> -		tx = *x;
> -		ty = -*y;
> -		break;
> -	case WL_OUTPUT_TRANSFORM_FLIPPED_270:
> -		tx = *y;
> -		ty = *x;
> -		break;
> -	}
> -
> -	*x = tx;
> -	*y = ty;
> -}
> -
> -static void
>  weston_output_update_zoom_transform(struct weston_output *output)
>  {
>  	float global_x, global_y;
> @@ -183,9 +139,6 @@ weston_output_update_zoom_transform(struct weston_output *output)
>  		((((global_y - output->y) / output->height) *
>  		(level * 2)) - level) * ratio;
>  
> -	weston_zoom_apply_output_transform(output, &output->zoom.trans_x,
> -						   &output->zoom.trans_y);
> -
>  	trans_max = level * 2 - level;
>  	trans_min = -trans_max;
>  
> -- 
> 1.9.0
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list