core_video/
opengl_texture.rs

1use core_foundation::base::{Boolean, CFTypeID, TCFType};
2
3use crate::{
4    buffer::TCVBuffer,
5    image_buffer::{CVImageBufferRef, TCVImageBuffer},
6    GLenum, GLuint,
7};
8
9pub type CVOpenGLTextureRef = CVImageBufferRef;
10
11extern "C" {
12    pub fn CVOpenGLTextureGetTypeID() -> CFTypeID;
13    pub fn CVOpenGLTextureRetain(texture: CVOpenGLTextureRef) -> CVOpenGLTextureRef;
14    pub fn CVOpenGLTextureRelease(texture: CVOpenGLTextureRef);
15    pub fn CVOpenGLTextureGetTarget(image: CVOpenGLTextureRef) -> GLenum;
16    pub fn CVOpenGLTextureGetName(image: CVOpenGLTextureRef) -> GLuint;
17    pub fn CVOpenGLTextureIsFlipped(image: CVOpenGLTextureRef) -> Boolean;
18    pub fn CVOpenGLTextureGetCleanTexCoords(
19        image: CVOpenGLTextureRef,
20        lowerLeft: *mut f32,
21        lowerRight: *mut f32,
22        upperRight: *mut f32,
23        upperLeft: *mut f32,
24    );
25}
26
27impl TCVBuffer for CVOpenGLTexture {}
28impl TCVImageBuffer for CVOpenGLTexture {}
29
30pub struct CVOpenGLTexture(CVOpenGLTextureRef);
31
32impl Drop for CVOpenGLTexture {
33    fn drop(&mut self) {
34        unsafe { CVOpenGLTextureRelease(self.0) }
35    }
36}
37
38impl_TCFType!(CVOpenGLTexture, CVOpenGLTextureRef, CVOpenGLTextureGetTypeID);
39impl_CFTypeDescription!(CVOpenGLTexture);
40
41impl CVOpenGLTexture {
42    #[inline]
43    pub fn get_target(&self) -> GLenum {
44        unsafe { CVOpenGLTextureGetTarget(self.as_concrete_TypeRef()) }
45    }
46
47    #[inline]
48    pub fn get_name(&self) -> GLuint {
49        unsafe { CVOpenGLTextureGetName(self.as_concrete_TypeRef()) }
50    }
51
52    #[inline]
53    pub fn is_flipped(&self) -> bool {
54        unsafe { CVOpenGLTextureIsFlipped(self.as_concrete_TypeRef()) != 0 }
55    }
56
57    #[inline]
58    pub fn get_clean_tex_coords(&self) -> (f32, f32, f32, f32) {
59        let mut lower_left = 0.0;
60        let mut lower_right = 0.0;
61        let mut upper_right = 0.0;
62        let mut upper_left = 0.0;
63        unsafe {
64            CVOpenGLTextureGetCleanTexCoords(self.as_concrete_TypeRef(), &mut lower_left, &mut lower_right, &mut upper_right, &mut upper_left);
65        }
66        (lower_left, lower_right, upper_right, upper_left)
67    }
68}