1use crate::{
2 Colour,
3 text::{
4 OutlinedGlyph,
5 TexturedGlyph,
6 },
7 texture::Texture,
8};
9
10#[cfg(feature="colour_filter")]
11use crate::graphics::ColourFilter;
12
13use super::two_dimensions::{
14 Vertex2D,
15 TexturedVertex2D,
16 Graphics2D
17};
18
19#[cfg(feature="3D")]
20use super::three_dimensions::Graphics3D;
21
22use super::{DependentObject,ObjectType,DrawType};
23
24use glium::{
25 Frame,
26 DrawParameters,
27 DrawError,
28 Surface,
29};
30
31
32
33
34
35pub struct Graphics<'g,'p,'f,S:Surface>{
38 pub graphics2d:&'g Graphics2D,
39
40 pub draw_parameters:DrawParameters<'p>,
41
42 pub frame:&'f mut S,
43}
44
45
46
47
48
49impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
50 #[inline(always)]
51 pub (crate) fn new(
52 graphics2d:&'g Graphics2D,
53 draw_parameters:DrawParameters<'p>,
54 frame:&'f mut S
55 )->Graphics<'g,'p,'f,S>{
56 Self{
57 graphics2d,
58 draw_parameters,
59 frame
60 }
61 }
62
63 #[inline(always)]
67 pub fn clear_colour(&mut self,[r,g,b,a]:[f32;4]){
68 self.frame.clear_color(r,g,b,a)
69 }
70
71 #[cfg(any(feature="simple_graphics",feature="texture_graphics",feature="text_graphics"))]
75 pub fn draw_object(
76 &mut self,
77 index:usize,
78 object_type:ObjectType,
79 draw_type:DrawType,
80 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
81 )->Result<(),DrawError>{
82 match object_type{
83 #[cfg(feature="simple_graphics")]
84 ObjectType::Simple=>{
85 match draw_type{
86 DrawType::Common=>self.draw_simple_object(
87 index,
88 #[cfg(feature="colour_filter")]colour_filter,
89 ),
90
91 DrawType::Shifting(shift)=>self.draw_shift_simple_object(
92 index,
93 shift,
94 #[cfg(feature="colour_filter")]colour_filter,
95 ),
96
97 DrawType::Rotating((angle,position))=>self.draw_rotate_simple_object(
98 index,
99 position,
100 angle,
101 #[cfg(feature="colour_filter")]colour_filter,
102 ),
103 }
104 }
105
106 #[cfg(feature="texture_graphics")]
107 ObjectType::Textured=>{
108 match draw_type{
109 DrawType::Common=>self.draw_textured_object(
110 index,
111 #[cfg(feature="colour_filter")]colour_filter,
112 ),
113
114 DrawType::Shifting(shift)=>self.draw_shift_textured_object(
115 index,
116 shift,
117 #[cfg(feature="colour_filter")]colour_filter,
118 ),
119
120 DrawType::Rotating((angle,position))=>self.draw_rotate_textured_object(
121 index,
122 position,
123 angle,
124 #[cfg(feature="colour_filter")]colour_filter,
125 )
126 }
127 }
128
129 #[cfg(feature="text_graphics")]
130 ObjectType::Text=>{
131 match draw_type{
132 DrawType::Common=>self.draw_text_object(
133 index,
134 #[cfg(feature="colour_filter")]colour_filter
135 ),
136
137 DrawType::Shifting(shift)=>self.draw_shift_text_object(
138 index,
139 shift,
140 #[cfg(feature="colour_filter")]colour_filter
141 ),
142
143 DrawType::Rotating((angle,position))=>self.draw_rotate_text_object(
144 index,
145 position,
146 angle,
147 #[cfg(feature="colour_filter")]colour_filter
148 ),
149 }
150 }
151
152 #[cfg(not(all(feature="simple_graphics",feature="texture_graphics",feature="text_graphics")))]
153 _=>Ok(())
154 }
155 }
156}
157
158
159
160
161
162#[cfg(feature="simple_graphics")]
164impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
165 #[inline(always)]
169 pub fn draw_simple<O,V,I>(
170 &mut self,
171 object:&O,
172 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
173
174 )->Result<(),DrawError>
175 where
176 O:DependentObject<
177 Vertex2D,
178 u8,
179 Vertices=V,
180 Indices=I
181 >,
182 V:AsRef<[Vertex2D]>,
183 I:AsRef<[u8]>
184 {
185 self.graphics2d.simple.draw(
186 object,
187 #[cfg(feature="colour_filter")]colour_filter,
188 &self.draw_parameters,
189 self.frame
190 )
191 }
192
193 #[inline(always)]
197 pub fn draw_shift_simple<O,V,I>(
198 &mut self,
199 object:&O,
200 shift:[f32;2],
201 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
202 )->Result<(),DrawError>
203 where
204 O:DependentObject<
205 Vertex2D,
206 u8,
207 Vertices=V,
208 Indices=I
209 >,
210 V:AsRef<[Vertex2D]>,
211 I:AsRef<[u8]>
212 {
213 self.graphics2d.simple.draw_shift(
214 object,
215 shift,
216 #[cfg(feature="colour_filter")]colour_filter,
217 &self.draw_parameters,
218 self.frame
219 )
220 }
221
222 #[inline(always)]
226 pub fn draw_rotate_simple<O,V,I>(
227 &mut self,
228 object:&O,
229 rotation_center:[f32;2],
230 angle:f32,
231 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
232
233 )->Result<(),DrawError>
234 where
235 O:DependentObject<
236 Vertex2D,
237 u8,
238 Vertices=V,
239 Indices=I
240 >,
241 V:AsRef<[Vertex2D]>,
242 I:AsRef<[u8]>
243 {
244 self.graphics2d.simple.draw_rotate(
245 object,
246 rotation_center,
247 angle,
248 #[cfg(feature="colour_filter")]colour_filter,
249 &self.draw_parameters,
250 self.frame
251 )
252 }
253
254 #[inline(always)]
258 pub fn draw_simple_general<O,V,I>(
259 &mut self,
260 object:&O,
261 draw_type:DrawType,
262 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
263 )->Result<(),DrawError>
264 where
265 O:DependentObject<
266 Vertex2D,
267 u8,
268 Vertices=V,
269 Indices=I
270 >,
271 V:AsRef<[Vertex2D]>,
272 I:AsRef<[u8]>
273 {
274 match draw_type{
275 DrawType::Common=>self.graphics2d.simple.draw(
276 object,
277 #[cfg(feature="colour_filter")]colour_filter,
278 &self.draw_parameters,
279 self.frame
280 ),
281
282 DrawType::Shifting(shift)=>self.graphics2d.simple.draw_shift(
283 object,
284 shift,
285 #[cfg(feature="colour_filter")]colour_filter,
286 &self.draw_parameters,
287 self.frame
288 ),
289
290 DrawType::Rotating((angle,position))=>self.graphics2d.simple.draw_rotate(
291 object,
292 position,
293 angle,
294 #[cfg(feature="colour_filter")]colour_filter,
295 &self.draw_parameters,
296 self.frame
297 ),
298 }
299 }
300}
301
302
303
304#[cfg(feature="texture_graphics")]
306impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
307 #[inline(always)]
311 pub fn draw_texture<O,V,I>(
312 &mut self,
313 base:&O,
314 texture:&Texture,
315 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
316 )->Result<(),DrawError>
317 where
318 O:DependentObject<
319 TexturedVertex2D,
320 u8,
321 Vertices=V,
322 Indices=I
323 >,
324 V:AsRef<[TexturedVertex2D]>,
325 I:AsRef<[u8]>
326 {
327 self.graphics2d.texture.draw(
328 base,
329 texture,
330 #[cfg(feature="colour_filter")]colour_filter,
331 &self.draw_parameters,
332 self.frame
333 )
334 }
335
336 #[inline(always)]
340 pub fn draw_shift_texture<O,V,I>(
341 &mut self,
342 base:&O,
343 texture:&Texture,
344 shift:[f32;2],
345 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
346 )->Result<(),DrawError>
347 where
348 O:DependentObject<
349 TexturedVertex2D,
350 u8,
351 Vertices=V,
352 Indices=I
353 >,
354 V:AsRef<[TexturedVertex2D]>,
355 I:AsRef<[u8]>
356 {
357 self.graphics2d.texture.draw_shift(
358 base,
359 texture,
360 shift,
361 #[cfg(feature="colour_filter")]colour_filter,
362 &self.draw_parameters,
363 self.frame
364 )
365 }
366
367 #[inline(always)]
373 pub fn draw_rotate_texture<O,V,I>(
374 &mut self,
375 base:&O,
376 texture:&Texture,
377 rotation_center:[f32;2],
378 angle:f32,
379 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
380 )->Result<(),DrawError>
381 where
382 O:DependentObject<
383 TexturedVertex2D,
384 u8,
385 Vertices=V,
386 Indices=I
387 >,
388 V:AsRef<[TexturedVertex2D]>,
389 I:AsRef<[u8]>
390 {
391 self.graphics2d.texture.draw_rotate(
392 base,
393 texture,
394 rotation_center,
395 angle,
396 #[cfg(feature="colour_filter")]colour_filter,
397 &self.draw_parameters,
398 self.frame,
399 )
400 }
401
402 #[inline(always)]
406 pub fn draw_texture_general<O,V,I>(
407 &mut self,
408 base:&O,
409 texture:&Texture,
410 draw_type:DrawType,
411 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
412 )->Result<(),DrawError>
413 where
414 O:DependentObject<
415 TexturedVertex2D,
416 u8,
417 Vertices=V,
418 Indices=I
419 >,
420 V:AsRef<[TexturedVertex2D]>,
421 I:AsRef<[u8]>
422 {
423 match draw_type{
424 DrawType::Common=>self.graphics2d.texture.draw(
425 base,
426 texture,
427 #[cfg(feature="colour_filter")]colour_filter,
428 &self.draw_parameters,
429 self.frame
430 ),
431
432 DrawType::Shifting(shift)=>self.graphics2d.texture.draw_shift(
433 base,
434 texture,
435 shift,
436 #[cfg(feature="colour_filter")]colour_filter,
437 &self.draw_parameters,
438 self.frame
439 ),
440
441 DrawType::Rotating((angle,position))=>self.graphics2d.texture.draw_rotate(
442 base,
443 texture,
444 position,
445 angle,
446 #[cfg(feature="colour_filter")]colour_filter,
447 &self.draw_parameters,
448 self.frame
449 )
450 }
451 }
452}
453
454
455
456#[cfg(feature="text_graphics")]
458impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
459 #[inline(always)]
463 pub fn draw_glyph(
464 &mut self,
465 glyph:&OutlinedGlyph,
466 colour:Colour,
467 [x,y]:[f32;2],
468 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
469 )->Result<(),DrawError>{
470 self.graphics2d.text.write_glyph(glyph);
472
473 let [w,h]=glyph.size();
475 let [w,h]=[w as f32,h as f32];
476
477
478 let [tw,th]=self.graphics2d.text.texture_size();
480
481 let uv=[
483 w/tw,
484 h/th
485 ];
486
487 self.graphics2d.text.write_vertices(
489 [x,y,w,h],
490 uv
491 );
492
493 let texture=self.graphics2d.text.texture();
494
495 self.graphics2d.text.draw_glyph(
496 texture,
497 colour,
498 #[cfg(feature="colour_filter")]colour_filter,
499 &self.draw_parameters,
500 self.frame
501 )
502 }
503
504 #[inline(always)]
508 pub fn draw_shift_glyph(
509 &mut self,
510 glyph:&OutlinedGlyph,
511 colour:Colour,
512 [x,y]:[f32;2],
513 shift:[f32;2],
514 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
515 )->Result<(),DrawError>{
516 self.graphics2d.text.write_glyph(glyph);
518
519 let [w,h]=glyph.size();
521 let [w,h]=[w as f32,h as f32];
522
523 let [tw,th]=self.graphics2d.text.texture_size();
525
526 let uv=[
528 w/tw,
529 h/th
530 ];
531
532 self.graphics2d.text.write_vertices(
534 [x,y,w,h],
535 uv
536 );
537
538 let texture=self.graphics2d.text.texture();
539
540 self.graphics2d.text.draw_shift_glyph(
541 texture,
542 colour,
543 shift,
544 #[cfg(feature="colour_filter")]colour_filter,
545 &self.draw_parameters,
546 self.frame
547 )
548 }
549
550 #[inline(always)]
554 pub fn draw_rotate_glyph(
555 &mut self,
556 glyph:&OutlinedGlyph,
557 colour:Colour,
558 [x,y]:[f32;2],
559 rotation_center:[f32;2],
560 angle:f32,
561 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
562 )->Result<(),DrawError>{
563 self.graphics2d.text.write_glyph(glyph);
565
566 let [w,h]=glyph.size();
568 let [w,h]=[w as f32,h as f32];
569
570 let [tw,th]=self.graphics2d.text.texture_size();
572
573 let uv=[
575 w/tw,
576 h/th
577 ];
578
579 self.graphics2d.text.write_vertices(
581 [x,y,w,h],
582 uv
583 );
584
585 let texture=self.graphics2d.text.texture();
586
587 self.graphics2d.text.draw_rotate_glyph(
588 texture,
589 colour,
590 rotation_center,
591 angle,
592 #[cfg(feature="colour_filter")]colour_filter,
593 &self.draw_parameters,
594 self.frame
595 )
596 }
597
598 #[inline(always)]
602 pub fn draw_glyph_cache(
603 &mut self,
604 glyph:&TexturedGlyph,
605 colour:Colour,
606 [x,y]:[f32;2],
607 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
608 )->Result<(),DrawError>{
609 let size=glyph.size();
610 self.graphics2d.text.write_vertices([x,y,size[0],size[1]],[1f32,1f32]);
612
613 self.graphics2d.text.draw_glyph(
614 glyph.texture(),
615 colour,
616 #[cfg(feature="colour_filter")]colour_filter,
617 &self.draw_parameters,
618 self.frame
619 )
620 }
621
622 #[inline(always)]
626 pub fn draw_shift_glyph_cache(
627 &mut self,
628 glyph:&TexturedGlyph,
629 colour:Colour,
630 [x,y]:[f32;2],
631 shift:[f32;2],
632 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
633 )->Result<(),DrawError>{
634 let size=glyph.size();
635 self.graphics2d.text.write_vertices([x,y,size[0],size[1]],[1f32,1f32]);
637
638 self.graphics2d.text.draw_shift_glyph(
639 glyph.texture(),
640 colour,
641 shift,
642 #[cfg(feature="colour_filter")]colour_filter,
643 &self.draw_parameters,
644 self.frame
645 )
646 }
647
648 #[inline(always)]
652 pub fn draw_rotate_glyph_cache(
653 &mut self,
654 glyph:&TexturedGlyph,
655 colour:Colour,
656 [x,y]:[f32;2],
657 rotation_center:[f32;2],
658 angle:f32,
659 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
660 )->Result<(),DrawError>{
661 let size=glyph.size();
662 self.graphics2d.text.write_vertices([x,y,size[0],size[1]],[1f32,1f32]);
664
665 self.graphics2d.text.draw_rotate_glyph(
666 glyph.texture(),
667 colour,
668 rotation_center,
669 angle,
670 #[cfg(feature="colour_filter")]colour_filter,
671 &self.draw_parameters,
672 self.frame
673 )
674 }
675
676 pub fn draw_glyph_cache_general(
680 &mut self,
681 glyph:&TexturedGlyph,
682 colour:Colour,
683 [x,y]:[f32;2],
684 draw_type:DrawType,
685 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
686 )->Result<(),DrawError>{
687 let size=glyph.size();
688 self.graphics2d.text.write_vertices([x,y,size[0],size[1]],[1f32,1f32]);
690
691 match draw_type{
692 DrawType::Common=>self.graphics2d.text.draw_glyph(
693 glyph.texture(),
694 colour,
695 #[cfg(feature="colour_filter")]colour_filter,
696 &self.draw_parameters,
697 self.frame
698 ),
699
700 DrawType::Shifting(shift)=>self.graphics2d.text.draw_shift_glyph(
701 glyph.texture(),
702 colour,
703 shift,
704 #[cfg(feature="colour_filter")]colour_filter,
705 &self.draw_parameters,
706 self.frame
707 ),
708
709 DrawType::Rotating((angle,position))=>self.graphics2d.text.draw_rotate_glyph(
710 glyph.texture(),
711 colour,
712 position,
713 angle,
714 #[cfg(feature="colour_filter")]colour_filter,
715 &self.draw_parameters,
716 self.frame
717 ),
718 }
719 }
720}
721
722
723
724
725
726#[cfg(feature="simple_graphics")]
728impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
729 #[inline(always)]
733 pub fn draw_simple_object(
734 &mut self,
735 index:usize,
736 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
737
738 )->Result<(),DrawError>{
739 self.graphics2d.simple.draw_object(
740 index,
741 #[cfg(feature="colour_filter")]colour_filter,
742 &self.draw_parameters,
743 self.frame
744 )
745 }
746
747 #[inline(always)]
751 pub fn draw_shift_simple_object(
752 &mut self,
753 index:usize,
754 shift:[f32;2],
755 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
756
757 )->Result<(),DrawError>{
758 self.graphics2d.simple.draw_shift_object(
759 index,
760 shift,
761 #[cfg(feature="colour_filter")]colour_filter,
762 &self.draw_parameters,
763 self.frame
764 )
765 }
766
767 #[inline(always)]
771 pub fn draw_rotate_simple_object(
772 &mut self,
773 index:usize,
774 rotation_center:[f32;2],
775 angle:f32,
776 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
777
778 )->Result<(),DrawError>{
779 self.graphics2d.simple.draw_rotate_object(
780 index,
781 rotation_center,
782 angle,
783 #[cfg(feature="colour_filter")]colour_filter,
784 &self.draw_parameters,
785 self.frame
786 )
787 }
788
789 #[inline(always)]
793 pub fn draw_simple_object_general(
794 &mut self,
795 index:usize,
796 draw_type:DrawType,
797 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
798 )->Result<(),DrawError>{
799 match draw_type{
800 DrawType::Common=>self.draw_simple_object(
801 index,
802 #[cfg(feature="colour_filter")]colour_filter,
803 ),
804
805 DrawType::Shifting(shift)=>self.draw_shift_simple_object(
806 index,
807 shift,
808 #[cfg(feature="colour_filter")]colour_filter,
809 ),
810
811 DrawType::Rotating((angle,position))=>self.draw_rotate_simple_object(
812 index,
813 position,
814 angle,
815 #[cfg(feature="colour_filter")]colour_filter,
816 ),
817 }
818 }
819}
820
821
822
823#[cfg(feature="texture_graphics")]
825impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
826 #[inline(always)]
830 pub fn draw_textured_object(
831 &mut self,
832 index:usize,
833 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
834 )->Result<(),DrawError>{
835 self.graphics2d.texture.draw_object(
836 index,
837 #[cfg(feature="colour_filter")]colour_filter,
838 &self.draw_parameters,
839 self.frame,
840 )
841 }
842
843 #[inline(always)]
847 pub fn draw_shift_textured_object(
848 &mut self,
849 index:usize,
850 shift:[f32;2],
851 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
852 )->Result<(),DrawError>{
853 self.graphics2d.texture.draw_shift_object(
854 index,
855 shift,
856 #[cfg(feature="colour_filter")]colour_filter,
857 &self.draw_parameters,
858 self.frame
859 )
860 }
861
862 #[inline(always)]
869 pub fn draw_rotate_textured_object(
870 &mut self,
871 index:usize,
872 rotation_center:[f32;2],
873 angle:f32,
874 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
875 )->Result<(),DrawError>{
876 self.graphics2d.texture.draw_rotate_object(
877 index,
878 rotation_center,
879 angle,
880 #[cfg(feature="colour_filter")]colour_filter,
881 &self.draw_parameters,
882 self.frame
883 )
884 }
885
886 #[inline(always)]
890 pub fn draw_textured_object_general(
891 &mut self,
892 index:usize,
893 draw_type:DrawType,
894 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
895 )->Result<(),DrawError>{
896 match draw_type{
897 DrawType::Common=>self.draw_textured_object(
898 index,
899 #[cfg(feature="colour_filter")]colour_filter,
900 ),
901
902 DrawType::Shifting(shift)=>self.draw_shift_textured_object(
903 index,
904 shift,
905 #[cfg(feature="colour_filter")]colour_filter,
906 ),
907
908 DrawType::Rotating((angle,position))=>self.draw_rotate_textured_object(
909 index,
910 position,
911 angle,
912 #[cfg(feature="colour_filter")]colour_filter,
913 )
914 }
915 }
916}
917
918
919
920#[cfg(feature="text_graphics")]
922impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
923 #[inline(always)]
927 pub fn draw_text_object(
928 &mut self,
929 index:usize,
930 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
931
932 )->Result<(),DrawError>{
933 self.graphics2d.text.draw_object(
934 index,
935 #[cfg(feature="colour_filter")]colour_filter,
936 &self.draw_parameters,
937 self.frame,
938 )
939 }
940
941 #[inline(always)]
945 pub fn draw_shift_text_object(
946 &mut self,
947 index:usize,
948 shift:[f32;2],
949 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
950 )->Result<(),DrawError>{
951 self.graphics2d.text.draw_shift_object(
952 index,
953 shift,
954 #[cfg(feature="colour_filter")]colour_filter,
955 &self.draw_parameters,
956 self.frame,
957 )
958 }
959
960 #[inline(always)]
964 pub fn draw_rotate_text_object(
965 &mut self,
966 index:usize,
967 rotation_center:[f32;2],
968 angle:f32,
969 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
970 )->Result<(),DrawError>{
971 self.graphics2d.text.draw_rotate_object(
972 index,
973 rotation_center,
974 angle,
975 #[cfg(feature="colour_filter")]colour_filter,
976 &self.draw_parameters,
977 self.frame,
978 )
979 }
980
981 pub fn draw_text_object_general(
985 &mut self,
986 index:usize,
987 draw_type:DrawType,
988 #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
989 )->Result<(),DrawError>{
990 match draw_type{
991 DrawType::Common=>self.draw_text_object(
992 index,
993 #[cfg(feature="colour_filter")]colour_filter,
994 ),
995
996 DrawType::Shifting(shift)=>self.draw_shift_text_object(
997 index,
998 shift,
999 #[cfg(feature="colour_filter")]colour_filter,
1000 ),
1001
1002 DrawType::Rotating((angle,position))=>self.draw_rotate_text_object(
1003 index,
1004 position,
1005 angle,
1006 #[cfg(feature="colour_filter")]colour_filter,
1007 ),
1008 }
1009 }
1010}