// Package render is the X client API for the RENDER extension.
package render

// This file is automatically generated from render.xml. Edit at your peril!

import (
	"github.com/BurntSushi/xgb"

	"github.com/BurntSushi/xgb/xproto"
)

// Init must be called before using the RENDER extension.
func Init(c *xgb.Conn) error {
	reply, err := xproto.QueryExtension(c, 6, "RENDER").Reply()
	switch {
	case err != nil:
		return err
	case !reply.Present:
		return xgb.Errorf("No extension named RENDER could be found on on the server.")
	}

	xgb.ExtLock.Lock()
	c.Extensions["RENDER"] = reply.MajorOpcode
	for evNum, fun := range xgb.NewExtEventFuncs["RENDER"] {
		xgb.NewEventFuncs[int(reply.FirstEvent)+evNum] = fun
	}
	for errNum, fun := range xgb.NewExtErrorFuncs["RENDER"] {
		xgb.NewErrorFuncs[int(reply.FirstError)+errNum] = fun
	}
	xgb.ExtLock.Unlock()

	return nil
}

func init() {
	xgb.NewExtEventFuncs["RENDER"] = make(map[int]xgb.NewEventFun)
	xgb.NewExtErrorFuncs["RENDER"] = make(map[int]xgb.NewErrorFun)
}

type Animcursorelt struct {
	Cursor xproto.Cursor
	Delay  uint32
}

// AnimcursoreltRead reads a byte slice into a Animcursorelt value.
func AnimcursoreltRead(buf []byte, v *Animcursorelt) int {
	b := 0

	v.Cursor = xproto.Cursor(xgb.Get32(buf[b:]))
	b += 4

	v.Delay = xgb.Get32(buf[b:])
	b += 4

	return b
}

// AnimcursoreltReadList reads a byte slice into a list of Animcursorelt values.
func AnimcursoreltReadList(buf []byte, dest []Animcursorelt) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Animcursorelt{}
		b += AnimcursoreltRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Animcursorelt value to a byte slice.
func (v Animcursorelt) Bytes() []byte {
	buf := make([]byte, 8)
	b := 0

	xgb.Put32(buf[b:], uint32(v.Cursor))
	b += 4

	xgb.Put32(buf[b:], v.Delay)
	b += 4

	return buf[:b]
}

// AnimcursoreltListBytes writes a list of Animcursorelt values to a byte slice.
func AnimcursoreltListBytes(buf []byte, list []Animcursorelt) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

type Color struct {
	Red   uint16
	Green uint16
	Blue  uint16
	Alpha uint16
}

// ColorRead reads a byte slice into a Color value.
func ColorRead(buf []byte, v *Color) int {
	b := 0

	v.Red = xgb.Get16(buf[b:])
	b += 2

	v.Green = xgb.Get16(buf[b:])
	b += 2

	v.Blue = xgb.Get16(buf[b:])
	b += 2

	v.Alpha = xgb.Get16(buf[b:])
	b += 2

	return b
}

// ColorReadList reads a byte slice into a list of Color values.
func ColorReadList(buf []byte, dest []Color) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Color{}
		b += ColorRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Color value to a byte slice.
func (v Color) Bytes() []byte {
	buf := make([]byte, 8)
	b := 0

	xgb.Put16(buf[b:], v.Red)
	b += 2

	xgb.Put16(buf[b:], v.Green)
	b += 2

	xgb.Put16(buf[b:], v.Blue)
	b += 2

	xgb.Put16(buf[b:], v.Alpha)
	b += 2

	return buf[:b]
}

// ColorListBytes writes a list of Color values to a byte slice.
func ColorListBytes(buf []byte, list []Color) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

const (
	CpRepeat           = 1
	CpAlphaMap         = 2
	CpAlphaXOrigin     = 4
	CpAlphaYOrigin     = 8
	CpClipXOrigin      = 16
	CpClipYOrigin      = 32
	CpClipMask         = 64
	CpGraphicsExposure = 128
	CpSubwindowMode    = 256
	CpPolyEdge         = 512
	CpPolyMode         = 1024
	CpDither           = 2048
	CpComponentAlpha   = 4096
)

type Directformat struct {
	RedShift   uint16
	RedMask    uint16
	GreenShift uint16
	GreenMask  uint16
	BlueShift  uint16
	BlueMask   uint16
	AlphaShift uint16
	AlphaMask  uint16
}

// DirectformatRead reads a byte slice into a Directformat value.
func DirectformatRead(buf []byte, v *Directformat) int {
	b := 0

	v.RedShift = xgb.Get16(buf[b:])
	b += 2

	v.RedMask = xgb.Get16(buf[b:])
	b += 2

	v.GreenShift = xgb.Get16(buf[b:])
	b += 2

	v.GreenMask = xgb.Get16(buf[b:])
	b += 2

	v.BlueShift = xgb.Get16(buf[b:])
	b += 2

	v.BlueMask = xgb.Get16(buf[b:])
	b += 2

	v.AlphaShift = xgb.Get16(buf[b:])
	b += 2

	v.AlphaMask = xgb.Get16(buf[b:])
	b += 2

	return b
}

// DirectformatReadList reads a byte slice into a list of Directformat values.
func DirectformatReadList(buf []byte, dest []Directformat) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Directformat{}
		b += DirectformatRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Directformat value to a byte slice.
func (v Directformat) Bytes() []byte {
	buf := make([]byte, 16)
	b := 0

	xgb.Put16(buf[b:], v.RedShift)
	b += 2

	xgb.Put16(buf[b:], v.RedMask)
	b += 2

	xgb.Put16(buf[b:], v.GreenShift)
	b += 2

	xgb.Put16(buf[b:], v.GreenMask)
	b += 2

	xgb.Put16(buf[b:], v.BlueShift)
	b += 2

	xgb.Put16(buf[b:], v.BlueMask)
	b += 2

	xgb.Put16(buf[b:], v.AlphaShift)
	b += 2

	xgb.Put16(buf[b:], v.AlphaMask)
	b += 2

	return buf[:b]
}

// DirectformatListBytes writes a list of Directformat values to a byte slice.
func DirectformatListBytes(buf []byte, list []Directformat) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

type Fixed int32

type Glyph uint32

// BadGlyph is the error number for a BadGlyph.
const BadGlyph = 4

type GlyphError struct {
	Sequence uint16
	NiceName string
}

// GlyphErrorNew constructs a GlyphError value that implements xgb.Error from a byte slice.
func GlyphErrorNew(buf []byte) xgb.Error {
	v := GlyphError{}
	v.NiceName = "Glyph"

	b := 1 // skip error determinant
	b += 1 // don't read error number

	v.Sequence = xgb.Get16(buf[b:])
	b += 2

	return v
}

// SequenceId returns the sequence id attached to the BadGlyph error.
// This is mostly used internally.
func (err GlyphError) SequenceId() uint16 {
	return err.Sequence
}

// BadId returns the 'BadValue' number if one exists for the BadGlyph error. If no bad value exists, 0 is returned.
func (err GlyphError) BadId() uint32 {
	return 0
}

// Error returns a rudimentary string representation of the BadGlyph error.

func (err GlyphError) Error() string {
	fieldVals := make([]string, 0, 0)
	fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
	fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence))
	return "BadGlyph {" + xgb.StringsJoin(fieldVals, ", ") + "}"
}

func init() {
	xgb.NewExtErrorFuncs["RENDER"][4] = GlyphErrorNew
}

// BadGlyphSet is the error number for a BadGlyphSet.
const BadGlyphSet = 3

type GlyphSetError struct {
	Sequence uint16
	NiceName string
}

// GlyphSetErrorNew constructs a GlyphSetError value that implements xgb.Error from a byte slice.
func GlyphSetErrorNew(buf []byte) xgb.Error {
	v := GlyphSetError{}
	v.NiceName = "GlyphSet"

	b := 1 // skip error determinant
	b += 1 // don't read error number

	v.Sequence = xgb.Get16(buf[b:])
	b += 2

	return v
}

// SequenceId returns the sequence id attached to the BadGlyphSet error.
// This is mostly used internally.
func (err GlyphSetError) SequenceId() uint16 {
	return err.Sequence
}

// BadId returns the 'BadValue' number if one exists for the BadGlyphSet error. If no bad value exists, 0 is returned.
func (err GlyphSetError) BadId() uint32 {
	return 0
}

// Error returns a rudimentary string representation of the BadGlyphSet error.

func (err GlyphSetError) Error() string {
	fieldVals := make([]string, 0, 0)
	fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
	fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence))
	return "BadGlyphSet {" + xgb.StringsJoin(fieldVals, ", ") + "}"
}

func init() {
	xgb.NewExtErrorFuncs["RENDER"][3] = GlyphSetErrorNew
}

type Glyphinfo struct {
	Width  uint16
	Height uint16
	X      int16
	Y      int16
	XOff   int16
	YOff   int16
}

// GlyphinfoRead reads a byte slice into a Glyphinfo value.
func GlyphinfoRead(buf []byte, v *Glyphinfo) int {
	b := 0

	v.Width = xgb.Get16(buf[b:])
	b += 2

	v.Height = xgb.Get16(buf[b:])
	b += 2

	v.X = int16(xgb.Get16(buf[b:]))
	b += 2

	v.Y = int16(xgb.Get16(buf[b:]))
	b += 2

	v.XOff = int16(xgb.Get16(buf[b:]))
	b += 2

	v.YOff = int16(xgb.Get16(buf[b:]))
	b += 2

	return b
}

// GlyphinfoReadList reads a byte slice into a list of Glyphinfo values.
func GlyphinfoReadList(buf []byte, dest []Glyphinfo) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Glyphinfo{}
		b += GlyphinfoRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Glyphinfo value to a byte slice.
func (v Glyphinfo) Bytes() []byte {
	buf := make([]byte, 12)
	b := 0

	xgb.Put16(buf[b:], v.Width)
	b += 2

	xgb.Put16(buf[b:], v.Height)
	b += 2

	xgb.Put16(buf[b:], uint16(v.X))
	b += 2

	xgb.Put16(buf[b:], uint16(v.Y))
	b += 2

	xgb.Put16(buf[b:], uint16(v.XOff))
	b += 2

	xgb.Put16(buf[b:], uint16(v.YOff))
	b += 2

	return buf[:b]
}

// GlyphinfoListBytes writes a list of Glyphinfo values to a byte slice.
func GlyphinfoListBytes(buf []byte, list []Glyphinfo) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

type Glyphset uint32

func NewGlyphsetId(c *xgb.Conn) (Glyphset, error) {
	id, err := c.NewId()
	if err != nil {
		return 0, err
	}
	return Glyphset(id), nil
}

type Indexvalue struct {
	Pixel uint32
	Red   uint16
	Green uint16
	Blue  uint16
	Alpha uint16
}

// IndexvalueRead reads a byte slice into a Indexvalue value.
func IndexvalueRead(buf []byte, v *Indexvalue) int {
	b := 0

	v.Pixel = xgb.Get32(buf[b:])
	b += 4

	v.Red = xgb.Get16(buf[b:])
	b += 2

	v.Green = xgb.Get16(buf[b:])
	b += 2

	v.Blue = xgb.Get16(buf[b:])
	b += 2

	v.Alpha = xgb.Get16(buf[b:])
	b += 2

	return b
}

