216 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright © 2004 Keith Packard
 | |
|  *
 | |
|  * Permission to use, copy, modify, distribute, and sell this software and its
 | |
|  * documentation for any purpose is hereby granted without fee, provided that
 | |
|  * the above copyright notice appear in all copies and that both that
 | |
|  * copyright notice and this permission notice appear in supporting
 | |
|  * documentation, and that the name of Keith Packard not be used in
 | |
|  * advertising or publicity pertaining to distribution of the software without
 | |
|  * specific, written prior permission.  Keith Packard makes no
 | |
|  * representations about the suitability of this software for any purpose.  It
 | |
|  * is provided "as is" without express or implied warranty.
 | |
|  *
 | |
|  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | |
|  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | |
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | |
|  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | |
|  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | |
|  * PERFORMANCE OF THIS SOFTWARE.
 | |
|  */
 | |
| 
 | |
| #ifdef HAVE_DIX_CONFIG_H
 | |
| #include <dix-config.h>
 | |
| #endif
 | |
| 
 | |
| #include "fb.h"
 | |
| 
 | |
| #include "picturestr.h"
 | |
| #include "mipict.h"
 | |
| #include "fbpict.h"
 | |
| #include "damage.h"
 | |
| 
 | |
| void
 | |
| fbAddTraps (PicturePtr	pPicture,
 | |
| 	    INT16	x_off,
 | |
| 	    INT16	y_off,
 | |
| 	    int		ntrap,
 | |
| 	    xTrap	*traps)
 | |
| {
 | |
|     pixman_image_t *image;
 | |
|     int dst_xoff, dst_yoff;
 | |
| 
 | |
|     if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff)))
 | |
| 	return;
 | |
|     
 | |
|     pixman_add_traps (image, x_off + dst_xoff, y_off + dst_yoff,
 | |
| 		      ntrap, (pixman_trap_t *)traps);
 | |
| 
 | |
|     free_pixman_pict (pPicture, image);
 | |
| }
 | |
| 
 | |
| void
 | |
| fbRasterizeTrapezoid (PicturePtr    pPicture,
 | |
| 		      xTrapezoid  *trap,
 | |
| 		      int	    x_off,
 | |
| 		      int	    y_off)
 | |
| {
 | |
|     pixman_image_t *image;
 | |
|     int	dst_xoff, dst_yoff;
 | |
| 
 | |
|     if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff)))
 | |
| 	return;
 | |
| 
 | |
|     pixman_rasterize_trapezoid (image, (pixman_trapezoid_t *)trap,
 | |
| 				x_off + dst_xoff,
 | |
| 				y_off + dst_yoff);
 | |
| 
 | |
|     free_pixman_pict (pPicture, image);
 | |
| }
 | |
| 
 | |
| void
 | |
| fbAddTriangles (PicturePtr  pPicture,
 | |
| 		INT16	    x_off,
 | |
| 		INT16	    y_off,
 | |
| 		int	    ntri,
 | |
| 		xTriangle *tris)
 | |
| {
 | |
|     pixman_image_t *image;
 | |
|     int dst_xoff, dst_yoff;
 | |
| 
 | |
|     if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff)))
 | |
| 	return;
 | |
|     
 | |
|     pixman_add_triangles (image,
 | |
| 			  dst_xoff + x_off, dst_yoff + y_off,
 | |
| 			  ntri, (pixman_triangle_t *)tris);
 | |
| 
 | |
|     free_pixman_pict (pPicture, image);
 | |
| }
 | |
| 
 | |
| typedef void (* CompositeShapesFunc) (pixman_op_t op,
 | |
| 				      pixman_image_t *src,
 | |
| 				      pixman_image_t *dst,
 | |
| 				      pixman_format_code_t mask_format,
 | |
| 				      int x_src, int y_src,
 | |
| 				      int x_dst, int y_dst,
 | |
| 				      int n_shapes, const uint8_t *shapes);
 | |
| 
 | |
| static void
 | |
| fbShapes (CompositeShapesFunc	composite,
 | |
| 	  pixman_op_t		op,
 | |
| 	  PicturePtr		pSrc,
 | |
| 	  PicturePtr		pDst,
 | |
| 	  PictFormatPtr		maskFormat,
 | |
| 	  int16_t		xSrc,
 | |
| 	  int16_t		ySrc,
 | |
| 	  int			nshapes,
 | |
| 	  int			shape_size,
 | |
| 	  const uint8_t *	shapes)
 | |
