1 | use std::fmt; |
2 | |
3 | use crate::{ |
4 | gpu::{BackendAPI, BackendFormat, DirectContext, Renderable}, |
5 | prelude::*, |
6 | ColorType, TextureCompressionType, |
7 | }; |
8 | use skia_bindings::{self as sb, GrRecordingContext, SkRefCntBase}; |
9 | |
10 | pub type RecordingContext = RCHandle<GrRecordingContext>; |
11 | |
12 | impl NativeRefCountedBase for GrRecordingContext { |
13 | type Base = SkRefCntBase; |
14 | } |
15 | |
16 | impl From<DirectContext> for RecordingContext { |
17 | fn from(direct_context: DirectContext) -> Self { |
18 | unsafe { std::mem::transmute(src:direct_context) } |
19 | } |
20 | } |
21 | |
22 | impl fmt::Debug for RecordingContext { |
23 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
24 | f&mut DebugStruct<'_, '_>.debug_struct("RecordingContext" ) |
25 | .field("backend" , &self.backend()) |
26 | .field("max_texture_size" , &self.max_texture_size()) |
27 | .field(name:"max_render_target_size" , &self.max_render_target_size()) |
28 | .finish() |
29 | } |
30 | } |
31 | |
32 | impl RecordingContext { |
33 | // From GrContext_Base |
34 | pub fn as_direct_context(&mut self) -> Option<DirectContext> { |
35 | DirectContext::from_unshared_ptr(unsafe { |
36 | sb::C_GrRecordingContext_asDirectContext(self.native_mut()) |
37 | }) |
38 | } |
39 | |
40 | // From GrContext_Base |
41 | pub fn backend(&self) -> BackendAPI { |
42 | unsafe { sb::C_GrRecordingContext_backend(self.native()) } |
43 | } |
44 | |
45 | pub fn default_backend_format(&self, ct: ColorType, renderable: Renderable) -> BackendFormat { |
46 | let mut format = BackendFormat::new_invalid(); |
47 | unsafe { |
48 | sb::C_GrRecordingContext_defaultBackendFormat( |
49 | self.native(), |
50 | ct.into_native(), |
51 | renderable, |
52 | format.native_mut(), |
53 | ) |
54 | }; |
55 | format |
56 | } |
57 | |
58 | // From GrContext_Base |
59 | pub fn compressed_backend_format( |
60 | &self, |
61 | compression_type: TextureCompressionType, |
62 | ) -> BackendFormat { |
63 | let mut format = BackendFormat::new_invalid(); |
64 | unsafe { |
65 | sb::C_GrRecordingContext_compressedBackendFormat( |
66 | self.native(), |
67 | compression_type, |
68 | format.native_mut(), |
69 | ) |
70 | } |
71 | format |
72 | } |
73 | |
74 | // TODO: GrContext_Base::threadSafeProxy |
75 | |
76 | pub fn abandoned(&mut self) -> bool { |
77 | unsafe { sb::C_GrRecordingContext_abandoned(self.native_mut()) } |
78 | } |
79 | |
80 | pub fn color_type_supported_as_surface(&self, color_type: ColorType) -> bool { |
81 | unsafe { |
82 | sb::C_GrRecordingContext_colorTypeSupportedAsSurface( |
83 | self.native(), |
84 | color_type.into_native(), |
85 | ) |
86 | } |
87 | } |
88 | |
89 | pub fn max_texture_size(&self) -> i32 { |
90 | unsafe { self.native().maxTextureSize() } |
91 | } |
92 | |
93 | pub fn max_render_target_size(&self) -> i32 { |
94 | unsafe { self.native().maxRenderTargetSize() } |
95 | } |
96 | |
97 | pub fn color_type_supported_as_image(&self, color_type: ColorType) -> bool { |
98 | unsafe { |
99 | self.native() |
100 | .colorTypeSupportedAsImage(color_type.into_native()) |
101 | } |
102 | } |
103 | |
104 | pub fn supports_protected_content(&self) -> bool { |
105 | unsafe { self.native().supportsProtectedContent() } |
106 | } |
107 | |
108 | pub fn max_surface_sample_count_for_color_type(&self, color_type: ColorType) -> usize { |
109 | unsafe { |
110 | sb::C_GrRecordingContext_maxSurfaceSampleCountForColorType( |
111 | self.native(), |
112 | color_type.into_native(), |
113 | ) |
114 | } |
115 | .try_into() |
116 | .unwrap() |
117 | } |
118 | |
119 | // TODO: Wrap Arenas (if used). |
120 | } |
121 | |