@@ -96,15 +96,25 @@ enum DirtyRegionDebugMode {
96
96
Log ,
97
97
}
98
98
99
- fn create_partial_renderer_state ( ) -> ( Option < PartialRenderingState > , DirtyRegionDebugMode ) {
100
- let dirty_region_debug_mode = match std:: env:: var ( "SLINT_SKIA_PARTIAL_RENDERING" ) . as_deref ( ) {
101
- Ok ( "visualize" ) => DirtyRegionDebugMode :: Visualize ,
102
- Ok ( "log" ) => DirtyRegionDebugMode :: Log ,
103
- Ok ( _) => DirtyRegionDebugMode :: NoDebug ,
104
- _ => return ( None , DirtyRegionDebugMode :: NoDebug ) ,
105
- } ;
106
-
107
- ( Some ( PartialRenderingState :: default ( ) ) , dirty_region_debug_mode)
99
+ impl Default for DirtyRegionDebugMode {
100
+ fn default ( ) -> Self {
101
+ match std:: env:: var ( "SLINT_SKIA_PARTIAL_RENDERING" ) . as_deref ( ) {
102
+ Ok ( "visualize" ) => DirtyRegionDebugMode :: Visualize ,
103
+ Ok ( "log" ) => DirtyRegionDebugMode :: Log ,
104
+ _ => DirtyRegionDebugMode :: NoDebug ,
105
+ }
106
+ }
107
+ }
108
+
109
+ fn create_partial_renderer_state (
110
+ maybe_surface : Option < & dyn Surface > ,
111
+ ) -> Option < PartialRenderingState > {
112
+ maybe_surface
113
+ . map_or_else (
114
+ || std:: env:: var ( "SLINT_SKIA_PARTIAL_RENDERING" ) . as_deref ( ) . is_ok ( ) ,
115
+ |surface| surface. use_partial_rendering ( ) ,
116
+ )
117
+ . then ( || PartialRenderingState :: default ( ) )
108
118
}
109
119
110
120
/// Use the SkiaRenderer when implementing a custom Slint platform where you deliver events to
@@ -132,7 +142,6 @@ pub struct SkiaRenderer {
132
142
133
143
impl Default for SkiaRenderer {
134
144
fn default ( ) -> Self {
135
- let ( partial_rendering_state, dirty_region_debug_mode) = create_partial_renderer_state ( ) ;
136
145
Self {
137
146
maybe_window_adapter : Default :: default ( ) ,
138
147
rendering_notifier : Default :: default ( ) ,
@@ -143,8 +152,8 @@ impl Default for SkiaRenderer {
143
152
surface : Default :: default ( ) ,
144
153
surface_factory : create_default_surface,
145
154
pre_present_callback : Default :: default ( ) ,
146
- partial_rendering_state,
147
- dirty_region_debug_mode,
155
+ partial_rendering_state : create_partial_renderer_state ( None ) ,
156
+ dirty_region_debug_mode : Default :: default ( ) ,
148
157
dirty_region_history : Default :: default ( ) ,
149
158
}
150
159
}
@@ -154,7 +163,6 @@ impl SkiaRenderer {
154
163
#[ cfg( skia_backend_software) ]
155
164
/// Creates a new SkiaRenderer that will always use Skia's software renderer.
156
165
pub fn default_software ( ) -> Self {
157
- let ( partial_rendering_state, dirty_region_debug_mode) = create_partial_renderer_state ( ) ;
158
166
Self {
159
167
maybe_window_adapter : Default :: default ( ) ,
160
168
rendering_notifier : Default :: default ( ) ,
@@ -173,16 +181,15 @@ impl SkiaRenderer {
173
181
. map ( |r| Box :: new ( r) as Box < dyn Surface > )
174
182
} ,
175
183
pre_present_callback : Default :: default ( ) ,
176
- partial_rendering_state,
177
- dirty_region_debug_mode,
184
+ partial_rendering_state : PartialRenderingState :: default ( ) . into ( ) ,
185
+ dirty_region_debug_mode : Default :: default ( ) ,
178
186
dirty_region_history : Default :: default ( ) ,
179
187
}
180
188
}
181
189
182
190
#[ cfg( not( target_os = "ios" ) ) ]
183
191
/// Creates a new SkiaRenderer that will always use Skia's OpenGL renderer.
184
192
pub fn default_opengl ( ) -> Self {
185
- let ( partial_rendering_state, dirty_region_debug_mode) = create_partial_renderer_state ( ) ;
186
193
Self {
187
194
maybe_window_adapter : Default :: default ( ) ,
188
195
rendering_notifier : Default :: default ( ) ,
@@ -201,16 +208,15 @@ impl SkiaRenderer {
201
208
. map ( |r| Box :: new ( r) as Box < dyn Surface > )
202
209
} ,
203
210
pre_present_callback : Default :: default ( ) ,
204
- partial_rendering_state,
205
- dirty_region_debug_mode,
211
+ partial_rendering_state : create_partial_renderer_state ( None ) ,
212
+ dirty_region_debug_mode : Default :: default ( ) ,
206
213
dirty_region_history : Default :: default ( ) ,
207
214
}
208
215
}
209
216
210
217
#[ cfg( target_vendor = "apple" ) ]
211
218
/// Creates a new SkiaRenderer that will always use Skia's Metal renderer.
212
219
pub fn default_metal ( ) -> Self {
213
- let ( partial_rendering_state, dirty_region_debug_mode) = create_partial_renderer_state ( ) ;
214
220
Self {
215
221
maybe_window_adapter : Default :: default ( ) ,
216
222
rendering_notifier : Default :: default ( ) ,
@@ -229,16 +235,15 @@ impl SkiaRenderer {
229
235
. map ( |r| Box :: new ( r) as Box < dyn Surface > )
230
236
} ,
231
237
pre_present_callback : Default :: default ( ) ,
232
- partial_rendering_state,
233
- dirty_region_debug_mode,
238
+ partial_rendering_state : create_partial_renderer_state ( None ) ,
239
+ dirty_region_debug_mode : Default :: default ( ) ,
234
240
dirty_region_history : Default :: default ( ) ,
235
241
}
236
242
}
237
243
238
244
#[ cfg( skia_backend_vulkan) ]
239
245
/// Creates a new SkiaRenderer that will always use Skia's Vulkan renderer.
240
246
pub fn default_vulkan ( ) -> Self {
241
- let ( partial_rendering_state, dirty_region_debug_mode) = create_partial_renderer_state ( ) ;
242
247
Self {
243
248
maybe_window_adapter : Default :: default ( ) ,
244
249
rendering_notifier : Default :: default ( ) ,
@@ -257,16 +262,15 @@ impl SkiaRenderer {
257
262
. map ( |r| Box :: new ( r) as Box < dyn Surface > )
258
263
} ,
259
264
pre_present_callback : Default :: default ( ) ,
260
- partial_rendering_state,
261
- dirty_region_debug_mode,
265
+ partial_rendering_state : create_partial_renderer_state ( None ) ,
266
+ dirty_region_debug_mode : Default :: default ( ) ,
262
267
dirty_region_history : Default :: default ( ) ,
263
268
}
264
269
}
265
270
266
271
#[ cfg( target_family = "windows" ) ]
267
272
/// Creates a new SkiaRenderer that will always use Skia's Direct3D renderer.
268
273
pub fn default_direct3d ( ) -> Self {
269
- let ( partial_rendering_state, dirty_region_debug_mode) = create_partial_renderer_state ( ) ;
270
274
Self {
271
275
maybe_window_adapter : Default :: default ( ) ,
272
276
rendering_notifier : Default :: default ( ) ,
@@ -285,8 +289,8 @@ impl SkiaRenderer {
285
289
. map ( |r| Box :: new ( r) as Box < dyn Surface > )
286
290
} ,
287
291
pre_present_callback : Default :: default ( ) ,
288
- partial_rendering_state,
289
- dirty_region_debug_mode,
292
+ partial_rendering_state : create_partial_renderer_state ( None ) ,
293
+ dirty_region_debug_mode : Default :: default ( ) ,
290
294
dirty_region_history : Default :: default ( ) ,
291
295
}
292
296
}
@@ -307,7 +311,7 @@ impl SkiaRenderer {
307
311
308
312
/// Creates a new renderer with the given surface trait implementation.
309
313
pub fn new_with_surface ( surface : Box < dyn Surface + ' static > ) -> Self {
310
- let ( partial_rendering_state, dirty_region_debug_mode ) = create_partial_renderer_state ( ) ;
314
+ let partial_rendering_state = create_partial_renderer_state ( Some ( surface . as_ref ( ) ) ) . into ( ) ;
311
315
Self {
312
316
maybe_window_adapter : Default :: default ( ) ,
313
317
rendering_notifier : Default :: default ( ) ,
@@ -321,7 +325,7 @@ impl SkiaRenderer {
321
325
} ,
322
326
pre_present_callback : Default :: default ( ) ,
323
327
partial_rendering_state,
324
- dirty_region_debug_mode,
328
+ dirty_region_debug_mode : Default :: default ( ) ,
325
329
dirty_region_history : Default :: default ( ) ,
326
330
}
327
331
}
@@ -966,6 +970,10 @@ pub trait Surface {
966
970
) -> Result < ( ) , i_slint_core:: platform:: PlatformError > ;
967
971
fn bits_per_pixel ( & self ) -> Result < u8 , PlatformError > ;
968
972
973
+ fn use_partial_rendering ( & self ) -> bool {
974
+ false
975
+ }
976
+
969
977
/// Implementations should return self to allow upcasting.
970
978
fn as_any ( & self ) -> & dyn core:: any:: Any {
971
979
& ( )
@@ -980,8 +988,6 @@ pub trait SkiaRendererExt {
980
988
surface_size : PhysicalWindowSize ,
981
989
post_render_cb : Option < & dyn Fn ( & mut dyn ItemRenderer ) > ,
982
990
) -> Result < ( ) , i_slint_core:: platform:: PlatformError > ;
983
- /// Remove this when partial rendering becomes enabled by default.
984
- fn enable_partial_rendering ( & mut self ) ;
985
991
}
986
992
987
993
impl SkiaRendererExt for SkiaRenderer {
@@ -999,7 +1005,4 @@ impl SkiaRendererExt for SkiaRenderer {
999
1005
post_render_cb,
1000
1006
)
1001
1007
}
1002
- fn enable_partial_rendering ( & mut self ) {
1003
- self . partial_rendering_state = Some ( PartialRenderingState :: default ( ) )
1004
- }
1005
1008
}
0 commit comments