1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "services/viz/public/cpp/compositing/quads_mojom_traits.h"
6
7 #include "ui/gfx/mojom/color_space_mojom_traits.h"
8 #include "ui/gfx/mojom/transform_mojom_traits.h"
9
10 namespace mojo {
11
AllocateAndConstruct(viz::mojom::DrawQuadStateDataView::Tag material,viz::QuadList * list)12 viz::DrawQuad* AllocateAndConstruct(
13 viz::mojom::DrawQuadStateDataView::Tag material,
14 viz::QuadList* list) {
15 viz::DrawQuad* quad = nullptr;
16 switch (material) {
17 case viz::mojom::DrawQuadStateDataView::Tag::DEBUG_BORDER_QUAD_STATE:
18 quad = list->AllocateAndConstruct<viz::DebugBorderDrawQuad>();
19 quad->material = viz::DrawQuad::Material::kDebugBorder;
20 return quad;
21 case viz::mojom::DrawQuadStateDataView::Tag::RENDER_PASS_QUAD_STATE:
22 quad = list->AllocateAndConstruct<viz::RenderPassDrawQuad>();
23 quad->material = viz::DrawQuad::Material::kRenderPass;
24 return quad;
25 case viz::mojom::DrawQuadStateDataView::Tag::SOLID_COLOR_QUAD_STATE:
26 quad = list->AllocateAndConstruct<viz::SolidColorDrawQuad>();
27 quad->material = viz::DrawQuad::Material::kSolidColor;
28 return quad;
29 case viz::mojom::DrawQuadStateDataView::Tag::STREAM_VIDEO_QUAD_STATE:
30 quad = list->AllocateAndConstruct<viz::StreamVideoDrawQuad>();
31 quad->material = viz::DrawQuad::Material::kStreamVideoContent;
32 return quad;
33 case viz::mojom::DrawQuadStateDataView::Tag::SURFACE_QUAD_STATE:
34 quad = list->AllocateAndConstruct<viz::SurfaceDrawQuad>();
35 quad->material = viz::DrawQuad::Material::kSurfaceContent;
36 return quad;
37 case viz::mojom::DrawQuadStateDataView::Tag::TEXTURE_QUAD_STATE:
38 quad = list->AllocateAndConstruct<viz::TextureDrawQuad>();
39 quad->material = viz::DrawQuad::Material::kTextureContent;
40 return quad;
41 case viz::mojom::DrawQuadStateDataView::Tag::TILE_QUAD_STATE:
42 quad = list->AllocateAndConstruct<viz::TileDrawQuad>();
43 quad->material = viz::DrawQuad::Material::kTiledContent;
44 return quad;
45 case viz::mojom::DrawQuadStateDataView::Tag::VIDEO_HOLE_QUAD_STATE:
46 quad = list->AllocateAndConstruct<viz::VideoHoleDrawQuad>();
47 quad->material = viz::DrawQuad::Material::kVideoHole;
48 return quad;
49 case viz::mojom::DrawQuadStateDataView::Tag::YUV_VIDEO_QUAD_STATE:
50 quad = list->AllocateAndConstruct<viz::YUVVideoDrawQuad>();
51 quad->material = viz::DrawQuad::Material::kYuvVideoContent;
52 return quad;
53 }
54 NOTREACHED();
55 return nullptr;
56 }
57
58 // static
59 bool StructTraits<viz::mojom::DebugBorderQuadStateDataView, viz::DrawQuad>::
Read(viz::mojom::DebugBorderQuadStateDataView data,viz::DrawQuad * out)60 Read(viz::mojom::DebugBorderQuadStateDataView data, viz::DrawQuad* out) {
61 viz::DebugBorderDrawQuad* quad = static_cast<viz::DebugBorderDrawQuad*>(out);
62 quad->color = data.color();
63 quad->width = data.width();
64 return true;
65 }
66
67 // static
Read(viz::mojom::RenderPassQuadStateDataView data,viz::DrawQuad * out)68 bool StructTraits<viz::mojom::RenderPassQuadStateDataView, viz::DrawQuad>::Read(
69 viz::mojom::RenderPassQuadStateDataView data,
70 viz::DrawQuad* out) {
71 viz::RenderPassDrawQuad* quad = static_cast<viz::RenderPassDrawQuad*>(out);
72 quad->resources.ids[viz::RenderPassDrawQuad::kMaskResourceIdIndex] =
73 data.mask_resource_id();
74 quad->resources.count = data.mask_resource_id() ? 1 : 0;
75 quad->render_pass_id = data.render_pass_id();
76 // RenderPass ids are never zero.
77 if (!quad->render_pass_id)
78 return false;
79 if (!data.ReadMaskUvRect(&quad->mask_uv_rect) ||
80 !data.ReadMaskTextureSize(&quad->mask_texture_size) ||
81 !data.ReadFiltersScale(&quad->filters_scale) ||
82 !data.ReadFiltersOrigin(&quad->filters_origin) ||
83 !data.ReadTexCoordRect(&quad->tex_coord_rect)) {
84 return false;
85 }
86 quad->force_anti_aliasing_off = data.force_anti_aliasing_off();
87 quad->backdrop_filter_quality = data.backdrop_filter_quality();
88 quad->can_use_backdrop_filter_cache = data.can_use_backdrop_filter_cache();
89 return true;
90 }
91
92 // static
Read(viz::mojom::SolidColorQuadStateDataView data,viz::DrawQuad * out)93 bool StructTraits<viz::mojom::SolidColorQuadStateDataView, viz::DrawQuad>::Read(
94 viz::mojom::SolidColorQuadStateDataView data,
95 viz::DrawQuad* out) {
96 viz::SolidColorDrawQuad* quad = static_cast<viz::SolidColorDrawQuad*>(out);
97 quad->force_anti_aliasing_off = data.force_anti_aliasing_off();
98 quad->color = data.color();
99 return true;
100 }
101
102 // static
103 bool StructTraits<viz::mojom::StreamVideoQuadStateDataView, viz::DrawQuad>::
Read(viz::mojom::StreamVideoQuadStateDataView data,viz::DrawQuad * out)104 Read(viz::mojom::StreamVideoQuadStateDataView data, viz::DrawQuad* out) {
105 auto* quad = static_cast<viz::StreamVideoDrawQuad*>(out);
106 quad->resources.ids[viz::StreamVideoDrawQuad::kResourceIdIndex] =
107 data.resource_id();
108 quad->resources.count = 1;
109 return data.ReadResourceSizeInPixels(
110 &quad->overlay_resources.size_in_pixels) &&
111 data.ReadUvTopLeft(&quad->uv_top_left) &&
112 data.ReadUvBottomRight(&quad->uv_bottom_right);
113 }
114
115 // static
Read(viz::mojom::SurfaceQuadStateDataView data,viz::DrawQuad * out)116 bool StructTraits<viz::mojom::SurfaceQuadStateDataView, viz::DrawQuad>::Read(
117 viz::mojom::SurfaceQuadStateDataView data,
118 viz::DrawQuad* out) {
119 viz::SurfaceDrawQuad* quad = static_cast<viz::SurfaceDrawQuad*>(out);
120 quad->default_background_color = data.default_background_color();
121 quad->stretch_content_to_fill_bounds = data.stretch_content_to_fill_bounds();
122 quad->is_reflection = data.is_reflection();
123 quad->allow_merge = data.allow_merge();
124 return data.ReadSurfaceRange(&quad->surface_range);
125 }
126
127 // static
Read(viz::mojom::TextureQuadStateDataView data,viz::DrawQuad * out)128 bool StructTraits<viz::mojom::TextureQuadStateDataView, viz::DrawQuad>::Read(
129 viz::mojom::TextureQuadStateDataView data,
130 viz::DrawQuad* out) {
131 auto* quad = static_cast<viz::TextureDrawQuad*>(out);
132
133 quad->resources.ids[viz::TextureDrawQuad::kResourceIdIndex] =
134 data.resource_id();
135 if (!data.ReadResourceSizeInPixels(&quad->overlay_resources.size_in_pixels)) {
136 return false;
137 }
138
139 quad->resources.count = 1;
140 quad->premultiplied_alpha = data.premultiplied_alpha();
141 gfx::ProtectedVideoType protected_video_type =
142 gfx::ProtectedVideoType::kClear;
143 if (!data.ReadUvTopLeft(&quad->uv_top_left) ||
144 !data.ReadUvBottomRight(&quad->uv_bottom_right) ||
145 !data.ReadProtectedVideoType(&protected_video_type)) {
146 return false;
147 }
148 quad->protected_video_type = protected_video_type;
149 quad->background_color = data.background_color();
150 base::span<float> vertex_opacity_array(quad->vertex_opacity);
151 if (!data.ReadVertexOpacity(&vertex_opacity_array))
152 return false;
153
154 quad->y_flipped = data.y_flipped();
155 quad->nearest_neighbor = data.nearest_neighbor();
156 quad->secure_output_only = data.secure_output_only();
157 return true;
158 }
159
160 // static
Read(viz::mojom::TileQuadStateDataView data,viz::DrawQuad * out)161 bool StructTraits<viz::mojom::TileQuadStateDataView, viz::DrawQuad>::Read(
162 viz::mojom::TileQuadStateDataView data,
163 viz::DrawQuad* out) {
164 viz::TileDrawQuad* quad = static_cast<viz::TileDrawQuad*>(out);
165 if (!data.ReadTexCoordRect(&quad->tex_coord_rect) ||
166 !data.ReadTextureSize(&quad->texture_size)) {
167 return false;
168 }
169
170 quad->is_premultiplied = data.is_premultiplied();
171 quad->nearest_neighbor = data.nearest_neighbor();
172 quad->force_anti_aliasing_off = data.force_anti_aliasing_off();
173 quad->resources.ids[viz::TileDrawQuad::kResourceIdIndex] = data.resource_id();
174 quad->resources.count = 1;
175 return true;
176 }
177
178 // static
Read(viz::mojom::VideoHoleQuadStateDataView data,viz::DrawQuad * out)179 bool StructTraits<viz::mojom::VideoHoleQuadStateDataView, viz::DrawQuad>::Read(
180 viz::mojom::VideoHoleQuadStateDataView data,
181 viz::DrawQuad* out) {
182 viz::VideoHoleDrawQuad* video_hole_quad =
183 static_cast<viz::VideoHoleDrawQuad*>(out);
184 return data.ReadOverlayPlaneId(&video_hole_quad->overlay_plane_id);
185 }
186
187 // static
Read(viz::mojom::YUVVideoQuadStateDataView data,viz::DrawQuad * out)188 bool StructTraits<viz::mojom::YUVVideoQuadStateDataView, viz::DrawQuad>::Read(
189 viz::mojom::YUVVideoQuadStateDataView data,
190 viz::DrawQuad* out) {
191 viz::YUVVideoDrawQuad* quad = static_cast<viz::YUVVideoDrawQuad*>(out);
192 if (!data.ReadYaTexCoordRect(&quad->ya_tex_coord_rect) ||
193 !data.ReadUvTexCoordRect(&quad->uv_tex_coord_rect) ||
194 !data.ReadYaTexSize(&quad->ya_tex_size) ||
195 !data.ReadUvTexSize(&quad->uv_tex_size) ||
196 !data.ReadVideoColorSpace(&quad->video_color_space) ||
197 !data.ReadProtectedVideoType(&quad->protected_video_type)) {
198 return false;
199 }
200 quad->resources.ids[viz::YUVVideoDrawQuad::kYPlaneResourceIdIndex] =
201 data.y_plane_resource_id();
202 quad->resources.ids[viz::YUVVideoDrawQuad::kUPlaneResourceIdIndex] =
203 data.u_plane_resource_id();
204 quad->resources.ids[viz::YUVVideoDrawQuad::kVPlaneResourceIdIndex] =
205 data.v_plane_resource_id();
206 quad->resources.ids[viz::YUVVideoDrawQuad::kAPlaneResourceIdIndex] =
207 data.a_plane_resource_id();
208 static_assert(viz::YUVVideoDrawQuad::kAPlaneResourceIdIndex ==
209 viz::DrawQuad::Resources::kMaxResourceIdCount - 1,
210 "The A plane resource should be the last resource ID.");
211 quad->resources.count = data.a_plane_resource_id() ? 4 : 3;
212
213 quad->resource_offset = data.resource_offset();
214 quad->resource_multiplier = data.resource_multiplier();
215 quad->bits_per_channel = data.bits_per_channel();
216 if (quad->bits_per_channel < viz::YUVVideoDrawQuad::kMinBitsPerChannel ||
217 quad->bits_per_channel > viz::YUVVideoDrawQuad::kMaxBitsPerChannel) {
218 return false;
219 }
220 return true;
221 }
222
223 // static
Read(viz::mojom::DrawQuadDataView data,viz::DrawQuad * out)224 bool StructTraits<viz::mojom::DrawQuadDataView, viz::DrawQuad>::Read(
225 viz::mojom::DrawQuadDataView data,
226 viz::DrawQuad* out) {
227 if (!data.ReadRect(&out->rect) || !data.ReadVisibleRect(&out->visible_rect)) {
228 return false;
229 }
230 // Reject quads with areas larger than int32.
231 if (!out->rect.size().GetCheckedArea().IsValid())
232 return false;
233 if (!out->rect.Contains(out->visible_rect))
234 return false;
235
236 out->needs_blending = data.needs_blending();
237 return data.ReadDrawQuadState(out);
238 }
239
240 } // namespace mojo
241