105b261ecSmrg/* 205b261ecSmrg * Copyright © 2004 Keith Packard 305b261ecSmrg * 405b261ecSmrg * Permission to use, copy, modify, distribute, and sell this software and its 505b261ecSmrg * documentation for any purpose is hereby granted without fee, provided that 605b261ecSmrg * the above copyright notice appear in all copies and that both that 705b261ecSmrg * copyright notice and this permission notice appear in supporting 805b261ecSmrg * documentation, and that the name of Keith Packard not be used in 905b261ecSmrg * advertising or publicity pertaining to distribution of the software without 1005b261ecSmrg * specific, written prior permission. Keith Packard makes no 1105b261ecSmrg * representations about the suitability of this software for any purpose. It 1205b261ecSmrg * is provided "as is" without express or implied warranty. 1305b261ecSmrg * 1405b261ecSmrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1505b261ecSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 1605b261ecSmrg * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 1705b261ecSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 1805b261ecSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 1905b261ecSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2005b261ecSmrg * PERFORMANCE OF THIS SOFTWARE. 2105b261ecSmrg */ 2205b261ecSmrg 2305b261ecSmrg#ifdef HAVE_DIX_CONFIG_H 2405b261ecSmrg#include <dix-config.h> 2505b261ecSmrg#endif 2605b261ecSmrg 2705b261ecSmrg#include "fb.h" 2805b261ecSmrg 2905b261ecSmrg#include "picturestr.h" 3005b261ecSmrg#include "mipict.h" 3105b261ecSmrg#include "fbpict.h" 3235c4bbdfSmrg#include "damage.h" 3305b261ecSmrg 3405b261ecSmrgvoid 3535c4bbdfSmrgfbAddTraps(PicturePtr pPicture, 3635c4bbdfSmrg INT16 x_off, INT16 y_off, int ntrap, xTrap * traps) 3705b261ecSmrg{ 3835c4bbdfSmrg pixman_image_t *image; 3935c4bbdfSmrg int dst_xoff, dst_yoff; 4005b261ecSmrg 4135c4bbdfSmrg if (!(image = image_from_pict(pPicture, FALSE, &dst_xoff, &dst_yoff))) 4235c4bbdfSmrg return; 4305b261ecSmrg 4435c4bbdfSmrg pixman_add_traps(image, x_off + dst_xoff, y_off + dst_yoff, 4535c4bbdfSmrg ntrap, (pixman_trap_t *) traps); 4635c4bbdfSmrg 4735c4bbdfSmrg free_pixman_pict(pPicture, image); 4805b261ecSmrg} 4905b261ecSmrg 5005b261ecSmrgvoid 5135c4bbdfSmrgfbRasterizeTrapezoid(PicturePtr pPicture, 5235c4bbdfSmrg xTrapezoid * trap, int x_off, int y_off) 5305b261ecSmrg{ 5435c4bbdfSmrg pixman_image_t *image; 5535c4bbdfSmrg int dst_xoff, dst_yoff; 5605b261ecSmrg 5735c4bbdfSmrg if (!(image = image_from_pict(pPicture, FALSE, &dst_xoff, &dst_yoff))) 5835c4bbdfSmrg return; 5905b261ecSmrg 6035c4bbdfSmrg pixman_rasterize_trapezoid(image, (pixman_trapezoid_t *) trap, 6135c4bbdfSmrg x_off + dst_xoff, y_off + dst_yoff); 6205b261ecSmrg 6335c4bbdfSmrg free_pixman_pict(pPicture, image); 6405b261ecSmrg} 6505b261ecSmrg 6635c4bbdfSmrgvoid 6735c4bbdfSmrgfbAddTriangles(PicturePtr pPicture, 6835c4bbdfSmrg INT16 x_off, INT16 y_off, int ntri, xTriangle * tris) 6905b261ecSmrg{ 7035c4bbdfSmrg pixman_image_t *image; 7135c4bbdfSmrg int dst_xoff, dst_yoff; 7235c4bbdfSmrg 7335c4bbdfSmrg if (!(image = image_from_pict(pPicture, FALSE, &dst_xoff, &dst_yoff))) 7435c4bbdfSmrg return; 7535c4bbdfSmrg 7635c4bbdfSmrg pixman_add_triangles(image, 7735c4bbdfSmrg dst_xoff + x_off, dst_yoff + y_off, 7835c4bbdfSmrg ntri, (pixman_triangle_t *) tris); 7935c4bbdfSmrg 8035c4bbdfSmrg free_pixman_pict(pPicture, image); 8105b261ecSmrg} 8205b261ecSmrg 8335c4bbdfSmrgtypedef void (*CompositeShapesFunc) (pixman_op_t op, 8435c4bbdfSmrg pixman_image_t * src, 8535c4bbdfSmrg pixman_image_t * dst, 8635c4bbdfSmrg pixman_format_code_t mask_format, 8735c4bbdfSmrg int x_src, int y_src, 8835c4bbdfSmrg int x_dst, int y_dst, 8935c4bbdfSmrg int n_shapes, const uint8_t * shapes); 9035c4bbdfSmrg 9135c4bbdfSmrgstatic void 9235c4bbdfSmrgfbShapes(CompositeShapesFunc composite, 9335c4bbdfSmrg pixman_op_t op, 9435c4bbdfSmrg PicturePtr pSrc, 9535c4bbdfSmrg PicturePtr pDst, 9635c4bbdfSmrg PictFormatPtr maskFormat, 9735c4bbdfSmrg int16_t xSrc, 9835c4bbdfSmrg int16_t ySrc, int nshapes, int shape_size, const uint8_t * shapes) 9905b261ecSmrg{ 10035c4bbdfSmrg pixman_image_t *src, *dst; 10135c4bbdfSmrg int src_xoff, src_yoff; 10235c4bbdfSmrg int dst_xoff, dst_yoff; 10335c4bbdfSmrg 10435c4bbdfSmrg miCompositeSourceValidate(pSrc); 10535c4bbdfSmrg 10635c4bbdfSmrg src = image_from_pict(pSrc, FALSE, &src_xoff, &src_yoff); 10735c4bbdfSmrg dst = image_from_pict(pDst, TRUE, &dst_xoff, &dst_yoff); 10835c4bbdfSmrg 10935c4bbdfSmrg if (src && dst) { 11035c4bbdfSmrg pixman_format_code_t format; 11135c4bbdfSmrg 11235c4bbdfSmrg DamageRegionAppend(pDst->pDrawable, pDst->pCompositeClip); 11335c4bbdfSmrg 11435c4bbdfSmrg if (!maskFormat) { 11535c4bbdfSmrg int i; 11635c4bbdfSmrg 11735c4bbdfSmrg if (pDst->polyEdge == PolyEdgeSharp) 11835c4bbdfSmrg format = PIXMAN_a1; 11935c4bbdfSmrg else 12035c4bbdfSmrg format = PIXMAN_a8; 12135c4bbdfSmrg 12235c4bbdfSmrg for (i = 0; i < nshapes; ++i) { 12335c4bbdfSmrg composite(op, src, dst, format, 12435c4bbdfSmrg xSrc + src_xoff, 12535c4bbdfSmrg ySrc + src_yoff, 12635c4bbdfSmrg dst_xoff, dst_yoff, 1, shapes + i * shape_size); 12735c4bbdfSmrg } 12835c4bbdfSmrg } 12935c4bbdfSmrg else { 13035c4bbdfSmrg switch (PICT_FORMAT_A(maskFormat->format)) { 13135c4bbdfSmrg case 1: 13235c4bbdfSmrg format = PIXMAN_a1; 13335c4bbdfSmrg break; 13435c4bbdfSmrg 13535c4bbdfSmrg case 4: 13635c4bbdfSmrg format = PIXMAN_a4; 13735c4bbdfSmrg break; 13835c4bbdfSmrg 13935c4bbdfSmrg default: 14035c4bbdfSmrg case 8: 14135c4bbdfSmrg format = PIXMAN_a8; 14235c4bbdfSmrg break; 14335c4bbdfSmrg } 14435c4bbdfSmrg 14535c4bbdfSmrg composite(op, src, dst, format, 14635c4bbdfSmrg xSrc + src_xoff, 14735c4bbdfSmrg ySrc + src_yoff, dst_xoff, dst_yoff, nshapes, shapes); 14835c4bbdfSmrg } 14935c4bbdfSmrg 15035c4bbdfSmrg DamageRegionProcessPending(pDst->pDrawable); 15135c4bbdfSmrg } 15205b261ecSmrg 15335c4bbdfSmrg free_pixman_pict(pSrc, src); 15435c4bbdfSmrg free_pixman_pict(pDst, dst); 15505b261ecSmrg} 15605b261ecSmrg 15705b261ecSmrgvoid 15835c4bbdfSmrgfbTrapezoids(CARD8 op, 15935c4bbdfSmrg PicturePtr pSrc, 16035c4bbdfSmrg PicturePtr pDst, 16135c4bbdfSmrg PictFormatPtr maskFormat, 16235c4bbdfSmrg INT16 xSrc, INT16 ySrc, int ntrap, xTrapezoid * traps) 16305b261ecSmrg{ 16435c4bbdfSmrg xSrc -= (traps[0].left.p1.x >> 16); 16535c4bbdfSmrg ySrc -= (traps[0].left.p1.y >> 16); 16635c4bbdfSmrg 16735c4bbdfSmrg fbShapes((CompositeShapesFunc) pixman_composite_trapezoids, 16835c4bbdfSmrg op, pSrc, pDst, maskFormat, 16935c4bbdfSmrg xSrc, ySrc, ntrap, sizeof(xTrapezoid), (const uint8_t *) traps); 17005b261ecSmrg} 17105b261ecSmrg 17235c4bbdfSmrgvoid 17335c4bbdfSmrgfbTriangles(CARD8 op, 17435c4bbdfSmrg PicturePtr pSrc, 17535c4bbdfSmrg PicturePtr pDst, 17635c4bbdfSmrg PictFormatPtr maskFormat, 17735c4bbdfSmrg INT16 xSrc, INT16 ySrc, int ntris, xTriangle * tris) 17835c4bbdfSmrg{ 17935c4bbdfSmrg xSrc -= (tris[0].p1.x >> 16); 18035c4bbdfSmrg ySrc -= (tris[0].p1.y >> 16); 18135c4bbdfSmrg 18235c4bbdfSmrg fbShapes((CompositeShapesFunc) pixman_composite_triangles, 18335c4bbdfSmrg op, pSrc, pDst, maskFormat, 18435c4bbdfSmrg xSrc, ySrc, ntris, sizeof(xTriangle), (const uint8_t *) tris); 18535c4bbdfSmrg} 186