// IndexvalueReadList reads a byte slice into a list of Indexvalue values.
func IndexvalueReadList(buf []byte, dest []Indexvalue) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Indexvalue{}
		b += IndexvalueRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Indexvalue value to a byte slice.
func (v Indexvalue) Bytes() []byte {
	buf := make([]byte, 12)
	b := 0

	xgb.Put32(buf[b:], v.Pixel)
	b += 4

	xgb.Put16(buf[b:], v.Red)
	b += 2

	xgb.Put16(buf[b:], v.Green)
	b += 2

	xgb.Put16(buf[b:], v.Blue)
	b += 2

	xgb.Put16(buf[b:], v.Alpha)
	b += 2

	return buf[:b]
}

// IndexvalueListBytes writes a list of Indexvalue values to a byte slice.
func IndexvalueListBytes(buf []byte, list []Indexvalue) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

type Linefix struct {
	P1 Pointfix
	P2 Pointfix
}

// LinefixRead reads a byte slice into a Linefix value.
func LinefixRead(buf []byte, v *Linefix) int {
	b := 0

	v.P1 = Pointfix{}
	b += PointfixRead(buf[b:], &v.P1)

	v.P2 = Pointfix{}
	b += PointfixRead(buf[b:], &v.P2)

	return b
}

// LinefixReadList reads a byte slice into a list of Linefix values.
func LinefixReadList(buf []byte, dest []Linefix) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Linefix{}
		b += LinefixRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Linefix value to a byte slice.
func (v Linefix) Bytes() []byte {
	buf := make([]byte, 16)
	b := 0

	{
		structBytes := v.P1.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	{
		structBytes := v.P2.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	return buf[:b]
}

// LinefixListBytes writes a list of Linefix values to a byte slice.
func LinefixListBytes(buf []byte, list []Linefix) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

// BadPictFormat is the error number for a BadPictFormat.
const BadPictFormat = 0

type PictFormatError struct {
	Sequence uint16
	NiceName string
}

// PictFormatErrorNew constructs a PictFormatError value that implements xgb.Error from a byte slice.
func PictFormatErrorNew(buf []byte) xgb.Error {
	v := PictFormatError{}
	v.NiceName = "PictFormat"

	b := 1 // skip error determinant
	b += 1 // don't read error number

	v.Sequence = xgb.Get16(buf[b:])
	b += 2

	return v
}

// SequenceId returns the sequence id attached to the BadPictFormat error.
// This is mostly used internally.
func (err PictFormatError) SequenceId() uint16 {
	return err.Sequence
}

// BadId returns the 'BadValue' number if one exists for the BadPictFormat error. If no bad value exists, 0 is returned.
func (err PictFormatError) BadId() uint32 {
	return 0
}

// Error returns a rudimentary string representation of the BadPictFormat error.

func (err PictFormatError) Error() string {
	fieldVals := make([]string, 0, 0)
	fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
	fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence))
	return "BadPictFormat {" + xgb.StringsJoin(fieldVals, ", ") + "}"
}

func init() {
	xgb.NewExtErrorFuncs["RENDER"][0] = PictFormatErrorNew
}

// BadPictOp is the error number for a BadPictOp.
const BadPictOp = 2

type PictOpError struct {
	Sequence uint16
	NiceName string
}

// PictOpErrorNew constructs a PictOpError value that implements xgb.Error from a byte slice.
func PictOpErrorNew(buf []byte) xgb.Error {
	v := PictOpError{}
	v.NiceName = "PictOp"

	b := 1 // skip error determinant
	b += 1 // don't read error number

	v.Sequence = xgb.Get16(buf[b:])
	b += 2

	return v
}

// SequenceId returns the sequence id attached to the BadPictOp error.
// This is mostly used internally.
func (err PictOpError) SequenceId() uint16 {
	return err.Sequence
}

// BadId returns the 'BadValue' number if one exists for the BadPictOp error. If no bad value exists, 0 is returned.
func (err PictOpError) BadId() uint32 {
	return 0
}

// Error returns a rudimentary string representation of the BadPictOp error.

func (err PictOpError) Error() string {
	fieldVals := make([]string, 0, 0)
	fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
	fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence))
	return "BadPictOp {" + xgb.StringsJoin(fieldVals, ", ") + "}"
}

func init() {
	xgb.NewExtErrorFuncs["RENDER"][2] = PictOpErrorNew
}

const (
	PictOpClear               = 0
	PictOpSrc                 = 1
	PictOpDst                 = 2
	PictOpOver                = 3
	PictOpOverReverse         = 4
	PictOpIn                  = 5
	PictOpInReverse           = 6
	PictOpOut                 = 7
	PictOpOutReverse          = 8
	PictOpAtop                = 9
	PictOpAtopReverse         = 10
	PictOpXor                 = 11
	PictOpAdd                 = 12
	PictOpSaturate            = 13
	PictOpDisjointClear       = 16
	PictOpDisjointSrc         = 17
	PictOpDisjointDst         = 18
	PictOpDisjointOver        = 19
	PictOpDisjointOverReverse = 20
	PictOpDisjointIn          = 21
	PictOpDisjointInReverse   = 22
	PictOpDisjointOut         = 23
	PictOpDisjointOutReverse  = 24
	PictOpDisjointAtop        = 25
	PictOpDisjointAtopReverse = 26
	PictOpDisjointXor         = 27
	PictOpConjointClear       = 32
	PictOpConjointSrc         = 33
	PictOpConjointDst         = 34
	PictOpConjointOver        = 35
	PictOpConjointOverReverse = 36
	PictOpConjointIn          = 37
	PictOpConjointInReverse   = 38
	PictOpConjointOut         = 39
	PictOpConjointOutReverse  = 40
	PictOpConjointAtop        = 41
	PictOpConjointAtopReverse = 42
	PictOpConjointXor         = 43
	PictOpMultiply            = 48
	PictOpScreen              = 49
	PictOpOverlay             = 50
	PictOpDarken              = 51
	PictOpLighten             = 52
	PictOpColorDodge          = 53
	PictOpColorBurn           = 54
	PictOpHardLight           = 55
	PictOpSoftLight           = 56
	PictOpDifference          = 57
	PictOpExclusion           = 58
	PictOpHSLHue              = 59
	PictOpHSLSaturation       = 60
	PictOpHSLColor            = 61
	PictOpHSLLuminosity       = 62
)

const (
	PictTypeIndexed = 0
	PictTypeDirect  = 1
)

type Pictdepth struct {
	Depth byte
	// padding: 1 bytes
	NumVisuals uint16
	// padding: 4 bytes
	Visuals []Pictvisual // size: xgb.Pad((int(NumVisuals) * 8))
}

// PictdepthRead reads a byte slice into a Pictdepth value.
func PictdepthRead(buf []byte, v *Pictdepth) int {
	b := 0

	v.Depth = buf[b]
	b += 1

	b += 1 // padding

	v.NumVisuals = xgb.Get16(buf[b:])
	b += 2

	b += 4 // padding

	v.Visuals = make([]Pictvisual, v.NumVisuals)
	b += PictvisualReadList(buf[b:], v.Visuals)

	return b
}

// PictdepthReadList reads a byte slice into a list of Pictdepth values.
func PictdepthReadList(buf []byte, dest []Pictdepth) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Pictdepth{}
		b += PictdepthRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Pictdepth value to a byte slice.
func (v Pictdepth) Bytes() []byte {
	buf := make([]byte, (8 + xgb.Pad((int(v.NumVisuals) * 8))))
	b := 0

	buf[b] = v.Depth
	b += 1

	b += 1 // padding

	xgb.Put16(buf[b:], v.NumVisuals)
	b += 2

	b += 4 // padding

	b += PictvisualListBytes(buf[b:], v.Visuals)

	return buf[:b]
}

// PictdepthListBytes writes a list of Pictdepth values to a byte slice.
func PictdepthListBytes(buf []byte, list []Pictdepth) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

// PictdepthListSize computes the size (bytes) of a list of Pictdepth values.
func PictdepthListSize(list []Pictdepth) int {
	size := 0
	for _, item := range list {
		size += (8 + xgb.Pad((int(item.NumVisuals) * 8)))
	}
	return size
}

type Pictformat uint32

func NewPictformatId(c *xgb.Conn) (Pictformat, error) {
	id, err := c.NewId()
	if err != nil {
		return 0, err
	}
	return Pictformat(id), nil
}

type Pictforminfo struct {
	Id    Pictformat
	Type  byte
	Depth byte
	// padding: 2 bytes
	Direct   Directformat
	Colormap xproto.Colormap
}

// PictforminfoRead reads a byte slice into a Pictforminfo value.
func PictforminfoRead(buf []byte, v *Pictforminfo) int {
	b := 0

	v.Id = Pictformat(xgb.Get32(buf[b:]))
	b += 4

	v.Type = buf[b]
	b += 1

	v.Depth = buf[b]
	b += 1

	b += 2 // padding

	v.Direct = Directformat{}
	b += DirectformatRead(buf[b:], &v.Direct)

	v.Colormap = xproto.Colormap(xgb.Get32(buf[b:]))
	b += 4

	return b
}

// PictforminfoReadList reads a byte slice into a list of Pictforminfo values.
func PictforminfoReadList(buf []byte, dest []Pictforminfo) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Pictforminfo{}
		b += PictforminfoRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Pictforminfo value to a byte slice.
func (v Pictforminfo) Bytes() []byte {
	buf := make([]byte, 28)
	b := 0

	xgb.Put32(buf[b:], uint32(v.Id))
	b += 4

	buf[b] = v.Type
	b += 1

	buf[b] = v.Depth
	b += 1

	b += 2 // padding

	{
		structBytes := v.Direct.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	xgb.Put32(buf[b:], uint32(v.Colormap))
	b += 4

	return buf[:b]
}

// PictforminfoListBytes writes a list of Pictforminfo values to a byte slice.
func PictforminfoListBytes(buf []byte, list []Pictforminfo) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

type Pictscreen struct {
	NumDepths uint32
	Fallback  Pictformat
	Depths    []Pictdepth // size: PictdepthListSize(Depths)
}

// PictscreenRead reads a byte slice into a Pictscreen value.
func PictscreenRead(buf []byte, v *Pictscreen) int {
	b := 0

	v.NumDepths = xgb.Get32(buf[b:])
	b += 4

	v.Fallback = Pictformat(xgb.Get32(buf[b:]))
	b += 4

	v.Depths = make([]Pictdepth, v.NumDepths)
	b += PictdepthReadList(buf[b:], v.Depths)

	return b
}

// PictscreenReadList reads a byte slice into a list of Pictscreen values.
func PictscreenReadList(buf []byte, dest []Pictscreen) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Pictscreen{}
		b += PictscreenRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Pictscreen value to a byte slice.
func (v Pictscreen) Bytes() []byte {
	buf := make([]byte, (8 + PictdepthListSize(v.Depths)))
	b := 0

	xgb.Put32(buf[b:], v.NumDepths)
	b += 4

	xgb.Put32(buf[b:], uint32(v.Fallback))
	b += 4

	b += PictdepthListBytes(buf[b:], v.Depths)

	return buf[:b]
}

// PictscreenListBytes writes a list of Pictscreen values to a byte slice.
func PictscreenListBytes(buf []byte, list []Pictscreen) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

// PictscreenListSize computes the size (bytes) of a list of Pictscreen values.
func PictscreenListSize(list []Pictscreen) int {
	size := 0
	for _, item := range list {
		size += (8 + PictdepthListSize(item.Depths))
	}
	return size
}

type Picture uint32

func NewPictureId(c *xgb.Conn) (Picture, error) {
	id, err := c.NewId()
	if err != nil {
		return 0, err
	}
	return Picture(id), nil
}

// BadPicture is the error number for a BadPicture.
const BadPicture = 1

type PictureError struct {
	Sequence uint16
	NiceName string
}

// PictureErrorNew constructs a PictureError value that implements xgb.Error from a byte slice.
func PictureErrorNew(buf []byte) xgb.Error {
	v := PictureError{}
	v.NiceName = "Picture"

	b := 1 // skip error determinant
	b += 1 // don't read error number

	v.Sequence = xgb.Get16(buf[b:])
	b += 2

	return v
}

// SequenceId returns the sequence id attached to the BadPicture error.
// This is mostly used internally.
func (err PictureError) SequenceId() uint16 {
	return err.Sequence
}

// BadId returns the 'BadValue' number if one exists for the BadPicture error. If no bad value exists, 0 is returned.
func (err PictureError) BadId() uint32 {
	return 0
}

// Error returns a rudimentary string representation of the BadPicture error.

func (err PictureError) Error() string {
	fieldVals := make([]string, 0, 0)
	fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
	fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence))
	return "BadPicture {" + xgb.StringsJoin(fieldVals, ", ") + "}"
}

