Tri.c revision 1f0ac6a5
11f0ac6a5Smrg/*
21f0ac6a5Smrg *
31f0ac6a5Smrg * Copyright © 2002 Keith Packard
41f0ac6a5Smrg *
51f0ac6a5Smrg * Permission to use, copy, modify, distribute, and sell this software and its
61f0ac6a5Smrg * documentation for any purpose is hereby granted without fee, provided that
71f0ac6a5Smrg * the above copyright notice appear in all copies and that both that
81f0ac6a5Smrg * copyright notice and this permission notice appear in supporting
91f0ac6a5Smrg * documentation, and that the name of Keith Packard not be used in
101f0ac6a5Smrg * advertising or publicity pertaining to distribution of the software without
111f0ac6a5Smrg * specific, written prior permission.  Keith Packard makes no
121f0ac6a5Smrg * representations about the suitability of this software for any purpose.  It
131f0ac6a5Smrg * is provided "as is" without express or implied warranty.
141f0ac6a5Smrg *
151f0ac6a5Smrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
161f0ac6a5Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
171f0ac6a5Smrg * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
181f0ac6a5Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
191f0ac6a5Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
201f0ac6a5Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
211f0ac6a5Smrg * PERFORMANCE OF THIS SOFTWARE.
221f0ac6a5Smrg */
231f0ac6a5Smrg
241f0ac6a5Smrg#ifdef HAVE_CONFIG_H
251f0ac6a5Smrg#include <config.h>
261f0ac6a5Smrg#endif
271f0ac6a5Smrg#include "Xrenderint.h"
281f0ac6a5Smrg
291f0ac6a5Smrgvoid
301f0ac6a5SmrgXRenderCompositeTriangles (Display		*dpy,
311f0ac6a5Smrg			   int			op,
321f0ac6a5Smrg			   Picture		src,
331f0ac6a5Smrg			   Picture		dst,
341f0ac6a5Smrg			    _Xconst XRenderPictFormat	*maskFormat,
351f0ac6a5Smrg			   int			xSrc,
361f0ac6a5Smrg			   int			ySrc,
371f0ac6a5Smrg			   _Xconst XTriangle	*triangles,
381f0ac6a5Smrg			   int			ntriangle)
391f0ac6a5Smrg{
401f0ac6a5Smrg    XRenderExtDisplayInfo         *info = XRenderFindDisplay (dpy);
411f0ac6a5Smrg    xRenderTrianglesReq	    *req;
421f0ac6a5Smrg    int			    n;
431f0ac6a5Smrg    long    		    len;
441f0ac6a5Smrg
451f0ac6a5Smrg    RenderSimpleCheckExtension (dpy, info);
461f0ac6a5Smrg    LockDisplay(dpy);
471f0ac6a5Smrg    while (ntriangle)
481f0ac6a5Smrg    {
491f0ac6a5Smrg	GetReq(RenderTriangles, req);
501f0ac6a5Smrg	req->reqType = info->codes->major_opcode;
511f0ac6a5Smrg	req->renderReqType = X_RenderTriangles;
521f0ac6a5Smrg	req->op = (CARD8) op;
531f0ac6a5Smrg	req->src = src;
541f0ac6a5Smrg	req->dst = dst;
551f0ac6a5Smrg	req->maskFormat = maskFormat ? maskFormat->id : 0;
561f0ac6a5Smrg	req->xSrc = xSrc;
571f0ac6a5Smrg	req->ySrc = ySrc;
581f0ac6a5Smrg	n = ntriangle;
591f0ac6a5Smrg	len = ((long) n) * (SIZEOF (xTriangle) >> 2);
601f0ac6a5Smrg	if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
611f0ac6a5Smrg	    n = (dpy->max_request_size - req->length) / (SIZEOF (xTriangle) >> 2);
621f0ac6a5Smrg	    len = ((long)n) * (SIZEOF (xTriangle) >> 2);
631f0ac6a5Smrg	}
641f0ac6a5Smrg	SetReqLen (req, len, len);
651f0ac6a5Smrg	len <<= 2;
661f0ac6a5Smrg	DataInt32 (dpy, (int *) triangles, len);
671f0ac6a5Smrg	ntriangle -= n;
681f0ac6a5Smrg	triangles += n;
691f0ac6a5Smrg    }
701f0ac6a5Smrg    UnlockDisplay(dpy);
711f0ac6a5Smrg    SyncHandle();
721f0ac6a5Smrg}
731f0ac6a5Smrg
741f0ac6a5Smrgvoid
751f0ac6a5SmrgXRenderCompositeTriStrip (Display		*dpy,
761f0ac6a5Smrg			  int			op,
771f0ac6a5Smrg			  Picture		src,
781f0ac6a5Smrg			  Picture		dst,
791f0ac6a5Smrg			  _Xconst XRenderPictFormat	*maskFormat,
801f0ac6a5Smrg			  int			xSrc,
811f0ac6a5Smrg			  int			ySrc,
821f0ac6a5Smrg			  _Xconst XPointFixed	*points,
831f0ac6a5Smrg			  int			npoint)
841f0ac6a5Smrg{
851f0ac6a5Smrg    XRenderExtDisplayInfo         *info = XRenderFindDisplay (dpy);
861f0ac6a5Smrg    xRenderTriStripReq	    *req;
871f0ac6a5Smrg    int			    n;
881f0ac6a5Smrg    long    		    len;
891f0ac6a5Smrg
901f0ac6a5Smrg    RenderSimpleCheckExtension (dpy, info);
911f0ac6a5Smrg    LockDisplay(dpy);
921f0ac6a5Smrg    while (npoint > 2)
931f0ac6a5Smrg    {
941f0ac6a5Smrg	GetReq(RenderTriStrip, req);
951f0ac6a5Smrg	req->reqType = info->codes->major_opcode;
961f0ac6a5Smrg	req->renderReqType = X_RenderTriStrip;
971f0ac6a5Smrg	req->op = (CARD8) op;
981f0ac6a5Smrg	req->src = src;
991f0ac6a5Smrg	req->dst = dst;
1001f0ac6a5Smrg	req->maskFormat = maskFormat ? maskFormat->id : 0;
1011f0ac6a5Smrg	req->xSrc = xSrc;
1021f0ac6a5Smrg	req->ySrc = ySrc;
1031f0ac6a5Smrg	n = npoint;
1041f0ac6a5Smrg	len = ((long) n) * (SIZEOF (xPointFixed) >> 2);
1051f0ac6a5Smrg	if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
1061f0ac6a5Smrg	    n = (dpy->max_request_size - req->length) / (SIZEOF (xPointFixed) >> 2);
1071f0ac6a5Smrg	    len = ((long)n) * (SIZEOF (xPointFixed) >> 2);
1081f0ac6a5Smrg	}
1091f0ac6a5Smrg	SetReqLen (req, len, len);
1101f0ac6a5Smrg	len <<= 2;
1111f0ac6a5Smrg	DataInt32 (dpy, (int *) points, len);
1121f0ac6a5Smrg	npoint -= (n - 2);
1131f0ac6a5Smrg	points += (n - 2);
1141f0ac6a5Smrg    }
1151f0ac6a5Smrg    UnlockDisplay(dpy);
1161f0ac6a5Smrg    SyncHandle();
1171f0ac6a5Smrg}
1181f0ac6a5Smrg
1191f0ac6a5Smrgvoid
1201f0ac6a5SmrgXRenderCompositeTriFan (Display			*dpy,
1211f0ac6a5Smrg			int			op,
1221f0ac6a5Smrg			Picture			src,
1231f0ac6a5Smrg			Picture			dst,
1241f0ac6a5Smrg			_Xconst XRenderPictFormat	*maskFormat,
1251f0ac6a5Smrg			int			xSrc,
1261f0ac6a5Smrg			int			ySrc,
1271f0ac6a5Smrg			_Xconst XPointFixed	*points,
1281f0ac6a5Smrg			int			npoint)
1291f0ac6a5Smrg{
1301f0ac6a5Smrg    XRenderExtDisplayInfo         *info = XRenderFindDisplay (dpy);
1311f0ac6a5Smrg    _Xconst XPointFixed	    *first = points;
1321f0ac6a5Smrg    xPointFixed		    *p;
1331f0ac6a5Smrg    xRenderTriFanReq	    *req;
1341f0ac6a5Smrg    int			    n;
1351f0ac6a5Smrg    long    		    len;
1361f0ac6a5Smrg
1371f0ac6a5Smrg    RenderSimpleCheckExtension (dpy, info);
1381f0ac6a5Smrg    LockDisplay(dpy);
1391f0ac6a5Smrg    points++;
1401f0ac6a5Smrg    npoint--;
1411f0ac6a5Smrg    while (npoint > 1)
1421f0ac6a5Smrg    {
1431f0ac6a5Smrg	GetReqExtra(RenderTriFan, SIZEOF (xPointFixed), req);
1441f0ac6a5Smrg	req->reqType = info->codes->major_opcode;
1451f0ac6a5Smrg	req->renderReqType = X_RenderTriFan;
1461f0ac6a5Smrg	req->op = (CARD8) op;
1471f0ac6a5Smrg	req->src = src;
1481f0ac6a5Smrg	req->dst = dst;
1491f0ac6a5Smrg	req->maskFormat = maskFormat ? maskFormat->id : 0;
1501f0ac6a5Smrg	req->xSrc = xSrc;
1511f0ac6a5Smrg	req->ySrc = ySrc;
1521f0ac6a5Smrg	p = (xPointFixed *) (req + 1);
1531f0ac6a5Smrg	p->x = first->x;
1541f0ac6a5Smrg	p->y = first->y;
1551f0ac6a5Smrg	n = npoint;
1561f0ac6a5Smrg	len = ((long) n) * (SIZEOF (xPointFixed) >> 2);
1571f0ac6a5Smrg	if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
1581f0ac6a5Smrg	    n = (dpy->max_request_size - req->length) / (SIZEOF (xPointFixed) >> 2);
1591f0ac6a5Smrg	    len = ((long)n) * (SIZEOF (xPointFixed) >> 2);
1601f0ac6a5Smrg	}
1611f0ac6a5Smrg	SetReqLen (req, len, len);
1621f0ac6a5Smrg	len <<= 2;
1631f0ac6a5Smrg	DataInt32 (dpy, (int *) points, len);
1641f0ac6a5Smrg	npoint -= (n - 1);
1651f0ac6a5Smrg	points += (n - 1);
1661f0ac6a5Smrg    }
1671f0ac6a5Smrg    UnlockDisplay(dpy);
1681f0ac6a5Smrg    SyncHandle();
1691f0ac6a5Smrg}
170