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