blob: fcba4b262c80d52f446565af2d654457d3892ae7 [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 base64;
use fidl_fuchsia_images::{AlphaFormat, ColorSpace, ImageInfo, PixelFormat, Tiling, Transform};
use fidl_fuchsia_mem::Buffer;
use fidl_fuchsia_ui_scenic::ScreenshotData;
use serde::Serializer;
use serde_derive::{Deserialize, Serialize};
/// Enum for supported FIDL commands.
pub enum ScenicMethod {
TakeScreenshot,
}
impl std::str::FromStr for ScenicMethod {
type Err = failure::Error;
fn from_str(method: &str) -> Result<Self, Self::Err> {
match method {
"TakeScreenshot" => Ok(ScenicMethod::TakeScreenshot),
_ => bail!("invalid Scenic FIDL method: {}", method),
}
}
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(remote = "Transform")]
pub enum TransformDef {
Normal = 0,
FlipHorizontal = 1,
FlipVertical = 2,
FlipVerticalAndHorizontal = 3,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(remote = "PixelFormat")]
pub enum PixelFormatDef {
Bgra8 = 0,
Yuy2 = 1,
Nv12 = 2,
Yv12 = 3,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(remote = "ColorSpace")]
pub enum ColorSpaceDef {
Srgb = 0,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(remote = "Tiling")]
pub enum TilingDef {
Linear = 0,
GpuOptimal = 1,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(remote = "AlphaFormat")]
pub enum AlphaFormatDef {
Opaque = 0,
Premultiplied = 1,
NonPremultiplied = 2,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(remote = "ImageInfo")]
pub struct ImageInfoDef {
#[serde(with = "TransformDef")]
pub transform: Transform,
pub width: u32,
pub height: u32,
pub stride: u32,
#[serde(with = "PixelFormatDef")]
pub pixel_format: PixelFormat,
#[serde(with = "ColorSpaceDef")]
pub color_space: ColorSpace,
#[serde(with = "TilingDef")]
pub tiling: Tiling,
#[serde(with = "AlphaFormatDef")]
pub alpha_format: AlphaFormat,
}
fn serialize_buffer<S>(buffer: &Buffer, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut data = vec![0; buffer.size as usize];
use serde::ser::Error;
buffer.vmo.read(&mut data, 0).map_err(Error::custom)?;
serializer.serialize_str(&base64::encode(&data))
}
#[derive(Serialize, Debug)]
pub struct ScreenshotDataDef {
#[serde(with = "ImageInfoDef")]
pub info: ImageInfo,
#[serde(serialize_with = "serialize_buffer")]
pub data: Buffer,
}
impl ScreenshotDataDef {
pub fn new(screenshot_data: ScreenshotData) -> ScreenshotDataDef {
ScreenshotDataDef { info: screenshot_data.info, data: screenshot_data.data }
}
}