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