blob: 26e1d3f5b9548ab40569213a01bbdc9aff39a71c [file] [log] [blame]
// Copyright 2016 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.
#include "cc/ipc/quads_struct_traits.h"
namespace mojo {
namespace {
bool ReadDrawQuad(cc::mojom::DrawQuadDataView data, cc::DrawQuad* quad) {
cc::DrawQuad::Material material;
if (!data.ReadMaterial(&material) || material != quad->material) {
return false;
}
if (!data.ReadRect(&quad->rect) || !data.ReadOpaqueRect(&quad->opaque_rect) ||
!data.ReadVisibleRect(&quad->visible_rect)) {
return false;
}
quad->needs_blending = data.needs_blending();
return true;
}
bool AllocateAndConstruct(cc::DrawQuad::Material material, cc::QuadList* list) {
cc::DrawQuad* quad = nullptr;
switch (material) {
case cc::DrawQuad::INVALID:
break;
case cc::DrawQuad::DEBUG_BORDER:
quad = list->AllocateAndConstruct<cc::DebugBorderDrawQuad>();
break;
case cc::DrawQuad::PICTURE_CONTENT:
quad = list->AllocateAndConstruct<cc::PictureDrawQuad>();
break;
case cc::DrawQuad::RENDER_PASS:
quad = list->AllocateAndConstruct<cc::RenderPassDrawQuad>();
break;
case cc::DrawQuad::SOLID_COLOR:
quad = list->AllocateAndConstruct<cc::SolidColorDrawQuad>();
break;
case cc::DrawQuad::STREAM_VIDEO_CONTENT:
quad = list->AllocateAndConstruct<cc::StreamVideoDrawQuad>();
break;
case cc::DrawQuad::SURFACE_CONTENT:
quad = list->AllocateAndConstruct<cc::SurfaceDrawQuad>();
break;
case cc::DrawQuad::TEXTURE_CONTENT:
quad = list->AllocateAndConstruct<cc::TextureDrawQuad>();
break;
case cc::DrawQuad::TILED_CONTENT:
quad = list->AllocateAndConstruct<cc::TileDrawQuad>();
break;
case cc::DrawQuad::YUV_VIDEO_CONTENT:
quad = list->AllocateAndConstruct<cc::YUVVideoDrawQuad>();
break;
}
if (quad)
quad->material = material;
return quad != nullptr;
}
} // namespace
// static
cc::mojom::Material
EnumTraits<cc::mojom::Material, cc::DrawQuad::Material>::ToMojom(
cc::DrawQuad::Material material) {
switch (material) {
case cc::DrawQuad::INVALID:
return cc::mojom::Material::INVALID;
case cc::DrawQuad::DEBUG_BORDER:
return cc::mojom::Material::DEBUG_BORDER;
case cc::DrawQuad::PICTURE_CONTENT:
return cc::mojom::Material::PICTURE_CONTENT;
case cc::DrawQuad::RENDER_PASS:
return cc::mojom::Material::RENDER_PASS;
case cc::DrawQuad::SOLID_COLOR:
return cc::mojom::Material::SOLID_COLOR;
case cc::DrawQuad::STREAM_VIDEO_CONTENT:
return cc::mojom::Material::STREAM_VIDEO_CONTENT;
case cc::DrawQuad::SURFACE_CONTENT:
return cc::mojom::Material::SURFACE_CONTENT;
case cc::DrawQuad::TEXTURE_CONTENT:
return cc::mojom::Material::TEXTURE_CONTENT;
case cc::DrawQuad::TILED_CONTENT:
return cc::mojom::Material::TILED_CONTENT;
case cc::DrawQuad::YUV_VIDEO_CONTENT:
return cc::mojom::Material::YUV_VIDEO_CONTENT;
}
return cc::mojom::Material::INVALID;
}
// static
bool EnumTraits<cc::mojom::Material, cc::DrawQuad::Material>::FromMojom(
cc::mojom::Material input,
cc::DrawQuad::Material* out) {
switch (input) {
case cc::mojom::Material::INVALID:
*out = cc::DrawQuad::INVALID;
return true;
case cc::mojom::Material::DEBUG_BORDER:
*out = cc::DrawQuad::DEBUG_BORDER;
return true;
case cc::mojom::Material::PICTURE_CONTENT:
*out = cc::DrawQuad::PICTURE_CONTENT;
return true;
case cc::mojom::Material::RENDER_PASS:
*out = cc::DrawQuad::RENDER_PASS;
return true;
case cc::mojom::Material::SOLID_COLOR:
*out = cc::DrawQuad::SOLID_COLOR;
return true;
case cc::mojom::Material::STREAM_VIDEO_CONTENT:
*out = cc::DrawQuad::STREAM_VIDEO_CONTENT;
return true;
case cc::mojom::Material::SURFACE_CONTENT:
*out = cc::DrawQuad::SURFACE_CONTENT;
return true;
case cc::mojom::Material::TEXTURE_CONTENT:
*out = cc::DrawQuad::TEXTURE_CONTENT;
return true;
case cc::mojom::Material::TILED_CONTENT:
*out = cc::DrawQuad::TILED_CONTENT;
return true;
case cc::mojom::Material::YUV_VIDEO_CONTENT:
*out = cc::DrawQuad::YUV_VIDEO_CONTENT;
return true;
}
return false;
}
// static
bool StructTraits<cc::mojom::DebugBorderQuadState, cc::DrawQuad>::Read(
cc::mojom::DebugBorderQuadStateDataView data,
cc::DrawQuad* out) {
cc::DebugBorderDrawQuad* quad = static_cast<cc::DebugBorderDrawQuad*>(out);
quad->color = data.color();
quad->width = data.width();
return true;
}
// static
bool StructTraits<cc::mojom::RenderPassQuadState, cc::DrawQuad>::Read(
cc::mojom::RenderPassQuadStateDataView data,
cc::DrawQuad* out) {
cc::RenderPassDrawQuad* quad = static_cast<cc::RenderPassDrawQuad*>(out);
quad->resources.ids[cc::RenderPassDrawQuad::kMaskResourceIdIndex] =
data.mask_resource_id();
return data.ReadRenderPassId(&quad->render_pass_id) &&
data.ReadMaskUvScale(&quad->mask_uv_scale) &&
data.ReadMaskTextureSize(&quad->mask_texture_size) &&
data.ReadFilters(&quad->filters) &&
data.ReadFiltersScale(&quad->filters_scale) &&
data.ReadBackgroundFilters(&quad->background_filters);
}
// static
bool StructTraits<cc::mojom::SolidColorQuadState, cc::DrawQuad>::Read(
cc::mojom::SolidColorQuadStateDataView data,
cc::DrawQuad* out) {
cc::SolidColorDrawQuad* quad = static_cast<cc::SolidColorDrawQuad*>(out);
quad->force_anti_aliasing_off = data.force_anti_aliasing_off();
quad->color = data.color();
return true;
}
// static
bool StructTraits<cc::mojom::SurfaceQuadState, cc::DrawQuad>::Read(
cc::mojom::SurfaceQuadStateDataView data,
cc::DrawQuad* out) {
cc::SurfaceDrawQuad* quad = static_cast<cc::SurfaceDrawQuad*>(out);
return data.ReadSurface(&quad->surface_id);
}
// static
bool StructTraits<cc::mojom::TextureQuadState, cc::DrawQuad>::Read(
cc::mojom::TextureQuadStateDataView data,
cc::DrawQuad* out) {
cc::TextureDrawQuad* quad = static_cast<cc::TextureDrawQuad*>(out);
quad->resources.ids[cc::TextureDrawQuad::kResourceIdIndex] =
data.resource_id();
quad->premultiplied_alpha = data.premultiplied_alpha();
if (!data.ReadUvTopLeft(&quad->uv_top_left) ||
!data.ReadUvBottomRight(&quad->uv_bottom_right)) {
return false;
}
quad->background_color = data.background_color();
CArray<float> vertex_opacity_array = {4, 4, &quad->vertex_opacity[0]};
if (!data.ReadVertexOpacity(&vertex_opacity_array))
return false;
quad->y_flipped = data.y_flipped();
quad->nearest_neighbor = data.nearest_neighbor();
quad->secure_output_only = data.secure_output_only();
return true;
}
// static
bool StructTraits<cc::mojom::TileQuadState, cc::DrawQuad>::Read(
cc::mojom::TileQuadStateDataView data,
cc::DrawQuad* out) {
cc::TileDrawQuad* quad = static_cast<cc::TileDrawQuad*>(out);
if (!data.ReadTexCoordRect(&quad->tex_coord_rect) ||
!data.ReadTextureSize(&quad->texture_size)) {
return false;
}
quad->swizzle_contents = data.swizzle_contents();
quad->nearest_neighbor = data.nearest_neighbor();
quad->resources.ids[cc::TileDrawQuad::kResourceIdIndex] = data.resource_id();
return true;
}
cc::mojom::YUVColorSpace
EnumTraits<cc::mojom::YUVColorSpace, cc::YUVVideoDrawQuad::ColorSpace>::ToMojom(
cc::YUVVideoDrawQuad::ColorSpace color_space) {
switch (color_space) {
case cc::YUVVideoDrawQuad::REC_601:
return cc::mojom::YUVColorSpace::REC_601;
case cc::YUVVideoDrawQuad::REC_709:
return cc::mojom::YUVColorSpace::REC_709;
case cc::YUVVideoDrawQuad::JPEG:
return cc::mojom::YUVColorSpace::JPEG;
}
NOTREACHED();
return cc::mojom::YUVColorSpace::JPEG;
}
// static
bool EnumTraits<cc::mojom::YUVColorSpace, cc::YUVVideoDrawQuad::ColorSpace>::
FromMojom(cc::mojom::YUVColorSpace input,
cc::YUVVideoDrawQuad::ColorSpace* out) {
switch (input) {
case cc::mojom::YUVColorSpace::REC_601:
*out = cc::YUVVideoDrawQuad::REC_601;
return true;
case cc::mojom::YUVColorSpace::REC_709:
*out = cc::YUVVideoDrawQuad::REC_709;
return true;
case cc::mojom::YUVColorSpace::JPEG:
*out = cc::YUVVideoDrawQuad::JPEG;
return true;
}
return false;
}
// static
bool StructTraits<cc::mojom::YUVVideoQuadState, cc::DrawQuad>::Read(
cc::mojom::YUVVideoQuadStateDataView data,
cc::DrawQuad* out) {
cc::YUVVideoDrawQuad* quad = static_cast<cc::YUVVideoDrawQuad*>(out);
if (!data.ReadYaTexCoordRect(&quad->ya_tex_coord_rect) ||
!data.ReadUvTexCoordRect(&quad->uv_tex_coord_rect) ||
!data.ReadYaTexSize(&quad->ya_tex_size) ||
!data.ReadUvTexSize(&quad->uv_tex_size)) {
return false;
}
quad->resources.ids[cc::YUVVideoDrawQuad::kYPlaneResourceIdIndex] =
data.y_plane_resource_id();
quad->resources.ids[cc::YUVVideoDrawQuad::kUPlaneResourceIdIndex] =
data.u_plane_resource_id();
quad->resources.ids[cc::YUVVideoDrawQuad::kVPlaneResourceIdIndex] =
data.v_plane_resource_id();
quad->resources.ids[cc::YUVVideoDrawQuad::kAPlaneResourceIdIndex] =
data.a_plane_resource_id();
if (!data.ReadColorSpace(&quad->color_space))
return false;
quad->resource_offset = data.resource_offset();
quad->resource_multiplier = data.resource_multiplier();
return true;
}
// static
bool StructTraits<cc::mojom::DrawQuad, cc::DrawQuad>::Read(
cc::mojom::DrawQuadDataView data,
cc::DrawQuad* out) {
if (!ReadDrawQuad(data, out))
return false;
switch (data.material()) {
case cc::mojom::Material::INVALID:
break;
case cc::mojom::Material::DEBUG_BORDER:
return data.ReadDebugBorderQuadState(out);
case cc::mojom::Material::PICTURE_CONTENT:
// TODO(fsamuel): Implement PictureDrawQuad
// serialization/deserialization.
break;
case cc::mojom::Material::RENDER_PASS:
return data.ReadRenderPassQuadState(out);
case cc::mojom::Material::SOLID_COLOR:
return data.ReadSolidColorQuadState(out);
case cc::mojom::Material::STREAM_VIDEO_CONTENT:
// TODO(fsamuel): Implement StreamVideoContentDrawQuad
// serialization/deserialization.
break;
case cc::mojom::Material::SURFACE_CONTENT:
return data.ReadSurfaceQuadState(out);
case cc::mojom::Material::TEXTURE_CONTENT:
return data.ReadTextureQuadState(out);
case cc::mojom::Material::TILED_CONTENT:
return data.ReadTileQuadState(out);
case cc::mojom::Material::YUV_VIDEO_CONTENT:
return data.ReadYuvVideoQuadState(out);
}
NOTREACHED();
return false;
}
// static
void* StructTraits<cc::mojom::QuadList, cc::QuadList>::SetUpContext(
const cc::QuadList& quad_list) {
mojo::Array<cc::DrawQuad::Material>* materials =
new mojo::Array<cc::DrawQuad::Material>(quad_list.size());
for (auto it = quad_list.begin(); it != quad_list.end(); ++it)
(*materials)[it.index()] = it->material;
return materials;
}
// static
void StructTraits<cc::mojom::QuadList, cc::QuadList>::TearDownContext(
const cc::QuadList& quad_list,
void* context) {
// static_cast to ensure the destructor is called.
delete static_cast<mojo::Array<cc::DrawQuad::Material>*>(context);
}
// static
const mojo::Array<cc::DrawQuad::Material>&
StructTraits<cc::mojom::QuadList, cc::QuadList>::quad_types(
const cc::QuadList& quad_list,
void* context) {
return *static_cast<mojo::Array<cc::DrawQuad::Material>*>(context);
}
// static
bool StructTraits<cc::mojom::QuadList, cc::QuadList>::Read(
cc::mojom::QuadListDataView data,
cc::QuadList* out) {
// TODO(fsamuel): Once we have ArrayTraits DataViews we can delete
// this field. This field exists so we can pre-allocate DrawQuads
// in the QuadList according to their material.
mojo::Array<cc::DrawQuad::Material> materials;
if (!data.ReadQuadTypes(&materials))
return false;
for (size_t i = 0; i < materials.size(); ++i) {
if (!AllocateAndConstruct(materials[i], out))
return false;
}
// The materials array and the quads array are expected to be the same size.
// If they are not, then deserialization will fail.
QuadListArray quad_list_array = {materials.size(), out};
return data.ReadQuads(&quad_list_array);
}
} // namespace mojo