func init() {
	xgb.NewExtErrorFuncs["RENDER"][1] = PictureErrorNew
}

const (
	PictureNone = 0
)

type Pictvisual struct {
	Visual xproto.Visualid
	Format Pictformat
}

// PictvisualRead reads a byte slice into a Pictvisual value.
func PictvisualRead(buf []byte, v *Pictvisual) int {
	b := 0

	v.Visual = xproto.Visualid(xgb.Get32(buf[b:]))
	b += 4

	v.Format = Pictformat(xgb.Get32(buf[b:]))
	b += 4

	return b
}

// PictvisualReadList reads a byte slice into a list of Pictvisual values.
func PictvisualReadList(buf []byte, dest []Pictvisual) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Pictvisual{}
		b += PictvisualRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Pictvisual value to a byte slice.
func (v Pictvisual) Bytes() []byte {
	buf := make([]byte, 8)
	b := 0

	xgb.Put32(buf[b:], uint32(v.Visual))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Format))
	b += 4

	return buf[:b]
}

// PictvisualListBytes writes a list of Pictvisual values to a byte slice.
func PictvisualListBytes(buf []byte, list []Pictvisual) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

type Pointfix struct {
	X Fixed
	Y Fixed
}

// PointfixRead reads a byte slice into a Pointfix value.
func PointfixRead(buf []byte, v *Pointfix) int {
	b := 0

	v.X = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Y = Fixed(xgb.Get32(buf[b:]))
	b += 4

	return b
}

// PointfixReadList reads a byte slice into a list of Pointfix values.
func PointfixReadList(buf []byte, dest []Pointfix) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Pointfix{}
		b += PointfixRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Pointfix value to a byte slice.
func (v Pointfix) Bytes() []byte {
	buf := make([]byte, 8)
	b := 0

	xgb.Put32(buf[b:], uint32(v.X))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Y))
	b += 4

	return buf[:b]
}

// PointfixListBytes writes a list of Pointfix values to a byte slice.
func PointfixListBytes(buf []byte, list []Pointfix) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

const (
	PolyEdgeSharp  = 0
	PolyEdgeSmooth = 1
)

const (
	PolyModePrecise   = 0
	PolyModeImprecise = 1
)

const (
	RepeatNone    = 0
	RepeatNormal  = 1
	RepeatPad     = 2
	RepeatReflect = 3
)

type Spanfix struct {
	L Fixed
	R Fixed
	Y Fixed
}

// SpanfixRead reads a byte slice into a Spanfix value.
func SpanfixRead(buf []byte, v *Spanfix) int {
	b := 0

	v.L = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.R = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Y = Fixed(xgb.Get32(buf[b:]))
	b += 4

	return b
}

// SpanfixReadList reads a byte slice into a list of Spanfix values.
func SpanfixReadList(buf []byte, dest []Spanfix) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Spanfix{}
		b += SpanfixRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Spanfix value to a byte slice.
func (v Spanfix) Bytes() []byte {
	buf := make([]byte, 12)
	b := 0

	xgb.Put32(buf[b:], uint32(v.L))
	b += 4

	xgb.Put32(buf[b:], uint32(v.R))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Y))
	b += 4

	return buf[:b]
}

// SpanfixListBytes writes a list of Spanfix values to a byte slice.
func SpanfixListBytes(buf []byte, list []Spanfix) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

const (
	SubPixelUnknown       = 0
	SubPixelHorizontalRGB = 1
	SubPixelHorizontalBGR = 2
	SubPixelVerticalRGB   = 3
	SubPixelVerticalBGR   = 4
	SubPixelNone          = 5
)

type Transform struct {
	Matrix11 Fixed
	Matrix12 Fixed
	Matrix13 Fixed
	Matrix21 Fixed
	Matrix22 Fixed
	Matrix23 Fixed
	Matrix31 Fixed
	Matrix32 Fixed
	Matrix33 Fixed
}

// TransformRead reads a byte slice into a Transform value.
func TransformRead(buf []byte, v *Transform) int {
	b := 0

	v.Matrix11 = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Matrix12 = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Matrix13 = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Matrix21 = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Matrix22 = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Matrix23 = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Matrix31 = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Matrix32 = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Matrix33 = Fixed(xgb.Get32(buf[b:]))
	b += 4

	return b
}

// TransformReadList reads a byte slice into a list of Transform values.
func TransformReadList(buf []byte, dest []Transform) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Transform{}
		b += TransformRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Transform value to a byte slice.
func (v Transform) Bytes() []byte {
	buf := make([]byte, 36)
	b := 0

	xgb.Put32(buf[b:], uint32(v.Matrix11))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Matrix12))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Matrix13))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Matrix21))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Matrix22))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Matrix23))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Matrix31))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Matrix32))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Matrix33))
	b += 4

	return buf[:b]
}

// TransformListBytes writes a list of Transform values to a byte slice.
func TransformListBytes(buf []byte, list []Transform) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

type Trap struct {
	Top Spanfix
	Bot Spanfix
}

// TrapRead reads a byte slice into a Trap value.
func TrapRead(buf []byte, v *Trap) int {
	b := 0

	v.Top = Spanfix{}
	b += SpanfixRead(buf[b:], &v.Top)

	v.Bot = Spanfix{}
	b += SpanfixRead(buf[b:], &v.Bot)

	return b
}

// TrapReadList reads a byte slice into a list of Trap values.
func TrapReadList(buf []byte, dest []Trap) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Trap{}
		b += TrapRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Trap value to a byte slice.
