// Copyright 2013 The Flutter 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/shell/platform/android/android_external_view_embedder.h" #include "fml/trace_event.h" namespace flutter { // |ExternalViewEmbedder| void AndroidExternalViewEmbedder::PrerollCompositeEmbeddedView( int view_id, std::unique_ptr params) { // TODO(egarciad): Implement hybrid composition. // https://github.com/flutter/flutter/issues/55270 TRACE_EVENT0("flutter", "AndroidExternalViewEmbedder::PrerollCompositeEmbeddedView"); picture_recorders_[view_id] = std::make_unique(); picture_recorders_[view_id]->beginRecording(SkRect::Make(frame_size_)); composition_order_.push_back(view_id); } // |ExternalViewEmbedder| SkCanvas* AndroidExternalViewEmbedder::CompositeEmbeddedView(int view_id) { return picture_recorders_[view_id]->getRecordingCanvas(); } // |ExternalViewEmbedder| std::vector AndroidExternalViewEmbedder::GetCurrentCanvases() { // TODO(egarciad): Implement hybrid composition. // https://github.com/flutter/flutter/issues/55270 std::vector canvases; for (size_t i = 0; i < composition_order_.size(); i++) { int64_t view_id = composition_order_[i]; canvases.push_back(picture_recorders_[view_id]->getRecordingCanvas()); } return canvases; } // |ExternalViewEmbedder| bool AndroidExternalViewEmbedder::SubmitFrame(GrContext* context, SkCanvas* background_canvas) { // TODO(egarciad): Implement hybrid composition. // https://github.com/flutter/flutter/issues/55270 TRACE_EVENT0("flutter", "AndroidExternalViewEmbedder::SubmitFrame"); for (size_t i = 0; i < composition_order_.size(); i++) { int64_t view_id = composition_order_[i]; background_canvas->drawPicture( picture_recorders_[view_id]->finishRecordingAsPicture()); } return true; } // |ExternalViewEmbedder| PostPrerollResult AndroidExternalViewEmbedder::PostPrerollAction( fml::RefPtr raster_thread_merger) { return PostPrerollResult::kSuccess; } // |ExternalViewEmbedder| SkCanvas* AndroidExternalViewEmbedder::GetRootCanvas() { // On Android, the root surface is created from the on-screen render target. return nullptr; } // |ExternalViewEmbedder| void AndroidExternalViewEmbedder::BeginFrame(SkISize frame_size, GrContext* context, double device_pixel_ratio) { frame_size_ = frame_size; } void AndroidExternalViewEmbedder::ClearFrame() { composition_order_.clear(); picture_recorders_.clear(); frame_size_ = SkISize::MakeEmpty(); } // |ExternalViewEmbedder| void AndroidExternalViewEmbedder::CancelFrame() { ClearFrame(); } // |ExternalViewEmbedder| void AndroidExternalViewEmbedder::FinishFrame() { ClearFrame(); } // |ExternalViewEmbedder| void AndroidExternalViewEmbedder::EndFrame( fml::RefPtr raster_thread_merger) {} } // namespace flutter