13 UIView* overlay_view_wrapper,
14 std::unique_ptr<IOSSurface> ios_surface,
15 std::unique_ptr<Surface> surface)
16 : overlay_view(overlay_view),
17 overlay_view_wrapper(overlay_view_wrapper),
18 ios_surface(std::move(ios_surface)),
19 surface(std::move(surface)){};
25 auto screenScale = [UIScreen mainScreen].scale;
29 rect.width() / screenScale, rect.height() / screenScale);
32 [NSString stringWithFormat:
@"platform_view[%lld].overlay[%lld]", view_id, overlay_id];
39 [NSString stringWithFormat:
@"platform_view[%lld].overlay_view[%lld]", view_id, overlay_id];
46 std::shared_ptr<OverlayLayer> result;
47 if (available_layer_index_ < layers_.size()) {
48 result = layers_[available_layer_index_];
49 available_layer_index_++;
56 const std::shared_ptr<IOSContext>& ios_context,
57 MTLPixelFormat pixel_format) {
58 FML_DCHECK([[NSThread currentThread] isMainThread]);
59 std::shared_ptr<OverlayLayer> layer;
61 UIView* overlay_view_wrapper;
63 bool impeller_enabled = !!ios_context->GetImpellerContext();
64 if (!gr_context && !impeller_enabled) {
68 CALayer* ca_layer = overlay_view.layer;
70 std::unique_ptr<Surface> surface = ios_surface->CreateGPUSurface();
72 layer = std::make_shared<OverlayLayer>(overlay_view, overlay_view_wrapper,
73 std::move(ios_surface), std::move(surface));
75 CGFloat screenScale = [UIScreen mainScreen].scale;
77 pixelFormat:pixel_format];
79 pixelFormat:pixel_format];
81 CALayer* ca_layer = overlay_view.layer;
83 std::unique_ptr<Surface> surface = ios_surface->CreateGPUSurface(gr_context);
85 layer = std::make_shared<OverlayLayer>(overlay_view, overlay_view_wrapper,
86 std::move(ios_surface), std::move(surface));
87 layer->gr_context = gr_context;
103 layer->overlay_view_wrapper.clipsToBounds = YES;
104 [layer->overlay_view_wrapper addSubview:layer->overlay_view];
106 layers_.push_back(layer);
110 available_layer_index_ = 0;
114 std::vector<std::shared_ptr<OverlayLayer>> results;
115 for (
size_t i = available_layer_index_; i < layers_.size(); i++) {
116 results.push_back(layers_[i]);
122 static constexpr
size_t kLeakLayerCount = 1;
123 size_t erase_offset = std::max(available_layer_index_, kLeakLayerCount);
124 if (erase_offset < layers_.size()) {
125 layers_.erase(layers_.begin() + erase_offset, layers_.end());
131 return layers_.size();