func (v Trap) Bytes() []byte {
	buf := make([]byte, 24)
	b := 0

	{
		structBytes := v.Top.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	{
		structBytes := v.Bot.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	return buf[:b]
}

// TrapListBytes writes a list of Trap values to a byte slice.
func TrapListBytes(buf []byte, list []Trap) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

type Trapezoid struct {
	Top    Fixed
	Bottom Fixed
	Left   Linefix
	Right  Linefix
}

// TrapezoidRead reads a byte slice into a Trapezoid value.
func TrapezoidRead(buf []byte, v *Trapezoid) int {
	b := 0

	v.Top = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Bottom = Fixed(xgb.Get32(buf[b:]))
	b += 4

	v.Left = Linefix{}
	b += LinefixRead(buf[b:], &v.Left)

	v.Right = Linefix{}
	b += LinefixRead(buf[b:], &v.Right)

	return b
}

// TrapezoidReadList reads a byte slice into a list of Trapezoid values.
func TrapezoidReadList(buf []byte, dest []Trapezoid) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Trapezoid{}
		b += TrapezoidRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Trapezoid value to a byte slice.
func (v Trapezoid) Bytes() []byte {
	buf := make([]byte, 40)
	b := 0

	xgb.Put32(buf[b:], uint32(v.Top))
	b += 4

	xgb.Put32(buf[b:], uint32(v.Bottom))
	b += 4

	{
		structBytes := v.Left.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	{
		structBytes := v.Right.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	return buf[:b]
}

// TrapezoidListBytes writes a list of Trapezoid values to a byte slice.
func TrapezoidListBytes(buf []byte, list []Trapezoid) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

type Triangle struct {
	P1 Pointfix
	P2 Pointfix
	P3 Pointfix
}

// TriangleRead reads a byte slice into a Triangle value.
func TriangleRead(buf []byte, v *Triangle) int {
	b := 0

	v.P1 = Pointfix{}
	b += PointfixRead(buf[b:], &v.P1)

	v.P2 = Pointfix{}
	b += PointfixRead(buf[b:], &v.P2)

	v.P3 = Pointfix{}
	b += PointfixRead(buf[b:], &v.P3)

	return b
}

// TriangleReadList reads a byte slice into a list of Triangle values.
func TriangleReadList(buf []byte, dest []Triangle) int {
	b := 0
	for i := 0; i < len(dest); i++ {
		dest[i] = Triangle{}
		b += TriangleRead(buf[b:], &dest[i])
	}
	return xgb.Pad(b)
}

// Bytes writes a Triangle value to a byte slice.
func (v Triangle) Bytes() []byte {
	buf := make([]byte, 24)
	b := 0

	{
		structBytes := v.P1.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	{
		structBytes := v.P2.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	{
		structBytes := v.P3.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	return buf[:b]
}

// TriangleListBytes writes a list of Triangle values to a byte slice.
func TriangleListBytes(buf []byte, list []Triangle) int {
	b := 0
	var structBytes []byte
	for _, item := range list {
		structBytes = item.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}
	return xgb.Pad(b)
}

// Skipping definition for base type 'Bool'

// Skipping definition for base type 'Byte'

// Skipping definition for base type 'Card8'

// Skipping definition for base type 'Char'

// Skipping definition for base type 'Void'

// Skipping definition for base type 'Double'

// Skipping definition for base type 'Float'

// Skipping definition for base type 'Int16'

// Skipping definition for base type 'Int32'

// Skipping definition for base type 'Int8'

// Skipping definition for base type 'Card16'

// Skipping definition for base type 'Card32'

// AddGlyphsCookie is a cookie used only for AddGlyphs requests.
type AddGlyphsCookie struct {
	*xgb.Cookie
}

// AddGlyphs sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func AddGlyphs(c *xgb.Conn, Glyphset Glyphset, GlyphsLen uint32, Glyphids []uint32, Glyphs []Glyphinfo, Data []byte) AddGlyphsCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'AddGlyphs' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(addGlyphsRequest(c, Glyphset, GlyphsLen, Glyphids, Glyphs, Data), cookie)
	return AddGlyphsCookie{cookie}
}

// AddGlyphsChecked sends a checked request.
// If an error occurs, it can be retrieved using AddGlyphsCookie.Check()
func AddGlyphsChecked(c *xgb.Conn, Glyphset Glyphset, GlyphsLen uint32, Glyphids []uint32, Glyphs []Glyphinfo, Data []byte) AddGlyphsCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'AddGlyphs' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(addGlyphsRequest(c, Glyphset, GlyphsLen, Glyphids, Glyphs, Data), cookie)
	return AddGlyphsCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook AddGlyphsCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for AddGlyphs
// addGlyphsRequest writes a AddGlyphs request to a byte slice.
func addGlyphsRequest(c *xgb.Conn, Glyphset Glyphset, GlyphsLen uint32, Glyphids []uint32, Glyphs []Glyphinfo, Data []byte) []byte {
	size := xgb.Pad(((((12 + xgb.Pad((int(GlyphsLen) * 4))) + 4) + xgb.Pad((int(GlyphsLen) * 12))) + xgb.Pad((len(Data) * 1))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 20 // request opcode
	b += 1

	blen := b
	b += 2

	xgb.Put32(buf[b:], uint32(Glyphset))
	b += 4

	xgb.Put32(buf[b:], GlyphsLen)
	b += 4

	for i := 0; i < int(GlyphsLen); i++ {
		xgb.Put32(buf[b:], Glyphids[i])
		b += 4
	}

	b = (b + 3) & ^3 // alignment gap

	b += GlyphinfoListBytes(buf[b:], Glyphs)

	copy(buf[b:], Data[:len(Data)])
	b += int(len(Data))

	b = xgb.Pad(b)
	xgb.Put16(buf[blen:], uint16(b/4)) // write request size in 4-byte units
	return buf[:b]
}

// AddTrapsCookie is a cookie used only for AddTraps requests.
type AddTrapsCookie struct {
	*xgb.Cookie
}

// AddTraps sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func AddTraps(c *xgb.Conn, Picture Picture, XOff int16, YOff int16, Traps []Trap) AddTrapsCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'AddTraps' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(addTrapsRequest(c, Picture, XOff, YOff, Traps), cookie)
	return AddTrapsCookie{cookie}
}

// AddTrapsChecked sends a checked request.
// If an error occurs, it can be retrieved using AddTrapsCookie.Check()
func AddTrapsChecked(c *xgb.Conn, Picture Picture, XOff int16, YOff int16, Traps []Trap) AddTrapsCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'AddTraps' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(addTrapsRequest(c, Picture, XOff, YOff, Traps), cookie)
	return AddTrapsCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook AddTrapsCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for AddTraps
// addTrapsRequest writes a AddTraps request to a byte slice.
func addTrapsRequest(c *xgb.Conn, Picture Picture, XOff int16, YOff int16, Traps []Trap) []byte {
	size := xgb.Pad((12 + xgb.Pad((len(Traps) * 24))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 32 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Picture))
	b += 4

	xgb.Put16(buf[b:], uint16(XOff))
	b += 2

	xgb.Put16(buf[b:], uint16(YOff))
	b += 2

	b += TrapListBytes(buf[b:], Traps)

	return buf
}

// ChangePictureCookie is a cookie used only for ChangePicture requests.
type ChangePictureCookie struct {
	*xgb.Cookie
}

// ChangePicture sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func ChangePicture(c *xgb.Conn, Picture Picture, ValueMask uint32, ValueList []uint32) ChangePictureCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'ChangePicture' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(changePictureRequest(c, Picture, ValueMask, ValueList), cookie)
	return ChangePictureCookie{cookie}
}

// ChangePictureChecked sends a checked request.
// If an error occurs, it can be retrieved using ChangePictureCookie.Check()
func ChangePictureChecked(c *xgb.Conn, Picture Picture, ValueMask uint32, ValueList []uint32) ChangePictureCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'ChangePicture' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(changePictureRequest(c, Picture, ValueMask, ValueList), cookie)
	return ChangePictureCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook ChangePictureCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for ChangePicture
// changePictureRequest writes a ChangePicture request to a byte slice.
func changePictureRequest(c *xgb.Conn, Picture Picture, ValueMask uint32, ValueList []uint32) []byte {
	size := xgb.Pad((8 + (4 + xgb.Pad((4 * xgb.PopCount(int(ValueMask)))))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 5 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Picture))
	b += 4

	xgb.Put32(buf[b:], ValueMask)
	b += 4
	for i := 0; i < xgb.PopCount(int(ValueMask)); i++ {
		xgb.Put32(buf[b:], ValueList[i])
		b += 4
	}
	b = xgb.Pad(b)

	return buf
}

// CompositeCookie is a cookie used only for Composite requests.
type CompositeCookie struct {
	*xgb.Cookie
}

// Composite sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func Composite(c *xgb.Conn, Op byte, Src Picture, Mask Picture, Dst Picture, SrcX int16, SrcY int16, MaskX int16, MaskY int16, DstX int16, DstY int16, Width uint16, Height uint16) CompositeCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'Composite' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(compositeRequest(c, Op, Src, Mask, Dst, SrcX, SrcY, MaskX, MaskY, DstX, DstY, Width, Height), cookie)
	return CompositeCookie{cookie}
}

// CompositeChecked sends a checked request.
// If an error occurs, it can be retrieved using CompositeCookie.Check()
func CompositeChecked(c *xgb.Conn, Op byte, Src Picture, Mask Picture, Dst Picture, SrcX int16, SrcY int16, MaskX int16, MaskY int16, DstX int16, DstY int16, Width uint16, Height uint16) CompositeCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'Composite' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(compositeRequest(c, Op, Src, Mask, Dst, SrcX, SrcY, MaskX, MaskY, DstX, DstY, Width, Height), cookie)
	return CompositeCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CompositeCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for Composite
// compositeRequest writes a Composite request to a byte slice.
func compositeRequest(c *xgb.Conn, Op byte, Src Picture, Mask Picture, Dst Picture, SrcX int16, SrcY int16, MaskX int16, MaskY int16, DstX int16, DstY int16, Width uint16, Height uint16) []byte {
	size := 36
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 8 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	buf[b] = Op
	b += 1

	b += 3 // padding

	xgb.Put32(buf[b:], uint32(Src))
	b += 4

	xgb.Put32(buf[b:], uint32(Mask))
	b += 4

	xgb.Put32(buf[b:], uint32(Dst))
	b += 4

	xgb.Put16(buf[b:], uint16(SrcX))
	b += 2

	xgb.Put16(buf[b:], uint16(SrcY))
	b += 2

	xgb.Put16(buf[b:], uint16(MaskX))
	b += 2

	xgb.Put16(buf[b:], uint16(MaskY))
	b += 2

	xgb.Put16(buf[b:], uint16(DstX))
	b += 2

	xgb.Put16(buf[b:], uint16(DstY))
	b += 2

	xgb.Put16(buf[b:], Width)
	b += 2

	xgb.Put16(buf[b:], Height)
	b += 2

	return buf
}

// CompositeGlyphs16Cookie is a cookie used only for CompositeGlyphs16 requests.
type CompositeGlyphs16Cookie struct {
	*xgb.Cookie
}

// CompositeGlyphs16 sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CompositeGlyphs16(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, Glyphset Glyphset, SrcX int16, SrcY int16, Glyphcmds []byte) CompositeGlyphs16Cookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CompositeGlyphs16' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(compositeGlyphs16Request(c, Op, Src, Dst, MaskFormat, Glyphset, SrcX, SrcY, Glyphcmds), cookie)
	return CompositeGlyphs16Cookie{cookie}
}

// CompositeGlyphs16Checked sends a checked request.
// If an error occurs, it can be retrieved using CompositeGlyphs16Cookie.Check()
func CompositeGlyphs16Checked(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, Glyphset Glyphset, SrcX int16, SrcY int16, Glyphcmds []byte) CompositeGlyphs16Cookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CompositeGlyphs16' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(compositeGlyphs16Request(c, Op, Src, Dst, MaskFormat, Glyphset, SrcX, SrcY, Glyphcmds), cookie)
	return CompositeGlyphs16Cookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CompositeGlyphs16Cookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CompositeGlyphs16
// compositeGlyphs16Request writes a CompositeGlyphs16 request to a byte slice.
func compositeGlyphs16Request(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, Glyphset Glyphset, SrcX int16, SrcY int16, Glyphcmds []byte) []byte {
	size := xgb.Pad((28 + xgb.Pad((len(Glyphcmds) * 1))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 24 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	buf[b] = Op
	b += 1

	b += 3 // padding

	xgb.Put32(buf[b:], uint32(Src))
	b += 4

	xgb.Put32(buf[b:], uint32(Dst))
	b += 4

	xgb.Put32(buf[b:], uint32(MaskFormat))
	b += 4

	xgb.Put32(buf[b:], uint32(Glyphset))
	b += 4

	xgb.Put16(buf[b:], uint16(SrcX))
	b += 2

	xgb.Put16(buf[b:], uint16(SrcY))
	b += 2

	copy(buf[b:], Glyphcmds[:len(Glyphcmds)])
	b += int(len(Glyphcmds))

	return buf
}

// CompositeGlyphs32Cookie is a cookie used only for CompositeGlyphs32 requests.
type CompositeGlyphs32Cookie struct {
	*xgb.Cookie
}

// CompositeGlyphs32 sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CompositeGlyphs32(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, Glyphset Glyphset, SrcX int16, SrcY int16, Glyphcmds []byte) CompositeGlyphs32Cookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CompositeGlyphs32' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(compositeGlyphs32Request(c, Op, Src, Dst, MaskFormat, Glyphset, SrcX, SrcY, Glyphcmds), cookie)
	return CompositeGlyphs32Cookie{cookie}
}

// CompositeGlyphs32Checked sends a checked request.
// If an error occurs, it can be retrieved using CompositeGlyphs32Cookie.Check()
func CompositeGlyphs32Checked(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, Glyphset Glyphset, SrcX int16, SrcY int16, Glyphcmds []byte) CompositeGlyphs32Cookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CompositeGlyphs32' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(compositeGlyphs32Request(c, Op, Src, Dst, MaskFormat, Glyphset, SrcX, SrcY, Glyphcmds), cookie)
	return CompositeGlyphs32Cookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CompositeGlyphs32Cookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CompositeGlyphs32
// compositeGlyphs32Request writes a CompositeGlyphs32 request to a byte slice.
func compositeGlyphs32Request(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, Glyphset Glyphset, SrcX int16, SrcY int16, Glyphcmds []byte) []byte {
	size := xgb.Pad((28 + xgb.Pad((len(Glyphcmds) * 1))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 25 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	buf[b] = Op
	b += 1

	b += 3 // padding

	xgb.Put32(buf[b:], uint32(Src))
	b += 4

	xgb.Put32(buf[b:], uint32(Dst))
	b += 4

	xgb.Put32(buf[b:], uint32(MaskFormat))
	b += 4

	xgb.Put32(buf[b:], uint32(Glyphset))
	b += 4

	xgb.Put16(buf[b:], uint16(SrcX))
	b += 2

	xgb.Put16(buf[b:], uint16(SrcY))
	b += 2

	copy(buf[b:], Glyphcmds[:len(Glyphcmds)])
	b += int(len(Glyphcmds))

	return buf
}

// CompositeGlyphs8Cookie is a cookie used only for CompositeGlyphs8 requests.
type CompositeGlyphs8Cookie struct {
	*xgb.Cookie
}

// CompositeGlyphs8 sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CompositeGlyphs8(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, Glyphset Glyphset, SrcX int16, SrcY int16, Glyphcmds []byte) CompositeGlyphs8Cookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CompositeGlyphs8' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(compositeGlyphs8Request(c, Op, Src, Dst, MaskFormat, Glyphset, SrcX, SrcY, Glyphcmds), cookie)
	return CompositeGlyphs8Cookie{cookie}
}

// CompositeGlyphs8Checked sends a checked request.
// If an error occurs, it can be retrieved using CompositeGlyphs8Cookie.Check()
func CompositeGlyphs8Checked(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, Glyphset Glyphset, SrcX int16, SrcY int16, Glyphcmds []byte) CompositeGlyphs8Cookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CompositeGlyphs8' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(compositeGlyphs8Request(c, Op, Src, Dst, MaskFormat, Glyphset, SrcX, SrcY, Glyphcmds), cookie)
	return CompositeGlyphs8Cookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CompositeGlyphs8Cookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CompositeGlyphs8
// compositeGlyphs8Request writes a CompositeGlyphs8 request to a byte slice.
func compositeGlyphs8Request(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, Glyphset Glyphset, SrcX int16, SrcY int16, Glyphcmds []byte) []byte {
	size := xgb.Pad((28 + xgb.Pad((len(Glyphcmds) * 1))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 23 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	buf[b] = Op
	b += 1

	b += 3 // padding

	xgb.Put32(buf[b:], uint32(Src))
	b += 4

	xgb.Put32(buf[b:], uint32(Dst))
	b += 4

	xgb.Put32(buf[b:], uint32(MaskFormat))
	b += 4

	xgb.Put32(buf[b:], uint32(Glyphset))
	b += 4

	xgb.Put16(buf[b:], uint16(SrcX))
	b += 2

	xgb.Put16(buf[b:], uint16(SrcY))
	b += 2

	copy(buf[b:], Glyphcmds[:len(Glyphcmds)])
	b += int(len(Glyphcmds))

	return buf
}

// CreateAnimCursorCookie is a cookie used only for CreateAnimCursor requests.
type CreateAnimCursorCookie struct {
	*xgb.Cookie
}

// CreateAnimCursor sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CreateAnimCursor(c *xgb.Conn, Cid xproto.Cursor, Cursors []Animcursorelt) CreateAnimCursorCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateAnimCursor' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(createAnimCursorRequest(c, Cid, Cursors), cookie)
	return CreateAnimCursorCookie{cookie}
}

// CreateAnimCursorChecked sends a checked request.
// If an error occurs, it can be retrieved using CreateAnimCursorCookie.Check()
func CreateAnimCursorChecked(c *xgb.Conn, Cid xproto.Cursor, Cursors []Animcursorelt) CreateAnimCursorCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateAnimCursor' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(createAnimCursorRequest(c, Cid, Cursors), cookie)
	return CreateAnimCursorCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CreateAnimCursorCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CreateAnimCursor
// createAnimCursorRequest writes a CreateAnimCursor request to a byte slice.
func createAnimCursorRequest(c *xgb.Conn, Cid xproto.Cursor, Cursors []Animcursorelt) []byte {
	size := xgb.Pad((8 + xgb.Pad((len(Cursors) * 8))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 31 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Cid))
	b += 4

	b += AnimcursoreltListBytes(buf[b:], Cursors)

	return buf
}

// CreateConicalGradientCookie is a cookie used only for CreateConicalGradient requests.
type CreateConicalGradientCookie struct {
	*xgb.Cookie
}

// CreateConicalGradient sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CreateConicalGradient(c *xgb.Conn, Picture Picture, Center Pointfix, Angle Fixed, NumStops uint32, Stops []Fixed, Colors []Color) CreateConicalGradientCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateConicalGradient' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(createConicalGradientRequest(c, Picture, Center, Angle, NumStops, Stops, Colors), cookie)
	return CreateConicalGradientCookie{cookie}
}

// CreateConicalGradientChecked sends a checked request.
// If an error occurs, it can be retrieved using CreateConicalGradientCookie.Check()
func CreateConicalGradientChecked(c *xgb.Conn, Picture Picture, Center Pointfix, Angle Fixed, NumStops uint32, Stops []Fixed, Colors []Color) CreateConicalGradientCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateConicalGradient' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(createConicalGradientRequest(c, Picture, Center, Angle, NumStops, Stops, Colors), cookie)
	return CreateConicalGradientCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CreateConicalGradientCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CreateConicalGradient
// createConicalGradientRequest writes a CreateConicalGradient request to a byte slice.
func createConicalGradientRequest(c *xgb.Conn, Picture Picture, Center Pointfix, Angle Fixed, NumStops uint32, Stops []Fixed, Colors []Color) []byte {
	size := xgb.Pad((((24 + xgb.Pad((int(NumStops) * 4))) + 4) + xgb.Pad((int(NumStops) * 8))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 36 // request opcode
	b += 1

	blen := b
	b += 2

	xgb.Put32(buf[b:], uint32(Picture))
	b += 4

	{
		structBytes := Center.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	xgb.Put32(buf[b:], uint32(Angle))
	b += 4

	xgb.Put32(buf[b:], NumStops)
	b += 4

	for i := 0; i < int(NumStops); i++ {
		xgb.Put32(buf[b:], uint32(Stops[i]))
		b += 4
	}

	b = (b + 3) & ^3 // alignment gap

	b += ColorListBytes(buf[b:], Colors)

	b = xgb.Pad(b)
	xgb.Put16(buf[blen:], uint16(b/4)) // write request size in 4-byte units
	return buf[:b]
}

// CreateCursorCookie is a cookie used only for CreateCursor requests.
type CreateCursorCookie struct {
	*xgb.Cookie
}

// CreateCursor sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CreateCursor(c *xgb.Conn, Cid xproto.Cursor, Source Picture, X uint16, Y uint16) CreateCursorCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateCursor' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(createCursorRequest(c, Cid, Source, X, Y), cookie)
	return CreateCursorCookie{cookie}
}

// CreateCursorChecked sends a checked request.
// If an error occurs, it can be retrieved using CreateCursorCookie.Check()
func CreateCursorChecked(c *xgb.Conn, Cid xproto.Cursor, Source Picture, X uint16, Y uint16) CreateCursorCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateCursor' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(createCursorRequest(c, Cid, Source, X, Y), cookie)
	return CreateCursorCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CreateCursorCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CreateCursor
// createCursorRequest writes a CreateCursor request to a byte slice.
func createCursorRequest(c *xgb.Conn, Cid xproto.Cursor, Source Picture, X uint16, Y uint16) []byte {
	size := 16
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 27 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Cid))
	b += 4

	xgb.Put32(buf[b:], uint32(Source))
	b += 4

	xgb.Put16(buf[b:], X)
	b += 2

	xgb.Put16(buf[b:], Y)
	b += 2

	return buf
}

// CreateGlyphSetCookie is a cookie used only for CreateGlyphSet requests.
type CreateGlyphSetCookie struct {
	*xgb.Cookie
}

// CreateGlyphSet sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CreateGlyphSet(c *xgb.Conn, Gsid Glyphset, Format Pictformat) CreateGlyphSetCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateGlyphSet' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(createGlyphSetRequest(c, Gsid, Format), cookie)
	return CreateGlyphSetCookie{cookie}
}

// CreateGlyphSetChecked sends a checked request.
// If an error occurs, it can be retrieved using CreateGlyphSetCookie.Check()
func CreateGlyphSetChecked(c *xgb.Conn, Gsid Glyphset, Format Pictformat) CreateGlyphSetCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateGlyphSet' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(createGlyphSetRequest(c, Gsid, Format), cookie)
	return CreateGlyphSetCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CreateGlyphSetCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CreateGlyphSet
// createGlyphSetRequest writes a CreateGlyphSet request to a byte slice.
func createGlyphSetRequest(c *xgb.Conn, Gsid Glyphset, Format Pictformat) []byte {
	size := 12
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 17 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Gsid))
	b += 4

	xgb.Put32(buf[b:], uint32(Format))
	b += 4

	return buf
}

// CreateLinearGradientCookie is a cookie used only for CreateLinearGradient requests.
type CreateLinearGradientCookie struct {
	*xgb.Cookie
}

// CreateLinearGradient sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CreateLinearGradient(c *xgb.Conn, Picture Picture, P1 Pointfix, P2 Pointfix, NumStops uint32, Stops []Fixed, Colors []Color) CreateLinearGradientCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateLinearGradient' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(createLinearGradientRequest(c, Picture, P1, P2, NumStops, Stops, Colors), cookie)
	return CreateLinearGradientCookie{cookie}
}

// CreateLinearGradientChecked sends a checked request.
// If an error occurs, it can be retrieved using CreateLinearGradientCookie.Check()
func CreateLinearGradientChecked(c *xgb.Conn, Picture Picture, P1 Pointfix, P2 Pointfix, NumStops uint32, Stops []Fixed, Colors []Color) CreateLinearGradientCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateLinearGradient' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(createLinearGradientRequest(c, Picture, P1, P2, NumStops, Stops, Colors), cookie)
	return CreateLinearGradientCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CreateLinearGradientCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CreateLinearGradient
// createLinearGradientRequest writes a CreateLinearGradient request to a byte slice.
func createLinearGradientRequest(c *xgb.Conn, Picture Picture, P1 Pointfix, P2 Pointfix, NumStops uint32, Stops []Fixed, Colors []Color) []byte {
	size := xgb.Pad((((28 + xgb.Pad((int(NumStops) * 4))) + 4) + xgb.Pad((int(NumStops) * 8))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 34 // request opcode
	b += 1

	blen := b
	b += 2

	xgb.Put32(buf[b:], uint32(Picture))
	b += 4

	{
		structBytes := P1.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	{
		structBytes := P2.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	xgb.Put32(buf[b:], NumStops)
	b += 4

	for i := 0; i < int(NumStops); i++ {
		xgb.Put32(buf[b:], uint32(Stops[i]))
		b += 4
	}

	b = (b + 3) & ^3 // alignment gap

	b += ColorListBytes(buf[b:], Colors)

	b = xgb.Pad(b)
	xgb.Put16(buf[blen:], uint16(b/4)) // write request size in 4-byte units
	return buf[:b]
}

// CreatePictureCookie is a cookie used only for CreatePicture requests.
type CreatePictureCookie struct {
	*xgb.Cookie
}

// CreatePicture sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CreatePicture(c *xgb.Conn, Pid Picture, Drawable xproto.Drawable, Format Pictformat, ValueMask uint32, ValueList []uint32) CreatePictureCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreatePicture' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(createPictureRequest(c, Pid, Drawable, Format, ValueMask, ValueList), cookie)
	return CreatePictureCookie{cookie}
}

// CreatePictureChecked sends a checked request.
// If an error occurs, it can be retrieved using CreatePictureCookie.Check()
func CreatePictureChecked(c *xgb.Conn, Pid Picture, Drawable xproto.Drawable, Format Pictformat, ValueMask uint32, ValueList []uint32) CreatePictureCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreatePicture' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(createPictureRequest(c, Pid, Drawable, Format, ValueMask, ValueList), cookie)
	return CreatePictureCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CreatePictureCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CreatePicture
// createPictureRequest writes a CreatePicture request to a byte slice.
func createPictureRequest(c *xgb.Conn, Pid Picture, Drawable xproto.Drawable, Format Pictformat, ValueMask uint32, ValueList []uint32) []byte {
	size := xgb.Pad((16 + (4 + xgb.Pad((4 * xgb.PopCount(int(ValueMask)))))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 4 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Pid))
	b += 4

	xgb.Put32(buf[b:], uint32(Drawable))
	b += 4

	xgb.Put32(buf[b:], uint32(Format))
	b += 4

	xgb.Put32(buf[b:], ValueMask)
	b += 4
	for i := 0; i < xgb.PopCount(int(ValueMask)); i++ {
		xgb.Put32(buf[b:], ValueList[i])
		b += 4
	}
	b = xgb.Pad(b)

	return buf
}

// CreateRadialGradientCookie is a cookie used only for CreateRadialGradient requests.
type CreateRadialGradientCookie struct {
	*xgb.Cookie
}

// CreateRadialGradient sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CreateRadialGradient(c *xgb.Conn, Picture Picture, Inner Pointfix, Outer Pointfix, InnerRadius Fixed, OuterRadius Fixed, NumStops uint32, Stops []Fixed, Colors []Color) CreateRadialGradientCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateRadialGradient' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(createRadialGradientRequest(c, Picture, Inner, Outer, InnerRadius, OuterRadius, NumStops, Stops, Colors), cookie)
	return CreateRadialGradientCookie{cookie}
}

// CreateRadialGradientChecked sends a checked request.
// If an error occurs, it can be retrieved using CreateRadialGradientCookie.Check()
func CreateRadialGradientChecked(c *xgb.Conn, Picture Picture, Inner Pointfix, Outer Pointfix, InnerRadius Fixed, OuterRadius Fixed, NumStops uint32, Stops []Fixed, Colors []Color) CreateRadialGradientCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateRadialGradient' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(createRadialGradientRequest(c, Picture, Inner, Outer, InnerRadius, OuterRadius, NumStops, Stops, Colors), cookie)
	return CreateRadialGradientCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CreateRadialGradientCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CreateRadialGradient
// createRadialGradientRequest writes a CreateRadialGradient request to a byte slice.
func createRadialGradientRequest(c *xgb.Conn, Picture Picture, Inner Pointfix, Outer Pointfix, InnerRadius Fixed, OuterRadius Fixed, NumStops uint32, Stops []Fixed, Colors []Color) []byte {
	size := xgb.Pad((((36 + xgb.Pad((int(NumStops) * 4))) + 4) + xgb.Pad((int(NumStops) * 8))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 35 // request opcode
	b += 1

	blen := b
	b += 2

	xgb.Put32(buf[b:], uint32(Picture))
	b += 4

	{
		structBytes := Inner.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	{
		structBytes := Outer.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	xgb.Put32(buf[b:], uint32(InnerRadius))
	b += 4

	xgb.Put32(buf[b:], uint32(OuterRadius))
	b += 4

	xgb.Put32(buf[b:], NumStops)
	b += 4

	for i := 0; i < int(NumStops); i++ {
		xgb.Put32(buf[b:], uint32(Stops[i]))
		b += 4
	}

	b = (b + 3) & ^3 // alignment gap

	b += ColorListBytes(buf[b:], Colors)

	b = xgb.Pad(b)
	xgb.Put16(buf[blen:], uint16(b/4)) // write request size in 4-byte units
	return buf[:b]
}

// CreateSolidFillCookie is a cookie used only for CreateSolidFill requests.
type CreateSolidFillCookie struct {
	*xgb.Cookie
}

// CreateSolidFill sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func CreateSolidFill(c *xgb.Conn, Picture Picture, Color Color) CreateSolidFillCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateSolidFill' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(createSolidFillRequest(c, Picture, Color), cookie)
	return CreateSolidFillCookie{cookie}
}

// CreateSolidFillChecked sends a checked request.
// If an error occurs, it can be retrieved using CreateSolidFillCookie.Check()
func CreateSolidFillChecked(c *xgb.Conn, Picture Picture, Color Color) CreateSolidFillCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'CreateSolidFill' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(createSolidFillRequest(c, Picture, Color), cookie)
	return CreateSolidFillCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook CreateSolidFillCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for CreateSolidFill
// createSolidFillRequest writes a CreateSolidFill request to a byte slice.
func createSolidFillRequest(c *xgb.Conn, Picture Picture, Color Color) []byte {
	size := 16
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 33 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Picture))
	b += 4

	{
		structBytes := Color.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	return buf
}

// FillRectanglesCookie is a cookie used only for FillRectangles requests.
type FillRectanglesCookie struct {
	*xgb.Cookie
}

// FillRectangles sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func FillRectangles(c *xgb.Conn, Op byte, Dst Picture, Color Color, Rects []xproto.Rectangle) FillRectanglesCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'FillRectangles' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(fillRectanglesRequest(c, Op, Dst, Color, Rects), cookie)
	return FillRectanglesCookie{cookie}
}

// FillRectanglesChecked sends a checked request.
// If an error occurs, it can be retrieved using FillRectanglesCookie.Check()
func FillRectanglesChecked(c *xgb.Conn, Op byte, Dst Picture, Color Color, Rects []xproto.Rectangle) FillRectanglesCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'FillRectangles' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(fillRectanglesRequest(c, Op, Dst, Color, Rects), cookie)
	return FillRectanglesCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook FillRectanglesCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for FillRectangles
// fillRectanglesRequest writes a FillRectangles request to a byte slice.
func fillRectanglesRequest(c *xgb.Conn, Op byte, Dst Picture, Color Color, Rects []xproto.Rectangle) []byte {
	size := xgb.Pad((20 + xgb.Pad((len(Rects) * 8))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 26 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	buf[b] = Op
	b += 1

	b += 3 // padding

	xgb.Put32(buf[b:], uint32(Dst))
	b += 4

	{
		structBytes := Color.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	b += xproto.RectangleListBytes(buf[b:], Rects)

	return buf
}

// FreeGlyphSetCookie is a cookie used only for FreeGlyphSet requests.
type FreeGlyphSetCookie struct {
	*xgb.Cookie
}

// FreeGlyphSet sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func FreeGlyphSet(c *xgb.Conn, Glyphset Glyphset) FreeGlyphSetCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'FreeGlyphSet' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(freeGlyphSetRequest(c, Glyphset), cookie)
	return FreeGlyphSetCookie{cookie}
}

// FreeGlyphSetChecked sends a checked request.
// If an error occurs, it can be retrieved using FreeGlyphSetCookie.Check()
func FreeGlyphSetChecked(c *xgb.Conn, Glyphset Glyphset) FreeGlyphSetCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'FreeGlyphSet' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(freeGlyphSetRequest(c, Glyphset), cookie)
	return FreeGlyphSetCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook FreeGlyphSetCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for FreeGlyphSet
// freeGlyphSetRequest writes a FreeGlyphSet request to a byte slice.
func freeGlyphSetRequest(c *xgb.Conn, Glyphset Glyphset) []byte {
	size := 8
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 19 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Glyphset))
	b += 4

	return buf
}

// FreeGlyphsCookie is a cookie used only for FreeGlyphs requests.
type FreeGlyphsCookie struct {
	*xgb.Cookie
}

// FreeGlyphs sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func FreeGlyphs(c *xgb.Conn, Glyphset Glyphset, Glyphs []Glyph) FreeGlyphsCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'FreeGlyphs' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(freeGlyphsRequest(c, Glyphset, Glyphs), cookie)
	return FreeGlyphsCookie{cookie}
}

// FreeGlyphsChecked sends a checked request.
// If an error occurs, it can be retrieved using FreeGlyphsCookie.Check()
func FreeGlyphsChecked(c *xgb.Conn, Glyphset Glyphset, Glyphs []Glyph) FreeGlyphsCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'FreeGlyphs' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(freeGlyphsRequest(c, Glyphset, Glyphs), cookie)
	return FreeGlyphsCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook FreeGlyphsCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for FreeGlyphs
// freeGlyphsRequest writes a FreeGlyphs request to a byte slice.
func freeGlyphsRequest(c *xgb.Conn, Glyphset Glyphset, Glyphs []Glyph) []byte {
	size := xgb.Pad((8 + xgb.Pad((len(Glyphs) * 4))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 22 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Glyphset))
	b += 4

	for i := 0; i < int(len(Glyphs)); i++ {
		xgb.Put32(buf[b:], uint32(Glyphs[i]))
		b += 4
	}

	return buf
}

// FreePictureCookie is a cookie used only for FreePicture requests.
type FreePictureCookie struct {
	*xgb.Cookie
}

// FreePicture sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func FreePicture(c *xgb.Conn, Picture Picture) FreePictureCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'FreePicture' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(freePictureRequest(c, Picture), cookie)
	return FreePictureCookie{cookie}
}

// FreePictureChecked sends a checked request.
// If an error occurs, it can be retrieved using FreePictureCookie.Check()
func FreePictureChecked(c *xgb.Conn, Picture Picture) FreePictureCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'FreePicture' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(freePictureRequest(c, Picture), cookie)
	return FreePictureCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook FreePictureCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for FreePicture
// freePictureRequest writes a FreePicture request to a byte slice.
func freePictureRequest(c *xgb.Conn, Picture Picture) []byte {
	size := 8
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 7 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Picture))
	b += 4

	return buf
}

// QueryFiltersCookie is a cookie used only for QueryFilters requests.
type QueryFiltersCookie struct {
	*xgb.Cookie
}

// QueryFilters sends a checked request.
// If an error occurs, it will be returned with the reply by calling QueryFiltersCookie.Reply()
func QueryFilters(c *xgb.Conn, Drawable xproto.Drawable) QueryFiltersCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'QueryFilters' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, true)
	c.NewRequest(queryFiltersRequest(c, Drawable), cookie)
	return QueryFiltersCookie{cookie}
}