| {
 | |
|     pixman_image_t *src, *dst;
 | |
|     int src_xoff, src_yoff;
 | |
|     int dst_xoff, dst_yoff;
 | |
| 
 | |
|     miCompositeSourceValidate (pSrc);
 | |
| 
 | |
|     src = image_from_pict (pSrc, FALSE, &src_xoff, &src_yoff);
 | |
|     dst = image_from_pict (pDst, TRUE, &dst_xoff, &dst_yoff);
 | |
| 
 | |
|     if (src && dst)
 | |
|     {
 | |
| 	pixman_format_code_t format;
 | |
| 
 | |
| 	DamageRegionAppend (pDst->pDrawable, pDst->pCompositeClip);
 | |
| 
 | |
| 	if (!maskFormat)
 | |
| 	{
 | |
| 	    int i;
 | |
| 
 | |
| 	    if (pDst->polyEdge == PolyEdgeSharp)
 | |
| 		format = PIXMAN_a1;
 | |
| 	    else
 | |
| 		format = PIXMAN_a8;
 | |
| 
 | |
| 	    for (i = 0; i < nshapes; ++i)
 | |
| 	    {
 | |
| 		composite (op, src, dst, format,
 | |
| 			   xSrc + src_xoff,
 | |
| 			   ySrc + src_yoff,
 | |
| 			   dst_xoff,
 | |
| 			   dst_yoff,
 | |
| 			   1, shapes + i * shape_size);
 | |
| 	    }
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 	    switch (PICT_FORMAT_A (maskFormat->format))
 | |
| 	    {
 | |
| 	    case 1:
 | |
| 		format = PIXMAN_a1;
 | |
| 		break;
 | |
| 
 | |
| 	    case 4:
 | |
| 		format = PIXMAN_a4;
 | |
| 		break;
 | |
| 
 | |
| 	    default:
 | |
| 	    case 8:
 | |
| 		format = PIXMAN_a8;
 | |
| 		break;
 | |
| 	    }
 | |
| 	    
 | |
| 	    composite (op, src, dst, format,
 | |
| 		       xSrc + src_xoff,
 | |
| 		       ySrc + src_yoff,
 | |
| 		       dst_xoff,
 | |
| 		       dst_yoff,
 | |
| 		       nshapes, shapes);
 | |
| 	}
 | |
| 
 | |
| 	DamageRegionProcessPending (pDst->pDrawable);
 | |
|     }
 | |
| 
 | |
|     free_pixman_pict (pSrc, src);
 | |
|     free_pixman_pict (pDst, dst);
 | |
| }
 | |
| 
 | |
| void
 | |
| fbTrapezoids (CARD8	    op,
 | |
| 	      PicturePtr    pSrc,
 | |
| 	      PicturePtr    pDst,
 | |
| 	      PictFormatPtr maskFormat,
 | |
| 	      INT16	    xSrc,
 | |
| 	      INT16	    ySrc,
 | |
| 	      int	    ntrap,
 | |
| 	      xTrapezoid    *traps)
 | |
| {
 | |
|     xSrc -= (traps[0].left.p1.x >> 16);
 | |
|     ySrc -= (traps[0].left.p1.y >> 16);
 | |
|     
 | |
|     fbShapes ((CompositeShapesFunc)pixman_composite_trapezoids,
 | |
| 	      op, pSrc, pDst, maskFormat,
 | |
| 	      xSrc, ySrc,
 | |
| 	      ntrap, sizeof (xTrapezoid), (const uint8_t *)traps);
 | |
| }
 | |
| 
 | |
| void
 | |
| fbTriangles (CARD8	    op,
 | |
| 	     PicturePtr    pSrc,
 | |
| 	     PicturePtr    pDst,
 | |
| 	     PictFormatPtr maskFormat,
 | |
| 	     INT16	    xSrc,
 | |
| 	     INT16	    ySrc,
 | |
| 	     int	    ntris,
 | |
| 	     xTriangle    *tris)
 | |
| { 
 | |
|     xSrc -= (tris[0].p1.x >> 16);
 | |
|     ySrc -= (tris[0].p1.y >> 16);
 | |
|     
 | |
|     fbShapes ((CompositeShapesFunc)pixman_composite_triangles,
 | |
| 	      op, pSrc, pDst, maskFormat,
 | |
| 	      xSrc, ySrc,
 | |
| 	      ntris, sizeof (xTriangle), (const uint8_t *)tris);
 | |
| }
 |