blob: 553afbd9dd103a7773300f7814817b042fc972fe [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file was automatically generated with:
// ../../ui/gfx/x/gen_xproto.py \
// ../../third_party/xcbproto/src \
// gen/ui/gfx/x \
// bigreq \
// composite \
// damage \
// dpms \
// dri2 \
// dri3 \
// ge \
// glx \
// present \
// randr \
// record \
// render \
// res \
// screensaver \
// shape \
// shm \
// sync \
// xc_misc \
// xevie \
// xf86dri \
// xf86vidmode \
// xfixes \
// xinerama \
// xinput \
// xkb \
// xprint \
// xproto \
// xselinux \
// xtest \
// xv \
// xvmc
#include "render.h"
#include <xcb/xcb.h>
#include <xcb/xcbext.h>
#include "base/logging.h"
#include "base/posix/eintr_wrapper.h"
#include "ui/gfx/x/xproto_internal.h"
namespace x11 {
Render::Render(Connection* connection, const x11::QueryExtensionReply& info)
: connection_(connection), info_(info) {}
std::string Render::PictFormatError::ToString() const {
std::stringstream ss_;
ss_ << "Render::PictFormatError{";
ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
ss_ << "}";
return ss_.str();
}
template <>
void ReadError<Render::PictFormatError>(Render::PictFormatError* error_,
ReadBuffer* buffer) {
auto& buf = *buffer;
auto& sequence = (*error_).sequence;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// error_code
uint8_t error_code;
Read(&error_code, &buf);
// sequence
Read(&sequence, &buf);
DCHECK_LE(buf.offset, 32ul);
}
std::string Render::PictureError::ToString() const {
std::stringstream ss_;
ss_ << "Render::PictureError{";
ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
ss_ << "}";
return ss_.str();
}
template <>
void ReadError<Render::PictureError>(Render::PictureError* error_,
ReadBuffer* buffer) {
auto& buf = *buffer;
auto& sequence = (*error_).sequence;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// error_code
uint8_t error_code;
Read(&error_code, &buf);
// sequence
Read(&sequence, &buf);
DCHECK_LE(buf.offset, 32ul);
}
std::string Render::PictOpError::ToString() const {
std::stringstream ss_;
ss_ << "Render::PictOpError{";
ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
ss_ << "}";
return ss_.str();
}
template <>
void ReadError<Render::PictOpError>(Render::PictOpError* error_,
ReadBuffer* buffer) {
auto& buf = *buffer;
auto& sequence = (*error_).sequence;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// error_code
uint8_t error_code;
Read(&error_code, &buf);
// sequence
Read(&sequence, &buf);
DCHECK_LE(buf.offset, 32ul);
}
std::string Render::GlyphSetError::ToString() const {
std::stringstream ss_;
ss_ << "Render::GlyphSetError{";
ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
ss_ << "}";
return ss_.str();
}
template <>
void ReadError<Render::GlyphSetError>(Render::GlyphSetError* error_,
ReadBuffer* buffer) {
auto& buf = *buffer;
auto& sequence = (*error_).sequence;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// error_code
uint8_t error_code;
Read(&error_code, &buf);
// sequence
Read(&sequence, &buf);
DCHECK_LE(buf.offset, 32ul);
}
std::string Render::GlyphError::ToString() const {
std::stringstream ss_;
ss_ << "Render::GlyphError{";
ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
ss_ << "}";
return ss_.str();
}
template <>
void ReadError<Render::GlyphError>(Render::GlyphError* error_,
ReadBuffer* buffer) {
auto& buf = *buffer;
auto& sequence = (*error_).sequence;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// error_code
uint8_t error_code;
Read(&error_code, &buf);
// sequence
Read(&sequence, &buf);
DCHECK_LE(buf.offset, 32ul);
}
Future<Render::QueryVersionReply> Render::QueryVersion(
const Render::QueryVersionRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& client_major_version = request.client_major_version;
auto& client_minor_version = request.client_minor_version;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 0;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// client_major_version
buf.Write(&client_major_version);
// client_minor_version
buf.Write(&client_minor_version);
Align(&buf, 4);
return connection_->SendRequest<Render::QueryVersionReply>(
&buf, "Render::QueryVersion", false);
}
Future<Render::QueryVersionReply> Render::QueryVersion(
const uint32_t& client_major_version,
const uint32_t& client_minor_version) {
return Render::QueryVersion(
Render::QueryVersionRequest{client_major_version, client_minor_version});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Render::QueryVersionReply> detail::ReadReply<
Render::QueryVersionReply>(ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Render::QueryVersionReply>();
auto& sequence = (*reply).sequence;
auto& major_version = (*reply).major_version;
auto& minor_version = (*reply).minor_version;
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// major_version
Read(&major_version, &buf);
// minor_version
Read(&minor_version, &buf);
// pad1
Pad(&buf, 16);
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<Render::QueryPictFormatsReply> Render::QueryPictFormats(
const Render::QueryPictFormatsRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 1;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
Align(&buf, 4);
return connection_->SendRequest<Render::QueryPictFormatsReply>(
&buf, "Render::QueryPictFormats", false);
}
Future<Render::QueryPictFormatsReply> Render::QueryPictFormats() {
return Render::QueryPictFormats(Render::QueryPictFormatsRequest{});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Render::QueryPictFormatsReply> detail::ReadReply<
Render::QueryPictFormatsReply>(ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Render::QueryPictFormatsReply>();
auto& sequence = (*reply).sequence;
uint32_t num_formats{};
uint32_t num_screens{};
auto& num_depths = (*reply).num_depths;
auto& num_visuals = (*reply).num_visuals;
uint32_t num_subpixel{};
auto& formats = (*reply).formats;
size_t formats_len = formats.size();
auto& screens = (*reply).screens;
size_t screens_len = screens.size();
auto& subpixels = (*reply).subpixels;
size_t subpixels_len = subpixels.size();
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// num_formats
Read(&num_formats, &buf);
// num_screens
Read(&num_screens, &buf);
// num_depths
Read(&num_depths, &buf);
// num_visuals
Read(&num_visuals, &buf);
// num_subpixel
Read(&num_subpixel, &buf);
// pad1
Pad(&buf, 4);
// formats
formats.resize(num_formats);
for (auto& formats_elem : formats) {
// formats_elem
{
auto& id = formats_elem.id;
auto& type = formats_elem.type;
auto& depth = formats_elem.depth;
auto& direct = formats_elem.direct;
auto& colormap = formats_elem.colormap;
// id
Read(&id, &buf);
// type
uint8_t tmp0;
Read(&tmp0, &buf);
type = static_cast<Render::PictType>(tmp0);
// depth
Read(&depth, &buf);
// pad0
Pad(&buf, 2);
// direct
{
auto& red_shift = direct.red_shift;
auto& red_mask = direct.red_mask;
auto& green_shift = direct.green_shift;
auto& green_mask = direct.green_mask;
auto& blue_shift = direct.blue_shift;
auto& blue_mask = direct.blue_mask;
auto& alpha_shift = direct.alpha_shift;
auto& alpha_mask = direct.alpha_mask;
// red_shift
Read(&red_shift, &buf);
// red_mask
Read(&red_mask, &buf);
// green_shift
Read(&green_shift, &buf);
// green_mask
Read(&green_mask, &buf);
// blue_shift
Read(&blue_shift, &buf);
// blue_mask
Read(&blue_mask, &buf);
// alpha_shift
Read(&alpha_shift, &buf);
// alpha_mask
Read(&alpha_mask, &buf);
}
// colormap
Read(&colormap, &buf);
}
}
// screens
screens.resize(num_screens);
for (auto& screens_elem : screens) {
// screens_elem
{
uint32_t num_depths{};
auto& fallback = screens_elem.fallback;
auto& depths = screens_elem.depths;
size_t depths_len = depths.size();
// num_depths
Read(&num_depths, &buf);
// fallback
Read(&fallback, &buf);
// depths
depths.resize(num_depths);
for (auto& depths_elem : depths) {
// depths_elem
{
auto& depth = depths_elem.depth;
uint16_t num_visuals{};
auto& visuals = depths_elem.visuals;
size_t visuals_len = visuals.size();
// depth
Read(&depth, &buf);
// pad0
Pad(&buf, 1);
// num_visuals
Read(&num_visuals, &buf);
// pad1
Pad(&buf, 4);
// visuals
visuals.resize(num_visuals);
for (auto& visuals_elem : visuals) {
// visuals_elem
{
auto& visual = visuals_elem.visual;
auto& format = visuals_elem.format;
// visual
Read(&visual, &buf);
// format
Read(&format, &buf);
}
}
}
}
}
}
// subpixels
subpixels.resize(num_subpixel);
for (auto& subpixels_elem : subpixels) {
// subpixels_elem
uint32_t tmp1;
Read(&tmp1, &buf);
subpixels_elem = static_cast<Render::SubPixel>(tmp1);
}
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<Render::QueryPictIndexValuesReply> Render::QueryPictIndexValues(
const Render::QueryPictIndexValuesRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& format = request.format;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 2;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// format
buf.Write(&format);
Align(&buf, 4);
return connection_->SendRequest<Render::QueryPictIndexValuesReply>(
&buf, "Render::QueryPictIndexValues", false);
}
Future<Render::QueryPictIndexValuesReply> Render::QueryPictIndexValues(
const PictFormat& format) {
return Render::QueryPictIndexValues(
Render::QueryPictIndexValuesRequest{format});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Render::QueryPictIndexValuesReply> detail::ReadReply<
Render::QueryPictIndexValuesReply>(ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Render::QueryPictIndexValuesReply>();
auto& sequence = (*reply).sequence;
uint32_t num_values{};
auto& values = (*reply).values;
size_t values_len = values.size();
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// num_values
Read(&num_values, &buf);
// pad1
Pad(&buf, 20);
// values
values.resize(num_values);
for (auto& values_elem : values) {
// values_elem
{
auto& pixel = values_elem.pixel;
auto& red = values_elem.red;
auto& green = values_elem.green;
auto& blue = values_elem.blue;
auto& alpha = values_elem.alpha;
// pixel
Read(&pixel, &buf);
// red
Read(&red, &buf);
// green
Read(&green, &buf);
// blue
Read(&blue, &buf);
// alpha
Read(&alpha, &buf);
}
}
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<void> Render::CreatePicture(
const Render::CreatePictureRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& pid = request.pid;
auto& drawable = request.drawable;
auto& format = request.format;
CreatePictureAttribute value_mask{};
auto& value_list = request;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 4;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// pid
buf.Write(&pid);
// drawable
buf.Write(&drawable);
// format
buf.Write(&format);
// value_mask
SwitchVar(CreatePictureAttribute::Repeat, value_list.repeat.has_value(), true,
&value_mask);
SwitchVar(CreatePictureAttribute::AlphaMap, value_list.alphamap.has_value(),
true, &value_mask);
SwitchVar(CreatePictureAttribute::AlphaXOrigin,
value_list.alphaxorigin.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::AlphaYOrigin,
value_list.alphayorigin.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::ClipXOrigin,
value_list.clipxorigin.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::ClipYOrigin,
value_list.clipyorigin.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::ClipMask, value_list.clipmask.has_value(),
true, &value_mask);
SwitchVar(CreatePictureAttribute::GraphicsExposure,
value_list.graphicsexposure.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::SubwindowMode,
value_list.subwindowmode.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::PolyEdge, value_list.polyedge.has_value(),
true, &value_mask);
SwitchVar(CreatePictureAttribute::PolyMode, value_list.polymode.has_value(),
true, &value_mask);
SwitchVar(CreatePictureAttribute::Dither, value_list.dither.has_value(), true,
&value_mask);
SwitchVar(CreatePictureAttribute::ComponentAlpha,
value_list.componentalpha.has_value(), true, &value_mask);
uint32_t tmp2;
tmp2 = static_cast<uint32_t>(value_mask);
buf.Write(&tmp2);
// value_list
auto value_list_expr = value_mask;
if (CaseAnd(value_list_expr, CreatePictureAttribute::Repeat)) {
auto& repeat = *value_list.repeat;
// repeat
uint32_t tmp3;
tmp3 = static_cast<uint32_t>(repeat);
buf.Write(&tmp3);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::AlphaMap)) {
auto& alphamap = *value_list.alphamap;
// alphamap
buf.Write(&alphamap);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::AlphaXOrigin)) {
auto& alphaxorigin = *value_list.alphaxorigin;
// alphaxorigin
buf.Write(&alphaxorigin);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::AlphaYOrigin)) {
auto& alphayorigin = *value_list.alphayorigin;
// alphayorigin
buf.Write(&alphayorigin);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::ClipXOrigin)) {
auto& clipxorigin = *value_list.clipxorigin;
// clipxorigin
buf.Write(&clipxorigin);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::ClipYOrigin)) {
auto& clipyorigin = *value_list.clipyorigin;
// clipyorigin
buf.Write(&clipyorigin);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::ClipMask)) {
auto& clipmask = *value_list.clipmask;
// clipmask
buf.Write(&clipmask);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::GraphicsExposure)) {
auto& graphicsexposure = *value_list.graphicsexposure;
// graphicsexposure
buf.Write(&graphicsexposure);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::SubwindowMode)) {
auto& subwindowmode = *value_list.subwindowmode;
// subwindowmode
uint32_t tmp4;
tmp4 = static_cast<uint32_t>(subwindowmode);
buf.Write(&tmp4);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::PolyEdge)) {
auto& polyedge = *value_list.polyedge;
// polyedge
uint32_t tmp5;
tmp5 = static_cast<uint32_t>(polyedge);
buf.Write(&tmp5);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::PolyMode)) {
auto& polymode = *value_list.polymode;
// polymode
uint32_t tmp6;
tmp6 = static_cast<uint32_t>(polymode);
buf.Write(&tmp6);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::Dither)) {
auto& dither = *value_list.dither;
// dither
buf.Write(&dither);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::ComponentAlpha)) {
auto& componentalpha = *value_list.componentalpha;
// componentalpha
buf.Write(&componentalpha);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CreatePicture", false);
}
Future<void> Render::CreatePicture(
const Picture& pid,
const Drawable& drawable,
const PictFormat& format,
const absl::optional<Repeat>& repeat,
const absl::optional<Picture>& alphamap,
const absl::optional<int32_t>& alphaxorigin,
const absl::optional<int32_t>& alphayorigin,
const absl::optional<int32_t>& clipxorigin,
const absl::optional<int32_t>& clipyorigin,
const absl::optional<Pixmap>& clipmask,
const absl::optional<uint32_t>& graphicsexposure,
const absl::optional<SubwindowMode>& subwindowmode,
const absl::optional<PolyEdge>& polyedge,
const absl::optional<PolyMode>& polymode,
const absl::optional<Atom>& dither,
const absl::optional<uint32_t>& componentalpha) {
return Render::CreatePicture(Render::CreatePictureRequest{
pid, drawable, format, repeat, alphamap, alphaxorigin, alphayorigin,
clipxorigin, clipyorigin, clipmask, graphicsexposure, subwindowmode,
polyedge, polymode, dither, componentalpha});
}
Future<void> Render::ChangePicture(
const Render::ChangePictureRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& picture = request.picture;
CreatePictureAttribute value_mask{};
auto& value_list = request;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 5;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// picture
buf.Write(&picture);
// value_mask
SwitchVar(CreatePictureAttribute::Repeat, value_list.repeat.has_value(), true,
&value_mask);
SwitchVar(CreatePictureAttribute::AlphaMap, value_list.alphamap.has_value(),
true, &value_mask);
SwitchVar(CreatePictureAttribute::AlphaXOrigin,
value_list.alphaxorigin.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::AlphaYOrigin,
value_list.alphayorigin.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::ClipXOrigin,
value_list.clipxorigin.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::ClipYOrigin,
value_list.clipyorigin.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::ClipMask, value_list.clipmask.has_value(),
true, &value_mask);
SwitchVar(CreatePictureAttribute::GraphicsExposure,
value_list.graphicsexposure.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::SubwindowMode,
value_list.subwindowmode.has_value(), true, &value_mask);
SwitchVar(CreatePictureAttribute::PolyEdge, value_list.polyedge.has_value(),
true, &value_mask);
SwitchVar(CreatePictureAttribute::PolyMode, value_list.polymode.has_value(),
true, &value_mask);
SwitchVar(CreatePictureAttribute::Dither, value_list.dither.has_value(), true,
&value_mask);
SwitchVar(CreatePictureAttribute::ComponentAlpha,
value_list.componentalpha.has_value(), true, &value_mask);
uint32_t tmp7;
tmp7 = static_cast<uint32_t>(value_mask);
buf.Write(&tmp7);
// value_list
auto value_list_expr = value_mask;
if (CaseAnd(value_list_expr, CreatePictureAttribute::Repeat)) {
auto& repeat = *value_list.repeat;
// repeat
uint32_t tmp8;
tmp8 = static_cast<uint32_t>(repeat);
buf.Write(&tmp8);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::AlphaMap)) {
auto& alphamap = *value_list.alphamap;
// alphamap
buf.Write(&alphamap);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::AlphaXOrigin)) {
auto& alphaxorigin = *value_list.alphaxorigin;
// alphaxorigin
buf.Write(&alphaxorigin);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::AlphaYOrigin)) {
auto& alphayorigin = *value_list.alphayorigin;
// alphayorigin
buf.Write(&alphayorigin);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::ClipXOrigin)) {
auto& clipxorigin = *value_list.clipxorigin;
// clipxorigin
buf.Write(&clipxorigin);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::ClipYOrigin)) {
auto& clipyorigin = *value_list.clipyorigin;
// clipyorigin
buf.Write(&clipyorigin);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::ClipMask)) {
auto& clipmask = *value_list.clipmask;
// clipmask
buf.Write(&clipmask);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::GraphicsExposure)) {
auto& graphicsexposure = *value_list.graphicsexposure;
// graphicsexposure
buf.Write(&graphicsexposure);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::SubwindowMode)) {
auto& subwindowmode = *value_list.subwindowmode;
// subwindowmode
uint32_t tmp9;
tmp9 = static_cast<uint32_t>(subwindowmode);
buf.Write(&tmp9);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::PolyEdge)) {
auto& polyedge = *value_list.polyedge;
// polyedge
uint32_t tmp10;
tmp10 = static_cast<uint32_t>(polyedge);
buf.Write(&tmp10);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::PolyMode)) {
auto& polymode = *value_list.polymode;
// polymode
uint32_t tmp11;
tmp11 = static_cast<uint32_t>(polymode);
buf.Write(&tmp11);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::Dither)) {
auto& dither = *value_list.dither;
// dither
buf.Write(&dither);
}
if (CaseAnd(value_list_expr, CreatePictureAttribute::ComponentAlpha)) {
auto& componentalpha = *value_list.componentalpha;
// componentalpha
buf.Write(&componentalpha);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::ChangePicture", false);
}
Future<void> Render::ChangePicture(
const Picture& picture,
const absl::optional<Repeat>& repeat,
const absl::optional<Picture>& alphamap,
const absl::optional<int32_t>& alphaxorigin,
const absl::optional<int32_t>& alphayorigin,
const absl::optional<int32_t>& clipxorigin,
const absl::optional<int32_t>& clipyorigin,
const absl::optional<Pixmap>& clipmask,
const absl::optional<uint32_t>& graphicsexposure,
const absl::optional<SubwindowMode>& subwindowmode,
const absl::optional<PolyEdge>& polyedge,
const absl::optional<PolyMode>& polymode,
const absl::optional<Atom>& dither,
const absl::optional<uint32_t>& componentalpha) {
return Render::ChangePicture(Render::ChangePictureRequest{
picture, repeat, alphamap, alphaxorigin, alphayorigin, clipxorigin,
clipyorigin, clipmask, graphicsexposure, subwindowmode, polyedge,
polymode, dither, componentalpha});
}
Future<void> Render::SetPictureClipRectangles(
const Render::SetPictureClipRectanglesRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& picture = request.picture;
auto& clip_x_origin = request.clip_x_origin;
auto& clip_y_origin = request.clip_y_origin;
auto& rectangles = request.rectangles;
size_t rectangles_len = rectangles.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 6;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// picture
buf.Write(&picture);
// clip_x_origin
buf.Write(&clip_x_origin);
// clip_y_origin
buf.Write(&clip_y_origin);
// rectangles
DCHECK_EQ(static_cast<size_t>(rectangles_len), rectangles.size());
for (auto& rectangles_elem : rectangles) {
// rectangles_elem
{
auto& x = rectangles_elem.x;
auto& y = rectangles_elem.y;
auto& width = rectangles_elem.width;
auto& height = rectangles_elem.height;
// x
buf.Write(&x);
// y
buf.Write(&y);
// width
buf.Write(&width);
// height
buf.Write(&height);
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(
&buf, "Render::SetPictureClipRectangles", false);
}
Future<void> Render::SetPictureClipRectangles(
const Picture& picture,
const int16_t& clip_x_origin,
const int16_t& clip_y_origin,
const std::vector<Rectangle>& rectangles) {
return Render::SetPictureClipRectangles(
Render::SetPictureClipRectanglesRequest{picture, clip_x_origin,
clip_y_origin, rectangles});
}
Future<void> Render::FreePicture(const Render::FreePictureRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& picture = request.picture;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 7;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// picture
buf.Write(&picture);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::FreePicture", false);
}
Future<void> Render::FreePicture(const Picture& picture) {
return Render::FreePicture(Render::FreePictureRequest{picture});
}
Future<void> Render::Composite(const Render::CompositeRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& op = request.op;
auto& src = request.src;
auto& mask = request.mask;
auto& dst = request.dst;
auto& src_x = request.src_x;
auto& src_y = request.src_y;
auto& mask_x = request.mask_x;
auto& mask_y = request.mask_y;
auto& dst_x = request.dst_x;
auto& dst_y = request.dst_y;
auto& width = request.width;
auto& height = request.height;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 8;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// op
uint8_t tmp12;
tmp12 = static_cast<uint8_t>(op);
buf.Write(&tmp12);
// pad0
Pad(&buf, 3);
// src
buf.Write(&src);
// mask
buf.Write(&mask);
// dst
buf.Write(&dst);
// src_x
buf.Write(&src_x);
// src_y
buf.Write(&src_y);
// mask_x
buf.Write(&mask_x);
// mask_y
buf.Write(&mask_y);
// dst_x
buf.Write(&dst_x);
// dst_y
buf.Write(&dst_y);
// width
buf.Write(&width);
// height
buf.Write(&height);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::Composite", false);
}
Future<void> Render::Composite(const PictOp& op,
const Picture& src,
const Picture& mask,
const Picture& dst,
const int16_t& src_x,
const int16_t& src_y,
const int16_t& mask_x,
const int16_t& mask_y,
const int16_t& dst_x,
const int16_t& dst_y,
const uint16_t& width,
const uint16_t& height) {
return Render::Composite(
Render::CompositeRequest{op, src, mask, dst, src_x, src_y, mask_x, mask_y,
dst_x, dst_y, width, height});
}
Future<void> Render::Trapezoids(const Render::TrapezoidsRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& op = request.op;
auto& src = request.src;
auto& dst = request.dst;
auto& mask_format = request.mask_format;
auto& src_x = request.src_x;
auto& src_y = request.src_y;
auto& traps = request.traps;
size_t traps_len = traps.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 10;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// op
uint8_t tmp13;
tmp13 = static_cast<uint8_t>(op);
buf.Write(&tmp13);
// pad0
Pad(&buf, 3);
// src
buf.Write(&src);
// dst
buf.Write(&dst);
// mask_format
buf.Write(&mask_format);
// src_x
buf.Write(&src_x);
// src_y
buf.Write(&src_y);
// traps
DCHECK_EQ(static_cast<size_t>(traps_len), traps.size());
for (auto& traps_elem : traps) {
// traps_elem
{
auto& top = traps_elem.top;
auto& bottom = traps_elem.bottom;
auto& left = traps_elem.left;
auto& right = traps_elem.right;
// top
buf.Write(&top);
// bottom
buf.Write(&bottom);
// left
{
auto& p1 = left.p1;
auto& p2 = left.p2;
// p1
{
auto& x = p1.x;
auto& y = p1.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
// p2
{
auto& x = p2.x;
auto& y = p2.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
}
// right
{
auto& p1 = right.p1;
auto& p2 = right.p2;
// p1
{
auto& x = p1.x;
auto& y = p1.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
// p2
{
auto& x = p2.x;
auto& y = p2.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
}
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::Trapezoids", false);
}
Future<void> Render::Trapezoids(const PictOp& op,
const Picture& src,
const Picture& dst,
const PictFormat& mask_format,
const int16_t& src_x,
const int16_t& src_y,
const std::vector<Trapezoid>& traps) {
return Render::Trapezoids(Render::TrapezoidsRequest{op, src, dst, mask_format,
src_x, src_y, traps});
}
Future<void> Render::Triangles(const Render::TrianglesRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& op = request.op;
auto& src = request.src;
auto& dst = request.dst;
auto& mask_format = request.mask_format;
auto& src_x = request.src_x;
auto& src_y = request.src_y;
auto& triangles = request.triangles;
size_t triangles_len = triangles.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 11;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// op
uint8_t tmp14;
tmp14 = static_cast<uint8_t>(op);
buf.Write(&tmp14);
// pad0
Pad(&buf, 3);
// src
buf.Write(&src);
// dst
buf.Write(&dst);
// mask_format
buf.Write(&mask_format);
// src_x
buf.Write(&src_x);
// src_y
buf.Write(&src_y);
// triangles
DCHECK_EQ(static_cast<size_t>(triangles_len), triangles.size());
for (auto& triangles_elem : triangles) {
// triangles_elem
{
auto& p1 = triangles_elem.p1;
auto& p2 = triangles_elem.p2;
auto& p3 = triangles_elem.p3;
// p1
{
auto& x = p1.x;
auto& y = p1.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
// p2
{
auto& x = p2.x;
auto& y = p2.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
// p3
{
auto& x = p3.x;
auto& y = p3.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::Triangles", false);
}
Future<void> Render::Triangles(const PictOp& op,
const Picture& src,
const Picture& dst,
const PictFormat& mask_format,
const int16_t& src_x,
const int16_t& src_y,
const std::vector<Triangle>& triangles) {
return Render::Triangles(Render::TrianglesRequest{op, src, dst, mask_format,
src_x, src_y, triangles});
}
Future<void> Render::TriStrip(const Render::TriStripRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& op = request.op;
auto& src = request.src;
auto& dst = request.dst;
auto& mask_format = request.mask_format;
auto& src_x = request.src_x;
auto& src_y = request.src_y;
auto& points = request.points;
size_t points_len = points.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 12;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// op
uint8_t tmp15;
tmp15 = static_cast<uint8_t>(op);
buf.Write(&tmp15);
// pad0
Pad(&buf, 3);
// src
buf.Write(&src);
// dst
buf.Write(&dst);
// mask_format
buf.Write(&mask_format);
// src_x
buf.Write(&src_x);
// src_y
buf.Write(&src_y);
// points
DCHECK_EQ(static_cast<size_t>(points_len), points.size());
for (auto& points_elem : points) {
// points_elem
{
auto& x = points_elem.x;
auto& y = points_elem.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::TriStrip", false);
}
Future<void> Render::TriStrip(const PictOp& op,
const Picture& src,
const Picture& dst,
const PictFormat& mask_format,
const int16_t& src_x,
const int16_t& src_y,
const std::vector<PointFix>& points) {
return Render::TriStrip(
Render::TriStripRequest{op, src, dst, mask_format, src_x, src_y, points});
}
Future<void> Render::TriFan(const Render::TriFanRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& op = request.op;
auto& src = request.src;
auto& dst = request.dst;
auto& mask_format = request.mask_format;
auto& src_x = request.src_x;
auto& src_y = request.src_y;
auto& points = request.points;
size_t points_len = points.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 13;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// op
uint8_t tmp16;
tmp16 = static_cast<uint8_t>(op);
buf.Write(&tmp16);
// pad0
Pad(&buf, 3);
// src
buf.Write(&src);
// dst
buf.Write(&dst);
// mask_format
buf.Write(&mask_format);
// src_x
buf.Write(&src_x);
// src_y
buf.Write(&src_y);
// points
DCHECK_EQ(static_cast<size_t>(points_len), points.size());
for (auto& points_elem : points) {
// points_elem
{
auto& x = points_elem.x;
auto& y = points_elem.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::TriFan", false);
}
Future<void> Render::TriFan(const PictOp& op,
const Picture& src,
const Picture& dst,
const PictFormat& mask_format,
const int16_t& src_x,
const int16_t& src_y,
const std::vector<PointFix>& points) {
return Render::TriFan(
Render::TriFanRequest{op, src, dst, mask_format, src_x, src_y, points});
}
Future<void> Render::CreateGlyphSet(
const Render::CreateGlyphSetRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& gsid = request.gsid;
auto& format = request.format;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 17;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// gsid
buf.Write(&gsid);
// format
buf.Write(&format);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CreateGlyphSet", false);
}
Future<void> Render::CreateGlyphSet(const GlyphSet& gsid,
const PictFormat& format) {
return Render::CreateGlyphSet(Render::CreateGlyphSetRequest{gsid, format});
}
Future<void> Render::ReferenceGlyphSet(
const Render::ReferenceGlyphSetRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& gsid = request.gsid;
auto& existing = request.existing;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 18;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// gsid
buf.Write(&gsid);
// existing
buf.Write(&existing);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::ReferenceGlyphSet",
false);
}
Future<void> Render::ReferenceGlyphSet(const GlyphSet& gsid,
const GlyphSet& existing) {
return Render::ReferenceGlyphSet(
Render::ReferenceGlyphSetRequest{gsid, existing});
}
Future<void> Render::FreeGlyphSet(const Render::FreeGlyphSetRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& glyphset = request.glyphset;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 19;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// glyphset
buf.Write(&glyphset);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::FreeGlyphSet", false);
}
Future<void> Render::FreeGlyphSet(const GlyphSet& glyphset) {
return Render::FreeGlyphSet(Render::FreeGlyphSetRequest{glyphset});
}
Future<void> Render::AddGlyphs(const Render::AddGlyphsRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& glyphset = request.glyphset;
uint32_t glyphs_len{};
auto& glyphids = request.glyphids;
size_t glyphids_len = glyphids.size();
auto& glyphs = request.glyphs;
auto& data = request.data;
size_t data_len = data.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 20;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// glyphset
buf.Write(&glyphset);
// glyphs_len
glyphs_len = glyphs.size();
buf.Write(&glyphs_len);
// glyphids
DCHECK_EQ(static_cast<size_t>(glyphs_len), glyphids.size());
for (auto& glyphids_elem : glyphids) {
// glyphids_elem
buf.Write(&glyphids_elem);
}
// glyphs
DCHECK_EQ(static_cast<size_t>(glyphs_len), glyphs.size());
for (auto& glyphs_elem : glyphs) {
// glyphs_elem
{
auto& width = glyphs_elem.width;
auto& height = glyphs_elem.height;
auto& x = glyphs_elem.x;
auto& y = glyphs_elem.y;
auto& x_off = glyphs_elem.x_off;
auto& y_off = glyphs_elem.y_off;
// width
buf.Write(&width);
// height
buf.Write(&height);
// x
buf.Write(&x);
// y
buf.Write(&y);
// x_off
buf.Write(&x_off);
// y_off
buf.Write(&y_off);
}
}
// data
DCHECK_EQ(static_cast<size_t>(data_len), data.size());
for (auto& data_elem : data) {
// data_elem
buf.Write(&data_elem);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::AddGlyphs", false);
}
Future<void> Render::AddGlyphs(const GlyphSet& glyphset,
const std::vector<uint32_t>& glyphids,
const std::vector<GlyphInfo>& glyphs,
const std::vector<uint8_t>& data) {
return Render::AddGlyphs(
Render::AddGlyphsRequest{glyphset, glyphids, glyphs, data});
}
Future<void> Render::FreeGlyphs(const Render::FreeGlyphsRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& glyphset = request.glyphset;
auto& glyphs = request.glyphs;
size_t glyphs_len = glyphs.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 22;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// glyphset
buf.Write(&glyphset);
// glyphs
DCHECK_EQ(static_cast<size_t>(glyphs_len), glyphs.size());
for (auto& glyphs_elem : glyphs) {
// glyphs_elem
buf.Write(&glyphs_elem);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::FreeGlyphs", false);
}
Future<void> Render::FreeGlyphs(const GlyphSet& glyphset,
const std::vector<Glyph>& glyphs) {
return Render::FreeGlyphs(Render::FreeGlyphsRequest{glyphset, glyphs});
}
Future<void> Render::CompositeGlyphs8(
const Render::CompositeGlyphs8Request& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& op = request.op;
auto& src = request.src;
auto& dst = request.dst;
auto& mask_format = request.mask_format;
auto& glyphset = request.glyphset;
auto& src_x = request.src_x;
auto& src_y = request.src_y;
auto& glyphcmds = request.glyphcmds;
size_t glyphcmds_len = glyphcmds.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 23;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// op
uint8_t tmp17;
tmp17 = static_cast<uint8_t>(op);
buf.Write(&tmp17);
// pad0
Pad(&buf, 3);
// src
buf.Write(&src);
// dst
buf.Write(&dst);
// mask_format
buf.Write(&mask_format);
// glyphset
buf.Write(&glyphset);
// src_x
buf.Write(&src_x);
// src_y
buf.Write(&src_y);
// glyphcmds
DCHECK_EQ(static_cast<size_t>(glyphcmds_len), glyphcmds.size());
for (auto& glyphcmds_elem : glyphcmds) {
// glyphcmds_elem
buf.Write(&glyphcmds_elem);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CompositeGlyphs8",
false);
}
Future<void> Render::CompositeGlyphs8(const PictOp& op,
const Picture& src,
const Picture& dst,
const PictFormat& mask_format,
const GlyphSet& glyphset,
const int16_t& src_x,
const int16_t& src_y,
const std::vector<uint8_t>& glyphcmds) {
return Render::CompositeGlyphs8(Render::CompositeGlyphs8Request{
op, src, dst, mask_format, glyphset, src_x, src_y, glyphcmds});
}
Future<void> Render::CompositeGlyphs16(
const Render::CompositeGlyphs16Request& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& op = request.op;
auto& src = request.src;
auto& dst = request.dst;
auto& mask_format = request.mask_format;
auto& glyphset = request.glyphset;
auto& src_x = request.src_x;
auto& src_y = request.src_y;
auto& glyphcmds = request.glyphcmds;
size_t glyphcmds_len = glyphcmds.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 24;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// op
uint8_t tmp18;
tmp18 = static_cast<uint8_t>(op);
buf.Write(&tmp18);
// pad0
Pad(&buf, 3);
// src
buf.Write(&src);
// dst
buf.Write(&dst);
// mask_format
buf.Write(&mask_format);
// glyphset
buf.Write(&glyphset);
// src_x
buf.Write(&src_x);
// src_y
buf.Write(&src_y);
// glyphcmds
DCHECK_EQ(static_cast<size_t>(glyphcmds_len), glyphcmds.size());
for (auto& glyphcmds_elem : glyphcmds) {
// glyphcmds_elem
buf.Write(&glyphcmds_elem);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CompositeGlyphs16",
false);
}
Future<void> Render::CompositeGlyphs16(const PictOp& op,
const Picture& src,
const Picture& dst,
const PictFormat& mask_format,
const GlyphSet& glyphset,
const int16_t& src_x,
const int16_t& src_y,
const std::vector<uint8_t>& glyphcmds) {
return Render::CompositeGlyphs16(Render::CompositeGlyphs16Request{
op, src, dst, mask_format, glyphset, src_x, src_y, glyphcmds});
}
Future<void> Render::CompositeGlyphs32(
const Render::CompositeGlyphs32Request& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& op = request.op;
auto& src = request.src;
auto& dst = request.dst;
auto& mask_format = request.mask_format;
auto& glyphset = request.glyphset;
auto& src_x = request.src_x;
auto& src_y = request.src_y;
auto& glyphcmds = request.glyphcmds;
size_t glyphcmds_len = glyphcmds.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 25;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// op
uint8_t tmp19;
tmp19 = static_cast<uint8_t>(op);
buf.Write(&tmp19);
// pad0
Pad(&buf, 3);
// src
buf.Write(&src);
// dst
buf.Write(&dst);
// mask_format
buf.Write(&mask_format);
// glyphset
buf.Write(&glyphset);
// src_x
buf.Write(&src_x);
// src_y
buf.Write(&src_y);
// glyphcmds
DCHECK_EQ(static_cast<size_t>(glyphcmds_len), glyphcmds.size());
for (auto& glyphcmds_elem : glyphcmds) {
// glyphcmds_elem
buf.Write(&glyphcmds_elem);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CompositeGlyphs32",
false);
}
Future<void> Render::CompositeGlyphs32(const PictOp& op,
const Picture& src,
const Picture& dst,
const PictFormat& mask_format,
const GlyphSet& glyphset,
const int16_t& src_x,
const int16_t& src_y,
const std::vector<uint8_t>& glyphcmds) {
return Render::CompositeGlyphs32(Render::CompositeGlyphs32Request{
op, src, dst, mask_format, glyphset, src_x, src_y, glyphcmds});
}
Future<void> Render::FillRectangles(
const Render::FillRectanglesRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& op = request.op;
auto& dst = request.dst;
auto& color = request.color;
auto& rects = request.rects;
size_t rects_len = rects.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 26;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// op
uint8_t tmp20;
tmp20 = static_cast<uint8_t>(op);
buf.Write(&tmp20);
// pad0
Pad(&buf, 3);
// dst
buf.Write(&dst);
// color
{
auto& red = color.red;
auto& green = color.green;
auto& blue = color.blue;
auto& alpha = color.alpha;
// red
buf.Write(&red);
// green
buf.Write(&green);
// blue
buf.Write(&blue);
// alpha
buf.Write(&alpha);
}
// rects
DCHECK_EQ(static_cast<size_t>(rects_len), rects.size());
for (auto& rects_elem : rects) {
// rects_elem
{
auto& x = rects_elem.x;
auto& y = rects_elem.y;
auto& width = rects_elem.width;
auto& height = rects_elem.height;
// x
buf.Write(&x);
// y
buf.Write(&y);
// width
buf.Write(&width);
// height
buf.Write(&height);
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::FillRectangles", false);
}
Future<void> Render::FillRectangles(const PictOp& op,
const Picture& dst,
const Color& color,
const std::vector<Rectangle>& rects) {
return Render::FillRectangles(
Render::FillRectanglesRequest{op, dst, color, rects});
}
Future<void> Render::CreateCursor(const Render::CreateCursorRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& cid = request.cid;
auto& source = request.source;
auto& x = request.x;
auto& y = request.y;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 27;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// cid
buf.Write(&cid);
// source
buf.Write(&source);
// x
buf.Write(&x);
// y
buf.Write(&y);
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CreateCursor", false);
}
Future<void> Render::CreateCursor(const Cursor& cid,
const Picture& source,
const uint16_t& x,
const uint16_t& y) {
return Render::CreateCursor(Render::CreateCursorRequest{cid, source, x, y});
}
Future<void> Render::SetPictureTransform(
const Render::SetPictureTransformRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& picture = request.picture;
auto& transform = request.transform;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 28;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// picture
buf.Write(&picture);
// transform
{
auto& matrix11 = transform.matrix11;
auto& matrix12 = transform.matrix12;
auto& matrix13 = transform.matrix13;
auto& matrix21 = transform.matrix21;
auto& matrix22 = transform.matrix22;
auto& matrix23 = transform.matrix23;
auto& matrix31 = transform.matrix31;
auto& matrix32 = transform.matrix32;
auto& matrix33 = transform.matrix33;
// matrix11
buf.Write(&matrix11);
// matrix12
buf.Write(&matrix12);
// matrix13
buf.Write(&matrix13);
// matrix21
buf.Write(&matrix21);
// matrix22
buf.Write(&matrix22);
// matrix23
buf.Write(&matrix23);
// matrix31
buf.Write(&matrix31);
// matrix32
buf.Write(&matrix32);
// matrix33
buf.Write(&matrix33);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::SetPictureTransform",
false);
}
Future<void> Render::SetPictureTransform(const Picture& picture,
const Transform& transform) {
return Render::SetPictureTransform(
Render::SetPictureTransformRequest{picture, transform});
}
Future<Render::QueryFiltersReply> Render::QueryFilters(
const Render::QueryFiltersRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& drawable = request.drawable;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 29;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// drawable
buf.Write(&drawable);
Align(&buf, 4);
return connection_->SendRequest<Render::QueryFiltersReply>(
&buf, "Render::QueryFilters", false);
}
Future<Render::QueryFiltersReply> Render::QueryFilters(
const Drawable& drawable) {
return Render::QueryFilters(Render::QueryFiltersRequest{drawable});
}
template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<Render::QueryFiltersReply> detail::ReadReply<
Render::QueryFiltersReply>(ReadBuffer* buffer) {
auto& buf = *buffer;
auto reply = std::make_unique<Render::QueryFiltersReply>();
auto& sequence = (*reply).sequence;
uint32_t num_aliases{};
uint32_t num_filters{};
auto& aliases = (*reply).aliases;
size_t aliases_len = aliases.size();
auto& filters = (*reply).filters;
size_t filters_len = filters.size();
// response_type
uint8_t response_type;
Read(&response_type, &buf);
// pad0
Pad(&buf, 1);
// sequence
Read(&sequence, &buf);
// length
uint32_t length;
Read(&length, &buf);
// num_aliases
Read(&num_aliases, &buf);
// num_filters
Read(&num_filters, &buf);
// pad1
Pad(&buf, 16);
// aliases
aliases.resize(num_aliases);
for (auto& aliases_elem : aliases) {
// aliases_elem
Read(&aliases_elem, &buf);
}
// filters
filters.resize(num_filters);
for (auto& filters_elem : filters) {
// filters_elem
{
uint8_t name_len{};
auto& name = filters_elem.name;
// name_len
Read(&name_len, &buf);
// name
name.resize(name_len);
for (auto& name_elem : name) {
// name_elem
Read(&name_elem, &buf);
}
}
}
Align(&buf, 4);
DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);
return reply;
}
Future<void> Render::SetPictureFilter(
const Render::SetPictureFilterRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& picture = request.picture;
uint16_t filter_len{};
auto& filter = request.filter;
auto& values = request.values;
size_t values_len = values.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 30;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// picture
buf.Write(&picture);
// filter_len
filter_len = filter.size();
buf.Write(&filter_len);
// pad0
Pad(&buf, 2);
// filter
DCHECK_EQ(static_cast<size_t>(filter_len), filter.size());
for (auto& filter_elem : filter) {
// filter_elem
buf.Write(&filter_elem);
}
// pad1
Align(&buf, 4);
// values
DCHECK_EQ(static_cast<size_t>(values_len), values.size());
for (auto& values_elem : values) {
// values_elem
buf.Write(&values_elem);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::SetPictureFilter",
false);
}
Future<void> Render::SetPictureFilter(const Picture& picture,
const std::string& filter,
const std::vector<Fixed>& values) {
return Render::SetPictureFilter(
Render::SetPictureFilterRequest{picture, filter, values});
}
Future<void> Render::CreateAnimCursor(
const Render::CreateAnimCursorRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& cid = request.cid;
auto& cursors = request.cursors;
size_t cursors_len = cursors.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 31;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// cid
buf.Write(&cid);
// cursors
DCHECK_EQ(static_cast<size_t>(cursors_len), cursors.size());
for (auto& cursors_elem : cursors) {
// cursors_elem
{
auto& cursor = cursors_elem.cursor;
auto& delay = cursors_elem.delay;
// cursor
buf.Write(&cursor);
// delay
buf.Write(&delay);
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CreateAnimCursor",
false);
}
Future<void> Render::CreateAnimCursor(
const Cursor& cid,
const std::vector<AnimationCursorElement>& cursors) {
return Render::CreateAnimCursor(
Render::CreateAnimCursorRequest{cid, cursors});
}
Future<void> Render::AddTraps(const Render::AddTrapsRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& picture = request.picture;
auto& x_off = request.x_off;
auto& y_off = request.y_off;
auto& traps = request.traps;
size_t traps_len = traps.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 32;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// picture
buf.Write(&picture);
// x_off
buf.Write(&x_off);
// y_off
buf.Write(&y_off);
// traps
DCHECK_EQ(static_cast<size_t>(traps_len), traps.size());
for (auto& traps_elem : traps) {
// traps_elem
{
auto& top = traps_elem.top;
auto& bot = traps_elem.bot;
// top
{
auto& l = top.l;
auto& r = top.r;
auto& y = top.y;
// l
buf.Write(&l);
// r
buf.Write(&r);
// y
buf.Write(&y);
}
// bot
{
auto& l = bot.l;
auto& r = bot.r;
auto& y = bot.y;
// l
buf.Write(&l);
// r
buf.Write(&r);
// y
buf.Write(&y);
}
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::AddTraps", false);
}
Future<void> Render::AddTraps(const Picture& picture,
const int16_t& x_off,
const int16_t& y_off,
const std::vector<Trap>& traps) {
return Render::AddTraps(
Render::AddTrapsRequest{picture, x_off, y_off, traps});
}
Future<void> Render::CreateSolidFill(
const Render::CreateSolidFillRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& picture = request.picture;
auto& color = request.color;
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 33;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// picture
buf.Write(&picture);
// color
{
auto& red = color.red;
auto& green = color.green;
auto& blue = color.blue;
auto& alpha = color.alpha;
// red
buf.Write(&red);
// green
buf.Write(&green);
// blue
buf.Write(&blue);
// alpha
buf.Write(&alpha);
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CreateSolidFill", false);
}
Future<void> Render::CreateSolidFill(const Picture& picture,
const Color& color) {
return Render::CreateSolidFill(
Render::CreateSolidFillRequest{picture, color});
}
Future<void> Render::CreateLinearGradient(
const Render::CreateLinearGradientRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& picture = request.picture;
auto& p1 = request.p1;
auto& p2 = request.p2;
uint32_t num_stops{};
auto& stops = request.stops;
size_t stops_len = stops.size();
auto& colors = request.colors;
size_t colors_len = colors.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 34;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// picture
buf.Write(&picture);
// p1
{
auto& x = p1.x;
auto& y = p1.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
// p2
{
auto& x = p2.x;
auto& y = p2.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
// num_stops
num_stops = stops.size();
buf.Write(&num_stops);
// stops
DCHECK_EQ(static_cast<size_t>(num_stops), stops.size());
for (auto& stops_elem : stops) {
// stops_elem
buf.Write(&stops_elem);
}
// colors
DCHECK_EQ(static_cast<size_t>(num_stops), colors.size());
for (auto& colors_elem : colors) {
// colors_elem
{
auto& red = colors_elem.red;
auto& green = colors_elem.green;
auto& blue = colors_elem.blue;
auto& alpha = colors_elem.alpha;
// red
buf.Write(&red);
// green
buf.Write(&green);
// blue
buf.Write(&blue);
// alpha
buf.Write(&alpha);
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CreateLinearGradient",
false);
}
Future<void> Render::CreateLinearGradient(const Picture& picture,
const PointFix& p1,
const PointFix& p2,
const std::vector<Fixed>& stops,
const std::vector<Color>& colors) {
return Render::CreateLinearGradient(
Render::CreateLinearGradientRequest{picture, p1, p2, stops, colors});
}
Future<void> Render::CreateRadialGradient(
const Render::CreateRadialGradientRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& picture = request.picture;
auto& inner = request.inner;
auto& outer = request.outer;
auto& inner_radius = request.inner_radius;
auto& outer_radius = request.outer_radius;
uint32_t num_stops{};
auto& stops = request.stops;
size_t stops_len = stops.size();
auto& colors = request.colors;
size_t colors_len = colors.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 35;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// picture
buf.Write(&picture);
// inner
{
auto& x = inner.x;
auto& y = inner.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
// outer
{
auto& x = outer.x;
auto& y = outer.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
// inner_radius
buf.Write(&inner_radius);
// outer_radius
buf.Write(&outer_radius);
// num_stops
num_stops = stops.size();
buf.Write(&num_stops);
// stops
DCHECK_EQ(static_cast<size_t>(num_stops), stops.size());
for (auto& stops_elem : stops) {
// stops_elem
buf.Write(&stops_elem);
}
// colors
DCHECK_EQ(static_cast<size_t>(num_stops), colors.size());
for (auto& colors_elem : colors) {
// colors_elem
{
auto& red = colors_elem.red;
auto& green = colors_elem.green;
auto& blue = colors_elem.blue;
auto& alpha = colors_elem.alpha;
// red
buf.Write(&red);
// green
buf.Write(&green);
// blue
buf.Write(&blue);
// alpha
buf.Write(&alpha);
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CreateRadialGradient",
false);
}
Future<void> Render::CreateRadialGradient(const Picture& picture,
const PointFix& inner,
const PointFix& outer,
const Fixed& inner_radius,
const Fixed& outer_radius,
const std::vector<Fixed>& stops,
const std::vector<Color>& colors) {
return Render::CreateRadialGradient(Render::CreateRadialGradientRequest{
picture, inner, outer, inner_radius, outer_radius, stops, colors});
}
Future<void> Render::CreateConicalGradient(
const Render::CreateConicalGradientRequest& request) {
if (!connection_->Ready() || !present())
return {};
WriteBuffer buf;
auto& picture = request.picture;
auto& center = request.center;
auto& angle = request.angle;
uint32_t num_stops{};
auto& stops = request.stops;
size_t stops_len = stops.size();
auto& colors = request.colors;
size_t colors_len = colors.size();
// major_opcode
uint8_t major_opcode = info_.major_opcode;
buf.Write(&major_opcode);
// minor_opcode
uint8_t minor_opcode = 36;
buf.Write(&minor_opcode);
// length
// Caller fills in length for writes.
Pad(&buf, sizeof(uint16_t));
// picture
buf.Write(&picture);
// center
{
auto& x = center.x;
auto& y = center.y;
// x
buf.Write(&x);
// y
buf.Write(&y);
}
// angle
buf.Write(&angle);
// num_stops
num_stops = stops.size();
buf.Write(&num_stops);
// stops
DCHECK_EQ(static_cast<size_t>(num_stops), stops.size());
for (auto& stops_elem : stops) {
// stops_elem
buf.Write(&stops_elem);
}
// colors
DCHECK_EQ(static_cast<size_t>(num_stops), colors.size());
for (auto& colors_elem : colors) {
// colors_elem
{
auto& red = colors_elem.red;
auto& green = colors_elem.green;
auto& blue = colors_elem.blue;
auto& alpha = colors_elem.alpha;
// red
buf.Write(&red);
// green
buf.Write(&green);
// blue
buf.Write(&blue);
// alpha
buf.Write(&alpha);
}
}
Align(&buf, 4);
return connection_->SendRequest<void>(&buf, "Render::CreateConicalGradient",
false);
}
Future<void> Render::CreateConicalGradient(const Picture& picture,
const PointFix& center,
const Fixed& angle,
const std::vector<Fixed>& stops,
const std::vector<Color>& colors) {
return Render::CreateConicalGradient(Render::CreateConicalGradientRequest{
picture, center, angle, stops, colors});
}
} // namespace x11