// QueryFiltersUnchecked sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func QueryFiltersUnchecked(c *xgb.Conn, Drawable xproto.Drawable) QueryFiltersCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'QueryFilters' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, true)
	c.NewRequest(queryFiltersRequest(c, Drawable), cookie)
	return QueryFiltersCookie{cookie}
}

// QueryFiltersReply represents the data returned from a QueryFilters request.
type QueryFiltersReply struct {
	Sequence uint16 // sequence number of the request for this reply
	Length   uint32 // number of bytes in this reply
	// padding: 1 bytes
	NumAliases uint32
	NumFilters uint32
	// padding: 16 bytes
	Aliases []uint16     // size: xgb.Pad((int(NumAliases) * 2))
	Filters []xproto.Str // size: xproto.StrListSize(Filters)
}

// Reply blocks and returns the reply data for a QueryFilters request.
func (cook QueryFiltersCookie) Reply() (*QueryFiltersReply, error) {
	buf, err := cook.Cookie.Reply()
	if err != nil {
		return nil, err
	}
	if buf == nil {
		return nil, nil
	}
	return queryFiltersReply(buf), nil
}

// queryFiltersReply reads a byte slice into a QueryFiltersReply value.
func queryFiltersReply(buf []byte) *QueryFiltersReply {
	v := new(QueryFiltersReply)
	b := 1 // skip reply determinant

	b += 1 // padding

	v.Sequence = xgb.Get16(buf[b:])
	b += 2

	v.Length = xgb.Get32(buf[b:]) // 4-byte units
	b += 4

	v.NumAliases = xgb.Get32(buf[b:])
	b += 4

	v.NumFilters = xgb.Get32(buf[b:])
	b += 4

	b += 16 // padding

	v.Aliases = make([]uint16, v.NumAliases)
	for i := 0; i < int(v.NumAliases); i++ {
		v.Aliases[i] = xgb.Get16(buf[b:])
		b += 2
	}

	v.Filters = make([]xproto.Str, v.NumFilters)
	b += xproto.StrReadList(buf[b:], v.Filters)

	return v
}

