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