Commit 2020af2d authored by Ville Syrjälä's avatar Ville Syrjälä
Browse files

drm/rect: Keep the clipped dst rectangle in place



Now that we've constrained the clipped source rectangle such
that it can't have negative dimensions doing the same for the
dst rectangle seems appropriate. Should at least result in
the clipped src and dst rectangles being a bit more consistent
with each other.

Cc: Benjamin Gaignard <benjamin.gaignard@st.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191122175623.13565-4-ville.syrjala@linux.intel.com


Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: default avatarBenjamin Gaignard <benjamin.gaignard@st.com>
parent 2e351705
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ bool drm_rect_intersect(struct drm_rect *r1, const struct drm_rect *r2)
}
EXPORT_SYMBOL(drm_rect_intersect);

static u32 clip_scaled(u32 src, u32 dst, u32 clip)
static u32 clip_scaled(int src, int dst, int *clip)
{
	u64 tmp;

@@ -60,9 +60,9 @@ static u32 clip_scaled(u32 src, u32 dst, u32 clip)
		return 0;

	/* Only clip what we have. Keeps the result bounded. */
	clip = min(clip, dst);
	*clip = min(*clip, dst);

	tmp = mul_u32_u32(src, dst - clip);
	tmp = mul_u32_u32(src, dst - *clip);

	/*
	 * Round toward 1.0 when clipping so that we don't accidentally
@@ -95,34 +95,34 @@ bool drm_rect_clip_scaled(struct drm_rect *src, struct drm_rect *dst,
	diff = clip->x1 - dst->x1;
	if (diff > 0) {
		u32 new_src_w = clip_scaled(drm_rect_width(src),
					    drm_rect_width(dst), diff);
					    drm_rect_width(dst), &diff);

		src->x1 = src->x2 - new_src_w;
		dst->x1 = clip->x1;
		dst->x1 += diff;
	}
	diff = clip->y1 - dst->y1;
	if (diff > 0) {
		u32 new_src_h = clip_scaled(drm_rect_height(src),
					    drm_rect_height(dst), diff);
					    drm_rect_height(dst), &diff);

		src->y1 = src->y2 - new_src_h;
		dst->y1 = clip->y1;
		dst->y1 += diff;
	}
	diff = dst->x2 - clip->x2;
	if (diff > 0) {
		u32 new_src_w = clip_scaled(drm_rect_width(src),
					    drm_rect_width(dst), diff);
					    drm_rect_width(dst), &diff);

		src->x2 = src->x1 + new_src_w;
		dst->x2 = clip->x2;
		dst->x2 -= diff;
	}
	diff = dst->y2 - clip->y2;
	if (diff > 0) {
		u32 new_src_h = clip_scaled(drm_rect_height(src),
					    drm_rect_height(dst), diff);
					    drm_rect_height(dst), &diff);

		src->y2 = src->y1 + new_src_h;
		dst->y2 = clip->y2;
		dst->y2 -= diff;
	}

	return drm_rect_visible(dst);