Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(378)

Side by Side Diff: cc/ipc/quads_struct_traits.cc

Issue 2064833002: Implement DrawQuad StructTraits (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix move constructor Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/ipc/quads_struct_traits.h ('k') | cc/ipc/struct_traits_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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 "cc/ipc/quads_struct_traits.h"
6
7 namespace mojo {
8
9 namespace {
10
11 bool ReadDrawQuad(cc::mojom::DrawQuadDataView data, cc::DrawQuad* quad) {
12 cc::DrawQuad::Material material;
13 if (!data.ReadMaterial(&material) || material != quad->material) {
14 return false;
15 }
16 if (!data.ReadRect(&quad->rect) || !data.ReadOpaqueRect(&quad->opaque_rect) ||
17 !data.ReadVisibleRect(&quad->visible_rect)) {
18 return false;
19 }
20 quad->needs_blending = data.needs_blending();
21 return true;
22 }
23
24 bool AllocateAndConstruct(cc::DrawQuad::Material material, cc::QuadList* list) {
25 cc::DrawQuad* quad = nullptr;
26 switch (material) {
27 case cc::DrawQuad::INVALID:
28 break;
29 case cc::DrawQuad::DEBUG_BORDER:
30 quad = list->AllocateAndConstruct<cc::DebugBorderDrawQuad>();
31 break;
32 case cc::DrawQuad::PICTURE_CONTENT:
33 quad = list->AllocateAndConstruct<cc::PictureDrawQuad>();
34 break;
35 case cc::DrawQuad::RENDER_PASS:
36 quad = list->AllocateAndConstruct<cc::RenderPassDrawQuad>();
37 break;
38 case cc::DrawQuad::SOLID_COLOR:
39 quad = list->AllocateAndConstruct<cc::SolidColorDrawQuad>();
40 break;
41 case cc::DrawQuad::STREAM_VIDEO_CONTENT:
42 quad = list->AllocateAndConstruct<cc::StreamVideoDrawQuad>();
43 break;
44 case cc::DrawQuad::SURFACE_CONTENT:
45 quad = list->AllocateAndConstruct<cc::SurfaceDrawQuad>();
46 break;
47 case cc::DrawQuad::TEXTURE_CONTENT:
48 quad = list->AllocateAndConstruct<cc::TextureDrawQuad>();
49 break;
50 case cc::DrawQuad::TILED_CONTENT:
51 quad = list->AllocateAndConstruct<cc::TileDrawQuad>();
52 break;
53 case cc::DrawQuad::YUV_VIDEO_CONTENT:
54 quad = list->AllocateAndConstruct<cc::YUVVideoDrawQuad>();
55 break;
56 }
57 if (quad)
58 quad->material = material;
59 return quad != nullptr;
60 }
61
62 } // namespace
63
64 // static
65 cc::mojom::Material
66 EnumTraits<cc::mojom::Material, cc::DrawQuad::Material>::ToMojom(
67 cc::DrawQuad::Material material) {
68 switch (material) {
69 case cc::DrawQuad::INVALID:
70 return cc::mojom::Material::INVALID;
71 case cc::DrawQuad::DEBUG_BORDER:
72 return cc::mojom::Material::DEBUG_BORDER;
73 case cc::DrawQuad::PICTURE_CONTENT:
74 return cc::mojom::Material::PICTURE_CONTENT;
75 case cc::DrawQuad::RENDER_PASS:
76 return cc::mojom::Material::RENDER_PASS;
77 case cc::DrawQuad::SOLID_COLOR:
78 return cc::mojom::Material::SOLID_COLOR;
79 case cc::DrawQuad::STREAM_VIDEO_CONTENT:
80 return cc::mojom::Material::STREAM_VIDEO_CONTENT;
81 case cc::DrawQuad::SURFACE_CONTENT:
82 return cc::mojom::Material::SURFACE_CONTENT;
83 case cc::DrawQuad::TEXTURE_CONTENT:
84 return cc::mojom::Material::TEXTURE_CONTENT;
85 case cc::DrawQuad::TILED_CONTENT:
86 return cc::mojom::Material::TILED_CONTENT;
87 case cc::DrawQuad::YUV_VIDEO_CONTENT:
88 return cc::mojom::Material::YUV_VIDEO_CONTENT;
89 }
90 return cc::mojom::Material::INVALID;
91 }
92
93 // static
94 bool EnumTraits<cc::mojom::Material, cc::DrawQuad::Material>::FromMojom(
95 cc::mojom::Material input,
96 cc::DrawQuad::Material* out) {
97 switch (input) {
98 case cc::mojom::Material::INVALID:
99 *out = cc::DrawQuad::INVALID;
100 return true;
101 case cc::mojom::Material::DEBUG_BORDER:
102 *out = cc::DrawQuad::DEBUG_BORDER;
103 return true;
104 case cc::mojom::Material::PICTURE_CONTENT:
105 *out = cc::DrawQuad::PICTURE_CONTENT;
106 return true;
107 case cc::mojom::Material::RENDER_PASS:
108 *out = cc::DrawQuad::RENDER_PASS;
109 return true;
110 case cc::mojom::Material::SOLID_COLOR:
111 *out = cc::DrawQuad::SOLID_COLOR;
112 return true;
113 case cc::mojom::Material::STREAM_VIDEO_CONTENT:
114 *out = cc::DrawQuad::STREAM_VIDEO_CONTENT;
115 return true;
116 case cc::mojom::Material::SURFACE_CONTENT:
117 *out = cc::DrawQuad::SURFACE_CONTENT;
118 return true;
119 case cc::mojom::Material::TEXTURE_CONTENT:
120 *out = cc::DrawQuad::TEXTURE_CONTENT;
121 return true;
122 case cc::mojom::Material::TILED_CONTENT:
123 *out = cc::DrawQuad::TILED_CONTENT;
124 return true;
125 case cc::mojom::Material::YUV_VIDEO_CONTENT:
126 *out = cc::DrawQuad::YUV_VIDEO_CONTENT;
127 return true;
128 }
129 return false;
130 }
131
132 // static
133 bool StructTraits<cc::mojom::DebugBorderQuadState, cc::DrawQuad>::Read(
134 cc::mojom::DebugBorderQuadStateDataView data,
135 cc::DrawQuad* out) {
136 cc::DebugBorderDrawQuad* quad = static_cast<cc::DebugBorderDrawQuad*>(out);
137 quad->color = data.color();
138 quad->width = data.width();
139 return true;
140 }
141
142 // static
143 bool StructTraits<cc::mojom::RenderPassQuadState, cc::DrawQuad>::Read(
144 cc::mojom::RenderPassQuadStateDataView data,
145 cc::DrawQuad* out) {
146 cc::RenderPassDrawQuad* quad = static_cast<cc::RenderPassDrawQuad*>(out);
147 quad->resources.ids[cc::RenderPassDrawQuad::kMaskResourceIdIndex] =
148 data.mask_resource_id();
149 return data.ReadRenderPassId(&quad->render_pass_id) &&
150 data.ReadMaskUvScale(&quad->mask_uv_scale) &&
151 data.ReadMaskTextureSize(&quad->mask_texture_size) &&
152 data.ReadFilters(&quad->filters) &&
153 data.ReadFiltersScale(&quad->filters_scale) &&
154 data.ReadBackgroundFilters(&quad->background_filters);
155 }
156
157 // static
158 bool StructTraits<cc::mojom::SolidColorQuadState, cc::DrawQuad>::Read(
159 cc::mojom::SolidColorQuadStateDataView data,
160 cc::DrawQuad* out) {
161 cc::SolidColorDrawQuad* quad = static_cast<cc::SolidColorDrawQuad*>(out);
162 quad->force_anti_aliasing_off = data.force_anti_aliasing_off();
163 quad->color = data.color();
164 return true;
165 }
166
167 // static
168 bool StructTraits<cc::mojom::SurfaceQuadState, cc::DrawQuad>::Read(
169 cc::mojom::SurfaceQuadStateDataView data,
170 cc::DrawQuad* out) {
171 cc::SurfaceDrawQuad* quad = static_cast<cc::SurfaceDrawQuad*>(out);
172 return data.ReadSurface(&quad->surface_id);
173 }
174
175 // static
176 bool StructTraits<cc::mojom::TextureQuadState, cc::DrawQuad>::Read(
177 cc::mojom::TextureQuadStateDataView data,
178 cc::DrawQuad* out) {
179 cc::TextureDrawQuad* quad = static_cast<cc::TextureDrawQuad*>(out);
180 quad->resources.ids[cc::TextureDrawQuad::kResourceIdIndex] =
181 data.resource_id();
182 quad->premultiplied_alpha = data.premultiplied_alpha();
183 if (!data.ReadUvTopLeft(&quad->uv_top_left) ||
184 !data.ReadUvBottomRight(&quad->uv_bottom_right)) {
185 return false;
186 }
187 quad->background_color = data.background_color();
188 CArray<float> vertex_opacity_array = {4, 4, &quad->vertex_opacity[0]};
189 if (!data.ReadVertexOpacity(&vertex_opacity_array))
190 return false;
191
192 quad->y_flipped = data.y_flipped();
193 quad->nearest_neighbor = data.nearest_neighbor();
194 quad->secure_output_only = data.secure_output_only();
195 return true;
196 }
197
198 // static
199 bool StructTraits<cc::mojom::TileQuadState, cc::DrawQuad>::Read(
200 cc::mojom::TileQuadStateDataView data,
201 cc::DrawQuad* out) {
202 cc::TileDrawQuad* quad = static_cast<cc::TileDrawQuad*>(out);
203 if (!data.ReadTexCoordRect(&quad->tex_coord_rect) ||
204 !data.ReadTextureSize(&quad->texture_size)) {
205 return false;
206 }
207
208 quad->swizzle_contents = data.swizzle_contents();
209 quad->nearest_neighbor = data.nearest_neighbor();
210 quad->resources.ids[cc::TileDrawQuad::kResourceIdIndex] = data.resource_id();
211 return true;
212 }
213
214 // static
215 bool StructTraits<cc::mojom::DrawQuad, cc::DrawQuad>::Read(
216 cc::mojom::DrawQuadDataView data,
217 cc::DrawQuad* out) {
218 if (!ReadDrawQuad(data, out))
219 return false;
220 switch (data.material()) {
221 case cc::mojom::Material::INVALID:
222 break;
223 case cc::mojom::Material::DEBUG_BORDER:
224 return data.ReadDebugBorderQuadState(out);
225 case cc::mojom::Material::PICTURE_CONTENT:
226 // TODO(fsamuel): Implement PictureDrawQuad
227 // serialization/deserialization.
228 break;
229 case cc::mojom::Material::RENDER_PASS:
230 return data.ReadRenderPassQuadState(out);
231 case cc::mojom::Material::SOLID_COLOR:
232 return data.ReadSolidColorQuadState(out);
233 case cc::mojom::Material::STREAM_VIDEO_CONTENT:
234 // TODO(fsamuel): Implement StreamVideoContentDrawQuad
235 // serialization/deserialization.
236 break;
237 case cc::mojom::Material::SURFACE_CONTENT:
238 return data.ReadSurfaceQuadState(out);
239 case cc::mojom::Material::TEXTURE_CONTENT:
240 return data.ReadTextureQuadState(out);
241 case cc::mojom::Material::TILED_CONTENT:
242 return data.ReadTileQuadState(out);
243 case cc::mojom::Material::YUV_VIDEO_CONTENT:
244 // TODO(fsamuel): Implement YUVVideoDrawQuad
245 // serialization/deserialization.
246 break;
247 }
248 NOTREACHED();
249 return false;
250 }
251
252 // static
253 void* StructTraits<cc::mojom::QuadList, cc::QuadList>::SetUpContext(
254 const cc::QuadList& quad_list) {
255 mojo::Array<cc::DrawQuad::Material>* materials =
256 new mojo::Array<cc::DrawQuad::Material>(quad_list.size());
257 for (auto it = quad_list.begin(); it != quad_list.end(); ++it)
258 (*materials)[it.index()] = it->material;
259 return materials;
260 }
261
262 // static
263 void StructTraits<cc::mojom::QuadList, cc::QuadList>::TearDownContext(
264 const cc::QuadList& quad_list,
265 void* context) {
266 // static_cast to ensure the destructor is called.
267 delete static_cast<mojo::Array<cc::DrawQuad::Material>*>(context);
268 }
269
270 // static
271 const mojo::Array<cc::DrawQuad::Material>&
272 StructTraits<cc::mojom::QuadList, cc::QuadList>::quad_types(
273 const cc::QuadList& quad_list,
274 void* context) {
275 return *static_cast<mojo::Array<cc::DrawQuad::Material>*>(context);
276 }
277
278 // static
279 bool StructTraits<cc::mojom::QuadList, cc::QuadList>::Read(
280 cc::mojom::QuadListDataView data,
281 cc::QuadList* out) {
282 // TODO(fsamuel): Once we have ArrayTraits DataViews we can delete
283 // this field. This field exists so we can pre-allocate DrawQuads
284 // in the QuadList according to their material.
285 mojo::Array<cc::DrawQuad::Material> materials;
286 if (!data.ReadQuadTypes(&materials))
287 return false;
288 for (size_t i = 0; i < materials.size(); ++i) {
289 if (!AllocateAndConstruct(materials[i], out))
290 return false;
291 }
292 // The materials array and the quads array are expected to be the same size.
293 // If they are not, then deserialization will fail.
294 QuadListArray quad_list_array = {materials.size(), out};
295 return data.ReadQuads(&quad_list_array);
296 }
297
298 } // namespace mojo
OLDNEW
« no previous file with comments | « cc/ipc/quads_struct_traits.h ('k') | cc/ipc/struct_traits_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698