Skip to main content

gtk4/auto/
snapshot.rs

1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// DO NOT EDIT
4#![allow(deprecated)]
5
6use crate::{StyleContext, ffi};
7use glib::{prelude::*, translate::*};
8
9glib::wrapper! {
10    #[doc(alias = "GtkSnapshot")]
11    pub struct Snapshot(Object<ffi::GtkSnapshot, ffi::GtkSnapshotClass>) @extends gdk::Snapshot;
12
13    match fn {
14        type_ => || ffi::gtk_snapshot_get_type(),
15    }
16}
17
18impl Snapshot {
19    pub const NONE: Option<&'static Snapshot> = None;
20
21    #[doc(alias = "gtk_snapshot_new")]
22    pub fn new() -> Snapshot {
23        assert_initialized_main_thread!();
24        unsafe { from_glib_full(ffi::gtk_snapshot_new()) }
25    }
26}
27
28impl Default for Snapshot {
29    fn default() -> Self {
30        Self::new()
31    }
32}
33
34pub trait SnapshotExt: IsA<Snapshot> + 'static {
35    #[doc(alias = "gtk_snapshot_append_cairo")]
36    fn append_cairo(&self, bounds: &graphene::Rect) -> cairo::Context {
37        unsafe {
38            from_glib_full(ffi::gtk_snapshot_append_cairo(
39                self.as_ref().to_glib_none().0,
40                bounds.to_glib_none().0,
41            ))
42        }
43    }
44
45    #[doc(alias = "gtk_snapshot_append_color")]
46    fn append_color(&self, color: &gdk::RGBA, bounds: &graphene::Rect) {
47        unsafe {
48            ffi::gtk_snapshot_append_color(
49                self.as_ref().to_glib_none().0,
50                color.to_glib_none().0,
51                bounds.to_glib_none().0,
52            );
53        }
54    }
55
56    #[doc(alias = "gtk_snapshot_append_conic_gradient")]
57    fn append_conic_gradient(
58        &self,
59        bounds: &graphene::Rect,
60        center: &graphene::Point,
61        rotation: f32,
62        stops: &[gsk::ColorStop],
63    ) {
64        let n_stops = stops.len() as _;
65        unsafe {
66            ffi::gtk_snapshot_append_conic_gradient(
67                self.as_ref().to_glib_none().0,
68                bounds.to_glib_none().0,
69                center.to_glib_none().0,
70                rotation,
71                stops.to_glib_none().0,
72                n_stops,
73            );
74        }
75    }
76
77    #[cfg(feature = "v4_14")]
78    #[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
79    #[doc(alias = "gtk_snapshot_append_fill")]
80    fn append_fill(&self, path: &gsk::Path, fill_rule: gsk::FillRule, color: &gdk::RGBA) {
81        unsafe {
82            ffi::gtk_snapshot_append_fill(
83                self.as_ref().to_glib_none().0,
84                path.to_glib_none().0,
85                fill_rule.into_glib(),
86                color.to_glib_none().0,
87            );
88        }
89    }
90
91    #[doc(alias = "gtk_snapshot_append_inset_shadow")]
92    fn append_inset_shadow(
93        &self,
94        outline: &gsk::RoundedRect,
95        color: &gdk::RGBA,
96        dx: f32,
97        dy: f32,
98        spread: f32,
99        blur_radius: f32,
100    ) {
101        unsafe {
102            ffi::gtk_snapshot_append_inset_shadow(
103                self.as_ref().to_glib_none().0,
104                outline.to_glib_none().0,
105                color.to_glib_none().0,
106                dx,
107                dy,
108                spread,
109                blur_radius,
110            );
111        }
112    }
113
114    #[doc(alias = "gtk_snapshot_append_layout")]
115    fn append_layout(&self, layout: &pango::Layout, color: &gdk::RGBA) {
116        unsafe {
117            ffi::gtk_snapshot_append_layout(
118                self.as_ref().to_glib_none().0,
119                layout.to_glib_none().0,
120                color.to_glib_none().0,
121            );
122        }
123    }
124
125    #[doc(alias = "gtk_snapshot_append_linear_gradient")]
126    fn append_linear_gradient(
127        &self,
128        bounds: &graphene::Rect,
129        start_point: &graphene::Point,
130        end_point: &graphene::Point,
131        stops: &[gsk::ColorStop],
132    ) {
133        let n_stops = stops.len() as _;
134        unsafe {
135            ffi::gtk_snapshot_append_linear_gradient(
136                self.as_ref().to_glib_none().0,
137                bounds.to_glib_none().0,
138                start_point.to_glib_none().0,
139                end_point.to_glib_none().0,
140                stops.to_glib_none().0,
141                n_stops,
142            );
143        }
144    }
145
146    #[doc(alias = "gtk_snapshot_append_node")]
147    fn append_node(&self, node: impl AsRef<gsk::RenderNode>) {
148        unsafe {
149            ffi::gtk_snapshot_append_node(
150                self.as_ref().to_glib_none().0,
151                node.as_ref().to_glib_none().0,
152            );
153        }
154    }
155
156    #[doc(alias = "gtk_snapshot_append_outset_shadow")]
157    fn append_outset_shadow(
158        &self,
159        outline: &gsk::RoundedRect,
160        color: &gdk::RGBA,
161        dx: f32,
162        dy: f32,
163        spread: f32,
164        blur_radius: f32,
165    ) {
166        unsafe {
167            ffi::gtk_snapshot_append_outset_shadow(
168                self.as_ref().to_glib_none().0,
169                outline.to_glib_none().0,
170                color.to_glib_none().0,
171                dx,
172                dy,
173                spread,
174                blur_radius,
175            );
176        }
177    }
178
179    #[cfg(feature = "v4_22")]
180    #[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
181    #[doc(alias = "gtk_snapshot_append_paste")]
182    fn append_paste(&self, bounds: &graphene::Rect, nth: usize) {
183        unsafe {
184            ffi::gtk_snapshot_append_paste(
185                self.as_ref().to_glib_none().0,
186                bounds.to_glib_none().0,
187                nth,
188            );
189        }
190    }
191
192    #[doc(alias = "gtk_snapshot_append_radial_gradient")]
193    fn append_radial_gradient(
194        &self,
195        bounds: &graphene::Rect,
196        center: &graphene::Point,
197        hradius: f32,
198        vradius: f32,
199        start: f32,
200        end: f32,
201        stops: &[gsk::ColorStop],
202    ) {
203        let n_stops = stops.len() as _;
204        unsafe {
205            ffi::gtk_snapshot_append_radial_gradient(
206                self.as_ref().to_glib_none().0,
207                bounds.to_glib_none().0,
208                center.to_glib_none().0,
209                hradius,
210                vradius,
211                start,
212                end,
213                stops.to_glib_none().0,
214                n_stops,
215            );
216        }
217    }
218
219    #[doc(alias = "gtk_snapshot_append_repeating_linear_gradient")]
220    fn append_repeating_linear_gradient(
221        &self,
222        bounds: &graphene::Rect,
223        start_point: &graphene::Point,
224        end_point: &graphene::Point,
225        stops: &[gsk::ColorStop],
226    ) {
227        let n_stops = stops.len() as _;
228        unsafe {
229            ffi::gtk_snapshot_append_repeating_linear_gradient(
230                self.as_ref().to_glib_none().0,
231                bounds.to_glib_none().0,
232                start_point.to_glib_none().0,
233                end_point.to_glib_none().0,
234                stops.to_glib_none().0,
235                n_stops,
236            );
237        }
238    }
239
240    #[doc(alias = "gtk_snapshot_append_repeating_radial_gradient")]
241    fn append_repeating_radial_gradient(
242        &self,
243        bounds: &graphene::Rect,
244        center: &graphene::Point,
245        hradius: f32,
246        vradius: f32,
247        start: f32,
248        end: f32,
249        stops: &[gsk::ColorStop],
250    ) {
251        let n_stops = stops.len() as _;
252        unsafe {
253            ffi::gtk_snapshot_append_repeating_radial_gradient(
254                self.as_ref().to_glib_none().0,
255                bounds.to_glib_none().0,
256                center.to_glib_none().0,
257                hradius,
258                vradius,
259                start,
260                end,
261                stops.to_glib_none().0,
262                n_stops,
263            );
264        }
265    }
266
267    #[cfg(feature = "v4_10")]
268    #[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
269    #[doc(alias = "gtk_snapshot_append_scaled_texture")]
270    fn append_scaled_texture(
271        &self,
272        texture: &impl IsA<gdk::Texture>,
273        filter: gsk::ScalingFilter,
274        bounds: &graphene::Rect,
275    ) {
276        unsafe {
277            ffi::gtk_snapshot_append_scaled_texture(
278                self.as_ref().to_glib_none().0,
279                texture.as_ref().to_glib_none().0,
280                filter.into_glib(),
281                bounds.to_glib_none().0,
282            );
283        }
284    }
285
286    #[cfg(feature = "v4_14")]
287    #[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
288    #[doc(alias = "gtk_snapshot_append_stroke")]
289    fn append_stroke(&self, path: &gsk::Path, stroke: &gsk::Stroke, color: &gdk::RGBA) {
290        unsafe {
291            ffi::gtk_snapshot_append_stroke(
292                self.as_ref().to_glib_none().0,
293                path.to_glib_none().0,
294                stroke.to_glib_none().0,
295                color.to_glib_none().0,
296            );
297        }
298    }
299
300    #[doc(alias = "gtk_snapshot_append_texture")]
301    fn append_texture(&self, texture: &impl IsA<gdk::Texture>, bounds: &graphene::Rect) {
302        unsafe {
303            ffi::gtk_snapshot_append_texture(
304                self.as_ref().to_glib_none().0,
305                texture.as_ref().to_glib_none().0,
306                bounds.to_glib_none().0,
307            );
308        }
309    }
310
311    #[doc(alias = "gtk_snapshot_free_to_node")]
312    #[doc(alias = "free_to_node")]
313    fn to_node(self) -> Option<gsk::RenderNode> {
314        unsafe {
315            from_glib_full(ffi::gtk_snapshot_free_to_node(
316                self.upcast().into_glib_ptr(),
317            ))
318        }
319    }
320
321    #[doc(alias = "gtk_snapshot_free_to_paintable")]
322    #[doc(alias = "free_to_paintable")]
323    fn to_paintable(self, size: Option<&graphene::Size>) -> Option<gdk::Paintable> {
324        unsafe {
325            from_glib_full(ffi::gtk_snapshot_free_to_paintable(
326                self.upcast().into_glib_ptr(),
327                size.to_glib_none().0,
328            ))
329        }
330    }
331
332    #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
333    #[allow(deprecated)]
334    #[doc(alias = "gtk_snapshot_gl_shader_pop_texture")]
335    fn gl_shader_pop_texture(&self) {
336        unsafe {
337            ffi::gtk_snapshot_gl_shader_pop_texture(self.as_ref().to_glib_none().0);
338        }
339    }
340
341    #[doc(alias = "gtk_snapshot_perspective")]
342    fn perspective(&self, depth: f32) {
343        unsafe {
344            ffi::gtk_snapshot_perspective(self.as_ref().to_glib_none().0, depth);
345        }
346    }
347
348    #[doc(alias = "gtk_snapshot_pop")]
349    fn pop(&self) {
350        unsafe {
351            ffi::gtk_snapshot_pop(self.as_ref().to_glib_none().0);
352        }
353    }
354
355    #[doc(alias = "gtk_snapshot_push_blend")]
356    fn push_blend(&self, blend_mode: gsk::BlendMode) {
357        unsafe {
358            ffi::gtk_snapshot_push_blend(self.as_ref().to_glib_none().0, blend_mode.into_glib());
359        }
360    }
361
362    #[doc(alias = "gtk_snapshot_push_blur")]
363    fn push_blur(&self, radius: f64) {
364        unsafe {
365            ffi::gtk_snapshot_push_blur(self.as_ref().to_glib_none().0, radius);
366        }
367    }
368
369    #[doc(alias = "gtk_snapshot_push_clip")]
370    fn push_clip(&self, bounds: &graphene::Rect) {
371        unsafe {
372            ffi::gtk_snapshot_push_clip(self.as_ref().to_glib_none().0, bounds.to_glib_none().0);
373        }
374    }
375
376    #[doc(alias = "gtk_snapshot_push_color_matrix")]
377    fn push_color_matrix(&self, color_matrix: &graphene::Matrix, color_offset: &graphene::Vec4) {
378        unsafe {
379            ffi::gtk_snapshot_push_color_matrix(
380                self.as_ref().to_glib_none().0,
381                color_matrix.to_glib_none().0,
382                color_offset.to_glib_none().0,
383            );
384        }
385    }
386
387    #[cfg(feature = "v4_20")]
388    #[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
389    #[doc(alias = "gtk_snapshot_push_component_transfer")]
390    fn push_component_transfer(
391        &self,
392        red: &gsk::ComponentTransfer,
393        green: &gsk::ComponentTransfer,
394        blue: &gsk::ComponentTransfer,
395        alpha: &gsk::ComponentTransfer,
396    ) {
397        unsafe {
398            ffi::gtk_snapshot_push_component_transfer(
399                self.as_ref().to_glib_none().0,
400                red.to_glib_none().0,
401                green.to_glib_none().0,
402                blue.to_glib_none().0,
403                alpha.to_glib_none().0,
404            );
405        }
406    }
407
408    #[cfg(feature = "v4_22")]
409    #[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
410    #[doc(alias = "gtk_snapshot_push_composite")]
411    fn push_composite(&self, op: gsk::PorterDuff) {
412        unsafe {
413            ffi::gtk_snapshot_push_composite(self.as_ref().to_glib_none().0, op.into_glib());
414        }
415    }
416
417    #[cfg(feature = "v4_22")]
418    #[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
419    #[doc(alias = "gtk_snapshot_push_copy")]
420    fn push_copy(&self) {
421        unsafe {
422            ffi::gtk_snapshot_push_copy(self.as_ref().to_glib_none().0);
423        }
424    }
425
426    #[doc(alias = "gtk_snapshot_push_cross_fade")]
427    fn push_cross_fade(&self, progress: f64) {
428        unsafe {
429            ffi::gtk_snapshot_push_cross_fade(self.as_ref().to_glib_none().0, progress);
430        }
431    }
432
433    #[cfg(feature = "v4_14")]
434    #[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
435    #[doc(alias = "gtk_snapshot_push_fill")]
436    fn push_fill(&self, path: &gsk::Path, fill_rule: gsk::FillRule) {
437        unsafe {
438            ffi::gtk_snapshot_push_fill(
439                self.as_ref().to_glib_none().0,
440                path.to_glib_none().0,
441                fill_rule.into_glib(),
442            );
443        }
444    }
445
446    #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
447    #[allow(deprecated)]
448    #[doc(alias = "gtk_snapshot_push_gl_shader")]
449    fn push_gl_shader(
450        &self,
451        shader: &gsk::GLShader,
452        bounds: &graphene::Rect,
453        take_args: glib::Bytes,
454    ) {
455        unsafe {
456            ffi::gtk_snapshot_push_gl_shader(
457                self.as_ref().to_glib_none().0,
458                shader.to_glib_none().0,
459                bounds.to_glib_none().0,
460                take_args.into_glib_ptr(),
461            );
462        }
463    }
464
465    //#[cfg(feature = "v4_22")]
466    //#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
467    //#[doc(alias = "gtk_snapshot_push_isolation")]
468    //fn push_isolation(&self, features: /*Ignored*/gsk::Isolation) {
469    //    unsafe { TODO: call ffi:gtk_snapshot_push_isolation() }
470    //}
471
472    #[cfg(feature = "v4_10")]
473    #[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
474    #[doc(alias = "gtk_snapshot_push_mask")]
475    fn push_mask(&self, mask_mode: gsk::MaskMode) {
476        unsafe {
477            ffi::gtk_snapshot_push_mask(self.as_ref().to_glib_none().0, mask_mode.into_glib());
478        }
479    }
480
481    #[doc(alias = "gtk_snapshot_push_opacity")]
482    fn push_opacity(&self, opacity: f64) {
483        unsafe {
484            ffi::gtk_snapshot_push_opacity(self.as_ref().to_glib_none().0, opacity);
485        }
486    }
487
488    #[doc(alias = "gtk_snapshot_push_repeat")]
489    fn push_repeat(&self, bounds: &graphene::Rect, child_bounds: Option<&graphene::Rect>) {
490        unsafe {
491            ffi::gtk_snapshot_push_repeat(
492                self.as_ref().to_glib_none().0,
493                bounds.to_glib_none().0,
494                child_bounds.to_glib_none().0,
495            );
496        }
497    }
498
499    #[doc(alias = "gtk_snapshot_push_rounded_clip")]
500    fn push_rounded_clip(&self, bounds: &gsk::RoundedRect) {
501        unsafe {
502            ffi::gtk_snapshot_push_rounded_clip(
503                self.as_ref().to_glib_none().0,
504                bounds.to_glib_none().0,
505            );
506        }
507    }
508
509    #[doc(alias = "gtk_snapshot_push_shadow")]
510    fn push_shadow(&self, shadow: &[gsk::Shadow]) {
511        let n_shadows = shadow.len() as _;
512        unsafe {
513            ffi::gtk_snapshot_push_shadow(
514                self.as_ref().to_glib_none().0,
515                shadow.to_glib_none().0,
516                n_shadows,
517            );
518        }
519    }
520
521    #[cfg(feature = "v4_14")]
522    #[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
523    #[doc(alias = "gtk_snapshot_push_stroke")]
524    fn push_stroke(&self, path: &gsk::Path, stroke: &gsk::Stroke) {
525        unsafe {
526            ffi::gtk_snapshot_push_stroke(
527                self.as_ref().to_glib_none().0,
528                path.to_glib_none().0,
529                stroke.to_glib_none().0,
530            );
531        }
532    }
533
534    #[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
535    #[allow(deprecated)]
536    #[doc(alias = "gtk_snapshot_render_background")]
537    fn render_background(
538        &self,
539        context: &impl IsA<StyleContext>,
540        x: f64,
541        y: f64,
542        width: f64,
543        height: f64,
544    ) {
545        unsafe {
546            ffi::gtk_snapshot_render_background(
547                self.as_ref().to_glib_none().0,
548                context.as_ref().to_glib_none().0,
549                x,
550                y,
551                width,
552                height,
553            );
554        }
555    }
556
557    #[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
558    #[allow(deprecated)]
559    #[doc(alias = "gtk_snapshot_render_focus")]
560    fn render_focus(
561        &self,
562        context: &impl IsA<StyleContext>,
563        x: f64,
564        y: f64,
565        width: f64,
566        height: f64,
567    ) {
568        unsafe {
569            ffi::gtk_snapshot_render_focus(
570                self.as_ref().to_glib_none().0,
571                context.as_ref().to_glib_none().0,
572                x,
573                y,
574                width,
575                height,
576            );
577        }
578    }
579
580    #[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
581    #[allow(deprecated)]
582    #[doc(alias = "gtk_snapshot_render_frame")]
583    fn render_frame(
584        &self,
585        context: &impl IsA<StyleContext>,
586        x: f64,
587        y: f64,
588        width: f64,
589        height: f64,
590    ) {
591        unsafe {
592            ffi::gtk_snapshot_render_frame(
593                self.as_ref().to_glib_none().0,
594                context.as_ref().to_glib_none().0,
595                x,
596                y,
597                width,
598                height,
599            );
600        }
601    }
602
603    #[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
604    #[allow(deprecated)]
605    #[doc(alias = "gtk_snapshot_render_insertion_cursor")]
606    fn render_insertion_cursor(
607        &self,
608        context: &impl IsA<StyleContext>,
609        x: f64,
610        y: f64,
611        layout: &pango::Layout,
612        index: i32,
613        direction: pango::Direction,
614    ) {
615        unsafe {
616            ffi::gtk_snapshot_render_insertion_cursor(
617                self.as_ref().to_glib_none().0,
618                context.as_ref().to_glib_none().0,
619                x,
620                y,
621                layout.to_glib_none().0,
622                index,
623                direction.into_glib(),
624            );
625        }
626    }
627
628    #[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
629    #[allow(deprecated)]
630    #[doc(alias = "gtk_snapshot_render_layout")]
631    fn render_layout(
632        &self,
633        context: &impl IsA<StyleContext>,
634        x: f64,
635        y: f64,
636        layout: &pango::Layout,
637    ) {
638        unsafe {
639            ffi::gtk_snapshot_render_layout(
640                self.as_ref().to_glib_none().0,
641                context.as_ref().to_glib_none().0,
642                x,
643                y,
644                layout.to_glib_none().0,
645            );
646        }
647    }
648
649    #[doc(alias = "gtk_snapshot_restore")]
650    fn restore(&self) {
651        unsafe {
652            ffi::gtk_snapshot_restore(self.as_ref().to_glib_none().0);
653        }
654    }
655
656    #[doc(alias = "gtk_snapshot_rotate")]
657    fn rotate(&self, angle: f32) {
658        unsafe {
659            ffi::gtk_snapshot_rotate(self.as_ref().to_glib_none().0, angle);
660        }
661    }
662
663    #[doc(alias = "gtk_snapshot_rotate_3d")]
664    fn rotate_3d(&self, angle: f32, axis: &graphene::Vec3) {
665        unsafe {
666            ffi::gtk_snapshot_rotate_3d(
667                self.as_ref().to_glib_none().0,
668                angle,
669                axis.to_glib_none().0,
670            );
671        }
672    }
673
674    #[doc(alias = "gtk_snapshot_save")]
675    fn save(&self) {
676        unsafe {
677            ffi::gtk_snapshot_save(self.as_ref().to_glib_none().0);
678        }
679    }
680
681    #[doc(alias = "gtk_snapshot_scale")]
682    fn scale(&self, factor_x: f32, factor_y: f32) {
683        unsafe {
684            ffi::gtk_snapshot_scale(self.as_ref().to_glib_none().0, factor_x, factor_y);
685        }
686    }
687
688    #[doc(alias = "gtk_snapshot_scale_3d")]
689    fn scale_3d(&self, factor_x: f32, factor_y: f32, factor_z: f32) {
690        unsafe {
691            ffi::gtk_snapshot_scale_3d(
692                self.as_ref().to_glib_none().0,
693                factor_x,
694                factor_y,
695                factor_z,
696            );
697        }
698    }
699
700    #[doc(alias = "gtk_snapshot_transform")]
701    fn transform(&self, transform: Option<&gsk::Transform>) {
702        unsafe {
703            ffi::gtk_snapshot_transform(self.as_ref().to_glib_none().0, transform.to_glib_none().0);
704        }
705    }
706
707    #[doc(alias = "gtk_snapshot_transform_matrix")]
708    fn transform_matrix(&self, matrix: &graphene::Matrix) {
709        unsafe {
710            ffi::gtk_snapshot_transform_matrix(
711                self.as_ref().to_glib_none().0,
712                matrix.to_glib_none().0,
713            );
714        }
715    }
716
717    #[doc(alias = "gtk_snapshot_translate")]
718    fn translate(&self, point: &graphene::Point) {
719        unsafe {
720            ffi::gtk_snapshot_translate(self.as_ref().to_glib_none().0, point.to_glib_none().0);
721        }
722    }
723
724    #[doc(alias = "gtk_snapshot_translate_3d")]
725    fn translate_3d(&self, point: &graphene::Point3D) {
726        unsafe {
727            ffi::gtk_snapshot_translate_3d(self.as_ref().to_glib_none().0, point.to_glib_none().0);
728        }
729    }
730}
731
732impl<O: IsA<Snapshot>> SnapshotExt for O {}