mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-10-31 22:58:51 +00:00
gtk4: Add property to the paintable for selecting the background color
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1452>
This commit is contained in:
parent
9971f71e94
commit
0fe4e0bf0b
2 changed files with 37 additions and 8 deletions
|
@ -17,6 +17,13 @@ use glib::thread_guard::ThreadGuard;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use gtk::{gdk, glib};
|
use gtk::{gdk, glib};
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "macos", target_os = "windows", feature = "gst-gl"))]
|
||||||
|
use gst_gl::prelude::GLContextExt as GstGLContextExt;
|
||||||
|
#[cfg(any(target_os = "macos", target_os = "windows", feature = "gst-gl"))]
|
||||||
|
use gst_gl::prelude::*;
|
||||||
|
|
||||||
|
#[allow(unused_imports)]
|
||||||
|
use gst::prelude::*;
|
||||||
use gst::subclass::prelude::*;
|
use gst::subclass::prelude::*;
|
||||||
use gst_base::subclass::prelude::*;
|
use gst_base::subclass::prelude::*;
|
||||||
use gst_video::subclass::prelude::*;
|
use gst_video::subclass::prelude::*;
|
||||||
|
@ -26,11 +33,6 @@ use std::sync::{Mutex, MutexGuard};
|
||||||
|
|
||||||
use crate::utils;
|
use crate::utils;
|
||||||
|
|
||||||
#[cfg(any(target_os = "macos", target_os = "windows", feature = "gst-gl"))]
|
|
||||||
use gst_gl::prelude::GLContextExt as GstGLContextExt;
|
|
||||||
#[cfg(any(target_os = "macos", target_os = "windows", feature = "gst-gl"))]
|
|
||||||
use gst_gl::prelude::*;
|
|
||||||
|
|
||||||
// Global GL context that is created by the first sink and kept around until the end of the
|
// Global GL context that is created by the first sink and kept around until the end of the
|
||||||
// process. This is provided to other elements in the pipeline to make sure they create GL contexts
|
// process. This is provided to other elements in the pipeline to make sure they create GL contexts
|
||||||
// that are sharing with the GTK GL context.
|
// that are sharing with the GTK GL context.
|
||||||
|
|
|
@ -15,7 +15,7 @@ use gtk::{gdk, glib, graphene, gsk};
|
||||||
|
|
||||||
use crate::sink::frame::{Frame, Texture};
|
use crate::sink::frame::{Frame, Texture};
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::{Cell, RefCell};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
|
@ -33,6 +33,7 @@ pub struct Paintable {
|
||||||
paintables: RefCell<Vec<Texture>>,
|
paintables: RefCell<Vec<Texture>>,
|
||||||
cached_textures: RefCell<HashMap<usize, gdk::Texture>>,
|
cached_textures: RefCell<HashMap<usize, gdk::Texture>>,
|
||||||
gl_context: RefCell<Option<gdk::GLContext>>,
|
gl_context: RefCell<Option<gdk::GLContext>>,
|
||||||
|
background_color: Cell<gdk::RGBA>,
|
||||||
#[cfg(not(feature = "gtk_v4_10"))]
|
#[cfg(not(feature = "gtk_v4_10"))]
|
||||||
premult_shader: gsk::GLShader,
|
premult_shader: gsk::GLShader,
|
||||||
}
|
}
|
||||||
|
@ -43,6 +44,7 @@ impl Default for Paintable {
|
||||||
paintables: Default::default(),
|
paintables: Default::default(),
|
||||||
cached_textures: Default::default(),
|
cached_textures: Default::default(),
|
||||||
gl_context: Default::default(),
|
gl_context: Default::default(),
|
||||||
|
background_color: Cell::new(gdk::RGBA::BLACK),
|
||||||
#[cfg(not(feature = "gtk_v4_10"))]
|
#[cfg(not(feature = "gtk_v4_10"))]
|
||||||
premult_shader: gsk::GLShader::from_bytes(&glib::Bytes::from_static(include_bytes!(
|
premult_shader: gsk::GLShader::from_bytes(&glib::Bytes::from_static(include_bytes!(
|
||||||
"premult.glsl"
|
"premult.glsl"
|
||||||
|
@ -67,6 +69,11 @@ impl ObjectImpl for Paintable {
|
||||||
.blurb("GL context to use for rendering")
|
.blurb("GL context to use for rendering")
|
||||||
.construct_only()
|
.construct_only()
|
||||||
.build(),
|
.build(),
|
||||||
|
glib::ParamSpecUInt::builder("background-color")
|
||||||
|
.nick("Background Color")
|
||||||
|
.blurb("Background color to render behind the video frame and in the borders")
|
||||||
|
.default_value(0)
|
||||||
|
.build(),
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -76,6 +83,16 @@ impl ObjectImpl for Paintable {
|
||||||
fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value {
|
fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value {
|
||||||
match pspec.name() {
|
match pspec.name() {
|
||||||
"gl-context" => self.gl_context.borrow().to_value(),
|
"gl-context" => self.gl_context.borrow().to_value(),
|
||||||
|
"background-color" => {
|
||||||
|
let color = self.background_color.get();
|
||||||
|
|
||||||
|
let v = (f32::clamp(color.red() * 255.0, 0.0, 255.0) as u32) << 24
|
||||||
|
| (f32::clamp(color.green() * 255.0, 0.0, 255.0) as u32) << 16
|
||||||
|
| (f32::clamp(color.blue() * 255.0, 0.0, 255.0) as u32) << 8
|
||||||
|
| (f32::clamp(color.alpha() * 255.0, 0.0, 255.0) as u32);
|
||||||
|
|
||||||
|
v.to_value()
|
||||||
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,6 +102,15 @@ impl ObjectImpl for Paintable {
|
||||||
"gl-context" => {
|
"gl-context" => {
|
||||||
*self.gl_context.borrow_mut() = value.get::<Option<gtk::gdk::GLContext>>().unwrap();
|
*self.gl_context.borrow_mut() = value.get::<Option<gtk::gdk::GLContext>>().unwrap();
|
||||||
}
|
}
|
||||||
|
"background-color" => {
|
||||||
|
let v = value.get::<u32>().unwrap();
|
||||||
|
let red = ((v & 0xff_00_00_00) >> 24) as f32 / 255.0;
|
||||||
|
let green = ((v & 0x00_ff_00_00) >> 16) as f32 / 255.0;
|
||||||
|
let blue = ((v & 0x00_00_ff_00) >> 8) as f32 / 255.0;
|
||||||
|
let alpha = (v & 0x00_00_00_ff) as f32 / 255.0;
|
||||||
|
self.background_color
|
||||||
|
.set(gdk::RGBA::new(red, green, blue, alpha))
|
||||||
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,6 +144,7 @@ impl PaintableImpl for Paintable {
|
||||||
fn snapshot(&self, snapshot: &gdk::Snapshot, width: f64, height: f64) {
|
fn snapshot(&self, snapshot: &gdk::Snapshot, width: f64, height: f64) {
|
||||||
let snapshot = snapshot.downcast_ref::<gtk::Snapshot>().unwrap();
|
let snapshot = snapshot.downcast_ref::<gtk::Snapshot>().unwrap();
|
||||||
|
|
||||||
|
let background_color = self.background_color.get();
|
||||||
let paintables = self.paintables.borrow();
|
let paintables = self.paintables.borrow();
|
||||||
|
|
||||||
if !paintables.is_empty() {
|
if !paintables.is_empty() {
|
||||||
|
@ -145,7 +172,7 @@ impl PaintableImpl for Paintable {
|
||||||
}
|
}
|
||||||
|
|
||||||
snapshot.append_color(
|
snapshot.append_color(
|
||||||
&gdk::RGBA::BLACK,
|
&background_color,
|
||||||
&graphene::Rect::new(0f32, 0f32, width as f32, height as f32),
|
&graphene::Rect::new(0f32, 0f32, width as f32, height as f32),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -246,7 +273,7 @@ impl PaintableImpl for Paintable {
|
||||||
} else {
|
} else {
|
||||||
gst::trace!(CAT, imp: self, "Snapshotting black frame");
|
gst::trace!(CAT, imp: self, "Snapshotting black frame");
|
||||||
snapshot.append_color(
|
snapshot.append_color(
|
||||||
&gdk::RGBA::BLACK,
|
&background_color,
|
||||||
&graphene::Rect::new(0f32, 0f32, width as f32, height as f32),
|
&graphene::Rect::new(0f32, 0f32, width as f32, height as f32),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue