// 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" #include "ui/gfx/mojo/transform_struct_traits.h" namespace mojo { cc::DrawQuad* AllocateAndConstruct( cc::mojom::DrawQuadStateDataView::Tag material, cc::QuadList* list) { cc::DrawQuad* quad = nullptr; switch (material) { case cc::mojom::DrawQuadStateDataView::Tag::DEBUG_BORDER_QUAD_STATE: quad = list->AllocateAndConstruct(); quad->material = cc::DrawQuad::DEBUG_BORDER; return quad; case cc::mojom::DrawQuadStateDataView::Tag::RENDER_PASS_QUAD_STATE: quad = list->AllocateAndConstruct(); quad->material = cc::DrawQuad::RENDER_PASS; return quad; case cc::mojom::DrawQuadStateDataView::Tag::SOLID_COLOR_QUAD_STATE: quad = list->AllocateAndConstruct(); quad->material = cc::DrawQuad::SOLID_COLOR; return quad; case cc::mojom::DrawQuadStateDataView::Tag::STREAM_VIDEO_QUAD_STATE: quad = list->AllocateAndConstruct(); quad->material = cc::DrawQuad::STREAM_VIDEO_CONTENT; return quad; case cc::mojom::DrawQuadStateDataView::Tag::SURFACE_QUAD_STATE: quad = list->AllocateAndConstruct(); quad->material = cc::DrawQuad::SURFACE_CONTENT; return quad; case cc::mojom::DrawQuadStateDataView::Tag::TEXTURE_QUAD_STATE: quad = list->AllocateAndConstruct(); quad->material = cc::DrawQuad::TEXTURE_CONTENT; return quad; case cc::mojom::DrawQuadStateDataView::Tag::TILE_QUAD_STATE: quad = list->AllocateAndConstruct(); quad->material = cc::DrawQuad::TILED_CONTENT; return quad; case cc::mojom::DrawQuadStateDataView::Tag::YUV_VIDEO_QUAD_STATE: quad = list->AllocateAndConstruct(); quad->material = cc::DrawQuad::YUV_VIDEO_CONTENT; return quad; } NOTREACHED(); return nullptr; } // static bool StructTraits::Read( cc::mojom::DebugBorderQuadStateDataView data, cc::DrawQuad* out) { cc::DebugBorderDrawQuad* quad = static_cast(out); quad->color = data.color(); quad->width = data.width(); return true; } // static bool StructTraits::Read( cc::mojom::RenderPassQuadStateDataView data, cc::DrawQuad* out) { cc::RenderPassDrawQuad* quad = static_cast(out); quad->resources.ids[cc::RenderPassDrawQuad::kMaskResourceIdIndex] = data.mask_resource_id(); quad->resources.count = data.mask_resource_id() ? 1 : 0; quad->render_pass_id = data.render_pass_id(); // RenderPass ids are never zero. if (!quad->render_pass_id) return false; return data.ReadMaskUvRect(&quad->mask_uv_rect) && data.ReadMaskTextureSize(&quad->mask_texture_size) && data.ReadFiltersScale(&quad->filters_scale) && data.ReadFiltersOrigin(&quad->filters_origin) && data.ReadTexCoordRect(&quad->tex_coord_rect); } // static bool StructTraits::Read( cc::mojom::SolidColorQuadStateDataView data, cc::DrawQuad* out) { cc::SolidColorDrawQuad* quad = static_cast(out); quad->force_anti_aliasing_off = data.force_anti_aliasing_off(); quad->color = data.color(); return true; } // static bool StructTraits::Read( cc::mojom::StreamVideoQuadStateDataView data, cc::DrawQuad* out) { cc::StreamVideoDrawQuad* quad = static_cast(out); quad->resources.ids[cc::StreamVideoDrawQuad::kResourceIdIndex] = data.resource_id(); quad->resources.count = 1; return data.ReadResourceSizeInPixels( &quad->overlay_resources .size_in_pixels[cc::StreamVideoDrawQuad::kResourceIdIndex]) && data.ReadMatrix(&quad->matrix); } // static cc::mojom::SurfaceDrawQuadType EnumTraits::ToMojom( cc::SurfaceDrawQuadType surface_draw_quad_type) { switch (surface_draw_quad_type) { case cc::SurfaceDrawQuadType::PRIMARY: return cc::mojom::SurfaceDrawQuadType::PRIMARY; case cc::SurfaceDrawQuadType::FALLBACK: return cc::mojom::SurfaceDrawQuadType::FALLBACK; } NOTREACHED(); return cc::mojom::SurfaceDrawQuadType::PRIMARY; } // static bool EnumTraits:: FromMojom(cc::mojom::SurfaceDrawQuadType input, cc::SurfaceDrawQuadType* out) { switch (input) { case cc::mojom::SurfaceDrawQuadType::PRIMARY: *out = cc::SurfaceDrawQuadType::PRIMARY; return true; case cc::mojom::SurfaceDrawQuadType::FALLBACK: *out = cc::SurfaceDrawQuadType::FALLBACK; return true; } return false; } // static bool StructTraits::Read( cc::mojom::SurfaceQuadStateDataView data, cc::DrawQuad* out) { cc::SurfaceDrawQuad* quad = static_cast(out); return data.ReadSurfaceDrawQuadType(&quad->surface_draw_quad_type) && data.ReadSurface(&quad->surface_id); } // static bool StructTraits::Read( cc::mojom::TextureQuadStateDataView data, cc::DrawQuad* out) { cc::TextureDrawQuad* quad = static_cast(out); quad->resources.ids[cc::TextureDrawQuad::kResourceIdIndex] = data.resource_id(); if (!data.ReadResourceSizeInPixels( &quad->overlay_resources .size_in_pixels[cc::TextureDrawQuad::kResourceIdIndex])) { return false; } quad->resources.count = 1; 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 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::Read( cc::mojom::TileQuadStateDataView data, cc::DrawQuad* out) { cc::TileDrawQuad* quad = static_cast(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(); quad->resources.count = 1; return true; } cc::mojom::YUVColorSpace EnumTraits::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:: 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::Read( cc::mojom::YUVVideoQuadStateDataView data, cc::DrawQuad* out) { cc::YUVVideoDrawQuad* quad = static_cast(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(); static_assert(cc::YUVVideoDrawQuad::kAPlaneResourceIdIndex == cc::DrawQuad::Resources::kMaxResourceIdCount - 1, "The A plane resource should be the last resource ID."); quad->resources.count = data.a_plane_resource_id() ? 4 : 3; if (!data.ReadColorSpace(&quad->color_space)) return false; quad->resource_offset = data.resource_offset(); quad->resource_multiplier = data.resource_multiplier(); quad->bits_per_channel = data.bits_per_channel(); if (quad->bits_per_channel < cc::YUVVideoDrawQuad::kMinBitsPerChannel || quad->bits_per_channel > cc::YUVVideoDrawQuad::kMaxBitsPerChannel) { return false; } return true; } // static bool StructTraits::Read( cc::mojom::DrawQuadDataView data, cc::DrawQuad* out) { if (!data.ReadRect(&out->rect) || !data.ReadOpaqueRect(&out->opaque_rect) || !data.ReadVisibleRect(&out->visible_rect)) { return false; } out->needs_blending = data.needs_blending(); return data.ReadDrawQuadState(out); } } // namespace mojo