[Xcb] xcb_render_util_composite_text

Ian Osgood iano at quirkster.com
Sat Oct 14 11:39:11 PDT 2006

I'm starting to write the XCB renderutil equivalent of libXrender's  
XRenderCompositeText, and would like to discuss possible interfaces.  
My goal is to keep the API as close to the wire protocol as possible  
while minimizing user error, avoiding duplicated code, and retaining  
full flexibility. I expect then first user of this interface to be  
the cairo XCB backend.

Please forward this to anyone you know who has used the  
XRenderCompositeText interfaces. Later I could implement  
composite_string methods which would be as convenient as  
XRenderCompositeString but layered on top of the composite_text methods.

The wire protocol for CompositeGlyphs consists of a base request  
containing among other parameters the initial GLYPHSET (an xid) and a  
stream of commands (GLYPHELT + data payload).

Each request flavor (8,16,32) contains a stream of two possible  
command types:

1. a GLYPHELT followed by a short array of glyph indices
	uint8_t count
	uint8_t pad[3]
	uint16_t dx, dy
	uint{8,16,32}_t glyphs[count]
where the maximum count is 252 for text_8, and 254 otherwise.

2. a GLYPHELT with count==255 followed by a new GLYPHSET to switch to
	uint8_t count = 255
	uint8_t pad[3]
	uint16_t dx = dy = 0
	xcb_render_glyphset_t glyphset

I'm thinking that a stream-like API captures this flexibly yet simply.

   composite_text_stream_t stream;
   stream = composite_text_stream(initial_glyphset,  
total_glyph_count, total_glyphset_changes)
   composite_text_glyphs_8( stream, uint32_t count, uint8_t *glyphs,  
int16_t dx, int16_t dy)
   composite_text_glyphs_16( stream, uint32_t count, uint16_t  
*glyphs, int16_t dx, int16_t dy)
   composite_text_glyphs_32( stream, uint32_t count, uint32_t  
*glyphs, int16_t dx, int16_t dy)
   composite_text_change_glyphset( stream, xcb_render_glyphset_t  
   xcb_void_cookie_t  composite_text( connection, op, src, dst,  
mask_format, src_x, src_y, stream )
   xcb_void_cookie_t  composite_text_checked( connection, op, src,  
dst, mask_format, src_x, src_y, stream )

This would build up the stream of commands incrementally. The stream  
is allocated in _stream and deallocated when sent.

* type-safe
* close to wire protocol
* allows optional preallocation of the potentially large stream buffer
* abstracts the 8/16/32 request types
* abstract enough to allow command merging underneath if desired
* should result in less duplicated code to handle text_8/16/32 and  
* no extra types (besides opaque stream); libXrender exposes XGlyphElt 
{8,16,32) to bundle glyphset, glyphs, and dx/dy together.

* allows incorrectly mixing 8,16,32 glyphs (though this would be  
detected at runtime)
* different from the libXrender API

Please let me know what you all think, especially if I have mistaken  
how the XRender protocol works.


More information about the Xcb mailing list