| OLD | NEW |
| (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 |
| OLD | NEW |