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