use X11::Protocol; $x = X11::Protocol->new($ENV{'DISPLAY'}); $x->init_extension('RENDER') or die;
As of this writing (early 2004), the specification and implementation both have rough edges, but there are relatively few alternatives for offloading fancy graphics processing to the server, as is necessary over slow links or if the client is written in a slow language. Another possibility you might consider is the 2D subset of OpenGL, though it doesn't yet have an X11::Protocol-compatible interface.
$x->RenderQueryVersion($major, $minor) => ($major, $minor) $x->RenderQueryPictFormats() => ([[$id, $type, $depth, $red, $red_m, $green, $green_m, $blue, $blue_m, $alpha, $alpha_m, $cmap], ...], [[$fallback, [$depth, [$visual, $format], ...], ...], ...], [$subpixel, ...]) $x->RenderQueryPictIndexValues($pict_format) => ([$index, $red, $green, $blue, $alpha], ...) $x->RenderQueryFilters($drawable) => ([@filters], [@aliases]) $x->RenderCreatePicture($picture, $drawable, $format, 'attribute' => $value, ...) $x->RenderChangePicture($picture, 'attribute' => $value, ...) $x->RenderSetPictureClipRectangles($pic, $x_origin, $y_origin, [$x, $y, $width, $height], ...) $x->RenderSetPictureTransform($pict, $m11, $m12, $m13, $m21, $m22, $m23, $m31, $m32, $m33); $x->RenderSetPictureFilter($pict, $filter, @args) $x->RenderComposite($op, $src, $mask, $dst, $src_x, $src_y, $mask_x, $mask_y, $dst_x, $dst_y, $width, $height) $x->RenderFillRectangles($op, $dst, [$red, $green, $blue, $alpha], [$x, $y, $width, $height], ...) $x->RenderTrapezoids($op, $src, $src_x, $src_y, $dst, $mask_format, [$top, $bottom, $lx1, $ly1, $lx2, $ly2, $rx1, $ry1, $rx2, $ry2] ,...) $x->RenderTriangles($op, $src, $src_x, $src_y, $dst, $mask_format, [$x1, $y1, $x2, $y2, $x3, $y3]) $x->RenderTriStrip($op, $src, $src_x, $src_y, $dst, $mask_format, [$x, $y], [$x, $y], [$x, $y], [$x, $y], ...) $x->RenderTriFan($op, $src, $src_x, $src_y, $dst, $mask_format, [$x, $y], [$x, $y], [$x, $y], [$x, $y], ...) $x->RenderCreateGlyphSet($gsid, $format) $x->RenderReferenceGlyphSet($gsid, $existing) $x->RenderFreeGlyphSet($gsid) $x->RenderAddGlyphs($gsid, [$glyph, $width, $height, $x, $y, $x_off, $y_off, $data], ...)
Warning: with some server implementations (including XFree86 through 4.4) passing more than one glyph to AddGlyphs can hang or crash the server. So don't do that.
$x->RenderFreeGylphs($gsid, @glyphs) $x->RenderCompositeGlyphs8($op, $src, $dst, $mask_format, $gsid, $src_x, $src_y, [$delta_x, $delta_y, $str], ...) $x->RenderCompositeGlyphs16($op, $src, $dst, $mask_format, $gsid, $src_x, $src_y, [$delta_x, $delta_y, $str], ...) $x->RenderCompositeGlyphs32($op, $src, $dst, $mask_format, $gsid, $src_x, $src_y, [$delta_x, $delta_y, $str], ...)
In these three requests, new GlyphSetIDs can also be interspersed with the array references.
$x->RenderCreateCursor($cid, $source, $hot_x, $hot_y) $x->RenderCreateAnimCursor($cid, [$cursor, $delay], ...)