// 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. #ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_EXTERNAL_VIEW_H_ #define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_EXTERNAL_VIEW_H_ #include #include #include #include "flutter/flow/embedded_views.h" #include "flutter/fml/hash_combine.h" #include "flutter/fml/macros.h" #include "flutter/shell/common/canvas_spy.h" #include "flutter/shell/platform/embedder/embedder_render_target.h" #include "third_party/skia/include/core/SkPictureRecorder.h" namespace flutter { class EmbedderExternalView { public: using PlatformViewID = int64_t; struct ViewIdentifier { std::optional platform_view_id; ViewIdentifier() {} ViewIdentifier(PlatformViewID view_id) : platform_view_id(view_id) {} struct Hash { constexpr std::size_t operator()(const ViewIdentifier& desc) const { if (!desc.platform_view_id.has_value()) { return fml::HashCombine(); } return fml::HashCombine(desc.platform_view_id.value()); } }; struct Equal { constexpr bool operator()(const ViewIdentifier& lhs, const ViewIdentifier& rhs) const { return lhs.platform_view_id == rhs.platform_view_id; } }; }; struct RenderTargetDescriptor { ViewIdentifier view_identifier; SkISize surface_size; RenderTargetDescriptor(ViewIdentifier p_view_identifier, SkISize p_surface_size) : view_identifier(p_view_identifier), surface_size(p_surface_size) {} struct Hash { constexpr std::size_t operator()( const RenderTargetDescriptor& desc) const { return fml::HashCombine(desc.surface_size.width(), desc.surface_size.height(), ViewIdentifier::Hash{}(desc.view_identifier)); } }; struct Equal { bool operator()(const RenderTargetDescriptor& lhs, const RenderTargetDescriptor& rhs) const { return lhs.surface_size == rhs.surface_size && ViewIdentifier::Equal{}(lhs.view_identifier, rhs.view_identifier); } }; }; using ViewIdentifierSet = std::unordered_set; using PendingViews = std::unordered_map, ViewIdentifier::Hash, ViewIdentifier::Equal>; EmbedderExternalView(const SkISize& frame_size, const SkMatrix& surface_transformation); EmbedderExternalView(const SkISize& frame_size, const SkMatrix& surface_transformation, ViewIdentifier view_identifier, std::unique_ptr params); ~EmbedderExternalView(); bool IsRootView() const; bool HasPlatformView() const; bool HasEngineRenderedContents() const; ViewIdentifier GetViewIdentifier() const; const EmbeddedViewParams* GetEmbeddedViewParams() const; RenderTargetDescriptor CreateRenderTargetDescriptor() const; SkCanvas* GetCanvas() const; SkISize GetRenderSurfaceSize() const; bool Render(const EmbedderRenderTarget& render_target); private: const SkISize render_surface_size_; const SkMatrix surface_transformation_; ViewIdentifier view_identifier_; std::unique_ptr embedded_view_params_; std::unique_ptr recorder_; std::unique_ptr canvas_spy_; FML_DISALLOW_COPY_AND_ASSIGN(EmbedderExternalView); }; } // namespace flutter #endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_EXTERNAL_VIEW_H_