blob: 669868bc1696159e3f5692f0cbd6c012612a157a [file] [log] [blame]
// Copyright 2021 The Fuchsia 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 SRC_UI_SCENIC_LIB_SCREEN_CAPTURE_SCREEN_CAPTURE_H_
#define SRC_UI_SCENIC_LIB_SCREEN_CAPTURE_SCREEN_CAPTURE_H_
#include <fuchsia/ui/composition/cpp/fidl.h>
#include <lib/fidl/cpp/binding.h>
#include <unordered_map>
#include "src/ui/scenic/lib/allocation/buffer_collection_importer.h"
#include "src/ui/scenic/lib/flatland/engine/engine.h"
#include "src/ui/scenic/lib/flatland/renderer/renderer.h"
namespace screen_capture {
using Rectangle2D = escher::Rectangle2D;
using glm::vec2;
using GetRenderables = std::function<flatland::Renderables()>;
class ScreenCapture : public fuchsia::ui::composition::ScreenCapture {
public:
static std::vector<Rectangle2D> RotateRenderables(const std::vector<Rectangle2D>& rects,
fuchsia::ui::composition::Rotation rotation,
uint32_t image_width, uint32_t image_height);
ScreenCapture(fidl::InterfaceRequest<fuchsia::ui::composition::ScreenCapture> request,
const std::vector<std::shared_ptr<allocation::BufferCollectionImporter>>&
buffer_collection_importers,
std::shared_ptr<flatland::Renderer> renderer, GetRenderables get_renderables);
~ScreenCapture() override;
void Configure(fuchsia::ui::composition::ScreenCaptureConfig args,
ConfigureCallback callback) override;
void GetNextFrame(fuchsia::ui::composition::GetNextFrameArgs args,
GetNextFrameCallback callback) override;
void ReleaseFrame(uint32_t buffer_id, ReleaseFrameCallback callback) override;
private:
void ClearImages();
// Clients cannot use zero as an Image ID.
static constexpr int64_t kInvalidId = 0;
fidl::Binding<fuchsia::ui::composition::ScreenCapture> binding_;
std::vector<std::shared_ptr<allocation::BufferCollectionImporter>> buffer_collection_importers_;
// Holds all registered images.
std::unordered_map<int64_t, allocation::ImageMetadata> image_ids_;
// Indices of available buffers.
std::deque<uint32_t> available_buffers_;
fuchsia::ui::composition::Rotation stream_rotation_;
std::shared_ptr<flatland::Renderer> renderer_;
GetRenderables get_renderables_;
};
} // namespace screen_capture
#endif // SRC_UI_SCENIC_LIB_SCREEN_CAPTURE_SCREEN_CAPTURE_H_