xenocara/lib/xcb-util-renderutil/renderutil/util.c
2014-06-15 09:00:40 +00:00

256 lines
7.9 KiB
C

/* Copyright © 2000 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "xcb_renderutil.h"
xcb_render_pictvisual_t *
xcb_render_util_find_visual_format (const xcb_render_query_pict_formats_reply_t *formats,
const xcb_visualid_t visual)
{
xcb_render_pictscreen_iterator_t screens;
xcb_render_pictdepth_iterator_t depths;
xcb_render_pictvisual_iterator_t visuals;
if (!formats)
return 0;
for (screens = xcb_render_query_pict_formats_screens_iterator(formats); screens.rem; xcb_render_pictscreen_next(&screens))
for (depths = xcb_render_pictscreen_depths_iterator(screens.data); depths.rem; xcb_render_pictdepth_next(&depths))
for (visuals = xcb_render_pictdepth_visuals_iterator(depths.data); visuals.rem; xcb_render_pictvisual_next(&visuals))
if (visuals.data->visual == visual)
return visuals.data;
return 0;
}
xcb_render_pictforminfo_t *
xcb_render_util_find_format (const xcb_render_query_pict_formats_reply_t *formats,
unsigned long mask,
const xcb_render_pictforminfo_t *ptemplate,
int count)
{
xcb_render_pictforminfo_iterator_t i;
if (!formats)
return 0;
for (i = xcb_render_query_pict_formats_formats_iterator(formats); i.rem; xcb_render_pictforminfo_next(&i))
{
if (mask & XCB_PICT_FORMAT_ID)
if (ptemplate->id != i.data->id)
continue;
if (mask & XCB_PICT_FORMAT_TYPE)
if (ptemplate->type != i.data->type)
continue;
if (mask & XCB_PICT_FORMAT_DEPTH)
if (ptemplate->depth != i.data->depth)
continue;
if (mask & XCB_PICT_FORMAT_RED)
if (ptemplate->direct.red_shift != i.data->direct.red_shift)
continue;
if (mask & XCB_PICT_FORMAT_RED_MASK)
if (ptemplate->direct.red_mask != i.data->direct.red_mask)
continue;
if (mask & XCB_PICT_FORMAT_GREEN)
if (ptemplate->direct.green_shift != i.data->direct.green_shift)
continue;
if (mask & XCB_PICT_FORMAT_GREEN_MASK)
if (ptemplate->direct.green_mask != i.data->direct.green_mask)
continue;
if (mask & XCB_PICT_FORMAT_BLUE)
if (ptemplate->direct.blue_shift != i.data->direct.blue_shift)
continue;
if (mask & XCB_PICT_FORMAT_BLUE_MASK)
if (ptemplate->direct.blue_mask != i.data->direct.blue_mask)
continue;
if (mask & XCB_PICT_FORMAT_ALPHA)
if (ptemplate->direct.alpha_shift != i.data->direct.alpha_shift)
continue;
if (mask & XCB_PICT_FORMAT_ALPHA_MASK)
if (ptemplate->direct.alpha_mask != i.data->direct.alpha_mask)
continue;
if (mask & XCB_PICT_FORMAT_COLORMAP)
if (ptemplate->colormap != i.data->colormap)
continue;
if (count-- == 0)
return i.data;
}
return 0;
}
xcb_render_pictforminfo_t *
xcb_render_util_find_standard_format (const xcb_render_query_pict_formats_reply_t *formats,
xcb_pict_standard_t format)
{
static const struct {
xcb_render_pictforminfo_t templ;
unsigned long mask;
} standardFormats[] = {
/* XCB_PICT_STANDARD_ARGB_32 */
{
{
0, /* id */
XCB_RENDER_PICT_TYPE_DIRECT, /* type */
32, /* depth */
{ 0 }, /* pad */
{ /* direct */
16, /* direct.red */
0xff, /* direct.red_mask */
8, /* direct.green */
0xff, /* direct.green_mask */
0, /* direct.blue */
0xff, /* direct.blue_mask */
24, /* direct.alpha */
0xff, /* direct.alpha_mask */
},
0, /* colormap */
},
XCB_PICT_FORMAT_TYPE |
XCB_PICT_FORMAT_DEPTH |
XCB_PICT_FORMAT_RED |
XCB_PICT_FORMAT_RED_MASK |
XCB_PICT_FORMAT_GREEN |
XCB_PICT_FORMAT_GREEN_MASK |
XCB_PICT_FORMAT_BLUE |
XCB_PICT_FORMAT_BLUE_MASK |
XCB_PICT_FORMAT_ALPHA |
XCB_PICT_FORMAT_ALPHA_MASK,
},
/* XCB_PICT_STANDARD_RGB_24 */
{
{
0, /* id */
XCB_RENDER_PICT_TYPE_DIRECT, /* type */
24, /* depth */
{ 0 }, /* pad */
{ /* direct */
16, /* direct.red */
0xff, /* direct.red_MASK */
8, /* direct.green */
0xff, /* direct.green_MASK */
0, /* direct.blue */
0xff, /* direct.blue_MASK */
0, /* direct.alpha */
0x00, /* direct.alpha_MASK */
},
0, /* colormap */
},
XCB_PICT_FORMAT_TYPE |
XCB_PICT_FORMAT_DEPTH |
XCB_PICT_FORMAT_RED |
XCB_PICT_FORMAT_RED_MASK |
XCB_PICT_FORMAT_GREEN |
XCB_PICT_FORMAT_GREEN_MASK |
XCB_PICT_FORMAT_BLUE |
XCB_PICT_FORMAT_BLUE_MASK |
XCB_PICT_FORMAT_ALPHA_MASK,
},
/* XCB_PICT_STANDARD_A_8 */
{
{
0, /* id */
XCB_RENDER_PICT_TYPE_DIRECT, /* type */
8, /* depth */
{ 0 }, /* pad */
{ /* direct */
0, /* direct.red */
0x00, /* direct.red_MASK */
0, /* direct.green */
0x00, /* direct.green_MASK */
0, /* direct.blue */
0x00, /* direct.blue_MASK */
0, /* direct.alpha */
0xff, /* direct.alpha_MASK */
},
0, /* colormap */
},
XCB_PICT_FORMAT_TYPE |
XCB_PICT_FORMAT_DEPTH |
XCB_PICT_FORMAT_RED_MASK |
XCB_PICT_FORMAT_GREEN_MASK |
XCB_PICT_FORMAT_BLUE_MASK |
XCB_PICT_FORMAT_ALPHA |
XCB_PICT_FORMAT_ALPHA_MASK,
},
/* XCB_PICT_STANDARD_A_4 */
{
{
0, /* id */
XCB_RENDER_PICT_TYPE_DIRECT, /* type */
4, /* depth */
{ 0 }, /* pad */
{ /* direct */
0, /* direct.red */
0x00, /* direct.red_MASK */
0, /* direct.green */
0x00, /* direct.green_MASK */
0, /* direct.blue */
0x00, /* direct.blue_MASK */
0, /* direct.alpha */
0x0f, /* direct.alpha_MASK */
},
0, /* colormap */
},
XCB_PICT_FORMAT_TYPE |
XCB_PICT_FORMAT_DEPTH |
XCB_PICT_FORMAT_RED_MASK |
XCB_PICT_FORMAT_GREEN_MASK |
XCB_PICT_FORMAT_BLUE_MASK |
XCB_PICT_FORMAT_ALPHA |
XCB_PICT_FORMAT_ALPHA_MASK,
},
/* XCB_PICT_STANDARD_A_1 */
{
{
0, /* id */
XCB_RENDER_PICT_TYPE_DIRECT, /* type */
1, /* depth */
{ 0 }, /* pad */
{ /* direct */
0, /* direct.red */
0x00, /* direct.red_MASK */
0, /* direct.green */
0x00, /* direct.green_MASK */
0, /* direct.blue */
0x00, /* direct.blue_MASK */
0, /* direct.alpha */
0x01, /* direct.alpha_MASK */
},
0, /* colormap */
},
XCB_PICT_FORMAT_TYPE |
XCB_PICT_FORMAT_DEPTH |
XCB_PICT_FORMAT_RED_MASK |
XCB_PICT_FORMAT_GREEN_MASK |
XCB_PICT_FORMAT_BLUE_MASK |
XCB_PICT_FORMAT_ALPHA |
XCB_PICT_FORMAT_ALPHA_MASK,
},
};
if (format < 0 || format >= sizeof(standardFormats) / sizeof(*standardFormats))
return 0;
return xcb_render_util_find_format (formats,
standardFormats[format].mask,
&standardFormats[format].templ,
0);
}