[PATCH weston 2/8] pixman-renderer: put transformation computation into function
Derek Foreman
derekf at osg.samsung.com
Fri Mar 6 11:31:28 PST 2015
On 06/03/15 05:03 AM, Pekka Paalanen wrote:
> From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
>
> Move the long piece of code computing the end-to-end transformation from
> repaint_region() into a new function
> pixman_renderer_compute_transform().
>
> The code itself it not modified.
>
Nice refactor, but the transform patch series posted a while ago
contains a patch:
http://patchwork.freedesktop.org/patch/35170/
that reduces the bits moved into pixman_renderer_compute_transform to
about 10 lines.
Do you need those bits in a separate function somewhere or is this just
a cosmetic refactor?
> Because the number of moved lines is so big, git-diff will show the
> changes in the context instead of the moved lines.
>
> Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> ---
> src/pixman-renderer.c | 94 +++++++++++++++++++++++++++++----------------------
> 1 file changed, 53 insertions(+), 41 deletions(-)
>
> diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c
> index 09e8c0e..2769168 100644
> --- a/src/pixman-renderer.c
> +++ b/src/pixman-renderer.c
> @@ -169,51 +169,13 @@ transform_apply_viewport(pixman_transform_t *transform,
> }
>
> static void
> -repaint_region(struct weston_view *ev, struct weston_output *output,
> - pixman_region32_t *region, pixman_region32_t *surf_region,
> - pixman_op_t pixman_op)
> +pixman_renderer_compute_transform(pixman_transform_t *transform_out,
> + struct weston_view *ev,
> + struct weston_output *output)
> {
> - struct pixman_renderer *pr =
> - (struct pixman_renderer *) output->compositor->renderer;
> - struct pixman_surface_state *ps = get_surface_state(ev->surface);
> - struct pixman_output_state *po = get_output_state(output);
> struct weston_buffer_viewport *vp = &ev->surface->buffer_viewport;
> - pixman_region32_t final_region;
> - float view_x, view_y;
> pixman_transform_t transform;
> pixman_fixed_t fw, fh;
> - pixman_image_t *mask_image;
> - pixman_color_t mask = { 0, };
> -
> - /* The final region to be painted is the intersection of
> - * 'region' and 'surf_region'. However, 'region' is in the global
> - * coordinates, and 'surf_region' is in the surface-local
> - * coordinates
> - */
> - pixman_region32_init(&final_region);
> - if (surf_region) {
> - pixman_region32_copy(&final_region, surf_region);
> -
> - /* Convert from surface to global coordinates */
> - if (!ev->transform.enabled) {
> - pixman_region32_translate(&final_region, ev->geometry.x, ev->geometry.y);
> - } else {
> - weston_view_to_global_float(ev, 0, 0, &view_x, &view_y);
> - pixman_region32_translate(&final_region, (int)view_x, (int)view_y);
> - }
> -
> - /* We need to paint the intersection */
> - pixman_region32_intersect(&final_region, &final_region, region);
> - } else {
> - /* If there is no surface region, just use the global region */
> - pixman_region32_copy(&final_region, region);
> - }
> -
> - /* Convert from global to output coord */
> - region_global_to_output(output, &final_region);
> -
> - /* And clip to it */
> - pixman_image_set_clip_region32 (po->shadow_image, &final_region);
>
> /* Set up the source transformation based on the surface
> position, the output position/transform/scale and the client
> @@ -333,6 +295,56 @@ repaint_region(struct weston_view *ev, struct weston_output *output,
> pixman_double_to_fixed(vp->buffer.scale),
> pixman_double_to_fixed(vp->buffer.scale));
>
> + *transform_out = transform;
> +}
> +
> +static void
> +repaint_region(struct weston_view *ev, struct weston_output *output,
> + pixman_region32_t *region, pixman_region32_t *surf_region,
> + pixman_op_t pixman_op)
> +{
> + struct pixman_renderer *pr =
> + (struct pixman_renderer *) output->compositor->renderer;
> + struct pixman_surface_state *ps = get_surface_state(ev->surface);
> + struct pixman_output_state *po = get_output_state(output);
> + struct weston_buffer_viewport *vp = &ev->surface->buffer_viewport;
> + pixman_region32_t final_region;
> + float view_x, view_y;
> + pixman_transform_t transform;
> + pixman_image_t *mask_image;
> + pixman_color_t mask = { 0, };
> +
> + /* The final region to be painted is the intersection of
> + * 'region' and 'surf_region'. However, 'region' is in the global
> + * coordinates, and 'surf_region' is in the surface-local
> + * coordinates
> + */
> + pixman_region32_init(&final_region);
> + if (surf_region) {
> + pixman_region32_copy(&final_region, surf_region);
> +
> + /* Convert from surface to global coordinates */
> + if (!ev->transform.enabled) {
> + pixman_region32_translate(&final_region, ev->geometry.x, ev->geometry.y);
> + } else {
> + weston_view_to_global_float(ev, 0, 0, &view_x, &view_y);
> + pixman_region32_translate(&final_region, (int)view_x, (int)view_y);
> + }
> +
> + /* We need to paint the intersection */
> + pixman_region32_intersect(&final_region, &final_region, region);
> + } else {
> + /* If there is no surface region, just use the global region */
> + pixman_region32_copy(&final_region, region);
> + }
> +
> + /* Convert from global to output coord */
> + region_global_to_output(output, &final_region);
> +
> + /* And clip to it */
> + pixman_image_set_clip_region32 (po->shadow_image, &final_region);
> +
> + pixman_renderer_compute_transform(&transform, ev, output);
> pixman_image_set_transform(ps->image, &transform);
>
> if (ev->transform.enabled || output->current_scale != vp->buffer.scale)
>
More information about the wayland-devel
mailing list