blob: 84339a132d7e800840b18f030f58266b1d09baab [file] [log] [blame]
// Copyright 2022 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.
library fuchsia.ui.composition;
using fuchsia.io;
using fuchsia.math;
using zx;
/// The different formats of Screenshot that can be requested.
@available(added=12)
type ScreenshotFormat = flexible enum : uint8 {
/// The default format, requesting a tightly packed pixel data with 32 bit BGRA pixels.
BGRA_RAW = 0;
/// Requests tightly packed pixel data which is compressed into PNG format.
@available(added=HEAD)
PNG = 1;
};
/// Collects the current graphical content of a display.
@available(added=12)
@discoverable
closed protocol Screenshot {
/// Collects the current graphical content of a display in a specified buffer `format` in the
/// sRGB color space. Note that the sRGB color space is non-linear, meaning that unit tests
/// doing pixel equality checks making use of non-fully saturated colors should convert to a
/// linear color space.
///
/// See https://fuchsia.dev/fuchsia-src/concepts/ui/scenic/color_spaces for more information.
///
/// Screenshot is taken immediately, populated with the display's content from the most recent
/// VSYNC.
///
/// If the client calls [`Take`] a second time before a first [`Take`] call returns, the server
/// will close the Screenshot connection with a ZX_ERR_SHOULD_WAIT epitaph.
///
/// If capture fails due to an internal error, the server will close the Screenshot connection
/// with a ZX_ERR_INTERNAL epitaph.
strict Take(resource table {
/// Format of the requested screenshot.
1: format ScreenshotFormat;
}) -> (resource table {
/// CPU mappable read-only VMO that contains screenshot data. The server owns the VMO and
/// may reuse for the next [`Take`]. The VMO is guaranteed to be accessible after mapping.
/// In some allocations, VMO::read() might not be available, i.e. on emulator.
///
/// Basic usage: After the client receives a VMO handle, to ensure data stability, it should
/// finish reading the VMO before calling [`Take`] again. When finished reading, the client
/// should drop the VMO handle.
///
/// Advanced usage: To edit the data, or to persist it beyond the next [`Take`] call, the
/// client should copy the data to a private VMO.
1: vmo zx.Handle:VMO;
/// Size of the screenshot in pixels.
2: size fuchsia.math.SizeU;
});
/// Collects the current graphical content of a display in a specified buffer `format` in the
/// sRGB color space. Note that the sRGB color space is non-linear, meaning that unit tests
/// doing pixel equality checks making use of non-fully saturated colors should convert to a
/// linear color space.
///
/// TODO(https://fxbug.dev/42065844): Link to fuchsia.dev documentation when it's up.
///
/// Screenshot is taken immediately, populated with the display's content from the most recent
/// VSYNC.
///
/// If the client calls [`TakeFile`] a second time before a first [`TakeFile`] call returns,
/// the server will close the Screenshot connection with a ZX_ERR_SHOULD_WAIT epitaph.
///
/// If capture fails due to an internal error, the server will close the Screenshot connection
/// with a ZX_ERR_INTERNAL epitaph.
///
/// This call should be used if the client is on the host and does not support VMOs,
/// as is the case for ffx tools.
strict TakeFile(resource table {
/// Format of the requested screenshot.
1: format ScreenshotFormat;
}) -> (resource table {
/// |fuchsia.io.File| channel used to read the generated screenshot file data.
/// The server side of the channel is stored on the device until ZX_CHANNEL_PEER_CLOSED
/// is detected.
///
/// Basic usage: After the client recieves the client end of the file channel,
/// to avoid memory pile-ups, it should finish reading the data
/// before calling [`TakeFile`] again. When finished reading,
/// the client should call [`Close`] on the |fuchsia.io.File| channel, this will release
/// the memory allocated on the server side.
1: file client_end:fuchsia.io.File;
/// Size of the screenshot in pixels.
2: size fuchsia.math.SizeU;
});
};