rpms/pixman/devel new-clip-rules.patch, NONE, 1.1 pixman.spec, 1.28, 1.29

Soren Sandmann Pedersen ssp at fedoraproject.org
Tue May 12 04:14:24 UTC 2009


Author: ssp

Update of /cvs/pkgs/rpms/pixman/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv31764

Modified Files:
	pixman.spec 
Added Files:
	new-clip-rules.patch 
Log Message:
Add patch to test new clip rules

new-clip-rules.patch:

--- NEW FILE new-clip-rules.patch ---
commit f7724a23170413f4d33e635e4b156a3bc07067c7
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date:   Mon May 11 00:36:17 2009 -0400

    Simplify clipping rule.
    
    The new rule is:
    
    - Output is clipped to the destination clip region.
    
    - If a source image has the clip_sources property set, then there
      is an additional step, after repeating and transforming, but before
      compositing, where pixels that are not in the source clip are
      rejected. Rejected means no compositing takes place (not that the
      pixel is treated as 0). By default no source clipping is taking
      place.
    
    The old rules were unclear and inconsistently implemented.

diff --git a/pixman/pixman-compute-region.c b/pixman/pixman-compute-region.c
index a93cee0..077bb7d 100644
--- a/pixman/pixman-compute-region.c
+++ b/pixman/pixman-compute-region.c
@@ -79,43 +79,12 @@ miClipPictureSrc (pixman_region32_t *	pRegion,
 		  int		dx,
 		  int		dy)
 {
-    /* XXX what to do with clipping from transformed pictures? */
-    if (pPicture->common.transform || pPicture->type != BITS)
+    if (!pPicture->common.clip_sources)
 	return TRUE;
 
-    if (pPicture->common.repeat)
-    {
-	/* If the clip region was set by a client, then it should be intersected
-	 * with the composite region since it's interpreted as happening
-	 * after the repeat algorithm.
-	 *
-	 * If the clip region was not set by a client, then it was imposed by
-	 * boundaries of the pixmap, or by sibling or child windows, which means
-	 * it should in theory be repeated along. FIXME: we ignore that case.
-	 * It is only relevant for windows that are (a) clipped by siblings/children
-	 * and (b) used as source. However this case is not useful anyway due
-	 * to lack of GraphicsExpose events.
-	 */
-	if (pPicture->common.has_client_clip)
-	{
-	    pixman_region32_translate ( pRegion, dx, dy);
-	    
-	    if (!pixman_region32_intersect (pRegion, pRegion, 
-					    pPicture->common.src_clip))
-		return FALSE;
-	    
-	    pixman_region32_translate ( pRegion, -dx, -dy);
-	}
-	    
-	return TRUE;
-    }
-    else
-    {
-	return miClipPictureReg (pRegion,
-				 pPicture->common.src_clip,
-				 dx,
-				 dy);
-    }
+    return miClipPictureReg (pRegion,
+			     &pPicture->common.clip_region,
+			     dx, dy);
 }
 
 /*
@@ -154,12 +123,16 @@ pixman_compute_composite_region32 (pixman_region32_t *	pRegion,
 	return FALSE;
     }
     /* clip against dst */
-    if (!miClipPictureReg (pRegion, &pDst->common.clip_region, 0, 0))
+    if (pDst->common.have_clip_region)
     {
-	pixman_region32_fini (pRegion);
-	return FALSE;
+	if (!miClipPictureReg (pRegion, &pDst->common.clip_region, 0, 0))
+	{
+	    pixman_region32_fini (pRegion);
+	    return FALSE;
+	}
     }
-    if (pDst->common.alpha_map)
+    
+    if (pDst->common.alpha_map && pDst->common.alpha_map->common.have_clip_region)
     {
 	if (!miClipPictureReg (pRegion, &pDst->common.alpha_map->common.clip_region,
 			       -pDst->common.alpha_origin.x,
@@ -170,12 +143,15 @@ pixman_compute_composite_region32 (pixman_region32_t *	pRegion,
 	}
     }
     /* clip against src */
-    if (!miClipPictureSrc (pRegion, pSrc, xDst - xSrc, yDst - ySrc))
+    if (pSrc->common.have_clip_region)
     {
-	pixman_region32_fini (pRegion);
-	return FALSE;
+	if (!miClipPictureSrc (pRegion, pSrc, xDst - xSrc, yDst - ySrc))
+	{
+	    pixman_region32_fini (pRegion);
+	    return FALSE;
+	}
     }
-    if (pSrc->common.alpha_map)
+    if (pSrc->common.alpha_map && pSrc->common.alpha_map->common.have_clip_region)
     {
 	if (!miClipPictureSrc (pRegion, (pixman_image_t *)pSrc->common.alpha_map,
 			       xDst - (xSrc + pSrc->common.alpha_origin.x),
@@ -186,14 +162,14 @@ pixman_compute_composite_region32 (pixman_region32_t *	pRegion,
 	}
     }
     /* clip against mask */
-    if (pMask)
+    if (pMask && pMask->common.have_clip_region)
     {
 	if (!miClipPictureSrc (pRegion, pMask, xDst - xMask, yDst - yMask))
 	{
 	    pixman_region32_fini (pRegion);
 	    return FALSE;
 	}	
-	if (pMask->common.alpha_map)
+	if (pMask->common.alpha_map && pMask->common.alpha_map->common.have_clip_region)
 	{
 	    if (!miClipPictureSrc (pRegion, (pixman_image_t *)pMask->common.alpha_map,
 				   xDst - (xMask + pMask->common.alpha_origin.x),
diff --git a/pixman/pixman-image.c b/pixman/pixman-image.c
index bd52f25..5ae55dd 100644
--- a/pixman/pixman-image.c
+++ b/pixman/pixman-image.c
@@ -81,10 +81,8 @@ allocate_image (void)
     {
 	image_common_t *common = &image->common;
 
-	pixman_region32_init (&common->full_region);
 	pixman_region32_init (&common->clip_region);
-	common->src_clip = &common->full_region;
-	common->has_client_clip = FALSE;
+	common->clip_sources = FALSE;
 	common->transform = NULL;
 	common->repeat = PIXMAN_REPEAT_NONE;
 	common->filter = PIXMAN_FILTER_NEAREST;
@@ -120,7 +118,6 @@ pixman_image_unref (pixman_image_t *image)
     if (common->ref_count == 0)
     {
 	pixman_region32_fini (&common->clip_region);
-	pixman_region32_fini (&common->full_region);
 
 	if (common->transform)
 	    free (common->transform);
@@ -323,17 +320,7 @@ create_bits (pixman_format_code_t format,
 static void
 reset_clip_region (pixman_image_t *image)
 {
-    pixman_region32_fini (&image->common.clip_region);
-
-    if (image->type == BITS)
-    {
-	pixman_region32_init_rect (&image->common.clip_region, 0, 0,
-				   image->bits.width, image->bits.height);
-    }
-    else
-    {
-	pixman_region32_init (&image->common.clip_region);
-    }
+    image->common.have_clip_region = FALSE;
 }
 
 PIXMAN_EXPORT pixman_image_t *
@@ -374,14 +361,10 @@ pixman_image_create_bits (pixman_format_code_t  format,
     image->bits.free_me = free_me;
 
     image->bits.rowstride = rowstride_bytes / (int) sizeof (uint32_t); /* we store it in number
-								  * of uint32_t's
-								  */
+									* of uint32_t's
+									*/
     image->bits.indexed = NULL;
 
-    pixman_region32_fini (&image->common.full_region);
-    pixman_region32_init_rect (&image->common.full_region, 0, 0,
-			       image->bits.width, image->bits.height);
-
     reset_clip_region (image);
     return image;
 }
@@ -394,6 +377,8 @@ pixman_image_set_clip_region32 (pixman_image_t *image,
 
     if (region)
     {
+	image->common.have_clip_region = TRUE;
+	
 	return pixman_region32_copy (&common->clip_region, region);
     }
     else
@@ -429,7 +414,7 @@ PIXMAN_EXPORT void
 pixman_image_set_has_client_clip (pixman_image_t *image,
 				  pixman_bool_t	  client_clip)
 {
-    image->common.has_client_clip = client_clip;
+    /* This function is obsolete - it had to do with source and hierarchy clipping */
 }
 
 PIXMAN_EXPORT pixman_bool_t
@@ -506,16 +491,14 @@ pixman_image_set_filter (pixman_image_t       *image,
     return TRUE;
 }
 
+/* Whether there is an extra step in the pipeline where clips are applied
+ * to source images. Don't use it unless you are X.
+ */
 PIXMAN_EXPORT void
 pixman_image_set_source_clipping (pixman_image_t  *image,
-				  pixman_bool_t    source_clipping)
+				  pixman_bool_t    clip_sources)
 {
-    image_common_t *common = &image->common;
-
-    if (source_clipping)
-	common->src_clip = &common->clip_region;
-    else
-	common->src_clip = &common->full_region;
+    image->common.clip_sources = clip_sources;
 }
 
 /* Unlike all the other property setters, this function does not
@@ -712,11 +695,14 @@ pixman_image_fill_rectangles (pixman_op_t		    op,
 		pixman_box32_t *boxes;
 
 		pixman_region32_init_rect (&fill_region, rects[i].x, rects[i].y, rects[i].width, rects[i].height);
-		if (!pixman_region32_intersect (&fill_region,
-						&fill_region,
-						&dest->common.clip_region))
-		    return FALSE;
 
+		if (dest->common.have_clip_region)
+		{
+		    if (!pixman_region32_intersect (&fill_region,
+						    &fill_region,
+						    &dest->common.clip_region))
+			return FALSE;
+		}
 
 		boxes = pixman_region32_rectangles (&fill_region, &n_boxes);
 		for (j = 0; j < n_boxes; ++j)
diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c
index 548d38d..4f6ef91 100644
--- a/pixman/pixman-pict.c
+++ b/pixman/pixman-pict.c
@@ -1989,7 +1989,6 @@ pixman_image_composite (pixman_op_t      op,
         && (pSrc->common.filter == PIXMAN_FILTER_NEAREST)
         && PIXMAN_FORMAT_BPP(pDst->bits.format) == 32
         && pSrc->bits.format == pDst->bits.format
-        && pSrc->common.src_clip == &(pSrc->common.full_region)
         && !pSrc->common.read_func && !pSrc->common.write_func
         && !pDst->common.read_func && !pDst->common.write_func)
     {
diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h
index debd723..ee0bb0b 100644
--- a/pixman/pixman-private.h
+++ b/pixman/pixman-private.h
@@ -292,10 +292,9 @@ struct image_common
 {
     image_type_t		type;
     int32_t			ref_count;
-    pixman_region32_t		full_region;
-    pixman_region32_t		clip_region;
-    pixman_region32_t	       *src_clip;
-    pixman_bool_t               has_client_clip;
+    pixman_region32_t	        clip_region;
+    pixman_bool_t               have_clip_region;      /* if FALSE, there is no clip */
+    pixman_bool_t		clip_sources;	/* Whether clips apply to source images */
     pixman_transform_t	       *transform;
     pixman_repeat_t		repeat;
     pixman_filter_t		filter;
diff --git a/pixman/pixman-transformed.c b/pixman/pixman-transformed.c
index 6d695c5..ba45cc6 100644
--- a/pixman/pixman-transformed.c
+++ b/pixman/pixman-transformed.c
@@ -61,17 +61,9 @@ typedef FASTCALL uint32_t (*fetchFromRegionProc)(bits_image_t *pict, int x, int
  */
 static force_inline uint32_t
 do_fetch (bits_image_t *pict, int x, int y, fetchPixelProc32 fetch,
-	  pixman_bool_t src_clip,
 	  pixman_bool_t inside_bounds)
 {
-    if (src_clip)
-    {
-	if (pixman_region32_contains_point (pict->common.src_clip, x, y,NULL))
-	    return fetch (pict, x, y);
-	else
-	    return 0;
-    }
-    else if (inside_bounds)
+    if (inside_bounds)
     {
 	return fetch (pict, x, y);
     }
@@ -92,7 +84,6 @@ fetch_nearest (bits_image_t		*pict,
 	       fetchPixelProc32		 fetch,
 	       pixman_bool_t		 affine,
 	       pixman_repeat_t		 repeat,
-	       pixman_bool_t             has_src_clip,
 	       const pixman_vector_t    *v)
 {
     if (!v->vector[2])
@@ -147,7 +138,7 @@ fetch_nearest (bits_image_t		*pict,
 	    return 0;
 	}
 
-	return do_fetch (pict, x, y, fetch, has_src_clip, inside_bounds);
+	return do_fetch (pict, x, y, fetch, inside_bounds);
     }
 }
 
@@ -156,7 +147,6 @@ fetch_bilinear (bits_image_t		*pict,
 		fetchPixelProc32	 fetch,
 		pixman_bool_t		 affine,
 		pixman_repeat_t		 repeat,
-		pixman_bool_t		 has_src_clip,
 		const pixman_vector_t   *v)
 {
     if (!v->vector[2])
@@ -235,10 +225,10 @@ fetch_bilinear (bits_image_t		*pict,
 	    return 0;
 	}
 	
-	tl = do_fetch(pict, x1, y1, fetch, has_src_clip, inside_bounds);
-	tr = do_fetch(pict, x2, y1, fetch, has_src_clip, inside_bounds);
-	bl = do_fetch(pict, x1, y2, fetch, has_src_clip, inside_bounds);
-	br = do_fetch(pict, x2, y2, fetch, has_src_clip, inside_bounds);
+	tl = do_fetch(pict, x1, y1, fetch, inside_bounds);
+	tr = do_fetch(pict, x2, y1, fetch, inside_bounds);
+	bl = do_fetch(pict, x1, y2, fetch, inside_bounds);
+	br = do_fetch(pict, x2, y2, fetch, inside_bounds);
 	
 	ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx;
 	fb = FbGet8(bl,0) * idistx + FbGet8(br,0) * distx;
@@ -317,6 +307,8 @@ fbFetchTransformed_Convolution(bits_image_t * pict, int width, uint32_t *buffer,
                     for (x = x1; x < x2; x++) {
                         if (*p) {
                             int tx;
+			    uint32_t c;
+			    
                             switch (pict->common.repeat) {
                                 case PIXMAN_REPEAT_NORMAL:
                                     tx = MOD (x, pict->width);
@@ -332,14 +324,13 @@ fbFetchTransformed_Convolution(bits_image_t * pict, int width, uint32_t *buffer,
                                 default:
                                     tx = x;
                             }
-                            if (pixman_region32_contains_point (pict->common.src_clip, tx, ty, NULL)) {
-                                uint32_t c = fetch(pict, tx, ty);
-
-                                srtot += Red(c) * *p;
-                                sgtot += Green(c) * *p;
-                                sbtot += Blue(c) * *p;
-                                satot += Alpha(c) * *p;
-                            }
+			    
+			    c = fetch(pict, tx, ty);
+			    
+			    srtot += Red(c) * *p;
+			    sgtot += Green(c) * *p;
+			    sbtot += Blue(c) * *p;
+			    satot += Alpha(c) * *p;
                         }
                         p++;
                     }
@@ -419,7 +410,6 @@ ACCESS(fbFetchTransformed)(bits_image_t * pict, int x, int y, int width,
     if (pict->common.filter == PIXMAN_FILTER_NEAREST || pict->common.filter == PIXMAN_FILTER_FAST)
     {
 	fetchPixelProc32   fetch;
-	pixman_bool_t src_clip;
 	int i;
 
 	/* Round down to closest integer, ensuring that 0.5 rounds to 0, not 1 */
@@ -427,12 +417,10 @@ ACCESS(fbFetchTransformed)(bits_image_t * pict, int x, int y, int width,
 
 	fetch = ACCESS(pixman_fetchPixelProcForPicture32)(pict);
 	
-	src_clip = pict->common.src_clip != &(pict->common.full_region);
-	
 	for ( i = 0; i < width; ++i)
 	{
 	    if (!mask || mask[i] & maskBits)
-		*(buffer + i) = fetch_nearest (pict, fetch, affine, pict->common.repeat, src_clip, &v);
+		*(buffer + i) = fetch_nearest (pict, fetch, affine, pict->common.repeat, &v);
 	    
 	    v.vector[0] += unit.vector[0];
 	    v.vector[1] += unit.vector[1];
@@ -443,7 +431,6 @@ ACCESS(fbFetchTransformed)(bits_image_t * pict, int x, int y, int width,
 	       pict->common.filter == PIXMAN_FILTER_GOOD	||
 	       pict->common.filter == PIXMAN_FILTER_BEST)
     {
-	pixman_bool_t src_clip;
 	fetchPixelProc32   fetch;
 	int i;
 
@@ -451,12 +438,11 @@ ACCESS(fbFetchTransformed)(bits_image_t * pict, int x, int y, int width,
 	adjust (&v, &unit, -(pixman_fixed_1 / 2));
 
 	fetch = ACCESS(pixman_fetchPixelProcForPicture32)(pict);
-	src_clip = pict->common.src_clip != &(pict->common.full_region);
 	
 	for (i = 0; i < width; ++i)
 	{
 	    if (!mask || mask[i] & maskBits)
-		*(buffer + i) = fetch_bilinear (pict, fetch, affine, pict->common.repeat, src_clip, &v);
+		*(buffer + i) = fetch_bilinear (pict, fetch, affine, pict->common.repeat, &v);
 	    
 	    v.vector[0] += unit.vector[0];
 	    v.vector[1] += unit.vector[1];


Index: pixman.spec
===================================================================
RCS file: /cvs/pkgs/rpms/pixman/devel/pixman.spec,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -p -r1.28 -r1.29
--- pixman.spec	16 Apr 2009 14:12:37 -0000	1.28
+++ pixman.spec	12 May 2009 04:13:54 -0000	1.29
@@ -3,7 +3,7 @@
 
 Name:           pixman
 Version:        0.15.2
-Release:        1%{?dist}
+Release:        2%{?dist}
 Summary:        Pixel manipulation library
 
 Group:          System Environment/Libraries
@@ -15,6 +15,7 @@ URL:            http://xorg.freedesktop.
 Source0:        http://www.cairographics.org/releases/pixman-%{version}.tar.gz
 Source1:	make-pixman-snapshot.sh
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Patch0:		new-clip-rules.patch
 
 # BuildRequires:  automake autoconf libtool pkgconfig
 
@@ -32,6 +33,7 @@ Development library for pixman.
 
 %prep
 %setup -q
+%patch0 -p1 -b .new-clip-rules
 
 %build
 %configure --disable-static
@@ -61,6 +63,9 @@ rm -rf $RPM_BUILD_ROOT
 %{_libdir}/pkgconfig/pixman-1.pc
 
 %changelog
+* Tue May 12 2009 Soren Sandmann <ssp at redhat.com> 0.15.2-2
+- Add patch to implement new clipping rules.
+
 * Thu Apr 16 2009 Soren Sandmann <ssp at redhat.com> 0.15.2-1
 - pixman 0.15.2
 




More information about the scm-commits mailing list