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{
40d21ab8bcSmrg    XRenderExtDisplayInfo	*info = XRenderFindDisplay (dpy);
411f0ac6a5Smrg
421f0ac6a5Smrg    RenderSimpleCheckExtension (dpy, info);
431f0ac6a5Smrg    LockDisplay(dpy);
441f0ac6a5Smrg    while (ntriangle)
451f0ac6a5Smrg    {
46d21ab8bcSmrg	xRenderTrianglesReq	*req;
47d21ab8bcSmrg	int			n;
48d21ab8bcSmrg	long			len;
49d21ab8bcSmrg
501f0ac6a5Smrg	GetReq(RenderTriangles, req);
51d21ab8bcSmrg	req->reqType = (CARD8) info->codes->major_opcode;
521f0ac6a5Smrg	req->renderReqType = X_RenderTriangles;
531f0ac6a5Smrg	req->op = (CARD8) op;
54d21ab8bcSmrg	req->src = (CARD32) src;
55d21ab8bcSmrg	req->dst = (CARD32) dst;
56d21ab8bcSmrg	req->maskFormat = (CARD32) (maskFormat ? maskFormat->id : 0);
57d21ab8bcSmrg	req->xSrc = (INT16) xSrc;
58d21ab8bcSmrg	req->ySrc = (INT16) ySrc;
591f0ac6a5Smrg	n = ntriangle;
601f0ac6a5Smrg	len = ((long) n) * (SIZEOF (xTriangle) >> 2);
611f0ac6a5Smrg	if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
62d21ab8bcSmrg	    n = (int) ((dpy->max_request_size - req->length) / (SIZEOF (xTriangle) >> 2));
631f0ac6a5Smrg	    len = ((long)n) * (SIZEOF (xTriangle) >> 2);
641f0ac6a5Smrg	}
651f0ac6a5Smrg	SetReqLen (req, len, len);
661f0ac6a5Smrg	len <<= 2;
67d21ab8bcSmrg	DataInt32 (dpy, (_Xconst int *) triangles, len);
681f0ac6a5Smrg	ntriangle -= n;
691f0ac6a5Smrg	triangles += n;
701f0ac6a5Smrg    }
711f0ac6a5Smrg    UnlockDisplay(dpy);
721f0ac6a5Smrg    SyncHandle();
731f0ac6a5Smrg}
741f0ac6a5Smrg
751f0ac6a5Smrgvoid
761f0ac6a5SmrgXRenderCompositeTriStrip (Display		*dpy,
771f0ac6a5Smrg			  int			op,
781f0ac6a5Smrg			  Picture		src,
791f0ac6a5Smrg			  Picture		dst,
801f0ac6a5Smrg			  _Xconst XRenderPictFormat	*maskFormat,
811f0ac6a5Smrg			  int			xSrc,
821f0ac6a5Smrg			  int			ySrc,
831f0ac6a5Smrg			  _Xconst XPointFixed	*points,
841f0ac6a5Smrg			  int			npoint)
851f0ac6a5Smrg{
86d21ab8bcSmrg    XRenderExtDisplayInfo	*info = XRenderFindDisplay (dpy);
871f0ac6a5Smrg
881f0ac6a5Smrg    RenderSimpleCheckExtension (dpy, info);
891f0ac6a5Smrg    LockDisplay(dpy);
901f0ac6a5Smrg    while (npoint > 2)
911f0ac6a5Smrg    {
92d21ab8bcSmrg	xRenderTriStripReq	*req;
93d21ab8bcSmrg	int			n;
94d21ab8bcSmrg	long			len;
95d21ab8bcSmrg
961f0ac6a5Smrg	GetReq(RenderTriStrip, req);
97d21ab8bcSmrg	req->reqType = (CARD8) info->codes->major_opcode;
981f0ac6a5Smrg	req->renderReqType = X_RenderTriStrip;
991f0ac6a5Smrg	req->op = (CARD8) op;
100d21ab8bcSmrg	req->src = (CARD32) src;
101d21ab8bcSmrg	req->dst = (CARD32) dst;
102d21ab8bcSmrg	req->maskFormat = (CARD32) (maskFormat ? maskFormat->id : 0);
103d21ab8bcSmrg	req->xSrc = (INT16) xSrc;
104d21ab8bcSmrg	req->ySrc = (INT16) ySrc;
1051f0ac6a5Smrg	n = npoint;
1061f0ac6a5Smrg	len = ((long) n) * (SIZEOF (xPointFixed) >> 2);
1071f0ac6a5Smrg	if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
108d21ab8bcSmrg	    n = (int) ((dpy->max_request_size - req->length) / (SIZEOF (xPointFixed) >> 2));
1091f0ac6a5Smrg	    len = ((long)n) * (SIZEOF (xPointFixed) >> 2);
1101f0ac6a5Smrg	}
1111f0ac6a5Smrg	SetReqLen (req, len, len);
1121f0ac6a5Smrg	len <<= 2;
113d21ab8bcSmrg	DataInt32 (dpy, (_Xconst int *) points, len);
1141f0ac6a5Smrg	npoint -= (n - 2);
1151f0ac6a5Smrg	points += (n - 2);
1161f0ac6a5Smrg    }
1171f0ac6a5Smrg    UnlockDisplay(dpy);
1181f0ac6a5Smrg    SyncHandle();
1191f0ac6a5Smrg}
1201f0ac6a5Smrg
1211f0ac6a5Smrgvoid
1221f0ac6a5SmrgXRenderCompositeTriFan (Display			*dpy,
1231f0ac6a5Smrg			int			op,
1241f0ac6a5Smrg			Picture			src,
1251f0ac6a5Smrg			Picture			dst,
1261f0ac6a5Smrg			_Xconst XRenderPictFormat	*maskFormat,
1271f0ac6a5Smrg			int			xSrc,
1281f0ac6a5Smrg			int			ySrc,
1291f0ac6a5Smrg			_Xconst XPointFixed	*points,
1301f0ac6a5Smrg			int			npoint)
1311f0ac6a5Smrg{
132d21ab8bcSmrg    XRenderExtDisplayInfo   *info = XRenderFindDisplay (dpy);
1331f0ac6a5Smrg    _Xconst XPointFixed	    *first = points;
1341f0ac6a5Smrg
1351f0ac6a5Smrg    RenderSimpleCheckExtension (dpy, info);
1361f0ac6a5Smrg    LockDisplay(dpy);
1371f0ac6a5Smrg    points++;
1381f0ac6a5Smrg    npoint--;
1391f0ac6a5Smrg    while (npoint > 1)
1401f0ac6a5Smrg    {
141d21ab8bcSmrg	xRenderTriFanReq	*req;
142d21ab8bcSmrg	xPointFixed		*p;
143d21ab8bcSmrg	int			n;
144d21ab8bcSmrg	long			len;
145d21ab8bcSmrg
1461f0ac6a5Smrg	GetReqExtra(RenderTriFan, SIZEOF (xPointFixed), req);
147d21ab8bcSmrg	req->reqType = (CARD8) info->codes->major_opcode;
1481f0ac6a5Smrg	req->renderReqType = X_RenderTriFan;
1491f0ac6a5Smrg	req->op = (CARD8) op;
150d21ab8bcSmrg	req->src = (CARD32) src;
151d21ab8bcSmrg	req->dst = (CARD32) dst;
152d21ab8bcSmrg	req->maskFormat = (CARD32) (maskFormat ? maskFormat->id : 0);
153d21ab8bcSmrg	req->xSrc = (INT16) xSrc;
154d21ab8bcSmrg	req->ySrc = (INT16) ySrc;
1551f0ac6a5Smrg	p = (xPointFixed *) (req + 1);
1561f0ac6a5Smrg	p->x = first->x;
1571f0ac6a5Smrg	p->y = first->y;
1581f0ac6a5Smrg	n = npoint;
1591f0ac6a5Smrg	len = ((long) n) * (SIZEOF (xPointFixed) >> 2);
1601f0ac6a5Smrg	if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
161d21ab8bcSmrg	    n = (int) ((dpy->max_request_size - req->length) / (SIZEOF (xPointFixed) >> 2));
1621f0ac6a5Smrg	    len = ((long)n) * (SIZEOF (xPointFixed) >> 2);
1631f0ac6a5Smrg	}
1641f0ac6a5Smrg	SetReqLen (req, len, len);
1651f0ac6a5Smrg	len <<= 2;
166d21ab8bcSmrg	DataInt32 (dpy, (_Xconst int *) points, len);
1671f0ac6a5Smrg	npoint -= (n - 1);
1681f0ac6a5Smrg	points += (n - 1);
1691f0ac6a5Smrg    }
1701f0ac6a5Smrg    UnlockDisplay(dpy);
1711f0ac6a5Smrg    SyncHandle();
1721f0ac6a5Smrg}
173