Edit

IABSD.fr/xenocara/lib/xcb-util-renderutil/renderutil/util.c

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2014-06-15 09:00:40
    Hash : 9364b9c9
    Message : Uodate to xcb-util-renderutil 0.3.9

  • lib/xcb-util-renderutil/renderutil/util.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);
    }