blob: 7c5f1d342f1956ce7731962b9040e4e274c88c16 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/viz/public/cpp/compositing/quads_mojom_traits.h"
#include <algorithm>
#include <optional>
#include "base/notreached.h"
#include "cc/mojom/paint_flags_mojom_traits.h"
#include "components/viz/common/quads/shared_element_draw_quad.h"
#include "components/viz/common/quads/texture_draw_quad.h"
#include "services/viz/public/cpp/compositing/compositor_render_pass_id_mojom_traits.h"
#include "services/viz/public/cpp/compositing/resource_id_mojom_traits.h"
#include "services/viz/public/cpp/crash_keys.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/mojom/color_space_mojom_traits.h"
#include "ui/gfx/mojom/transform_mojom_traits.h"
namespace mojo {
viz::DrawQuad* AllocateAndConstruct(
viz::mojom::DrawQuadStateDataView::Tag material,
viz::QuadList* list) {
viz::DrawQuad* quad = nullptr;
switch (material) {
case viz::mojom::DrawQuadStateDataView::Tag::kDebugBorderQuadState:
quad = list->AllocateAndConstruct<viz::DebugBorderDrawQuad>();
quad->material = viz::DrawQuad::Material::kDebugBorder;
return quad;
case viz::mojom::DrawQuadStateDataView::Tag::kRenderPassQuadState:
quad = list->AllocateAndConstruct<viz::CompositorRenderPassDrawQuad>();
quad->material = viz::DrawQuad::Material::kCompositorRenderPass;
return quad;
case viz::mojom::DrawQuadStateDataView::Tag::kSolidColorQuadState:
quad = list->AllocateAndConstruct<viz::SolidColorDrawQuad>();
quad->material = viz::DrawQuad::Material::kSolidColor;
return quad;
case viz::mojom::DrawQuadStateDataView::Tag::kSurfaceQuadState:
quad = list->AllocateAndConstruct<viz::SurfaceDrawQuad>();
quad->material = viz::DrawQuad::Material::kSurfaceContent;
return quad;
case viz::mojom::DrawQuadStateDataView::Tag::kTextureQuadState:
quad = list->AllocateAndConstruct<viz::TextureDrawQuad>();
quad->material = viz::DrawQuad::Material::kTextureContent;
return quad;
case viz::mojom::DrawQuadStateDataView::Tag::kTileQuadState:
quad = list->AllocateAndConstruct<viz::TileDrawQuad>();
quad->material = viz::DrawQuad::Material::kTiledContent;
return quad;
case viz::mojom::DrawQuadStateDataView::Tag::kVideoHoleQuadState:
quad = list->AllocateAndConstruct<viz::VideoHoleDrawQuad>();
quad->material = viz::DrawQuad::Material::kVideoHole;
return quad;
case viz::mojom::DrawQuadStateDataView::Tag::kSharedElementQuadState:
quad = list->AllocateAndConstruct<viz::SharedElementDrawQuad>();
quad->material = viz::DrawQuad::Material::kSharedElement;
return quad;
}
NOTREACHED();
}
// static
bool StructTraits<viz::mojom::RoundedDisplayMasksInfoDataView,
viz::TextureDrawQuad::RoundedDisplayMasksInfo>::
Read(viz::mojom::RoundedDisplayMasksInfoDataView data,
viz::TextureDrawQuad::RoundedDisplayMasksInfo* out) {
viz::TextureDrawQuad::RoundedDisplayMasksInfo* info =
static_cast<viz::TextureDrawQuad::RoundedDisplayMasksInfo*>(out);
base::span<uint8_t> radii_array(info->radii);
if (!data.ReadRadii(&radii_array)) {
return false;
}
info->is_horizontally_positioned = data.is_horizontally_positioned();
return true;
}
// static
bool StructTraits<viz::mojom::DebugBorderQuadStateDataView, viz::DrawQuad>::
Read(viz::mojom::DebugBorderQuadStateDataView data, viz::DrawQuad* out) {
viz::DebugBorderDrawQuad* quad = static_cast<viz::DebugBorderDrawQuad*>(out);
if (!data.ReadColor(&quad->color))
return false;
quad->width = data.width();
return true;
}
// static
bool StructTraits<
viz::mojom::CompositorRenderPassQuadStateDataView,
viz::DrawQuad>::Read(viz::mojom::CompositorRenderPassQuadStateDataView data,
viz::DrawQuad* out) {
auto* quad = static_cast<viz::CompositorRenderPassDrawQuad*>(out);
if (!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) ||
!data.ReadRenderPassId(&quad->render_pass_id) ||
!data.ReadMaskResourceId(&quad->resource_id)) {
return false;
}
// CompositorRenderPass ids are never zero.
if (!quad->render_pass_id) {
viz::SetDeserializationCrashKeyString("Draw quad invalid render pass ID");
return false;
}
quad->force_anti_aliasing_off = data.force_anti_aliasing_off();
quad->backdrop_filter_quality = data.backdrop_filter_quality();
quad->intersects_damage_under = data.intersects_damage_under();
return true;
}
// static
bool StructTraits<viz::mojom::SolidColorQuadStateDataView, viz::DrawQuad>::Read(
viz::mojom::SolidColorQuadStateDataView data,
viz::DrawQuad* out) {
viz::SolidColorDrawQuad* quad = static_cast<viz::SolidColorDrawQuad*>(out);
quad->force_anti_aliasing_off = data.force_anti_aliasing_off();
if (!data.ReadColor(&quad->color))
return false;
// Clamp the alpha component of the color to the range of [0, 1].
quad->color.fA = std::clamp(quad->color.fA, 0.0f, 1.0f);
return true;
}
// static
bool StructTraits<viz::mojom::SurfaceQuadStateDataView, viz::DrawQuad>::Read(
viz::mojom::SurfaceQuadStateDataView data,
viz::DrawQuad* out) {
viz::SurfaceDrawQuad* quad = static_cast<viz::SurfaceDrawQuad*>(out);
if (!data.ReadDefaultBackgroundColor(&quad->default_background_color))
return false;
quad->stretch_content_to_fill_bounds = data.stretch_content_to_fill_bounds();
quad->is_reflection = data.is_reflection();
quad->allow_merge = data.allow_merge();
if (!data.ReadOverrideChildFilterQuality(
&quad->override_child_filter_quality)) {
return false;
}
if (!data.ReadOverrideChildDynamicRangeLimit(
&quad->override_child_dynamic_range_limit)) {
return false;
}
return data.ReadSurfaceRange(&quad->surface_range);
}
// static
bool StructTraits<viz::mojom::TextureQuadStateDataView, viz::DrawQuad>::Read(
viz::mojom::TextureQuadStateDataView data,
viz::DrawQuad* out) {
auto* quad = static_cast<viz::TextureDrawQuad*>(out);
if (!data.ReadResourceId(&quad->resource_id)) {
return false;
}
gfx::ProtectedVideoType protected_video_type =
gfx::ProtectedVideoType::kClear;
viz::OverlayPriority overlay_priority_hint = viz::OverlayPriority::kLow;
if (!data.ReadUvTopLeft(&quad->uv_top_left) ||
!data.ReadUvBottomRight(&quad->uv_bottom_right) ||
!data.ReadProtectedVideoType(&protected_video_type) ||
!data.ReadOverlayPriorityHint(&overlay_priority_hint) ||
!data.ReadRoundedDisplayMasksInfo(&quad->rounded_display_masks_info) ||
!data.ReadDynamicRangeLimit(&quad->dynamic_range_limit)) {
return false;
}
quad->protected_video_type = protected_video_type;
quad->overlay_priority_hint = overlay_priority_hint;
if (!data.ReadBackgroundColor(&quad->background_color))
return false;
quad->nearest_neighbor = data.nearest_neighbor();
quad->secure_output_only = data.secure_output_only();
quad->is_video_frame = data.is_video_frame();
quad->force_rgbx = data.force_rgbx();
if (!data.ReadDamageRect(&quad->damage_rect))
return false;
return true;
}
// static
bool StructTraits<viz::mojom::TileQuadStateDataView, viz::DrawQuad>::Read(
viz::mojom::TileQuadStateDataView data,
viz::DrawQuad* out) {
viz::TileDrawQuad* quad = static_cast<viz::TileDrawQuad*>(out);
if (!data.ReadTexCoordRect(&quad->tex_coord_rect) ||
!data.ReadResourceId(&quad->resource_id)) {
return false;
}
quad->nearest_neighbor = data.nearest_neighbor();
quad->force_anti_aliasing_off = data.force_anti_aliasing_off();
return true;
}
// static
bool StructTraits<viz::mojom::SharedElementQuadStateDataView, viz::DrawQuad>::
Read(viz::mojom::SharedElementQuadStateDataView data, viz::DrawQuad* out) {
viz::SharedElementDrawQuad* shared_element_quad =
static_cast<viz::SharedElementDrawQuad*>(out);
return data.ReadElementResourceId(&shared_element_quad->element_resource_id);
}
// static
bool StructTraits<viz::mojom::VideoHoleQuadStateDataView, viz::DrawQuad>::Read(
viz::mojom::VideoHoleQuadStateDataView data,
viz::DrawQuad* out) {
viz::VideoHoleDrawQuad* video_hole_quad =
static_cast<viz::VideoHoleDrawQuad*>(out);
return data.ReadOverlayPlaneId(&video_hole_quad->overlay_plane_id);
}
// static
bool StructTraits<viz::mojom::DrawQuadDataView, viz::DrawQuad>::Read(
viz::mojom::DrawQuadDataView data,
viz::DrawQuad* out) {
if (!data.ReadRect(&out->rect) || !data.ReadVisibleRect(&out->visible_rect)) {
return false;
}
if (!out->rect.Contains(out->visible_rect)) {
viz::SetDeserializationCrashKeyString("Rect does not contain visible rect");
return false;
}
out->needs_blending = data.needs_blending();
return data.ReadDrawQuadState(out);
}
} // namespace mojo