| 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/node_def.h" | 5 #include "services/gfx/compositor/graph/node_def.h" |
| 6 | 6 |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "mojo/services/gfx/composition/cpp/formatting.h" | 10 #include "mojo/services/gfx/composition/cpp/formatting.h" |
| 11 #include "mojo/skia/type_converters.h" | 11 #include "mojo/skia/type_converters.h" |
| 12 #include "services/gfx/compositor/graph/scene_content.h" | 12 #include "services/gfx/compositor/graph/scene_content.h" |
| 13 #include "services/gfx/compositor/graph/scene_def.h" | 13 #include "services/gfx/compositor/graph/scene_def.h" |
| 14 #include "services/gfx/compositor/graph/snapshot.h" | 14 #include "services/gfx/compositor/graph/snapshot.h" |
| 15 #include "services/gfx/compositor/graph/transform_pair.h" |
| 15 #include "services/gfx/compositor/render/render_image.h" | 16 #include "services/gfx/compositor/render/render_image.h" |
| 16 #include "third_party/skia/include/core/SkCanvas.h" | 17 #include "third_party/skia/include/core/SkCanvas.h" |
| 17 #include "third_party/skia/include/core/SkColor.h" | 18 #include "third_party/skia/include/core/SkColor.h" |
| 18 #include "third_party/skia/include/core/SkMatrix.h" | 19 #include "third_party/skia/include/core/SkMatrix.h" |
| 19 #include "third_party/skia/include/core/SkPaint.h" | 20 #include "third_party/skia/include/core/SkPaint.h" |
| 20 #include "third_party/skia/include/core/SkPoint.h" | 21 #include "third_party/skia/include/core/SkPoint.h" |
| 21 #include "third_party/skia/include/core/SkRect.h" | 22 #include "third_party/skia/include/core/SkRect.h" |
| 23 #include "third_party/skia/include/utils/SkMatrix44.h" |
| 22 | 24 |
| 23 namespace compositor { | 25 namespace compositor { |
| 24 namespace { | 26 namespace { |
| 25 SkColor MakeSkColor(const mojo::gfx::composition::Color& color) { | 27 SkColor MakeSkColor(const mojo::gfx::composition::Color& color) { |
| 26 return SkColorSetARGBInline(color.alpha, color.red, color.green, color.blue); | 28 return SkColorSetARGBInline(color.alpha, color.red, color.green, color.blue); |
| 27 } | 29 } |
| 28 | 30 |
| 29 void SetPaintForBlend(SkPaint* paint, mojo::gfx::composition::Blend* blend) { | 31 void SetPaintForBlend(SkPaint* paint, mojo::gfx::composition::Blend* blend) { |
| 30 DCHECK(paint); | 32 DCHECK(paint); |
| 31 if (blend) | 33 if (blend) |
| 32 paint->setAlpha(blend->alpha); | 34 paint->setAlpha(blend->alpha); |
| 33 } | 35 } |
| 34 | 36 |
| 35 bool Contains(const SkRect& bounds, const SkPoint& point) { | 37 bool Contains(const SkRect& bounds, const SkPoint& point) { |
| 36 return point.x() >= bounds.left() && point.x() < bounds.right() && | 38 return point.x() >= bounds.left() && point.x() < bounds.right() && |
| 37 point.y() >= bounds.top() && point.y() < bounds.bottom(); | 39 point.y() >= bounds.top() && point.y() < bounds.bottom(); |
| 38 } | 40 } |
| 39 } // namespace | 41 } // namespace |
| 40 | 42 |
| 41 NodeDef::NodeDef(uint32_t node_id, | 43 NodeDef::NodeDef(uint32_t node_id, |
| 42 mojo::TransformPtr content_transform, | 44 std::unique_ptr<TransformPair> content_transform, |
| 43 mojo::RectFPtr content_clip, | 45 mojo::RectFPtr content_clip, |
| 44 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, | 46 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
| 45 Combinator combinator, | 47 Combinator combinator, |
| 46 const std::vector<uint32_t>& child_node_ids) | 48 const std::vector<uint32_t>& child_node_ids) |
| 47 : node_id_(node_id), | 49 : node_id_(node_id), |
| 48 content_transform_(content_transform.Pass()), | 50 content_transform_(std::move(content_transform)), |
| 49 content_clip_(content_clip.Pass()), | 51 content_clip_(content_clip.Pass()), |
| 50 hit_test_behavior_(hit_test_behavior.Pass()), | 52 hit_test_behavior_(hit_test_behavior.Pass()), |
| 51 combinator_(combinator), | 53 combinator_(combinator), |
| 52 child_node_ids_(child_node_ids) {} | 54 child_node_ids_(child_node_ids) {} |
| 53 | 55 |
| 54 NodeDef::~NodeDef() {} | 56 NodeDef::~NodeDef() {} |
| 55 | 57 |
| 56 std::string NodeDef::FormattedLabel(const SceneContent* content) const { | 58 std::string NodeDef::FormattedLabel(const SceneContent* content) const { |
| 57 return content->FormattedLabelForNode(node_id_); | 59 return content->FormattedLabelForNode(node_id_); |
| 58 } | 60 } |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 const Snapshot* snapshot, | 200 const Snapshot* snapshot, |
| 199 SkCanvas* canvas) const { | 201 SkCanvas* canvas) const { |
| 200 DCHECK(content); | 202 DCHECK(content); |
| 201 DCHECK(snapshot); | 203 DCHECK(snapshot); |
| 202 DCHECK(canvas); | 204 DCHECK(canvas); |
| 203 | 205 |
| 204 const bool must_save = content_transform_ || content_clip_; | 206 const bool must_save = content_transform_ || content_clip_; |
| 205 if (must_save) { | 207 if (must_save) { |
| 206 canvas->save(); | 208 canvas->save(); |
| 207 if (content_transform_) | 209 if (content_transform_) |
| 208 canvas->concat(content_transform_.To<SkMatrix>()); | 210 canvas->concat(content_transform_->forward()); |
| 209 if (content_clip_) | 211 if (content_clip_) |
| 210 canvas->clipRect(content_clip_->To<SkRect>()); | 212 canvas->clipRect(content_clip_->To<SkRect>()); |
| 211 } | 213 } |
| 212 | 214 |
| 213 RecordPictureInner(content, snapshot, canvas); | 215 RecordPictureInner(content, snapshot, canvas); |
| 214 | 216 |
| 215 if (must_save) | 217 if (must_save) |
| 216 canvas->restore(); | 218 canvas->restore(); |
| 217 } | 219 } |
| 218 | 220 |
| 219 void NodeDef::RecordPictureInner(const SceneContent* content, | 221 void NodeDef::RecordPictureInner(const SceneContent* content, |
| 220 const Snapshot* snapshot, | 222 const Snapshot* snapshot, |
| 221 SkCanvas* canvas) const { | 223 SkCanvas* canvas) const { |
| 222 DCHECK(content); | 224 DCHECK(content); |
| 223 DCHECK(snapshot); | 225 DCHECK(snapshot); |
| 224 DCHECK(canvas); | 226 DCHECK(canvas); |
| 225 | 227 |
| 226 TraverseSnapshottedChildren( | 228 TraverseSnapshottedChildren( |
| 227 content, snapshot, | 229 content, snapshot, |
| 228 [this, content, snapshot, canvas](const NodeDef* child_node) -> bool { | 230 [this, content, snapshot, canvas](const NodeDef* child_node) -> bool { |
| 229 child_node->RecordPicture(content, snapshot, canvas); | 231 child_node->RecordPicture(content, snapshot, canvas); |
| 230 return true; | 232 return true; |
| 231 }); | 233 }); |
| 232 } | 234 } |
| 233 | 235 |
| 234 bool NodeDef::HitTest(const SceneContent* content, | 236 bool NodeDef::HitTest(const SceneContent* content, |
| 235 const Snapshot* snapshot, | 237 const Snapshot* snapshot, |
| 236 const SkPoint& parent_point, | 238 const SkPoint& parent_point, |
| 237 const SkMatrix& global_to_parent_transform, | 239 const SkMatrix44& global_to_parent_transform, |
| 238 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { | 240 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { |
| 239 DCHECK(content); | 241 DCHECK(content); |
| 240 DCHECK(snapshot); | 242 DCHECK(snapshot); |
| 241 DCHECK(hits); | 243 DCHECK(hits); |
| 242 | 244 |
| 243 // TODO(jeffbrown): These calculations should probably be happening using | 245 // TODO(jeffbrown): These calculations should probably be happening using |
| 244 // a 4x4 matrix instead. | 246 // a 4x4 matrix instead. |
| 245 SkPoint local_point = parent_point; | 247 SkPoint local_point(parent_point); |
| 246 SkMatrix global_to_local_transform = global_to_parent_transform; | 248 SkMatrix global_to_local_transform(global_to_parent_transform); |
| 247 if (content_transform_) { | 249 if (content_transform_) { |
| 248 // TODO(jeffbrown): Cache the inverse transform. | 250 // TODO(jeffbrown): Defer matrix multiplications using a matrix stack. |
| 249 // Defer matrix multiplications using a matrix stack. | 251 local_point = content_transform_->InverseMapPoint(parent_point); |
| 250 SkMatrix inverse_transform; | 252 global_to_local_transform.preConcat(content_transform_->GetInverse()); |
| 251 if (!content_transform_.To<SkMatrix>().invert(&inverse_transform)) { | |
| 252 // Matrix is singular! | |
| 253 // Return [0,0,0][0,0,0][0,0,1] (all zeroes except last component). | |
| 254 // This causes all points to be mapped to (0,0) when transformed. | |
| 255 inverse_transform.setScale(0.f, 0.f); | |
| 256 } | |
| 257 inverse_transform.mapXY(parent_point.x(), parent_point.y(), &local_point); | |
| 258 global_to_local_transform.preConcat(inverse_transform); | |
| 259 } | 253 } |
| 260 | 254 |
| 261 if (content_clip_ && !Contains(content_clip_->To<SkRect>(), local_point)) | 255 if (content_clip_ && !Contains(content_clip_->To<SkRect>(), local_point)) |
| 262 return false; | 256 return false; |
| 263 | 257 |
| 264 bool opaque_children = false; | 258 bool opaque_children = false; |
| 265 if (!hit_test_behavior_ || !hit_test_behavior_->prune) { | 259 if (!hit_test_behavior_ || !hit_test_behavior_->prune) { |
| 266 opaque_children = HitTestInner(content, snapshot, local_point, | 260 opaque_children = HitTestInner(content, snapshot, local_point, |
| 267 global_to_local_transform, hits); | 261 global_to_local_transform, hits); |
| 268 } | 262 } |
| 269 | 263 |
| 270 return HitTestSelf(content, snapshot, local_point, global_to_local_transform, | 264 return HitTestSelf(content, snapshot, local_point, global_to_local_transform, |
| 271 hits) || | 265 hits) || |
| 272 opaque_children; | 266 opaque_children; |
| 273 } | 267 } |
| 274 | 268 |
| 275 bool NodeDef::HitTestInner( | 269 bool NodeDef::HitTestInner( |
| 276 const SceneContent* content, | 270 const SceneContent* content, |
| 277 const Snapshot* snapshot, | 271 const Snapshot* snapshot, |
| 278 const SkPoint& local_point, | 272 const SkPoint& local_point, |
| 279 const SkMatrix& global_to_local_transform, | 273 const SkMatrix44& global_to_local_transform, |
| 280 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { | 274 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { |
| 281 DCHECK(content); | 275 DCHECK(content); |
| 282 DCHECK(snapshot); | 276 DCHECK(snapshot); |
| 283 DCHECK(hits); | 277 DCHECK(hits); |
| 284 | 278 |
| 285 // TODO(jeffbrown): Implement a more efficient way to traverse children in | 279 // TODO(jeffbrown): Implement a more efficient way to traverse children in |
| 286 // reverse order. | 280 // reverse order. |
| 287 std::vector<const NodeDef*> children; | 281 std::vector<const NodeDef*> children; |
| 288 TraverseSnapshottedChildren( | 282 TraverseSnapshottedChildren( |
| 289 content, snapshot, [this, &children](const NodeDef* child_node) -> bool { | 283 content, snapshot, [this, &children](const NodeDef* child_node) -> bool { |
| 290 children.push_back(child_node); | 284 children.push_back(child_node); |
| 291 return true; | 285 return true; |
| 292 }); | 286 }); |
| 293 | 287 |
| 294 for (auto it = children.crbegin(); it != children.crend(); ++it) { | 288 for (auto it = children.crbegin(); it != children.crend(); ++it) { |
| 295 if ((*it)->HitTest(content, snapshot, local_point, | 289 if ((*it)->HitTest(content, snapshot, local_point, |
| 296 global_to_local_transform, hits)) | 290 global_to_local_transform, hits)) |
| 297 return true; // opaque child covering siblings | 291 return true; // opaque child covering siblings |
| 298 } | 292 } |
| 299 return false; | 293 return false; |
| 300 } | 294 } |
| 301 | 295 |
| 302 bool NodeDef::HitTestSelf( | 296 bool NodeDef::HitTestSelf( |
| 303 const SceneContent* content, | 297 const SceneContent* content, |
| 304 const Snapshot* snapshot, | 298 const Snapshot* snapshot, |
| 305 const SkPoint& local_point, | 299 const SkPoint& local_point, |
| 306 const SkMatrix& global_to_local_transform, | 300 const SkMatrix44& global_to_local_transform, |
| 307 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { | 301 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { |
| 308 DCHECK(content); | 302 DCHECK(content); |
| 309 DCHECK(snapshot); | 303 DCHECK(snapshot); |
| 310 DCHECK(hits); | 304 DCHECK(hits); |
| 311 | 305 |
| 312 if (!hit_test_behavior_ || | 306 if (!hit_test_behavior_ || |
| 313 hit_test_behavior_->visibility == | 307 hit_test_behavior_->visibility == |
| 314 mojo::gfx::composition::HitTestBehavior::Visibility::INVISIBLE) | 308 mojo::gfx::composition::HitTestBehavior::Visibility::INVISIBLE) |
| 315 return false; | 309 return false; |
| 316 | 310 |
| 317 if (hit_test_behavior_->hit_rect && | 311 if (hit_test_behavior_->hit_rect && |
| 318 !Contains(hit_test_behavior_->hit_rect->To<SkRect>(), local_point)) | 312 !Contains(hit_test_behavior_->hit_rect->To<SkRect>(), local_point)) |
| 319 return false; | 313 return false; |
| 320 | 314 |
| 321 auto hit = mojo::gfx::composition::Hit::New(); | 315 auto hit = mojo::gfx::composition::Hit::New(); |
| 322 hit->set_node(mojo::gfx::composition::NodeHit::New()); | 316 hit->set_node(mojo::gfx::composition::NodeHit::New()); |
| 323 hit->get_node()->node_id = node_id_; | 317 hit->get_node()->node_id = node_id_; |
| 324 hit->get_node()->transform = | 318 hit->get_node()->transform = |
| 325 mojo::ConvertTo<mojo::TransformPtr>(global_to_local_transform); | 319 mojo::ConvertTo<mojo::TransformPtr>(global_to_local_transform); |
| 326 hits->push_back(hit.Pass()); | 320 hits->push_back(hit.Pass()); |
| 327 return hit_test_behavior_->visibility == | 321 return hit_test_behavior_->visibility == |
| 328 mojo::gfx::composition::HitTestBehavior::Visibility::OPAQUE; | 322 mojo::gfx::composition::HitTestBehavior::Visibility::OPAQUE; |
| 329 } | 323 } |
| 330 | 324 |
| 331 RectNodeDef::RectNodeDef( | 325 RectNodeDef::RectNodeDef( |
| 332 uint32_t node_id, | 326 uint32_t node_id, |
| 333 mojo::TransformPtr content_transform, | 327 std::unique_ptr<TransformPair> content_transform, |
| 334 mojo::RectFPtr content_clip, | 328 mojo::RectFPtr content_clip, |
| 335 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, | 329 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
| 336 Combinator combinator, | 330 Combinator combinator, |
| 337 const std::vector<uint32_t>& child_node_ids, | 331 const std::vector<uint32_t>& child_node_ids, |
| 338 const mojo::RectF& content_rect, | 332 const mojo::RectF& content_rect, |
| 339 const mojo::gfx::composition::Color& color) | 333 const mojo::gfx::composition::Color& color) |
| 340 : NodeDef(node_id, | 334 : NodeDef(node_id, |
| 341 content_transform.Pass(), | 335 std::move(content_transform), |
| 342 content_clip.Pass(), | 336 content_clip.Pass(), |
| 343 hit_test_behavior.Pass(), | 337 hit_test_behavior.Pass(), |
| 344 combinator, | 338 combinator, |
| 345 child_node_ids), | 339 child_node_ids), |
| 346 content_rect_(content_rect), | 340 content_rect_(content_rect), |
| 347 color_(color) {} | 341 color_(color) {} |
| 348 | 342 |
| 349 RectNodeDef::~RectNodeDef() {} | 343 RectNodeDef::~RectNodeDef() {} |
| 350 | 344 |
| 351 void RectNodeDef::RecordPictureInner(const SceneContent* content, | 345 void RectNodeDef::RecordPictureInner(const SceneContent* content, |
| 352 const Snapshot* snapshot, | 346 const Snapshot* snapshot, |
| 353 SkCanvas* canvas) const { | 347 SkCanvas* canvas) const { |
| 354 DCHECK(content); | 348 DCHECK(content); |
| 355 DCHECK(snapshot); | 349 DCHECK(snapshot); |
| 356 DCHECK(canvas); | 350 DCHECK(canvas); |
| 357 | 351 |
| 358 SkPaint paint; | 352 SkPaint paint; |
| 359 paint.setColor(MakeSkColor(color_)); | 353 paint.setColor(MakeSkColor(color_)); |
| 360 canvas->drawRect(content_rect_.To<SkRect>(), paint); | 354 canvas->drawRect(content_rect_.To<SkRect>(), paint); |
| 361 | 355 |
| 362 NodeDef::RecordPictureInner(content, snapshot, canvas); | 356 NodeDef::RecordPictureInner(content, snapshot, canvas); |
| 363 } | 357 } |
| 364 | 358 |
| 365 ImageNodeDef::ImageNodeDef( | 359 ImageNodeDef::ImageNodeDef( |
| 366 uint32_t node_id, | 360 uint32_t node_id, |
| 367 mojo::TransformPtr content_transform, | 361 std::unique_ptr<TransformPair> content_transform, |
| 368 mojo::RectFPtr content_clip, | 362 mojo::RectFPtr content_clip, |
| 369 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, | 363 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
| 370 Combinator combinator, | 364 Combinator combinator, |
| 371 const std::vector<uint32_t>& child_node_ids, | 365 const std::vector<uint32_t>& child_node_ids, |
| 372 const mojo::RectF& content_rect, | 366 const mojo::RectF& content_rect, |
| 373 mojo::RectFPtr image_rect, | 367 mojo::RectFPtr image_rect, |
| 374 uint32 image_resource_id, | 368 uint32 image_resource_id, |
| 375 mojo::gfx::composition::BlendPtr blend) | 369 mojo::gfx::composition::BlendPtr blend) |
| 376 : NodeDef(node_id, | 370 : NodeDef(node_id, |
| 377 content_transform.Pass(), | 371 std::move(content_transform), |
| 378 content_clip.Pass(), | 372 content_clip.Pass(), |
| 379 hit_test_behavior.Pass(), | 373 hit_test_behavior.Pass(), |
| 380 combinator, | 374 combinator, |
| 381 child_node_ids), | 375 child_node_ids), |
| 382 content_rect_(content_rect), | 376 content_rect_(content_rect), |
| 383 image_rect_(image_rect.Pass()), | 377 image_rect_(image_rect.Pass()), |
| 384 image_resource_id_(image_resource_id), | 378 image_resource_id_(image_resource_id), |
| 385 blend_(blend.Pass()) {} | 379 blend_(blend.Pass()) {} |
| 386 | 380 |
| 387 ImageNodeDef::~ImageNodeDef() {} | 381 ImageNodeDef::~ImageNodeDef() {} |
| (...skipping 25 matching lines...) Expand all Loading... |
| 413 ? image_rect_->To<SkRect>() | 407 ? image_rect_->To<SkRect>() |
| 414 : SkRect::MakeWH(image_resource->image()->width(), | 408 : SkRect::MakeWH(image_resource->image()->width(), |
| 415 image_resource->image()->height()), | 409 image_resource->image()->height()), |
| 416 content_rect_.To<SkRect>(), &paint); | 410 content_rect_.To<SkRect>(), &paint); |
| 417 | 411 |
| 418 NodeDef::RecordPictureInner(content, snapshot, canvas); | 412 NodeDef::RecordPictureInner(content, snapshot, canvas); |
| 419 } | 413 } |
| 420 | 414 |
| 421 SceneNodeDef::SceneNodeDef( | 415 SceneNodeDef::SceneNodeDef( |
| 422 uint32_t node_id, | 416 uint32_t node_id, |
| 423 mojo::TransformPtr content_transform, | 417 std::unique_ptr<TransformPair> content_transform, |
| 424 mojo::RectFPtr content_clip, | 418 mojo::RectFPtr content_clip, |
| 425 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, | 419 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
| 426 Combinator combinator, | 420 Combinator combinator, |
| 427 const std::vector<uint32_t>& child_node_ids, | 421 const std::vector<uint32_t>& child_node_ids, |
| 428 uint32_t scene_resource_id, | 422 uint32_t scene_resource_id, |
| 429 uint32_t scene_version) | 423 uint32_t scene_version) |
| 430 : NodeDef(node_id, | 424 : NodeDef(node_id, |
| 431 content_transform.Pass(), | 425 std::move(content_transform), |
| 432 content_clip.Pass(), | 426 content_clip.Pass(), |
| 433 hit_test_behavior.Pass(), | 427 hit_test_behavior.Pass(), |
| 434 combinator, | 428 combinator, |
| 435 child_node_ids), | 429 child_node_ids), |
| 436 scene_resource_id_(scene_resource_id), | 430 scene_resource_id_(scene_resource_id), |
| 437 scene_version_(scene_version) {} | 431 scene_version_(scene_version) {} |
| 438 | 432 |
| 439 SceneNodeDef::~SceneNodeDef() {} | 433 SceneNodeDef::~SceneNodeDef() {} |
| 440 | 434 |
| 441 bool SceneNodeDef::RecordContent(SceneContentBuilder* builder) const { | 435 bool SceneNodeDef::RecordContent(SceneContentBuilder* builder) const { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 DCHECK(resolved_content); | 479 DCHECK(resolved_content); |
| 486 resolved_content->RecordPicture(snapshot, canvas); | 480 resolved_content->RecordPicture(snapshot, canvas); |
| 487 | 481 |
| 488 NodeDef::RecordPictureInner(content, snapshot, canvas); | 482 NodeDef::RecordPictureInner(content, snapshot, canvas); |
| 489 } | 483 } |
| 490 | 484 |
| 491 bool SceneNodeDef::HitTestInner( | 485 bool SceneNodeDef::HitTestInner( |
| 492 const SceneContent* content, | 486 const SceneContent* content, |
| 493 const Snapshot* snapshot, | 487 const Snapshot* snapshot, |
| 494 const SkPoint& local_point, | 488 const SkPoint& local_point, |
| 495 const SkMatrix& global_to_local_transform, | 489 const SkMatrix44& global_to_local_transform, |
| 496 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { | 490 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { |
| 497 DCHECK(content); | 491 DCHECK(content); |
| 498 DCHECK(snapshot); | 492 DCHECK(snapshot); |
| 499 DCHECK(hits); | 493 DCHECK(hits); |
| 500 | 494 |
| 501 if (NodeDef::HitTestInner(content, snapshot, local_point, | 495 if (NodeDef::HitTestInner(content, snapshot, local_point, |
| 502 global_to_local_transform, hits)) | 496 global_to_local_transform, hits)) |
| 503 return true; // opaque child covering referenced scene | 497 return true; // opaque child covering referenced scene |
| 504 | 498 |
| 505 const SceneContent* resolved_content = | 499 const SceneContent* resolved_content = |
| 506 snapshot->GetResolvedSceneContent(this); | 500 snapshot->GetResolvedSceneContent(this); |
| 507 DCHECK(resolved_content); | 501 DCHECK(resolved_content); |
| 508 | 502 |
| 509 mojo::gfx::composition::SceneHitPtr scene_hit; | 503 mojo::gfx::composition::SceneHitPtr scene_hit; |
| 510 bool opaque = resolved_content->HitTest( | 504 bool opaque = resolved_content->HitTest( |
| 511 snapshot, local_point, global_to_local_transform, &scene_hit); | 505 snapshot, local_point, global_to_local_transform, &scene_hit); |
| 512 if (scene_hit) { | 506 if (scene_hit) { |
| 513 auto hit = mojo::gfx::composition::Hit::New(); | 507 auto hit = mojo::gfx::composition::Hit::New(); |
| 514 hit->set_scene(scene_hit.Pass()); | 508 hit->set_scene(scene_hit.Pass()); |
| 515 hits->push_back(hit.Pass()); | 509 hits->push_back(hit.Pass()); |
| 516 } | 510 } |
| 517 return opaque; | 511 return opaque; |
| 518 } | 512 } |
| 519 | 513 |
| 520 LayerNodeDef::LayerNodeDef( | 514 LayerNodeDef::LayerNodeDef( |
| 521 uint32_t node_id, | 515 uint32_t node_id, |
| 522 mojo::TransformPtr content_transform, | 516 std::unique_ptr<TransformPair> content_transform, |
| 523 mojo::RectFPtr content_clip, | 517 mojo::RectFPtr content_clip, |
| 524 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, | 518 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
| 525 Combinator combinator, | 519 Combinator combinator, |
| 526 const std::vector<uint32_t>& child_node_ids, | 520 const std::vector<uint32_t>& child_node_ids, |
| 527 const mojo::RectF& layer_rect, | 521 const mojo::RectF& layer_rect, |
| 528 mojo::gfx::composition::BlendPtr blend) | 522 mojo::gfx::composition::BlendPtr blend) |
| 529 : NodeDef(node_id, | 523 : NodeDef(node_id, |
| 530 content_transform.Pass(), | 524 std::move(content_transform), |
| 531 content_clip.Pass(), | 525 content_clip.Pass(), |
| 532 hit_test_behavior.Pass(), | 526 hit_test_behavior.Pass(), |
| 533 combinator, | 527 combinator, |
| 534 child_node_ids), | 528 child_node_ids), |
| 535 layer_rect_(layer_rect), | 529 layer_rect_(layer_rect), |
| 536 blend_(blend.Pass()) {} | 530 blend_(blend.Pass()) {} |
| 537 | 531 |
| 538 LayerNodeDef::~LayerNodeDef() {} | 532 LayerNodeDef::~LayerNodeDef() {} |
| 539 | 533 |
| 540 void LayerNodeDef::RecordPictureInner(const SceneContent* content, | 534 void LayerNodeDef::RecordPictureInner(const SceneContent* content, |
| 541 const Snapshot* snapshot, | 535 const Snapshot* snapshot, |
| 542 SkCanvas* canvas) const { | 536 SkCanvas* canvas) const { |
| 543 DCHECK(content); | 537 DCHECK(content); |
| 544 DCHECK(snapshot); | 538 DCHECK(snapshot); |
| 545 DCHECK(canvas); | 539 DCHECK(canvas); |
| 546 | 540 |
| 547 SkPaint paint; | 541 SkPaint paint; |
| 548 SetPaintForBlend(&paint, blend_.get()); | 542 SetPaintForBlend(&paint, blend_.get()); |
| 549 | 543 |
| 550 canvas->saveLayer(layer_rect_.To<SkRect>(), &paint); | 544 canvas->saveLayer(layer_rect_.To<SkRect>(), &paint); |
| 551 NodeDef::RecordPictureInner(content, snapshot, canvas); | 545 NodeDef::RecordPictureInner(content, snapshot, canvas); |
| 552 canvas->restore(); | 546 canvas->restore(); |
| 553 } | 547 } |
| 554 | 548 |
| 555 } // namespace compositor | 549 } // namespace compositor |
| OLD | NEW |