| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "services/gfx/compositor/graph/scene_def.h" | 5 #include "services/gfx/compositor/graph/scene_def.h" |
| 6 | 6 |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 | 100 |
| 101 // Update resources. | 101 // Update resources. |
| 102 if (update->clear_resources) { | 102 if (update->clear_resources) { |
| 103 resources_.clear(); | 103 resources_.clear(); |
| 104 } | 104 } |
| 105 for (auto it = update->resources.begin(); it != update->resources.end(); | 105 for (auto it = update->resources.begin(); it != update->resources.end(); |
| 106 ++it) { | 106 ++it) { |
| 107 uint32_t resource_id = it.GetKey(); | 107 uint32_t resource_id = it.GetKey(); |
| 108 mojo::gfx::composition::ResourcePtr& resource_decl = it.GetValue(); | 108 mojo::gfx::composition::ResourcePtr& resource_decl = it.GetValue(); |
| 109 if (resource_decl) { | 109 if (resource_decl) { |
| 110 scoped_refptr<const ResourceDef> resource = CreateResource( | 110 scoped_refptr<const Resource> resource = CreateResource( |
| 111 resource_id, resource_decl.Pass(), resolver, unavailable_sender, err); | 111 resource_id, resource_decl.Pass(), resolver, unavailable_sender, err); |
| 112 if (!resource) | 112 if (!resource) |
| 113 return false; | 113 return false; |
| 114 resources_[resource_id] = std::move(resource); | 114 resources_[resource_id] = std::move(resource); |
| 115 } else { | 115 } else { |
| 116 resources_.erase(resource_id); | 116 resources_.erase(resource_id); |
| 117 } | 117 } |
| 118 } | 118 } |
| 119 | 119 |
| 120 // Update nodes. | 120 // Update nodes. |
| 121 if (update->clear_nodes) { | 121 if (update->clear_nodes) { |
| 122 nodes_.clear(); | 122 nodes_.clear(); |
| 123 } | 123 } |
| 124 for (auto it = update->nodes.begin(); it != update->nodes.end(); ++it) { | 124 for (auto it = update->nodes.begin(); it != update->nodes.end(); ++it) { |
| 125 uint32_t node_id = it.GetKey(); | 125 uint32_t node_id = it.GetKey(); |
| 126 mojo::gfx::composition::NodePtr& node_decl = it.GetValue(); | 126 mojo::gfx::composition::NodePtr& node_decl = it.GetValue(); |
| 127 if (node_decl) { | 127 if (node_decl) { |
| 128 scoped_refptr<const NodeDef> node = | 128 scoped_refptr<const Node> node = |
| 129 CreateNode(node_id, node_decl.Pass(), err); | 129 CreateNode(node_id, node_decl.Pass(), err); |
| 130 if (!node) | 130 if (!node) |
| 131 return false; | 131 return false; |
| 132 nodes_[node_id] = std::move(node); | 132 nodes_[node_id] = std::move(node); |
| 133 } else { | 133 } else { |
| 134 nodes_.erase(node_id); | 134 nodes_.erase(node_id); |
| 135 } | 135 } |
| 136 } | 136 } |
| 137 return true; | 137 return true; |
| 138 } | 138 } |
| 139 | 139 |
| 140 bool SceneDef::UnlinkReferencedScene( | 140 bool SceneDef::UnlinkReferencedScene( |
| 141 SceneDef* scene, | 141 SceneDef* scene, |
| 142 const SceneUnavailableSender& unavailable_sender) { | 142 const SceneUnavailableSender& unavailable_sender) { |
| 143 DCHECK(scene); | 143 DCHECK(scene); |
| 144 | 144 |
| 145 bool changed = false; | 145 bool changed = false; |
| 146 for (auto& pair : resources_) { | 146 for (auto& pair : resources_) { |
| 147 if (pair.second->type() == ResourceDef::Type::kScene) { | 147 if (pair.second->type() == Resource::Type::kScene) { |
| 148 auto scene_resource = | 148 auto scene_resource = |
| 149 static_cast<const SceneResourceDef*>(pair.second.get()); | 149 static_cast<const SceneResource*>(pair.second.get()); |
| 150 if (scene_resource->referenced_scene().get() == scene) { | 150 if (scene_resource->referenced_scene().get() == scene) { |
| 151 changed = true; | 151 changed = true; |
| 152 pair.second = scene_resource->Unlink(); | 152 pair.second = scene_resource->Unlink(); |
| 153 unavailable_sender.Run(pair.first); | 153 unavailable_sender.Run(pair.first); |
| 154 } | 154 } |
| 155 } | 155 } |
| 156 } | 156 } |
| 157 return changed; | 157 return changed; |
| 158 } | 158 } |
| 159 | 159 |
| 160 scoped_refptr<const ResourceDef> SceneDef::CreateResource( | 160 scoped_refptr<const Resource> SceneDef::CreateResource( |
| 161 uint32_t resource_id, | 161 uint32_t resource_id, |
| 162 mojo::gfx::composition::ResourcePtr resource_decl, | 162 mojo::gfx::composition::ResourcePtr resource_decl, |
| 163 const SceneResolver& resolver, | 163 const SceneResolver& resolver, |
| 164 const SceneUnavailableSender& unavailable_sender, | 164 const SceneUnavailableSender& unavailable_sender, |
| 165 std::ostream& err) { | 165 std::ostream& err) { |
| 166 DCHECK(resource_decl); | 166 DCHECK(resource_decl); |
| 167 | 167 |
| 168 if (resource_decl->is_scene()) { | 168 if (resource_decl->is_scene()) { |
| 169 auto& scene_resource_decl = resource_decl->get_scene(); | 169 auto& scene_resource_decl = resource_decl->get_scene(); |
| 170 DCHECK(scene_resource_decl->scene_token); | 170 DCHECK(scene_resource_decl->scene_token); |
| 171 | 171 |
| 172 const mojo::gfx::composition::SceneToken& scene_token = | 172 const mojo::gfx::composition::SceneToken& scene_token = |
| 173 *scene_resource_decl->scene_token; | 173 *scene_resource_decl->scene_token; |
| 174 base::WeakPtr<SceneDef> referenced_scene = resolver.Run(scene_token); | 174 base::WeakPtr<SceneDef> referenced_scene = resolver.Run(scene_token); |
| 175 if (!referenced_scene) | 175 if (!referenced_scene) |
| 176 unavailable_sender.Run(resource_id); | 176 unavailable_sender.Run(resource_id); |
| 177 return new SceneResourceDef(scene_token, referenced_scene); | 177 return new SceneResource(scene_token, referenced_scene); |
| 178 } | 178 } |
| 179 | 179 |
| 180 if (resource_decl->is_mailbox_texture()) { | 180 if (resource_decl->is_mailbox_texture()) { |
| 181 auto& mailbox_texture_resource_decl = resource_decl->get_mailbox_texture(); | 181 auto& mailbox_texture_resource_decl = resource_decl->get_mailbox_texture(); |
| 182 DCHECK(mailbox_texture_resource_decl->mailbox_name.size() == | 182 DCHECK(mailbox_texture_resource_decl->mailbox_name.size() == |
| 183 GL_MAILBOX_SIZE_CHROMIUM); | 183 GL_MAILBOX_SIZE_CHROMIUM); |
| 184 DCHECK(mailbox_texture_resource_decl->size); | 184 DCHECK(mailbox_texture_resource_decl->size); |
| 185 | 185 |
| 186 const int32_t width = mailbox_texture_resource_decl->size->width; | 186 const int32_t width = mailbox_texture_resource_decl->size->width; |
| 187 const int32_t height = mailbox_texture_resource_decl->size->height; | 187 const int32_t height = mailbox_texture_resource_decl->size->height; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 203 base::MessageLoop::current()->task_runner(), | 203 base::MessageLoop::current()->task_runner(), |
| 204 base::Bind( | 204 base::Bind( |
| 205 &ReleaseMailboxTexture, | 205 &ReleaseMailboxTexture, |
| 206 base::Passed( | 206 base::Passed( |
| 207 mojo::gfx::composition::MailboxTextureCallbackPtr::Create( | 207 mojo::gfx::composition::MailboxTextureCallbackPtr::Create( |
| 208 std::move(mailbox_texture_resource_decl->callback))))); | 208 std::move(mailbox_texture_resource_decl->callback))))); |
| 209 if (!image) { | 209 if (!image) { |
| 210 err << "Could not create MailboxTexture"; | 210 err << "Could not create MailboxTexture"; |
| 211 return nullptr; | 211 return nullptr; |
| 212 } | 212 } |
| 213 return new ImageResourceDef(image); | 213 return new ImageResource(image); |
| 214 } | 214 } |
| 215 | 215 |
| 216 err << "Unsupported resource type: resource_id=" << resource_id; | 216 err << "Unsupported resource type: resource_id=" << resource_id; |
| 217 return nullptr; | 217 return nullptr; |
| 218 } | 218 } |
| 219 | 219 |
| 220 scoped_refptr<const NodeDef> SceneDef::CreateNode( | 220 scoped_refptr<const Node> SceneDef::CreateNode( |
| 221 uint32_t node_id, | 221 uint32_t node_id, |
| 222 mojo::gfx::composition::NodePtr node_decl, | 222 mojo::gfx::composition::NodePtr node_decl, |
| 223 std::ostream& err) { | 223 std::ostream& err) { |
| 224 DCHECK(node_decl); | 224 DCHECK(node_decl); |
| 225 | 225 |
| 226 std::unique_ptr<TransformPair> content_transform; | 226 std::unique_ptr<TransformPair> content_transform; |
| 227 if (node_decl->content_transform) { | 227 if (node_decl->content_transform) { |
| 228 content_transform.reset( | 228 content_transform.reset( |
| 229 new TransformPair(node_decl->content_transform.To<SkMatrix44>())); | 229 new TransformPair(node_decl->content_transform.To<SkMatrix44>())); |
| 230 } | 230 } |
| 231 mojo::RectFPtr content_clip = node_decl->content_clip.Pass(); | 231 mojo::RectFPtr content_clip = node_decl->content_clip.Pass(); |
| 232 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior = | 232 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior = |
| 233 node_decl->hit_test_behavior.Pass(); | 233 node_decl->hit_test_behavior.Pass(); |
| 234 const mojo::gfx::composition::Node::Combinator combinator = | 234 const mojo::gfx::composition::Node::Combinator combinator = |
| 235 node_decl->combinator; | 235 node_decl->combinator; |
| 236 const std::vector<uint32_t>& child_node_ids = | 236 const std::vector<uint32_t>& child_node_ids = |
| 237 node_decl->child_node_ids.storage(); | 237 node_decl->child_node_ids.storage(); |
| 238 | 238 |
| 239 if (!node_decl->op) { | 239 if (!node_decl->op) { |
| 240 return new NodeDef(node_id, std::move(content_transform), | 240 return new Node(node_id, std::move(content_transform), content_clip.Pass(), |
| 241 content_clip.Pass(), hit_test_behavior.Pass(), | 241 hit_test_behavior.Pass(), combinator, child_node_ids); |
| 242 combinator, child_node_ids); | |
| 243 } | 242 } |
| 244 | 243 |
| 245 if (node_decl->op->is_rect()) { | 244 if (node_decl->op->is_rect()) { |
| 246 auto& rect_node_decl = node_decl->op->get_rect(); | 245 auto& rect_node_decl = node_decl->op->get_rect(); |
| 247 DCHECK(rect_node_decl->content_rect); | 246 DCHECK(rect_node_decl->content_rect); |
| 248 DCHECK(rect_node_decl->color); | 247 DCHECK(rect_node_decl->color); |
| 249 | 248 |
| 250 const mojo::RectF& content_rect = *rect_node_decl->content_rect; | 249 const mojo::RectF& content_rect = *rect_node_decl->content_rect; |
| 251 const mojo::gfx::composition::Color& color = *rect_node_decl->color; | 250 const mojo::gfx::composition::Color& color = *rect_node_decl->color; |
| 252 return new RectNodeDef(node_id, std::move(content_transform), | 251 return new RectNode(node_id, std::move(content_transform), |
| 253 content_clip.Pass(), hit_test_behavior.Pass(), | 252 content_clip.Pass(), hit_test_behavior.Pass(), |
| 254 combinator, child_node_ids, content_rect, color); | 253 combinator, child_node_ids, content_rect, color); |
| 255 } | 254 } |
| 256 | 255 |
| 257 if (node_decl->op->is_image()) { | 256 if (node_decl->op->is_image()) { |
| 258 auto& image_node_decl = node_decl->op->get_image(); | 257 auto& image_node_decl = node_decl->op->get_image(); |
| 259 DCHECK(image_node_decl->content_rect); | 258 DCHECK(image_node_decl->content_rect); |
| 260 | 259 |
| 261 const mojo::RectF& content_rect = *image_node_decl->content_rect; | 260 const mojo::RectF& content_rect = *image_node_decl->content_rect; |
| 262 mojo::RectFPtr image_rect = image_node_decl->image_rect.Pass(); | 261 mojo::RectFPtr image_rect = image_node_decl->image_rect.Pass(); |
| 263 const uint32 image_resource_id = image_node_decl->image_resource_id; | 262 const uint32 image_resource_id = image_node_decl->image_resource_id; |
| 264 mojo::gfx::composition::BlendPtr blend = image_node_decl->blend.Pass(); | 263 mojo::gfx::composition::BlendPtr blend = image_node_decl->blend.Pass(); |
| 265 return new ImageNodeDef(node_id, std::move(content_transform), | 264 return new ImageNode(node_id, std::move(content_transform), |
| 266 content_clip.Pass(), hit_test_behavior.Pass(), | 265 content_clip.Pass(), hit_test_behavior.Pass(), |
| 267 combinator, child_node_ids, content_rect, | 266 combinator, child_node_ids, content_rect, |
| 268 image_rect.Pass(), image_resource_id, blend.Pass()); | 267 image_rect.Pass(), image_resource_id, blend.Pass()); |
| 269 } | 268 } |
| 270 | 269 |
| 271 if (node_decl->op->is_scene()) { | 270 if (node_decl->op->is_scene()) { |
| 272 auto& scene_node_decl = node_decl->op->get_scene(); | 271 auto& scene_node_decl = node_decl->op->get_scene(); |
| 273 | 272 |
| 274 const uint32_t scene_resource_id = scene_node_decl->scene_resource_id; | 273 const uint32_t scene_resource_id = scene_node_decl->scene_resource_id; |
| 275 const uint32_t scene_version = scene_node_decl->scene_version; | 274 const uint32_t scene_version = scene_node_decl->scene_version; |
| 276 return new SceneNodeDef(node_id, std::move(content_transform), | 275 return new SceneNode(node_id, std::move(content_transform), |
| 277 content_clip.Pass(), hit_test_behavior.Pass(), | 276 content_clip.Pass(), hit_test_behavior.Pass(), |
| 278 combinator, child_node_ids, scene_resource_id, | 277 combinator, child_node_ids, scene_resource_id, |
| 279 scene_version); | 278 scene_version); |
| 280 } | 279 } |
| 281 | 280 |
| 282 if (node_decl->op->is_layer()) { | 281 if (node_decl->op->is_layer()) { |
| 283 auto& layer_node_decl = node_decl->op->get_layer(); | 282 auto& layer_node_decl = node_decl->op->get_layer(); |
| 284 DCHECK(layer_node_decl->layer_rect); | 283 DCHECK(layer_node_decl->layer_rect); |
| 285 | 284 |
| 286 const mojo::RectF& layer_rect = *layer_node_decl->layer_rect; | 285 const mojo::RectF& layer_rect = *layer_node_decl->layer_rect; |
| 287 mojo::gfx::composition::BlendPtr blend = layer_node_decl->blend.Pass(); | 286 mojo::gfx::composition::BlendPtr blend = layer_node_decl->blend.Pass(); |
| 288 return new LayerNodeDef(node_id, std::move(content_transform), | 287 return new LayerNode(node_id, std::move(content_transform), |
| 289 content_clip.Pass(), hit_test_behavior.Pass(), | 288 content_clip.Pass(), hit_test_behavior.Pass(), |
| 290 combinator, child_node_ids, layer_rect, | 289 combinator, child_node_ids, layer_rect, blend.Pass()); |
| 291 blend.Pass()); | |
| 292 } | 290 } |
| 293 | 291 |
| 294 err << "Unsupported node op type: node_id=" << node_id | 292 err << "Unsupported node op type: node_id=" << node_id |
| 295 << ", node_op=" << node_decl->op; | 293 << ", node_op=" << node_decl->op; |
| 296 return nullptr; | 294 return nullptr; |
| 297 } | 295 } |
| 298 | 296 |
| 299 const NodeDef* SceneDef::FindNode(uint32_t node_id) const { | 297 const Node* SceneDef::FindNode(uint32_t node_id) const { |
| 300 auto it = nodes_.find(node_id); | 298 auto it = nodes_.find(node_id); |
| 301 return it != nodes_.end() ? it->second.get() : nullptr; | 299 return it != nodes_.end() ? it->second.get() : nullptr; |
| 302 } | 300 } |
| 303 | 301 |
| 304 const ResourceDef* SceneDef::FindResource(uint32_t resource_id) const { | 302 const Resource* SceneDef::FindResource(uint32_t resource_id) const { |
| 305 auto it = resources_.find(resource_id); | 303 auto it = resources_.find(resource_id); |
| 306 return it != resources_.end() ? it->second.get() : nullptr; | 304 return it != resources_.end() ? it->second.get() : nullptr; |
| 307 } | 305 } |
| 308 | 306 |
| 309 const SceneContent* SceneDef::FindContent(uint32_t version) const { | 307 const SceneContent* SceneDef::FindContent(uint32_t version) const { |
| 310 if (!content_) | 308 if (!content_) |
| 311 return nullptr; | 309 return nullptr; |
| 312 | 310 |
| 313 // TODO(jeffbrown): Consider briefly caching older versions to allow them | 311 // TODO(jeffbrown): Consider briefly caching older versions to allow them |
| 314 // to be used to provide alternate content for node combinators. | 312 // to be used to provide alternate content for node combinators. |
| 315 if (version != mojo::gfx::composition::kSceneVersionNone && | 313 if (version != mojo::gfx::composition::kSceneVersionNone && |
| 316 version != content_->version() && | 314 version != content_->version() && |
| 317 content_->version() != mojo::gfx::composition::kSceneVersionNone) | 315 content_->version() != mojo::gfx::composition::kSceneVersionNone) |
| 318 return nullptr; | 316 return nullptr; |
| 319 return content_.get(); | 317 return content_.get(); |
| 320 } | 318 } |
| 321 | 319 |
| 322 SceneDef::Publication::Publication( | 320 SceneDef::Publication::Publication( |
| 323 mojo::gfx::composition::SceneMetadataPtr metadata) | 321 mojo::gfx::composition::SceneMetadataPtr metadata) |
| 324 : metadata(metadata.Pass()) { | 322 : metadata(metadata.Pass()) { |
| 325 DCHECK(this->metadata); | 323 DCHECK(this->metadata); |
| 326 } | 324 } |
| 327 | 325 |
| 328 SceneDef::Publication::~Publication() {} | 326 SceneDef::Publication::~Publication() {} |
| 329 | 327 |
| 330 } // namespace compositor | 328 } // namespace compositor |
| OLD | NEW |