azul_core/screencap.rs
1//! POD types for the screen-capture surface
2//! (SUPER_PLAN_2 ยง4 Priority 6 + research/01).
3//!
4//! Symmetric to the camera surface: screen capture is a "dumb widget"
5//! (`azul_layout::widgets::screencap::ScreenCaptureWidget`) that owns a
6//! background capture thread + a GL-texture `ImageRef`, identical to the
7//! camera widget โ only the *source* differs (a display / window instead of
8//! a camera). Defined here in `azul-core` so the config types cross the FFI
9//! without `azul-layout` (or ScreenCaptureKit / MediaProjection / PipeWire)
10//! as a dependency.
11//!
12//! Reuses the camera surface's generic capture status types
13//! ([`crate::camera::StreamState`], `CaptureStats`, `CaptureStreamId`,
14//! `CaptureErrorCode`) โ those are capture-agnostic.
15
16use crate::resources::RawImageFormat;
17
18/// What to capture.
19#[repr(C, u8)]
20#[derive(Debug, Clone, Copy, PartialEq)]
21pub enum ScreenCaptureSource {
22 /// The primary display (the default).
23 PrimaryDisplay,
24 /// A specific display by index (0-based).
25 Display(u32),
26 /// A specific window by its platform id / handle.
27 Window(u64),
28}
29
30impl Default for ScreenCaptureSource {
31 fn default() -> Self {
32 ScreenCaptureSource::PrimaryDisplay
33 }
34}
35
36/// Requested screen-capture configuration โ the input to the screencap
37/// widget. Zero `fps` means "let the backend pick its default".
38#[repr(C)]
39#[derive(Debug, Clone, Copy, PartialEq)]
40pub struct ScreenCaptureConfig {
41 /// What to capture (display / window).
42 pub source: ScreenCaptureSource,
43 /// Preferred frame rate (0 = backend default).
44 pub fps: u32,
45 /// Texture format the backend should deliver. `BGRA8` is the portable
46 /// default; `Nv12` (a later `RawImageFormat` addition) is the zero-copy
47 /// path on platforms that produce it natively.
48 pub output_format: RawImageFormat,
49}
50
51impl Default for ScreenCaptureConfig {
52 fn default() -> Self {
53 Self {
54 source: ScreenCaptureSource::PrimaryDisplay,
55 fps: 0,
56 output_format: RawImageFormat::BGRA8,
57 }
58 }
59}
60
61impl ScreenCaptureConfig {
62 /// A default config for the given `source` (backend-chosen fps, `BGRA8`).
63 pub fn new(source: ScreenCaptureSource) -> Self {
64 Self {
65 source,
66 ..Self::default()
67 }
68 }
69}