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, Eq, Default)]
21pub enum ScreenCaptureSource {
22 /// The primary display (the default).
23 #[default]
24 PrimaryDisplay,
25 /// A specific display by index (0-based).
26 Display(u32),
27 /// A specific window by its platform id / handle.
28 Window(u64),
29}
30
31/// Requested screen-capture configuration โ the input to the screencap
32/// widget. Zero `fps` means "let the backend pick its default".
33#[repr(C)]
34#[derive(Debug, Clone, Copy, PartialEq, Eq)]
35pub struct ScreenCaptureConfig {
36 /// What to capture (display / window).
37 pub source: ScreenCaptureSource,
38 /// Preferred frame rate (0 = backend default).
39 pub fps: u32,
40 /// Texture format the backend should deliver. `BGRA8` is the portable
41 /// default; `Nv12` (a later `RawImageFormat` addition) is the zero-copy
42 /// path on platforms that produce it natively.
43 pub output_format: RawImageFormat,
44}
45
46impl Default for ScreenCaptureConfig {
47 fn default() -> Self {
48 Self {
49 source: ScreenCaptureSource::PrimaryDisplay,
50 fps: 0,
51 output_format: RawImageFormat::BGRA8,
52 }
53 }
54}
55
56impl ScreenCaptureConfig {
57 /// A default config for the given `source` (backend-chosen fps, `BGRA8`).
58 #[must_use]
59 pub fn new(source: ScreenCaptureSource) -> Self {
60 Self {
61 source,
62 ..Self::default()
63 }
64 }
65}
66
67#[cfg(test)]
68#[path = "screencap_test.rs"]
69mod screencap_test;