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

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: Addressed Yuzhu's comments 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
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 bool success = false;
26 switch (material) {
27 case cc::DrawQuad::INVALID:
28 break;
29 case cc::DrawQuad::DEBUG_BORDER:
30 success = list->AllocateAndConstruct<cc::DebugBorderDrawQuad>();
31 break;
32 case cc::DrawQuad::PICTURE_CONTENT:
33 success = list->AllocateAndConstruct<cc::PictureDrawQuad>();
34 break;
35 case cc::DrawQuad::RENDER_PASS:
36 success = list->AllocateAndConstruct<cc::RenderPassDrawQuad>();
37 break;
38 case cc::DrawQuad::SOLID_COLOR:
39 success = list->AllocateAndConstruct<cc::SolidColorDrawQuad>();
40 break;
41 case cc::DrawQuad::STREAM_VIDEO_CONTENT:
42 success = list->AllocateAndConstruct<cc::StreamVideoDrawQuad>();
43 break;
44 case cc::DrawQuad::SURFACE_CONTENT:
45 success = list->AllocateAndConstruct<cc::SurfaceDrawQuad>();
46 break;
47 case cc::DrawQuad::TEXTURE_CONTENT:
48 success = list->AllocateAndConstruct<cc::TextureDrawQuad>();
49 break;
50 case cc::DrawQuad::TILED_CONTENT:
51 success = list->AllocateAndConstruct<cc::TileDrawQuad>();
52 break;
53 case cc::DrawQuad::YUV_VIDEO_CONTENT:
54 success = list->AllocateAndConstruct<cc::YUVVideoDrawQuad>();
55 break;
56 }
57 if (success)
58 list->back()->material = material;
59 return success;
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 }
91
92 // static
93 bool EnumTraits<cc::mojom::Material, cc::DrawQuad::Material>::FromMojom(
94 cc::mojom::Material input,
95 cc::DrawQuad::Material* out) {
96 switch (input) {
97 case cc::mojom::Material::INVALID:
98 *out = cc::DrawQuad::INVALID;
99 return true;
100 case cc::mojom::Material::DEBUG_BORDER:
101 *out = cc::DrawQuad::DEBUG_BORDER;
102 return true;
103 case cc::mojom::Material::PICTURE_CONTENT:
104 *out = cc::DrawQuad::PICTURE_CONTENT;
105 return true;
106 case cc::mojom::Material::RENDER_PASS:
107 *out = cc::DrawQuad::RENDER_PASS;
108 return true;
109 case cc::mojom::Material::SOLID_COLOR:
110 *out = cc::DrawQuad::SOLID_COLOR;
111 return true;
112 case cc::mojom::Material::STREAM_VIDEO_CONTENT:
113 *out = cc::DrawQuad::STREAM_VIDEO_CONTENT;
114 return true;
115 case cc::mojom::Material::SURFACE_CONTENT:
116 *out = cc::DrawQuad::SURFACE_CONTENT;
117 return true;
118 case cc::mojom::Material::TEXTURE_CONTENT:
119 *out = cc::DrawQuad::TEXTURE_CONTENT;
120 return true;
121 case cc::mojom::Material::TILED_CONTENT:
122 *out = cc::DrawQuad::TILED_CONTENT;
123 return true;
124 case cc::mojom::Material::YUV_VIDEO_CONTENT:
125 *out = cc::DrawQuad::YUV_VIDEO_CONTENT;
126 return true;
127 }
128 return false;
129 }
130
131 // static
132 bool StructTraits<cc::mojom::DebugBorderQuadState, cc::DrawQuad>::Read(
133 cc::mojom::DebugBorderQuadStateDataView data,
134 cc::DrawQuad* out) {
135 cc::DebugBorderDrawQuad* quad = static_cast<cc::DebugBorderDrawQuad*>(out);
136 quad->color = data.color();
137 quad->width = data.width();
138 return true;
139 }
140
141 // static
142 bool StructTraits<cc::mojom::RenderPassQuadState, cc::DrawQuad>::Read(
143 cc::mojom::RenderPassQuadStateDataView data,
144 cc::DrawQuad* out) {
145 cc::RenderPassDrawQuad* quad = static_cast<cc::RenderPassDrawQuad*>(out);
146 quad->resources.ids[cc::RenderPassDrawQuad::kMaskResourceIdIndex] =
147 data.mask_resource_id();
148 return data.ReadRenderPassId(&quad->render_pass_id) &&
149 data.ReadMaskUvScale(&quad->mask_uv_scale) &&
150 data.ReadMaskTextureSize(&quad->mask_texture_size) &&
151 data.ReadFilters(&quad->filters) &&
152 data.ReadFiltersScale(&quad->filters_scale) &&
153 data.ReadBackgroundFilters(&quad->background_filters);
154 }
155
156 // static
157 bool StructTraits<cc::mojom::SolidColorQuadState, cc::DrawQuad>::Read(
158 cc::mojom::SolidColorQuadStateDataView data,
159 cc::DrawQuad* out) {
160 cc::SolidColorDrawQuad* quad = static_cast<cc::SolidColorDrawQuad*>(out);
161 quad->force_anti_aliasing_off = data.force_anti_aliasing_off();
162 quad->color = data.color();
163 return true;
164 }
165
166 // static
167 bool StructTraits<cc::mojom::SurfaceQuadState, cc::DrawQuad>::Read(
168 cc::mojom::SurfaceQuadStateDataView data,
169 cc::DrawQuad* out) {
170 cc::SurfaceDrawQuad* quad = static_cast<cc::SurfaceDrawQuad*>(out);
171 return data.ReadSurface(&quad->surface_id);
172 }
173
174 // static
175 bool StructTraits<cc::mojom::TextureQuadState, cc::DrawQuad>::Read(
176 cc::mojom::TextureQuadStateDataView data,
177 cc::DrawQuad* out) {
178 cc::TextureDrawQuad* quad = static_cast<cc::TextureDrawQuad*>(out);
179 quad->resources.ids[cc::TextureDrawQuad::kResourceIdIndex] =
180 data.resource_id();
181 quad->premultiplied_alpha = data.premultiplied_alpha();
182 if (!data.ReadUvTopLeft(&quad->uv_top_left) ||
183 !data.ReadUvBottomRight(&quad->uv_bottom_right)) {
184 return false;
185 }
186 quad->background_color = data.background_color();
187 CArray<float> vertex_opacity_array = {4, 4, &quad->vertex_opacity[0]};
188 if (!data.ReadVertexOpacity(&vertex_opacity_array))
189 return false;
190
191 quad->y_flipped = data.y_flipped();
192 quad->nearest_neighbor = data.nearest_neighbor();
193 quad->secure_output_only = data.secure_output_only();
194 return true;
195 }
196
197 // static
198 bool StructTraits<cc::mojom::TileQuadState, cc::DrawQuad>::Read(
199 cc::mojom::TileQuadStateDataView data,
200 cc::DrawQuad* out) {
201 cc::TileDrawQuad* quad = static_cast<cc::TileDrawQuad*>(out);
202 if (!data.ReadTexCoordRect(&quad->tex_coord_rect) ||
203 !data.ReadTextureSize(&quad->texture_size)) {
204 return false;
205 }
206
207 quad->swizzle_contents = data.swizzle_contents();
208 quad->nearest_neighbor = data.nearest_neighbor();
209 quad->resources.ids[cc::TileDrawQuad::kResourceIdIndex] = data.resource_id();
210 return true;
211 }
212
213 // static
214 bool StructTraits<cc::mojom::DrawQuad, cc::DrawQuad>::Read(
215 cc::mojom::DrawQuadDataView data,
216 cc::DrawQuad* out) {
217 if (!ReadDrawQuad(data, out))
218 return false;
219 switch (data.material()) {
220 case cc::mojom::Material::INVALID:
221 break;
222 case cc::mojom::Material::DEBUG_BORDER:
223 return data.ReadDebugBorderQuadState(out);
224 case cc::mojom::Material::PICTURE_CONTENT:
225 // TODO(fsamuel): Implement PictureDrawQuad
226 // serialization/deserialization.
227 break;
228 case cc::mojom::Material::RENDER_PASS:
229 return data.ReadRenderPassQuadState(out);
230 case cc::mojom::Material::SOLID_COLOR:
231 return data.ReadSolidColorQuadState(out);
232 case cc::mojom::Material::STREAM_VIDEO_CONTENT:
233 // TODO(fsamuel): Implement StreamVideoContentDrawQuad
234 // serialization/deserialization.
235 break;
236 case cc::mojom::Material::SURFACE_CONTENT:
237 return data.ReadSurfaceQuadState(out);
238 case cc::mojom::Material::TEXTURE_CONTENT:
239 return data.ReadTextureQuadState(out);
240 case cc::mojom::Material::TILED_CONTENT:
241 return data.ReadTileQuadState(out);
242 case cc::mojom::Material::YUV_VIDEO_CONTENT:
243 // TODO(fsamuel): Implement YUVVideoDrawQuad
244 // serialization/deserialization.
245 break;
246 }
247 NOTREACHED();
248 return false;
249 }
250
251 // static
252 void* StructTraits<cc::mojom::QuadList, cc::QuadList>::SetUpContext(
253 const cc::QuadList& quad_list) {
254 mojo::Array<cc::DrawQuad::Material>* materials =
255 new mojo::Array<cc::DrawQuad::Material>(quad_list.size());
256 for (auto it = quad_list.begin(); it != quad_list.end(); ++it)
257 (*materials)[it.index()] = it->material;
258 return materials;
259 }
260
261 // static
262 void StructTraits<cc::mojom::QuadList, cc::QuadList>::TearDownContext(
263 const cc::QuadList& quad_list,
264 void* context) {
265 // static_cast to ensure the destructor is called.
266 delete static_cast<mojo::Array<cc::DrawQuad::Material>*>(context);
267 }
268
269 // static
270 const mojo::Array<cc::DrawQuad::Material>&
271 StructTraits<cc::mojom::QuadList, cc::QuadList>::quad_types(
272 const cc::QuadList& quad_list,
273 void* context) {
274 return *static_cast<mojo::Array<cc::DrawQuad::Material>*>(context);
275 }
276
277 // static
278 bool StructTraits<cc::mojom::QuadList, cc::QuadList>::Read(
279 cc::mojom::QuadListDataView data,
280 cc::QuadList* out) {
281 // TODO(fsamuel): Once we have ArrayTraits DataViews we can delete
282 // this field. This field exists so we can pre-allocate DrawQuads
283 // in the QuadList according to their material.
284 mojo::Array<cc::DrawQuad::Material> materials;
285 if (!data.ReadQuadTypes(&materials))
286 return false;
287 for (size_t i = 0; i < materials.size(); ++i) {
288 if (!AllocateAndConstruct(materials[i], out))
289 return false;
290 }
291 // The materials array and the quads array are expected to be the same size.
292 // If they are not, then deserialization will fail.
293 QuadListArray quad_list_array = {materials.size(), out};
294 return data.ReadQuads(&quad_list_array);
295 }
296
297 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698