Picture.c revision d21ab8bc
1/*
2 *
3 * Copyright © 2000 SuSE, Inc.
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 SuSE not be used in advertising or
10 * publicity pertaining to distribution of the software without specific,
11 * written prior permission.  SuSE makes no representations about the
12 * suitability of this software for any purpose.  It is provided "as is"
13 * without express or implied warranty.
14 *
15 * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
17 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
19 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
20 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 *
22 * Author:  Keith Packard, SuSE, Inc.
23 */
24
25#ifdef HAVE_CONFIG_H
26#include <config.h>
27#endif
28#include "Xrenderint.h"
29#include <X11/Xregion.h>
30
31static void
32_XRenderProcessPictureAttributes (Display		    *dpy,
33				  xRenderChangePictureReq   *req,
34				  unsigned long		    valuemask,
35				  _Xconst XRenderPictureAttributes  *attributes)
36{
37    unsigned long values[32];
38    register unsigned long *value = values;
39    unsigned int nvalues;
40
41    if (valuemask & CPRepeat)
42	*value++ = (unsigned long) attributes->repeat;
43    if (valuemask & CPAlphaMap)
44	*value++ = attributes->alpha_map;
45    if (valuemask & CPAlphaXOrigin)
46	*value++ = (unsigned long) attributes->alpha_x_origin;
47    if (valuemask & CPAlphaYOrigin)
48	*value++ = (unsigned long) attributes->alpha_y_origin;
49    if (valuemask & CPClipXOrigin)
50	*value++ = (unsigned long) attributes->clip_x_origin;
51    if (valuemask & CPClipYOrigin)
52	*value++ = (unsigned long) attributes->clip_y_origin;
53    if (valuemask & CPClipMask)
54	*value++ = attributes->clip_mask;
55    if (valuemask & CPGraphicsExposure)
56	*value++ = (unsigned long) attributes->graphics_exposures;
57    if (valuemask & CPSubwindowMode)
58	*value++ = (unsigned long) attributes->subwindow_mode;
59    if (valuemask & CPPolyEdge)
60	*value++ = (unsigned long) attributes->poly_edge;
61    if (valuemask & CPPolyMode)
62	*value++ = (unsigned long) attributes->poly_mode;
63    if (valuemask & CPDither)
64	*value++ = attributes->dither;
65    if (valuemask & CPComponentAlpha)
66	*value++ = (unsigned long) attributes->component_alpha;
67
68    req->length += (nvalues = (unsigned) (value - values));
69
70    nvalues <<= 2;			    /* watch out for macros... */
71    Data32 (dpy, (long *) values, (long)nvalues);
72}
73
74Picture
75XRenderCreatePicture (Display			*dpy,
76		      Drawable			drawable,
77		      _Xconst XRenderPictFormat		*format,
78		      unsigned long		valuemask,
79		      _Xconst XRenderPictureAttributes	*attributes)
80{
81    XRenderExtDisplayInfo   *info = XRenderFindDisplay (dpy);
82    Picture		    pid;
83    xRenderCreatePictureReq *req;
84
85    RenderCheckExtension (dpy, info, 0);
86    LockDisplay(dpy);
87    GetReq(RenderCreatePicture, req);
88    req->reqType = (CARD8) info->codes->major_opcode;
89    req->renderReqType = X_RenderCreatePicture;
90    req->pid = (CARD32) (pid = XAllocID(dpy));
91    req->drawable = (CARD32) drawable;
92    req->format = (CARD32) format->id;
93    if ((req->mask = (CARD32) valuemask))
94	_XRenderProcessPictureAttributes (dpy,
95					  (xRenderChangePictureReq *) req,
96					  valuemask,
97					  attributes);
98    UnlockDisplay(dpy);
99    SyncHandle();
100    return pid;
101}
102
103void
104XRenderChangePicture (Display                   *dpy,
105		      Picture			picture,
106		      unsigned long             valuemask,
107		      _Xconst XRenderPictureAttributes  *attributes)
108{
109    XRenderExtDisplayInfo    *info = XRenderFindDisplay (dpy);
110    xRenderChangePictureReq  *req;
111
112    RenderSimpleCheckExtension (dpy, info);
113    LockDisplay(dpy);
114    GetReq(RenderChangePicture, req);
115    req->reqType = (CARD8) info->codes->major_opcode;
116    req->renderReqType = X_RenderChangePicture;
117    req->picture = (CARD32) picture;
118    req->mask = (CARD32) valuemask;
119    _XRenderProcessPictureAttributes (dpy,
120				      req,
121				      valuemask,
122				      attributes);
123    UnlockDisplay(dpy);
124    SyncHandle();
125}
126
127static void
128_XRenderSetPictureClipRectangles (Display	    *dpy,
129				  XRenderExtDisplayInfo   *info,
130				  Picture	    picture,
131				  int		    xOrigin,
132				  int		    yOrigin,
133				  _Xconst XRectangle	    *rects,
134				  int		    n)
135{
136    xRenderSetPictureClipRectanglesReq	*req;
137    long				len;
138
139    GetReq (RenderSetPictureClipRectangles, req);
140    req->reqType = (CARD8) info->codes->major_opcode;
141    req->renderReqType = X_RenderSetPictureClipRectangles;
142    req->picture = (CARD32) picture;
143    req->xOrigin = (INT16) xOrigin;
144    req->yOrigin = (INT16) yOrigin;
145    len = ((long) n) << 1;
146    SetReqLen (req, len, 1);
147    len <<= 2;
148    Data16 (dpy, (_Xconst short *) rects, len);
149}
150
151void
152XRenderSetPictureClipRectangles (Display	*dpy,
153				 Picture	picture,
154				 int		xOrigin,
155				 int		yOrigin,
156				 _Xconst XRectangle	*rects,
157				 int		n)
158{
159    XRenderExtDisplayInfo	    *info = XRenderFindDisplay (dpy);
160
161    RenderSimpleCheckExtension (dpy, info);
162    LockDisplay(dpy);
163    _XRenderSetPictureClipRectangles (dpy, info, picture,
164				      xOrigin, yOrigin, rects, n);
165    UnlockDisplay (dpy);
166    SyncHandle ();
167}
168
169void
170XRenderSetPictureClipRegion (Display	    *dpy,
171			     Picture	    picture,
172			     Region	    r)
173{
174    XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy);
175    XRectangle	    *xr;
176    unsigned long   total;
177
178    RenderSimpleCheckExtension (dpy, info);
179    LockDisplay(dpy);
180    total = (unsigned long) ((size_t) r->numRects * sizeof (XRectangle));
181    if ((xr = (XRectangle *) _XAllocTemp(dpy, total))) {
182	int		i;
183	XRectangle	*pr;
184	BOX		*pb;
185
186	for (pr = xr, pb = r->rects, i = (int) r->numRects; --i >= 0; pr++, pb++) {
187	    pr->x = pb->x1;
188	    pr->y = pb->y1;
189	    pr->width = (unsigned short) (pb->x2 - pb->x1);
190	    pr->height = (unsigned short) (pb->y2 - pb->y1);
191	}
192    }
193    if (xr || !r->numRects)
194	_XRenderSetPictureClipRectangles (dpy, info, picture, 0, 0,
195					  xr, (int) r->numRects);
196    if (xr)
197	_XFreeTemp(dpy, (char *)xr, total);
198    UnlockDisplay(dpy);
199    SyncHandle();
200}
201
202void
203XRenderSetPictureTransform (Display	*dpy,
204			    Picture	picture,
205			    XTransform	*transform)
206{
207    XRenderExtDisplayInfo	    *info = XRenderFindDisplay (dpy);
208    xRenderSetPictureTransformReq   *req;
209
210    RenderSimpleCheckExtension (dpy, info);
211    LockDisplay (dpy);
212    GetReq(RenderSetPictureTransform, req);
213    req->reqType = (CARD8) info->codes->major_opcode;
214    req->renderReqType = X_RenderSetPictureTransform;
215    req->picture = (CARD32) picture;
216    req->transform.matrix11 = transform->matrix[0][0];
217    req->transform.matrix12 = transform->matrix[0][1];
218    req->transform.matrix13 = transform->matrix[0][2];
219    req->transform.matrix21 = transform->matrix[1][0];
220    req->transform.matrix22 = transform->matrix[1][1];
221    req->transform.matrix23 = transform->matrix[1][2];
222    req->transform.matrix31 = transform->matrix[2][0];
223    req->transform.matrix32 = transform->matrix[2][1];
224    req->transform.matrix33 = transform->matrix[2][2];
225    UnlockDisplay(dpy);
226    SyncHandle();
227
228}
229
230void
231XRenderFreePicture (Display                   *dpy,
232		    Picture                   picture)
233{
234    XRenderExtDisplayInfo   *info = XRenderFindDisplay (dpy);
235    xRenderFreePictureReq   *req;
236
237    RenderSimpleCheckExtension (dpy, info);
238    LockDisplay(dpy);
239    GetReq(RenderFreePicture, req);
240    req->reqType = (CARD8) info->codes->major_opcode;
241    req->renderReqType = X_RenderFreePicture;
242    req->picture = (CARD32) picture;
243    UnlockDisplay(dpy);
244    SyncHandle();
245}
246
247
248Picture XRenderCreateSolidFill(Display *dpy,
249                               const XRenderColor *color)
250{
251    XRenderExtDisplayInfo	    *info = XRenderFindDisplay (dpy);
252    Picture			    pid;
253    xRenderCreateSolidFillReq	    *req;
254
255    RenderCheckExtension (dpy, info, 0);
256    LockDisplay(dpy);
257    GetReq(RenderCreateSolidFill, req);
258    req->reqType = (CARD8) info->codes->major_opcode;
259    req->renderReqType = X_RenderCreateSolidFill;
260
261    req->pid = (CARD32) (pid = XAllocID(dpy));
262    req->color.red = color->red;
263    req->color.green = color->green;
264    req->color.blue = color->blue;
265    req->color.alpha = color->alpha;
266
267    UnlockDisplay(dpy);
268    SyncHandle();
269    return pid;
270}
271
272
273Picture XRenderCreateLinearGradient(Display *dpy,
274                                    const XLinearGradient *gradient,
275                                    const XFixed *stops,
276                                    const XRenderColor *colors,
277                                    int nStops)
278{
279    XRenderExtDisplayInfo	    *info = XRenderFindDisplay (dpy);
280    Picture			    pid;
281    xRenderCreateLinearGradientReq *req;
282    long			   len;
283
284    RenderCheckExtension (dpy, info, 0);
285    LockDisplay(dpy);
286    GetReq(RenderCreateLinearGradient, req);
287    req->reqType = (CARD8) info->codes->major_opcode;
288    req->renderReqType = X_RenderCreateLinearGradient;
289
290    req->pid = (CARD32) (pid = XAllocID(dpy));
291    req->p1.x = gradient->p1.x;
292    req->p1.y = gradient->p1.y;
293    req->p2.x = gradient->p2.x;
294    req->p2.y = gradient->p2.y;
295
296    req->nStops = (CARD32) nStops;
297    len = (long) nStops * 3;
298    SetReqLen (req, len, 6);
299    DataInt32(dpy, stops, nStops * 4);
300    Data16(dpy, colors, nStops * 8);
301
302    UnlockDisplay(dpy);
303    SyncHandle();
304    return pid;
305}
306
307Picture XRenderCreateRadialGradient(Display *dpy,
308                                    const XRadialGradient *gradient,
309                                    const XFixed *stops,
310                                    const XRenderColor *colors,
311                                    int nStops)
312{
313    XRenderExtDisplayInfo	    *info = XRenderFindDisplay (dpy);
314    Picture			    pid;
315    xRenderCreateRadialGradientReq *req;
316    long			   len;
317
318    RenderCheckExtension (dpy, info, 0);
319    LockDisplay(dpy);
320    GetReq(RenderCreateRadialGradient, req);
321    req->reqType = (CARD8) info->codes->major_opcode;
322    req->renderReqType = X_RenderCreateRadialGradient;
323
324    req->pid = (CARD32) (pid = XAllocID(dpy));
325    req->inner.x = gradient->inner.x;
326    req->inner.y = gradient->inner.y;
327    req->outer.x = gradient->outer.x;
328    req->outer.y = gradient->outer.y;
329    req->inner_radius = gradient->inner.radius;
330    req->outer_radius = gradient->outer.radius;
331
332    req->nStops = (CARD32) nStops;
333    len = (long) nStops * 3;
334    SetReqLen (req, len, 6);
335    DataInt32(dpy, stops, nStops * 4);
336    Data16(dpy, colors, nStops * 8);
337
338    UnlockDisplay(dpy);
339    SyncHandle();
340    return pid;
341}
342
343Picture XRenderCreateConicalGradient(Display *dpy,
344                                     const XConicalGradient *gradient,
345                                     const XFixed *stops,
346                                     const XRenderColor *colors,
347                                     int nStops)
348{
349    XRenderExtDisplayInfo	    *info = XRenderFindDisplay (dpy);
350    Picture			    pid;
351    xRenderCreateConicalGradientReq *req;
352    long			    len;
353
354    RenderCheckExtension (dpy, info, 0);
355    LockDisplay(dpy);
356    GetReq(RenderCreateConicalGradient, req);
357    req->reqType = (CARD8) info->codes->major_opcode;
358    req->renderReqType = X_RenderCreateConicalGradient;
359
360    req->pid = (CARD32) (pid = XAllocID(dpy));
361    req->center.x = gradient->center.x;
362    req->center.y = gradient->center.y;
363    req->angle = gradient->angle;
364
365    req->nStops = (CARD32) nStops;
366    len = (long) nStops * 3;
367    SetReqLen (req, len, 6);
368    DataInt32(dpy, stops, nStops * 4);
369    Data16(dpy, colors, nStops * 8);
370
371    UnlockDisplay(dpy);
372    SyncHandle();
373    return pid;
374}
375