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