// Write request to wire for QueryFilters
// queryFiltersRequest writes a QueryFilters request to a byte slice.
func queryFiltersRequest(c *xgb.Conn, Drawable xproto.Drawable) []byte {
	size := 8
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 29 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Drawable))
	b += 4

	return buf
}

// QueryPictFormatsCookie is a cookie used only for QueryPictFormats requests.
type QueryPictFormatsCookie struct {
	*xgb.Cookie
}

// QueryPictFormats sends a checked request.
// If an error occurs, it will be returned with the reply by calling QueryPictFormatsCookie.Reply()
func QueryPictFormats(c *xgb.Conn) QueryPictFormatsCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'QueryPictFormats' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, true)
	c.NewRequest(queryPictFormatsRequest(c), cookie)
	return QueryPictFormatsCookie{cookie}
}

// QueryPictFormatsUnchecked sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func QueryPictFormatsUnchecked(c *xgb.Conn) QueryPictFormatsCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'QueryPictFormats' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, true)
	c.NewRequest(queryPictFormatsRequest(c), cookie)
	return QueryPictFormatsCookie{cookie}
}

// QueryPictFormatsReply represents the data returned from a QueryPictFormats request.
type QueryPictFormatsReply struct {
	Sequence uint16 // sequence number of the request for this reply
	Length   uint32 // number of bytes in this reply
	// padding: 1 bytes
	NumFormats  uint32
	NumScreens  uint32
	NumDepths   uint32
	NumVisuals  uint32
	NumSubpixel uint32
	// padding: 4 bytes
	Formats []Pictforminfo // size: xgb.Pad((int(NumFormats) * 28))
	// alignment gap to multiple of 4
	Screens []Pictscreen // size: PictscreenListSize(Screens)
	// alignment gap to multiple of 4
	Subpixels []uint32 // size: xgb.Pad((int(NumSubpixel) * 4))
}

