| // 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))?); |
| } |
| } |