/* Find an X11 visual for a RENDER picture format */ static xcb_visualid_t FindVisual(const xcb_setup_t *setup, const xcb_screen_t *scr, const xcb_render_query_pict_formats_reply_t *r, xcb_render_pictformat_t fmt_id) { const xcb_render_pictscreen_t *rs = FindPictScreen(setup, scr, r); if (rs == NULL) return 0; xcb_render_pictdepth_iterator_t rdi = xcb_render_pictscreen_depths_iterator(rs); while (rdi.rem > 0) { const xcb_render_pictdepth_t *rd = rdi.data; xcb_render_pictvisual_iterator_t rvi = xcb_render_pictdepth_visuals_iterator(rd); while (rvi.rem > 0) { const xcb_render_pictvisual_t *pv = rvi.data; if (pv->format == fmt_id) return pv->visual; xcb_render_pictvisual_next(&rvi); } xcb_render_pictdepth_next(&rdi); } return 0; }
uint32_t _ecore_xcb_render_find_visual_id(int type, Eina_Bool check_alpha) { #ifdef ECORE_XCB_RENDER const xcb_render_query_pict_formats_reply_t *reply; xcb_render_pictvisual_t *visual = NULL; xcb_render_pictscreen_iterator_t screens; xcb_render_pictdepth_iterator_t depths; xcb_render_pictvisual_iterator_t visuals; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_render_avail) return 0; #ifdef ECORE_XCB_RENDER reply = xcb_render_util_query_formats(_ecore_xcb_conn); if (!reply) return 0; for (screens = xcb_render_query_pict_formats_screens_iterator(reply); 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)) { xcb_render_pictforminfo_t temp; xcb_render_pictforminfo_t *format; visual = visuals.data; temp.id = visual->format; format = xcb_render_util_find_format(reply, XCB_PICT_FORMAT_ID, &temp, 0); if (!format) continue; if (format->type == type) { if (check_alpha) { if (format->direct.alpha_mask) return visual->visual; } else return visual->visual; } } } } #endif return 0; }
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; }