// Reply blocks and returns the reply data for a QueryPictFormats request.
func (cook QueryPictFormatsCookie) Reply() (*QueryPictFormatsReply, error) {
	buf, err := cook.Cookie.Reply()
	if err != nil {
		return nil, err
	}
	if buf == nil {
		return nil, nil
	}
	return queryPictFormatsReply(buf), nil
}

// queryPictFormatsReply reads a byte slice into a QueryPictFormatsReply value.
func queryPictFormatsReply(buf []byte) *QueryPictFormatsReply {
	v := new(QueryPictFormatsReply)
	b := 1 // skip reply determinant

	b += 1 // padding

	v.Sequence = xgb.Get16(buf[b:])
	b += 2

	v.Length = xgb.Get32(buf[b:]) // 4-byte units
	b += 4

	v.NumFormats = xgb.Get32(buf[b:])
	b += 4

	v.NumScreens = xgb.Get32(buf[b:])
	b += 4

	v.NumDepths = xgb.Get32(buf[b:])
	b += 4

	v.NumVisuals = xgb.Get32(buf[b:])
	b += 4

	v.NumSubpixel = xgb.Get32(buf[b:])
	b += 4

	b += 4 // padding

	v.Formats = make([]Pictforminfo, v.NumFormats)
	b += PictforminfoReadList(buf[b:], v.Formats)

	b = (b + 3) & ^3 // alignment gap

	v.Screens = make([]Pictscreen, v.NumScreens)
	b += PictscreenReadList(buf[b:], v.Screens)

	b = (b + 3) & ^3 // alignment gap

	v.Subpixels = make([]uint32, v.NumSubpixel)
	for i := 0; i < int(v.NumSubpixel); i++ {
		v.Subpixels[i] = xgb.Get32(buf[b:])
		b += 4
	}

	return v
}

// Write request to wire for QueryPictFormats
// queryPictFormatsRequest writes a QueryPictFormats request to a byte slice.
func queryPictFormatsRequest(c *xgb.Conn) []byte {
	size := 4
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 1 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	return buf
}

// QueryPictIndexValuesCookie is a cookie used only for QueryPictIndexValues requests.
type QueryPictIndexValuesCookie struct {
	*xgb.Cookie
}

// QueryPictIndexValues sends a checked request.
// If an error occurs, it will be returned with the reply by calling QueryPictIndexValuesCookie.Reply()
func QueryPictIndexValues(c *xgb.Conn, Format Pictformat) QueryPictIndexValuesCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'QueryPictIndexValues' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, true)
	c.NewRequest(queryPictIndexValuesRequest(c, Format), cookie)
	return QueryPictIndexValuesCookie{cookie}
}

// QueryPictIndexValuesUnchecked sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func QueryPictIndexValuesUnchecked(c *xgb.Conn, Format Pictformat) QueryPictIndexValuesCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'QueryPictIndexValues' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, true)
	c.NewRequest(queryPictIndexValuesRequest(c, Format), cookie)
	return QueryPictIndexValuesCookie{cookie}
}

// QueryPictIndexValuesReply represents the data returned from a QueryPictIndexValues request.
type QueryPictIndexValuesReply struct {
	Sequence uint16 // sequence number of the request for this reply
	Length   uint32 // number of bytes in this reply
	// padding: 1 bytes
	NumValues uint32
	// padding: 20 bytes
	Values []Indexvalue // size: xgb.Pad((int(NumValues) * 12))
}

// Reply blocks and returns the reply data for a QueryPictIndexValues request.
func (cook QueryPictIndexValuesCookie) Reply() (*QueryPictIndexValuesReply, error) {
	buf, err := cook.Cookie.Reply()
	if err != nil {
		return nil, err
	}
	if buf == nil {
		return nil, nil
	}
	return queryPictIndexValuesReply(buf), nil
}

// queryPictIndexValuesReply reads a byte slice into a QueryPictIndexValuesReply value.
func queryPictIndexValuesReply(buf []byte) *QueryPictIndexValuesReply {
	v := new(QueryPictIndexValuesReply)
	b := 1 // skip reply determinant

	b += 1 // padding

	v.Sequence = xgb.Get16(buf[b:])
	b += 2

	v.Length = xgb.Get32(buf[b:]) // 4-byte units
	b += 4

	v.NumValues = xgb.Get32(buf[b:])
	b += 4

	b += 20 // padding

	v.Values = make([]Indexvalue, v.NumValues)
	b += IndexvalueReadList(buf[b:], v.Values)

	return v
}

// Write request to wire for QueryPictIndexValues
// queryPictIndexValuesRequest writes a QueryPictIndexValues request to a byte slice.
func queryPictIndexValuesRequest(c *xgb.Conn, Format Pictformat) []byte {
	size := 8
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 2 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Format))
	b += 4

	return buf
}

// QueryVersionCookie is a cookie used only for QueryVersion requests.
type QueryVersionCookie struct {
	*xgb.Cookie
}

// QueryVersion sends a checked request.
// If an error occurs, it will be returned with the reply by calling QueryVersionCookie.Reply()
func QueryVersion(c *xgb.Conn, ClientMajorVersion uint32, ClientMinorVersion uint32) QueryVersionCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, true)
	c.NewRequest(queryVersionRequest(c, ClientMajorVersion, ClientMinorVersion), cookie)
	return QueryVersionCookie{cookie}
}

// QueryVersionUnchecked sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func QueryVersionUnchecked(c *xgb.Conn, ClientMajorVersion uint32, ClientMinorVersion uint32) QueryVersionCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, true)
	c.NewRequest(queryVersionRequest(c, ClientMajorVersion, ClientMinorVersion), cookie)
	return QueryVersionCookie{cookie}
}

// QueryVersionReply represents the data returned from a QueryVersion request.
type QueryVersionReply struct {
	Sequence uint16 // sequence number of the request for this reply
	Length   uint32 // number of bytes in this reply
	// padding: 1 bytes
	MajorVersion uint32
	MinorVersion uint32
	// padding: 16 bytes
}

// Reply blocks and returns the reply data for a QueryVersion request.
func (cook QueryVersionCookie) Reply() (*QueryVersionReply, error) {
	buf, err := cook.Cookie.Reply()
	if err != nil {
		return nil, err
	}
	if buf == nil {
		return nil, nil
	}
	return queryVersionReply(buf), nil
}

// queryVersionReply reads a byte slice into a QueryVersionReply value.
func queryVersionReply(buf []byte) *QueryVersionReply {
	v := new(QueryVersionReply)
	b := 1 // skip reply determinant

	b += 1 // padding

	v.Sequence = xgb.Get16(buf[b:])
	b += 2

	v.Length = xgb.Get32(buf[b:]) // 4-byte units
	b += 4

	v.MajorVersion = xgb.Get32(buf[b:])
	b += 4

	v.MinorVersion = xgb.Get32(buf[b:])
	b += 4

	b += 16 // padding

	return v
}

// Write request to wire for QueryVersion
// queryVersionRequest writes a QueryVersion request to a byte slice.
func queryVersionRequest(c *xgb.Conn, ClientMajorVersion uint32, ClientMinorVersion uint32) []byte {
	size := 12
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 0 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], ClientMajorVersion)
	b += 4

	xgb.Put32(buf[b:], ClientMinorVersion)
	b += 4

	return buf
}

// ReferenceGlyphSetCookie is a cookie used only for ReferenceGlyphSet requests.
type ReferenceGlyphSetCookie struct {
	*xgb.Cookie
}

// ReferenceGlyphSet sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func ReferenceGlyphSet(c *xgb.Conn, Gsid Glyphset, Existing Glyphset) ReferenceGlyphSetCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'ReferenceGlyphSet' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(referenceGlyphSetRequest(c, Gsid, Existing), cookie)
	return ReferenceGlyphSetCookie{cookie}
}

// ReferenceGlyphSetChecked sends a checked request.
// If an error occurs, it can be retrieved using ReferenceGlyphSetCookie.Check()
func ReferenceGlyphSetChecked(c *xgb.Conn, Gsid Glyphset, Existing Glyphset) ReferenceGlyphSetCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'ReferenceGlyphSet' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(referenceGlyphSetRequest(c, Gsid, Existing), cookie)
	return ReferenceGlyphSetCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook ReferenceGlyphSetCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for ReferenceGlyphSet
// referenceGlyphSetRequest writes a ReferenceGlyphSet request to a byte slice.
func referenceGlyphSetRequest(c *xgb.Conn, Gsid Glyphset, Existing Glyphset) []byte {
	size := 12
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 18 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Gsid))
	b += 4

	xgb.Put32(buf[b:], uint32(Existing))
	b += 4

	return buf
}

// SetPictureClipRectanglesCookie is a cookie used only for SetPictureClipRectangles requests.
type SetPictureClipRectanglesCookie struct {
	*xgb.Cookie
}

// SetPictureClipRectangles sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func SetPictureClipRectangles(c *xgb.Conn, Picture Picture, ClipXOrigin int16, ClipYOrigin int16, Rectangles []xproto.Rectangle) SetPictureClipRectanglesCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'SetPictureClipRectangles' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(setPictureClipRectanglesRequest(c, Picture, ClipXOrigin, ClipYOrigin, Rectangles), cookie)
	return SetPictureClipRectanglesCookie{cookie}
}

