mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
96 lines
3.1 KiB
C++
96 lines
3.1 KiB
C++
// 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<EmbeddedViewParams> 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<SkPictureRecorder>();
|
|
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<SkCanvas*> AndroidExternalViewEmbedder::GetCurrentCanvases() {
|
|
// TODO(egarciad): Implement hybrid composition.
|
|
// https://github.com/flutter/flutter/issues/55270
|
|
std::vector<SkCanvas*> 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<fml::RasterThreadMerger> 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<fml::RasterThreadMerger> raster_thread_merger) {}
|
|
|
|
} // namespace flutter
|