| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/flow/layers/child_scene_layer.h" |
| |
| #include "apps/mozart/lib/skia/type_converters.h" |
| #include "apps/mozart/services/composition/nodes.fidl.h" |
| |
| namespace flow { |
| |
| ChildSceneLayer::ChildSceneLayer() = default; |
| |
| ChildSceneLayer::~ChildSceneLayer() = default; |
| |
| void ChildSceneLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) { |
| set_needs_system_composite(true); |
| transform_.setIdentity(); |
| transform_.preTranslate(offset_.x(), offset_.y()); |
| float inverse_device_pixel_ratio = 1.f / device_pixel_ratio_; |
| transform_.preScale(inverse_device_pixel_ratio, inverse_device_pixel_ratio); |
| |
| SkRect bounds = |
| SkRect::MakeXYWH(offset_.x(), offset_.y(), |
| physical_size_.width() * inverse_device_pixel_ratio, |
| physical_size_.height() * inverse_device_pixel_ratio); |
| set_paint_bounds(bounds); |
| context->child_paint_bounds = bounds; |
| } |
| |
| void ChildSceneLayer::Paint(PaintContext& context) { |
| FTL_DCHECK(false) << "Failed to composite child scene."; |
| } |
| |
| void ChildSceneLayer::UpdateScene(SceneUpdateContext& context, |
| mozart::Node* container) { |
| FTL_DCHECK(needs_system_composite()); |
| |
| auto resource = mozart::Resource::New(); |
| resource->set_scene(mozart::SceneResource::New()); |
| resource->get_scene()->scene_token = mozart::SceneToken::New(); |
| resource->get_scene()->scene_token->value = scene_token_; |
| |
| auto node = mozart::Node::New(); |
| if (!hit_testable_) { |
| node->hit_test_behavior = mozart::HitTestBehavior::New(); |
| node->hit_test_behavior->visibility = |
| mozart::HitTestBehavior::Visibility::INVISIBLE; |
| node->hit_test_behavior->prune = true; |
| } |
| node->op = mozart::NodeOp::New(); |
| node->op->set_scene(mozart::SceneNodeOp::New()); |
| node->op->get_scene()->scene_resource_id = |
| context.AddResource(std::move(resource)); |
| node->content_clip = mozart::RectF::New(); |
| node->content_clip->width = physical_size_.width(); |
| node->content_clip->height = physical_size_.height(); |
| node->content_transform = mozart::Transform::From(transform_); |
| |
| context.AddChildNode(container, std::move(node)); |
| } |
| |
| } // namespace flow |