blob: 4fb7451f683635e363977e2cf9850faea95d42e1 [file] [log] [blame]
// Copyright 2019 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.
use crate::scenic::types::ScreenshotDataDef;
use anyhow::{Context as _, Error};
use fidl_fuchsia_ui_composition::{self as ui_comp, ScreenshotMarker};
use fidl_fuchsia_ui_scenic::ScreenshotData;
use fuchsia_component::{self as app};
use serde_json::{to_value, Value};
/// Perform Scenic operations.
///
/// Note this object is shared among all threads created by server.
#[derive(Debug)]
pub struct ScenicFacade {}
impl ScenicFacade {
pub fn new() -> ScenicFacade {
ScenicFacade {}
}
pub async fn take_screenshot(&self) -> Result<Value, Error> {
// Connect to the screenshot protocol.
let screenshotter = app::client::connect_to_protocol::<ScreenshotMarker>()
.context("Failed to connect to screenshot")?;
let gnf_args = ui_comp::ScreenshotTakeRequest {
format: Some(ui_comp::ScreenshotFormat::BgraRaw),
..Default::default()
};
let screenshot_response: ui_comp::ScreenshotTakeResponse;
let data = screenshotter.take(gnf_args).await;
match data {
Err(e) => {
return Err(format_err!("Screenshot.Take() failed with FIDL err: {}", e));
}
Ok(val) => screenshot_response = val,
}
let image_vmo = screenshot_response
.vmo
.ok_or(format_err!("invalid vmo format in ScreenshotTakeResponse"))?;
let image_size = screenshot_response
.size
.ok_or(format_err!("invalid size format in ScreenshotTakeResponse"))?;
let image_info = fidl_fuchsia_images::ImageInfo {
transform: fidl_fuchsia_images::Transform::Normal,
width: image_size.width,
height: image_size.height,
stride: image_size.width * 4,
pixel_format: fidl_fuchsia_images::PixelFormat::Bgra8,
color_space: fidl_fuchsia_images::ColorSpace::Srgb,
tiling: fidl_fuchsia_images::Tiling::Linear,
alpha_format: fidl_fuchsia_images::AlphaFormat::Opaque,
};
let buffer = fidl_fuchsia_mem::Buffer {
vmo: image_vmo,
size: u64::from(image_size.height * image_size.width * 4),
};
let screenshot: ScreenshotData = ScreenshotData { info: image_info, data: buffer };
return Ok(to_value(ScreenshotDataDef::new(screenshot))?);
}
}