mirror of OpenBSD xenocara tree
github.com/openbsd/xenocara
openbsd
1/*
2 *
3 * Copyright © 2002 Keith Packard
4 *
5 * Permission to use, copy, modify, distribute, and sell this software and its
6 * documentation for any purpose is hereby granted without fee, provided that
7 * the above copyright notice appear in all copies and that both that
8 * copyright notice and this permission notice appear in supporting
9 * documentation, and that the name of Keith Packard not be used in
10 * advertising or publicity pertaining to distribution of the software without
11 * specific, written prior permission. Keith Packard makes no
12 * representations about the suitability of this software for any purpose. It
13 * is provided "as is" without express or implied warranty.
14 *
15 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
19 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
21 * PERFORMANCE OF THIS SOFTWARE.
22 */
23
24#ifdef HAVE_CONFIG_H
25#include <config.h>
26#endif
27#include "Xrenderint.h"
28
29void
30XRenderCompositeTriangles (Display *dpy,
31 int op,
32 Picture src,
33 Picture dst,
34 _Xconst XRenderPictFormat *maskFormat,
35 int xSrc,
36 int ySrc,
37 _Xconst XTriangle *triangles,
38 int ntriangle)
39{
40 XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy);
41
42 RenderSimpleCheckExtension (dpy, info);
43 LockDisplay(dpy);
44 while (ntriangle)
45 {
46 xRenderTrianglesReq *req;
47 int n;
48 long len;
49
50 GetReq(RenderTriangles, req);
51 req->reqType = (CARD8) info->codes->major_opcode;
52 req->renderReqType = X_RenderTriangles;
53 req->op = (CARD8) op;
54 req->src = (CARD32) src;
55 req->dst = (CARD32) dst;
56 req->maskFormat = (CARD32) (maskFormat ? maskFormat->id : 0);
57 req->xSrc = (INT16) xSrc;
58 req->ySrc = (INT16) ySrc;
59 n = ntriangle;
60 len = ((long) n) * (SIZEOF (xTriangle) >> 2);
61 if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
62 n = (int) ((dpy->max_request_size - req->length) / (SIZEOF (xTriangle) >> 2));
63 len = ((long)n) * (SIZEOF (xTriangle) >> 2);
64 }
65 SetReqLen (req, len, len);
66 len <<= 2;
67 DataInt32 (dpy, (_Xconst int *) triangles, len);
68 ntriangle -= n;
69 triangles += n;
70 }
71 UnlockDisplay(dpy);
72 SyncHandle();
73}
74
75void
76XRenderCompositeTriStrip (Display *dpy,
77 int op,
78 Picture src,
79 Picture dst,
80 _Xconst XRenderPictFormat *maskFormat,
81 int xSrc,
82 int ySrc,
83 _Xconst XPointFixed *points,
84 int npoint)
85{
86 XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy);
87
88 RenderSimpleCheckExtension (dpy, info);
89 LockDisplay(dpy);
90 while (npoint > 2)
91 {
92 xRenderTriStripReq *req;
93 int n;
94 long len;
95
96 GetReq(RenderTriStrip, req);
97 req->reqType = (CARD8) info->codes->major_opcode;
98 req->renderReqType = X_RenderTriStrip;
99 req->op = (CARD8) op;
100 req->src = (CARD32) src;
101 req->dst = (CARD32) dst;
102 req->maskFormat = (CARD32) (maskFormat ? maskFormat->id : 0);
103 req->xSrc = (INT16) xSrc;
104 req->ySrc = (INT16) ySrc;
105 n = npoint;
106 len = ((long) n) * (SIZEOF (xPointFixed) >> 2);
107 if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
108 n = (int) ((dpy->max_request_size - req->length) / (SIZEOF (xPointFixed) >> 2));
109 len = ((long)n) * (SIZEOF (xPointFixed) >> 2);
110 }
111 SetReqLen (req, len, len);
112 len <<= 2;
113 DataInt32 (dpy, (_Xconst int *) points, len);
114 npoint -= (n - 2);
115 points += (n - 2);
116 }
117 UnlockDisplay(dpy);
118 SyncHandle();
119}
120
121void
122XRenderCompositeTriFan (Display *dpy,
123 int op,
124 Picture src,
125 Picture dst,
126 _Xconst XRenderPictFormat *maskFormat,
127 int xSrc,
128 int ySrc,
129 _Xconst XPointFixed *points,
130 int npoint)
131{
132 XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy);
133 _Xconst XPointFixed *first = points;
134
135 RenderSimpleCheckExtension (dpy, info);
136 LockDisplay(dpy);
137 points++;
138 npoint--;
139 while (npoint > 1)
140 {
141 xRenderTriFanReq *req;
142 xPointFixed *p;
143 int n;
144 long len;
145
146 GetReqExtra(RenderTriFan, SIZEOF (xPointFixed), req);
147 req->reqType = (CARD8) info->codes->major_opcode;
148 req->renderReqType = X_RenderTriFan;
149 req->op = (CARD8) op;
150 req->src = (CARD32) src;
151 req->dst = (CARD32) dst;
152 req->maskFormat = (CARD32) (maskFormat ? maskFormat->id : 0);
153 req->xSrc = (INT16) xSrc;
154 req->ySrc = (INT16) ySrc;
155 p = (xPointFixed *) (req + 1);
156 p->x = first->x;
157 p->y = first->y;
158 n = npoint;
159 len = ((long) n) * (SIZEOF (xPointFixed) >> 2);
160 if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
161 n = (int) ((dpy->max_request_size - req->length) / (SIZEOF (xPointFixed) >> 2));
162 len = ((long)n) * (SIZEOF (xPointFixed) >> 2);
163 }
164 SetReqLen (req, len, len);
165 len <<= 2;
166 DataInt32 (dpy, (_Xconst int *) points, len);
167 npoint -= (n - 1);
168 points += (n - 1);
169 }
170 UnlockDisplay(dpy);
171 SyncHandle();
172}