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