// SetPictureClipRectanglesChecked sends a checked request.
// If an error occurs, it can be retrieved using SetPictureClipRectanglesCookie.Check()
func SetPictureClipRectanglesChecked(c *xgb.Conn, Picture Picture, ClipXOrigin int16, ClipYOrigin int16, Rectangles []xproto.Rectangle) SetPictureClipRectanglesCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'SetPictureClipRectangles' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(setPictureClipRectanglesRequest(c, Picture, ClipXOrigin, ClipYOrigin, Rectangles), cookie)
	return SetPictureClipRectanglesCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook SetPictureClipRectanglesCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for SetPictureClipRectangles
// setPictureClipRectanglesRequest writes a SetPictureClipRectangles request to a byte slice.
func setPictureClipRectanglesRequest(c *xgb.Conn, Picture Picture, ClipXOrigin int16, ClipYOrigin int16, Rectangles []xproto.Rectangle) []byte {
	size := xgb.Pad((12 + xgb.Pad((len(Rectangles) * 8))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 6 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Picture))
	b += 4

	xgb.Put16(buf[b:], uint16(ClipXOrigin))
	b += 2

	xgb.Put16(buf[b:], uint16(ClipYOrigin))
	b += 2

	b += xproto.RectangleListBytes(buf[b:], Rectangles)

	return buf
}

// SetPictureFilterCookie is a cookie used only for SetPictureFilter requests.
type SetPictureFilterCookie struct {
	*xgb.Cookie
}

// SetPictureFilter sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func SetPictureFilter(c *xgb.Conn, Picture Picture, FilterLen uint16, Filter string, Values []Fixed) SetPictureFilterCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'SetPictureFilter' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(setPictureFilterRequest(c, Picture, FilterLen, Filter, Values), cookie)
	return SetPictureFilterCookie{cookie}
}

// SetPictureFilterChecked sends a checked request.
// If an error occurs, it can be retrieved using SetPictureFilterCookie.Check()
func SetPictureFilterChecked(c *xgb.Conn, Picture Picture, FilterLen uint16, Filter string, Values []Fixed) SetPictureFilterCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'SetPictureFilter' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(setPictureFilterRequest(c, Picture, FilterLen, Filter, Values), cookie)
	return SetPictureFilterCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook SetPictureFilterCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for SetPictureFilter
// setPictureFilterRequest writes a SetPictureFilter request to a byte slice.
func setPictureFilterRequest(c *xgb.Conn, Picture Picture, FilterLen uint16, Filter string, Values []Fixed) []byte {
	size := xgb.Pad((((12 + xgb.Pad((int(FilterLen) * 1))) + 4) + xgb.Pad((len(Values) * 4))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 30 // request opcode
	b += 1

	blen := b
	b += 2

	xgb.Put32(buf[b:], uint32(Picture))
	b += 4

	xgb.Put16(buf[b:], FilterLen)
	b += 2

	b += 2 // padding

	copy(buf[b:], Filter[:FilterLen])
	b += int(FilterLen)

	b = (b + 3) & ^3 // alignment gap

	for i := 0; i < int(len(Values)); i++ {
		xgb.Put32(buf[b:], uint32(Values[i]))
		b += 4
	}

	b = xgb.Pad(b)
	xgb.Put16(buf[blen:], uint16(b/4)) // write request size in 4-byte units
	return buf[:b]
}

// SetPictureTransformCookie is a cookie used only for SetPictureTransform requests.
type SetPictureTransformCookie struct {
	*xgb.Cookie
}

// SetPictureTransform sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func SetPictureTransform(c *xgb.Conn, Picture Picture, Transform Transform) SetPictureTransformCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'SetPictureTransform' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(setPictureTransformRequest(c, Picture, Transform), cookie)
	return SetPictureTransformCookie{cookie}
}

// SetPictureTransformChecked sends a checked request.
// If an error occurs, it can be retrieved using SetPictureTransformCookie.Check()
func SetPictureTransformChecked(c *xgb.Conn, Picture Picture, Transform Transform) SetPictureTransformCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'SetPictureTransform' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(setPictureTransformRequest(c, Picture, Transform), cookie)
	return SetPictureTransformCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook SetPictureTransformCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for SetPictureTransform
// setPictureTransformRequest writes a SetPictureTransform request to a byte slice.
func setPictureTransformRequest(c *xgb.Conn, Picture Picture, Transform Transform) []byte {
	size := 44
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 28 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	xgb.Put32(buf[b:], uint32(Picture))
	b += 4

	{
		structBytes := Transform.Bytes()
		copy(buf[b:], structBytes)
		b += len(structBytes)
	}

	return buf
}

// TrapezoidsCookie is a cookie used only for Trapezoids requests.
type TrapezoidsCookie struct {
	*xgb.Cookie
}

// Trapezoids sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func Trapezoids(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Traps []Trapezoid) TrapezoidsCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'Trapezoids' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(trapezoidsRequest(c, Op, Src, Dst, MaskFormat, SrcX, SrcY, Traps), cookie)
	return TrapezoidsCookie{cookie}
}

// TrapezoidsChecked sends a checked request.
// If an error occurs, it can be retrieved using TrapezoidsCookie.Check()
func TrapezoidsChecked(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Traps []Trapezoid) TrapezoidsCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'Trapezoids' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(trapezoidsRequest(c, Op, Src, Dst, MaskFormat, SrcX, SrcY, Traps), cookie)
	return TrapezoidsCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook TrapezoidsCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for Trapezoids
// trapezoidsRequest writes a Trapezoids request to a byte slice.
func trapezoidsRequest(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Traps []Trapezoid) []byte {
	size := xgb.Pad((24 + xgb.Pad((len(Traps) * 40))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 10 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	buf[b] = Op
	b += 1

	b += 3 // padding

	xgb.Put32(buf[b:], uint32(Src))
	b += 4

	xgb.Put32(buf[b:], uint32(Dst))
	b += 4

	xgb.Put32(buf[b:], uint32(MaskFormat))
	b += 4

	xgb.Put16(buf[b:], uint16(SrcX))
	b += 2

	xgb.Put16(buf[b:], uint16(SrcY))
	b += 2

	b += TrapezoidListBytes(buf[b:], Traps)

	return buf
}

// TriFanCookie is a cookie used only for TriFan requests.
type TriFanCookie struct {
	*xgb.Cookie
}

// TriFan sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func TriFan(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Points []Pointfix) TriFanCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'TriFan' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(triFanRequest(c, Op, Src, Dst, MaskFormat, SrcX, SrcY, Points), cookie)
	return TriFanCookie{cookie}
}

// TriFanChecked sends a checked request.
// If an error occurs, it can be retrieved using TriFanCookie.Check()
func TriFanChecked(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Points []Pointfix) TriFanCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'TriFan' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(triFanRequest(c, Op, Src, Dst, MaskFormat, SrcX, SrcY, Points), cookie)
	return TriFanCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook TriFanCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for TriFan
// triFanRequest writes a TriFan request to a byte slice.
func triFanRequest(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Points []Pointfix) []byte {
	size := xgb.Pad((24 + xgb.Pad((len(Points) * 8))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 13 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	buf[b] = Op
	b += 1

	b += 3 // padding

	xgb.Put32(buf[b:], uint32(Src))
	b += 4

	xgb.Put32(buf[b:], uint32(Dst))
	b += 4

	xgb.Put32(buf[b:], uint32(MaskFormat))
	b += 4

	xgb.Put16(buf[b:], uint16(SrcX))
	b += 2

	xgb.Put16(buf[b:], uint16(SrcY))
	b += 2

	b += PointfixListBytes(buf[b:], Points)

	return buf
}

// TriStripCookie is a cookie used only for TriStrip requests.
type TriStripCookie struct {
	*xgb.Cookie
}

// TriStrip sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func TriStrip(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Points []Pointfix) TriStripCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'TriStrip' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(triStripRequest(c, Op, Src, Dst, MaskFormat, SrcX, SrcY, Points), cookie)
	return TriStripCookie{cookie}
}

// TriStripChecked sends a checked request.
// If an error occurs, it can be retrieved using TriStripCookie.Check()
func TriStripChecked(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Points []Pointfix) TriStripCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'TriStrip' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(triStripRequest(c, Op, Src, Dst, MaskFormat, SrcX, SrcY, Points), cookie)
	return TriStripCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook TriStripCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for TriStrip
// triStripRequest writes a TriStrip request to a byte slice.
func triStripRequest(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Points []Pointfix) []byte {
	size := xgb.Pad((24 + xgb.Pad((len(Points) * 8))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 12 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	buf[b] = Op
	b += 1

	b += 3 // padding

	xgb.Put32(buf[b:], uint32(Src))
	b += 4

	xgb.Put32(buf[b:], uint32(Dst))
	b += 4

	xgb.Put32(buf[b:], uint32(MaskFormat))
	b += 4

	xgb.Put16(buf[b:], uint16(SrcX))
	b += 2

	xgb.Put16(buf[b:], uint16(SrcY))
	b += 2

	b += PointfixListBytes(buf[b:], Points)

	return buf
}

// TrianglesCookie is a cookie used only for Triangles requests.
type TrianglesCookie struct {
	*xgb.Cookie
}

// Triangles sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func Triangles(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Triangles []Triangle) TrianglesCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'Triangles' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(false, false)
	c.NewRequest(trianglesRequest(c, Op, Src, Dst, MaskFormat, SrcX, SrcY, Triangles), cookie)
	return TrianglesCookie{cookie}
}

// TrianglesChecked sends a checked request.
// If an error occurs, it can be retrieved using TrianglesCookie.Check()
func TrianglesChecked(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Triangles []Triangle) TrianglesCookie {
	if _, ok := c.Extensions["RENDER"]; !ok {
		panic("Cannot issue request 'Triangles' using the uninitialized extension 'RENDER'. render.Init(connObj) must be called first.")
	}
	cookie := c.NewCookie(true, false)
	c.NewRequest(trianglesRequest(c, Op, Src, Dst, MaskFormat, SrcX, SrcY, Triangles), cookie)
	return TrianglesCookie{cookie}
}

// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func (cook TrianglesCookie) Check() error {
	return cook.Cookie.Check()
}

// Write request to wire for Triangles
// trianglesRequest writes a Triangles request to a byte slice.
func trianglesRequest(c *xgb.Conn, Op byte, Src Picture, Dst Picture, MaskFormat Pictformat, SrcX int16, SrcY int16, Triangles []Triangle) []byte {
	size := xgb.Pad((24 + xgb.Pad((len(Triangles) * 24))))
	b := 0
	buf := make([]byte, size)

	buf[b] = c.Extensions["RENDER"]
	b += 1

	buf[b] = 11 // request opcode
	b += 1

	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
	b += 2

	buf[b] = Op
	b += 1

	b += 3 // padding

	xgb.Put32(buf[b:], uint32(Src))
	b += 4

	xgb.Put32(buf[b:], uint32(Dst))
	b += 4

	xgb.Put32(buf[b:], uint32(MaskFormat))
	b += 4

	xgb.Put16(buf[b:], uint16(SrcX))
	b += 2

	xgb.Put16(buf[b:], uint16(SrcY))
	b += 2

	b += TriangleListBytes(buf[b:], Triangles)

	return buf
}
