[PATCH] Handle filter widths in xf86Rotate

Keith Packard keithp at keithp.com
Fri Nov 14 14:12:38 PST 2008


---
 hw/xfree86/modes/xf86Crtc.h   |    2 +
 hw/xfree86/modes/xf86Rotate.c |   53 +++++++++++++++++++++++++++--------------
 2 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
index a5bb11b..d093b1a 100644
--- a/hw/xfree86/modes/xf86Crtc.h
+++ b/hw/xfree86/modes/xf86Crtc.h
@@ -309,6 +309,8 @@ struct _xf86Crtc {
     PictFilterPtr   filter;
     xFixed	    *params;
     int		    nparams;
+    int		    filter_width;
+    int		    filter_height;
     Bool	    transform_in_use;
     /**
      * Bounding box in screen space
diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c
index f201ae3..bf6976a 100644
--- a/hw/xfree86/modes/xf86Rotate.c
+++ b/hw/xfree86/modes/xf86Rotate.c
@@ -118,6 +118,10 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region)
 	BoxRec	dst_box;
 
 	dst_box = *b;
+	dst_box.x1 -= crtc->filter_width >> 2;
+	dst_box.x2 += crtc->filter_width >> 2;
+	dst_box.y1 -= crtc->filter_width >> 2;
+	dst_box.y2 += crtc->filter_width >> 2;
 	PictureTransformBounds (&dst_box, &crtc->framebuffer_to_crtc);
 	CompositePicture (PictOpSrc,
 			  src, NULL, dst,
@@ -322,6 +326,11 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
     /* if this is called during ScreenInit() we don't have pScrn->pScreen yet */
     ScreenPtr		pScreen = screenInfo.screens[pScrn->scrnIndex];
     PictTransform	crtc_to_fb, fb_to_crtc;
+    xFixed		*new_params = NULL;
+    int			new_nparams = 0;
+    PictFilterPtr	new_filter = NULL;
+    int			new_width = 0;
+    int			new_height = 0;
     
     PictureTransformInitIdentity (&crtc_to_fb);
     PictureTransformInitIdentity (&fb_to_crtc);
@@ -385,9 +394,6 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
 #ifdef RANDR_12_INTERFACE
     if (crtc->randr_crtc)
     {
-	xFixed		*new_params = NULL;
-	int		new_nparams = 0;
-	PictFilterPtr   new_filter = NULL;
 
 	RRTransformPtr	transform = RRCrtcGetTransform (crtc->randr_crtc);
 	if (transform)
@@ -405,11 +411,6 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
 	    PictureTransformMultiply (&crtc_to_fb, &transform->transform, &crtc_to_fb);
 	    PictureTransformMultiply (&fb_to_crtc, &fb_to_crtc, &transform->inverse);
 	}
-	if (crtc->params)
-	    xfree (crtc->params);
-	crtc->params = new_params;
-	crtc->nparams = new_nparams;
-	crtc->filter = new_filter;
     }
 #endif
     /*
@@ -418,12 +419,19 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
      */
     if (PictureTransformIsIdentity (&crtc_to_fb))
     {
-	crtc->transform_in_use = FALSE;
-	PictureTransformInitTranslate (&crtc->crtc_to_framebuffer, 
+	PictureTransformInitTranslate (&crtc_to_fb,
 				       F (-crtc->x), F (-crtc->y));
-	PictureTransformInitTranslate (&crtc->framebuffer_to_crtc,
+	PictureTransformInitTranslate (&fb_to_crtc,
 				       F ( crtc->x), F ( crtc->y));
 	xf86RotateDestroy (crtc);
+	crtc->transform_in_use = FALSE;
+	if (new_params)
+	    xfree (new_params);
+	new_params = NULL;
+	new_nparams = 0;
+	new_filter = NULL;
+	new_width = 0;
+	new_height = 0;
     }
     else
     {
@@ -494,17 +502,26 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
 								  NULL,
 								  old_width,
 								  old_height);
+	    if (new_params)
+		xfree (new_params);
 	    return FALSE;
 	}
 	crtc->transform_in_use = TRUE;
-	crtc->crtc_to_framebuffer = crtc_to_fb;
-	crtc->framebuffer_to_crtc = fb_to_crtc;
-	crtc->bounds.x1 = 0;
-	crtc->bounds.x2 = crtc->mode.HDisplay;
-	crtc->bounds.y1 = 0;
-	crtc->bounds.y2 = crtc->mode.VDisplay;
-	PictureTransformBounds (&crtc->bounds, &crtc_to_fb);
     }
+    crtc->crtc_to_framebuffer = crtc_to_fb;
+    crtc->framebuffer_to_crtc = fb_to_crtc;
+    if (crtc->params)
+	xfree (crtc->params);
+    crtc->params = new_params;
+    crtc->nparams = new_nparams;
+    crtc->filter = new_filter;
+    crtc->filter_width = new_width;
+    crtc->filter_height = new_height;
+    crtc->bounds.x1 = 0;
+    crtc->bounds.x2 = crtc->mode.HDisplay;
+    crtc->bounds.y1 = 0;
+    crtc->bounds.y2 = crtc->mode.VDisplay;
+    PictureTransformBounds (&crtc->bounds, &crtc_to_fb);
     
     /* All done */
     return TRUE;
-- 
1.5.6.5




More information about the xorg mailing list