1ecce36beSmrg/* Copyright © 2000 Keith Packard
2ecce36beSmrg *
3ecce36beSmrg * Permission to use, copy, modify, distribute, and sell this software and its
4ecce36beSmrg * documentation for any purpose is hereby granted without fee, provided that
5ecce36beSmrg * the above copyright notice appear in all copies and that both that
6ecce36beSmrg * copyright notice and this permission notice appear in supporting
7ecce36beSmrg * documentation, and that the name of Keith Packard not be used in
8ecce36beSmrg * advertising or publicity pertaining to distribution of the software without
9ecce36beSmrg * specific, written prior permission.  Keith Packard makes no
10ecce36beSmrg * representations about the suitability of this software for any purpose.  It
11ecce36beSmrg * is provided "as is" without express or implied warranty.
12ecce36beSmrg *
13ecce36beSmrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
14ecce36beSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
15ecce36beSmrg * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
16ecce36beSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
17ecce36beSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18ecce36beSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19ecce36beSmrg * PERFORMANCE OF THIS SOFTWARE.
20ecce36beSmrg */
21ecce36beSmrg
22ecce36beSmrg#include "xcb_renderutil.h"
23ecce36beSmrg
24ecce36beSmrgxcb_render_pictvisual_t *
25ecce36beSmrgxcb_render_util_find_visual_format (const xcb_render_query_pict_formats_reply_t *formats,
26ecce36beSmrg			       const xcb_visualid_t visual)
27ecce36beSmrg{
28ecce36beSmrg    xcb_render_pictscreen_iterator_t screens;
29ecce36beSmrg    xcb_render_pictdepth_iterator_t depths;
30ecce36beSmrg    xcb_render_pictvisual_iterator_t visuals;
31ecce36beSmrg    if (!formats)
32ecce36beSmrg	return 0;
33ecce36beSmrg    for (screens = xcb_render_query_pict_formats_screens_iterator(formats); screens.rem; xcb_render_pictscreen_next(&screens))
34ecce36beSmrg	for (depths = xcb_render_pictscreen_depths_iterator(screens.data); depths.rem; xcb_render_pictdepth_next(&depths))
35ecce36beSmrg	    for (visuals = xcb_render_pictdepth_visuals_iterator(depths.data); visuals.rem; xcb_render_pictvisual_next(&visuals))
36ecce36beSmrg		if (visuals.data->visual == visual)
37ecce36beSmrg		    return visuals.data;
38ecce36beSmrg    return 0;
39ecce36beSmrg}
40ecce36beSmrg
41ecce36beSmrgxcb_render_pictforminfo_t *
42ecce36beSmrgxcb_render_util_find_format (const xcb_render_query_pict_formats_reply_t	*formats,
43ecce36beSmrg			 unsigned long				mask,
44ecce36beSmrg			 const xcb_render_pictforminfo_t		*template,
45ecce36beSmrg			 int					count)
46ecce36beSmrg{
47ecce36beSmrg    xcb_render_pictforminfo_iterator_t i;
48ecce36beSmrg    if (!formats)
49ecce36beSmrg	return 0;
50ecce36beSmrg    for (i = xcb_render_query_pict_formats_formats_iterator(formats); i.rem; xcb_render_pictforminfo_next(&i))
51ecce36beSmrg    {
52ecce36beSmrg	if (mask & XCB_PICT_FORMAT_ID)
53ecce36beSmrg	    if (template->id != i.data->id)
54ecce36beSmrg		continue;
55ecce36beSmrg	if (mask & XCB_PICT_FORMAT_TYPE)
56ecce36beSmrg	    if (template->type != i.data->type)
57ecce36beSmrg		continue;
58ecce36beSmrg	if (mask & XCB_PICT_FORMAT_DEPTH)
59ecce36beSmrg	    if (template->depth != i.data->depth)
60ecce36beSmrg		continue;
61ecce36beSmrg	if (mask & XCB_PICT_FORMAT_RED)
62ecce36beSmrg	    if (template->direct.red_shift != i.data->direct.red_shift)
63ecce36beSmrg		continue;
64ecce36beSmrg	if (mask & XCB_PICT_FORMAT_RED_MASK)
65ecce36beSmrg	    if (template->direct.red_mask != i.data->direct.red_mask)
66ecce36beSmrg		continue;
67ecce36beSmrg	if (mask & XCB_PICT_FORMAT_GREEN)
68ecce36beSmrg	    if (template->direct.green_shift != i.data->direct.green_shift)
69ecce36beSmrg		continue;
70ecce36beSmrg	if (mask & XCB_PICT_FORMAT_GREEN_MASK)
71ecce36beSmrg	    if (template->direct.green_mask != i.data->direct.green_mask)
72ecce36beSmrg		continue;
73ecce36beSmrg	if (mask & XCB_PICT_FORMAT_BLUE)
74ecce36beSmrg	    if (template->direct.blue_shift != i.data->direct.blue_shift)
75ecce36beSmrg		continue;
76ecce36beSmrg	if (mask & XCB_PICT_FORMAT_BLUE_MASK)
77ecce36beSmrg	    if (template->direct.blue_mask != i.data->direct.blue_mask)
78ecce36beSmrg		continue;
79ecce36beSmrg	if (mask & XCB_PICT_FORMAT_ALPHA)
80ecce36beSmrg	    if (template->direct.alpha_shift != i.data->direct.alpha_shift)
81ecce36beSmrg		continue;
82ecce36beSmrg	if (mask & XCB_PICT_FORMAT_ALPHA_MASK)
83ecce36beSmrg	    if (template->direct.alpha_mask != i.data->direct.alpha_mask)
84ecce36beSmrg		continue;
85ecce36beSmrg	if (mask & XCB_PICT_FORMAT_COLORMAP)
86ecce36beSmrg	    if (template->colormap != i.data->colormap)
87ecce36beSmrg		continue;
88ecce36beSmrg	if (count-- == 0)
89ecce36beSmrg	    return i.data;
90ecce36beSmrg    }
91ecce36beSmrg    return 0;
92ecce36beSmrg}
93ecce36beSmrg
94ecce36beSmrgxcb_render_pictforminfo_t *
95ecce36beSmrgxcb_render_util_find_standard_format (const xcb_render_query_pict_formats_reply_t	*formats,
96ecce36beSmrg				 xcb_pict_standard_t					format)
97ecce36beSmrg{
98ecce36beSmrg    static const struct {
99ecce36beSmrg	xcb_render_pictforminfo_t templ;
100ecce36beSmrg	unsigned long	      mask;
101ecce36beSmrg    } standardFormats[] = {
102ecce36beSmrg	/* XCB_PICT_STANDARD_ARGB_32 */
103ecce36beSmrg	{
104ecce36beSmrg	    {
105ecce36beSmrg		0,			    /* id */
106ecce36beSmrg		XCB_RENDER_PICT_TYPE_DIRECT,    /* type */
107ecce36beSmrg		32,			    /* depth */
108ecce36beSmrg		{ 0 },			    /* pad */
109ecce36beSmrg		{			    /* direct */
110ecce36beSmrg		    16,			    /* direct.red */
111ecce36beSmrg		    0xff,		    /* direct.red_mask */
112ecce36beSmrg		    8,			    /* direct.green */
113ecce36beSmrg		    0xff,		    /* direct.green_mask */
114ecce36beSmrg		    0,			    /* direct.blue */
115ecce36beSmrg		    0xff,		    /* direct.blue_mask */
116ecce36beSmrg		    24,			    /* direct.alpha */
117ecce36beSmrg		    0xff,		    /* direct.alpha_mask */
118ecce36beSmrg		},
119ecce36beSmrg		0,			    /* colormap */
120ecce36beSmrg	    },
121ecce36beSmrg	    XCB_PICT_FORMAT_TYPE |
122ecce36beSmrg	    XCB_PICT_FORMAT_DEPTH |
123ecce36beSmrg	    XCB_PICT_FORMAT_RED |
124ecce36beSmrg	    XCB_PICT_FORMAT_RED_MASK |
125ecce36beSmrg	    XCB_PICT_FORMAT_GREEN |
126ecce36beSmrg	    XCB_PICT_FORMAT_GREEN_MASK |
127ecce36beSmrg	    XCB_PICT_FORMAT_BLUE |
128ecce36beSmrg	    XCB_PICT_FORMAT_BLUE_MASK |
129ecce36beSmrg	    XCB_PICT_FORMAT_ALPHA |
130ecce36beSmrg	    XCB_PICT_FORMAT_ALPHA_MASK,
131ecce36beSmrg	},
132ecce36beSmrg	/* XCB_PICT_STANDARD_RGB_24 */
133ecce36beSmrg	{
134ecce36beSmrg	    {
135ecce36beSmrg		0,			    /* id */
136ecce36beSmrg		XCB_RENDER_PICT_TYPE_DIRECT,    /* type */
137ecce36beSmrg		24,			    /* depth */
138ecce36beSmrg		{ 0 },			    /* pad */
139ecce36beSmrg		{			    /* direct */
140ecce36beSmrg		    16,			    /* direct.red */
141ecce36beSmrg		    0xff,		    /* direct.red_MASK */
142ecce36beSmrg		    8,			    /* direct.green */
143ecce36beSmrg		    0xff,		    /* direct.green_MASK */
144ecce36beSmrg		    0,			    /* direct.blue */
145ecce36beSmrg		    0xff,		    /* direct.blue_MASK */
146ecce36beSmrg		    0,			    /* direct.alpha */
147ecce36beSmrg		    0x00,		    /* direct.alpha_MASK */
148ecce36beSmrg		},
149ecce36beSmrg		0,			    /* colormap */
150ecce36beSmrg	    },
151ecce36beSmrg	    XCB_PICT_FORMAT_TYPE |
152ecce36beSmrg	    XCB_PICT_FORMAT_DEPTH |
153ecce36beSmrg	    XCB_PICT_FORMAT_RED |
154ecce36beSmrg	    XCB_PICT_FORMAT_RED_MASK |
155ecce36beSmrg	    XCB_PICT_FORMAT_GREEN |
156ecce36beSmrg	    XCB_PICT_FORMAT_GREEN_MASK |
157ecce36beSmrg	    XCB_PICT_FORMAT_BLUE |
158ecce36beSmrg	    XCB_PICT_FORMAT_BLUE_MASK |
159ecce36beSmrg	    XCB_PICT_FORMAT_ALPHA_MASK,
160ecce36beSmrg	},
161ecce36beSmrg	/* XCB_PICT_STANDARD_A_8 */
162ecce36beSmrg	{
163ecce36beSmrg	    {
164ecce36beSmrg		0,			    /* id */
165ecce36beSmrg		XCB_RENDER_PICT_TYPE_DIRECT,    /* type */
166ecce36beSmrg		8,			    /* depth */
167ecce36beSmrg		{ 0 },			    /* pad */
168ecce36beSmrg		{			    /* direct */
169ecce36beSmrg		    0,			    /* direct.red */
170ecce36beSmrg		    0x00,		    /* direct.red_MASK */
171ecce36beSmrg		    0,			    /* direct.green */
172ecce36beSmrg		    0x00,		    /* direct.green_MASK */
173ecce36beSmrg		    0,			    /* direct.blue */
174ecce36beSmrg		    0x00,		    /* direct.blue_MASK */
175ecce36beSmrg		    0,			    /* direct.alpha */
176ecce36beSmrg		    0xff,		    /* direct.alpha_MASK */
177ecce36beSmrg		},
178ecce36beSmrg		0,			    /* colormap */
179ecce36beSmrg	    },
180ecce36beSmrg	    XCB_PICT_FORMAT_TYPE |
181ecce36beSmrg	    XCB_PICT_FORMAT_DEPTH |
182ecce36beSmrg	    XCB_PICT_FORMAT_RED_MASK |
183ecce36beSmrg	    XCB_PICT_FORMAT_GREEN_MASK |
184ecce36beSmrg	    XCB_PICT_FORMAT_BLUE_MASK |
185ecce36beSmrg	    XCB_PICT_FORMAT_ALPHA |
186ecce36beSmrg	    XCB_PICT_FORMAT_ALPHA_MASK,
187ecce36beSmrg	},
188ecce36beSmrg	/* XCB_PICT_STANDARD_A_4 */
189ecce36beSmrg	{
190ecce36beSmrg	    {
191ecce36beSmrg		0,			    /* id */
192ecce36beSmrg		XCB_RENDER_PICT_TYPE_DIRECT,    /* type */
193ecce36beSmrg		4,			    /* depth */
194ecce36beSmrg		{ 0 },			    /* pad */
195ecce36beSmrg		{			    /* direct */
196ecce36beSmrg		    0,			    /* direct.red */
197ecce36beSmrg		    0x00,		    /* direct.red_MASK */
198ecce36beSmrg		    0,			    /* direct.green */
199ecce36beSmrg		    0x00,		    /* direct.green_MASK */
200ecce36beSmrg		    0,			    /* direct.blue */
201ecce36beSmrg		    0x00,		    /* direct.blue_MASK */
202ecce36beSmrg		    0,			    /* direct.alpha */
203ecce36beSmrg		    0x0f,		    /* direct.alpha_MASK */
204ecce36beSmrg		},
205ecce36beSmrg		0,			    /* colormap */
206ecce36beSmrg	    },
207ecce36beSmrg	    XCB_PICT_FORMAT_TYPE |
208ecce36beSmrg	    XCB_PICT_FORMAT_DEPTH |
209ecce36beSmrg	    XCB_PICT_FORMAT_RED_MASK |
210ecce36beSmrg	    XCB_PICT_FORMAT_GREEN_MASK |
211ecce36beSmrg	    XCB_PICT_FORMAT_BLUE_MASK |
212ecce36beSmrg	    XCB_PICT_FORMAT_ALPHA |
213ecce36beSmrg	    XCB_PICT_FORMAT_ALPHA_MASK,
214ecce36beSmrg	},
215ecce36beSmrg	/* XCB_PICT_STANDARD_A_1 */
216ecce36beSmrg	{
217ecce36beSmrg	    {
218ecce36beSmrg		0,			    /* id */
219ecce36beSmrg		XCB_RENDER_PICT_TYPE_DIRECT,    /* type */
220ecce36beSmrg		1,			    /* depth */
221ecce36beSmrg		{ 0 },			    /* pad */
222ecce36beSmrg		{			    /* direct */
223ecce36beSmrg		    0,			    /* direct.red */
224ecce36beSmrg		    0x00,		    /* direct.red_MASK */
225ecce36beSmrg		    0,			    /* direct.green */
226ecce36beSmrg		    0x00,		    /* direct.green_MASK */
227ecce36beSmrg		    0,			    /* direct.blue */
228ecce36beSmrg		    0x00,		    /* direct.blue_MASK */
229ecce36beSmrg		    0,			    /* direct.alpha */
230ecce36beSmrg		    0x01,		    /* direct.alpha_MASK */
231ecce36beSmrg		},
232ecce36beSmrg		0,			    /* colormap */
233ecce36beSmrg	    },
234ecce36beSmrg	    XCB_PICT_FORMAT_TYPE |
235ecce36beSmrg	    XCB_PICT_FORMAT_DEPTH |
236ecce36beSmrg	    XCB_PICT_FORMAT_RED_MASK |
237ecce36beSmrg	    XCB_PICT_FORMAT_GREEN_MASK |
238ecce36beSmrg	    XCB_PICT_FORMAT_BLUE_MASK |
239ecce36beSmrg	    XCB_PICT_FORMAT_ALPHA |
240ecce36beSmrg	    XCB_PICT_FORMAT_ALPHA_MASK,
241ecce36beSmrg	},
242ecce36beSmrg    };
243ecce36beSmrg
244ecce36beSmrg    if (format < 0 || format >= sizeof(standardFormats) / sizeof(*standardFormats))
245ecce36beSmrg	return 0;
246ecce36beSmrg
247ecce36beSmrg    return xcb_render_util_find_format (formats,
248ecce36beSmrg				    standardFormats[format].mask,
249ecce36beSmrg				    &standardFormats[format].templ,
250ecce36beSmrg				    0);
251ecce36beSmrg}
252