@@ -500,240 +500,66 @@ typedef enum {
500
500
} interpolation_e;
501
501
502
502
503
- template <typename T>
504
- class type_mapping ;
503
+ template <typename T> struct agg_type { using type = void ; };
504
+ template <> struct agg_type <double > { using type = agg::gray64; };
505
+ template <> struct agg_type <float > { using type = agg::gray32; };
506
+ template <> struct agg_type <unsigned short > { using type = agg::gray16; };
507
+ template <> struct agg_type <unsigned char > { using type = agg::gray8; };
505
508
506
509
507
- template <> class type_mapping <agg::rgba8>
510
+ template <typename T>
511
+ struct type_mapping
508
512
{
509
- public:
510
- typedef agg::rgba8 color_type;
511
- typedef fixed_blender_rgba_plain<color_type, agg::order_rgba> blender_type;
512
- typedef fixed_blender_rgba_pre<color_type, agg::order_rgba> pre_blender_type;
513
- typedef agg::pixfmt_alpha_blend_rgba<blender_type, agg::rendering_buffer> pixfmt_type;
514
- typedef agg::pixfmt_alpha_blend_rgba<pre_blender_type, agg::rendering_buffer> pixfmt_pre_type;
515
-
516
- template <typename A>
517
- struct span_gen_affine_type
518
- {
519
- typedef agg::span_image_resample_rgba_affine<A> type;
520
- };
521
-
522
- template <typename A, typename B>
523
- struct span_gen_filter_type
524
- {
525
- typedef agg::span_image_filter_rgba<A, B> type;
526
- };
527
-
528
- template <typename A, typename B>
529
- struct span_gen_nn_type
530
- {
531
- typedef agg::span_image_filter_rgba_nn<A, B> type;
532
- };
513
+ static bool const is_grayscale = std::is_arithmetic<T>::value;
514
+ using color_type = typename std::conditional<
515
+ is_grayscale,
516
+ typename agg_type<T>::type,
517
+ T
518
+ >::type;
519
+ using blender_type = typename std::conditional<
520
+ is_grayscale,
521
+ agg::blender_gray<color_type>,
522
+ typename std::conditional<
523
+ std::is_same<T, agg::rgba8>::value,
524
+ fixed_blender_rgba_plain<color_type, agg::order_rgba>,
525
+ agg::blender_rgba_plain<color_type, agg::order_rgba>
526
+ >::type
527
+ >::type;
528
+ using pixfmt_type = typename std::conditional<
529
+ is_grayscale,
530
+ agg::pixfmt_alpha_blend_gray<blender_type, agg::rendering_buffer>,
531
+ agg::pixfmt_alpha_blend_rgba<blender_type, agg::rendering_buffer>
532
+ >::type;
533
+ using pixfmt_pre_type = typename std::conditional<
534
+ is_grayscale,
535
+ pixfmt_type,
536
+ agg::pixfmt_alpha_blend_rgba<
537
+ typename std::conditional<
538
+ std::is_same<T, agg::rgba8>::value,
539
+ fixed_blender_rgba_pre<color_type, agg::order_rgba>,
540
+ agg::blender_rgba_pre<color_type, agg::order_rgba>
541
+ >::type,
542
+ agg::rendering_buffer>
543
+ >::type;
544
+ template <typename A> using span_gen_affine_type = typename std::conditional<
545
+ is_grayscale,
546
+ agg::span_image_resample_gray_affine<A>,
547
+ agg::span_image_resample_rgba_affine<A>
548
+ >::type;
549
+ template <typename A, typename B> using span_gen_filter_type = typename std::conditional<
550
+ is_grayscale,
551
+ agg::span_image_filter_gray<A, B>,
552
+ agg::span_image_filter_rgba<A, B>
553
+ >::type;
554
+ template <typename A, typename B> using span_gen_nn_type = typename std::conditional<
555
+ is_grayscale,
556
+ agg::span_image_filter_gray_nn<A, B>,
557
+ agg::span_image_filter_rgba_nn<A, B>
558
+ >::type;
533
559
};
534
560
535
561
536
- template <> class type_mapping <agg::rgba16>
537
- {
538
- public:
539
- typedef agg::rgba16 color_type;
540
- typedef fixed_blender_rgba_plain<color_type, agg::order_rgba> blender_type;
541
- typedef fixed_blender_rgba_pre<color_type, agg::order_rgba> pre_blender_type;
542
- typedef agg::pixfmt_alpha_blend_rgba<blender_type, agg::rendering_buffer> pixfmt_type;
543
- typedef agg::pixfmt_alpha_blend_rgba<pre_blender_type, agg::rendering_buffer> pixfmt_pre_type;
544
-
545
- template <typename A>
546
- struct span_gen_affine_type
547
- {
548
- typedef agg::span_image_resample_rgba_affine<A> type;
549
- };
550
-
551
- template <typename A, typename B>
552
- struct span_gen_filter_type
553
- {
554
- typedef agg::span_image_filter_rgba<A, B> type;
555
- };
556
-
557
- template <typename A, typename B>
558
- struct span_gen_nn_type
559
- {
560
- typedef agg::span_image_filter_rgba_nn<A, B> type;
561
- };
562
- };
563
-
564
-
565
- template <> class type_mapping <agg::rgba32>
566
- {
567
- public:
568
- typedef agg::rgba32 color_type;
569
- typedef agg::blender_rgba_plain<color_type, agg::order_rgba> blender_type;
570
- typedef agg::blender_rgba_pre<color_type, agg::order_rgba> pre_blender_type;
571
- typedef agg::pixfmt_alpha_blend_rgba<blender_type, agg::rendering_buffer> pixfmt_type;
572
- typedef agg::pixfmt_alpha_blend_rgba<pre_blender_type, agg::rendering_buffer> pixfmt_pre_type;
573
-
574
- template <typename A>
575
- struct span_gen_affine_type
576
- {
577
- typedef agg::span_image_resample_rgba_affine<A> type;
578
- };
579
-
580
- template <typename A, typename B>
581
- struct span_gen_filter_type
582
- {
583
- typedef agg::span_image_filter_rgba<A, B> type;
584
- };
585
-
586
- template <typename A, typename B>
587
- struct span_gen_nn_type
588
- {
589
- typedef agg::span_image_filter_rgba_nn<A, B> type;
590
- };
591
- };
592
-
593
-
594
- template <> class type_mapping <agg::rgba64>
595
- {
596
- public:
597
- typedef agg::rgba64 color_type;
598
- typedef agg::blender_rgba_plain<color_type, agg::order_rgba> blender_type;
599
- typedef agg::blender_rgba_pre<color_type, agg::order_rgba> pre_blender_type;
600
- typedef agg::pixfmt_alpha_blend_rgba<blender_type, agg::rendering_buffer> pixfmt_type;
601
- typedef agg::pixfmt_alpha_blend_rgba<pre_blender_type, agg::rendering_buffer> pixfmt_pre_type;
602
-
603
- template <typename A>
604
- struct span_gen_affine_type
605
- {
606
- typedef agg::span_image_resample_rgba_affine<A> type;
607
- };
608
-
609
- template <typename A, typename B>
610
- struct span_gen_filter_type
611
- {
612
- typedef agg::span_image_filter_rgba<A, B> type;
613
- };
614
-
615
- template <typename A, typename B>
616
- struct span_gen_nn_type
617
- {
618
- typedef agg::span_image_filter_rgba_nn<A, B> type;
619
- };
620
- };
621
-
622
-
623
- template <> class type_mapping <double >
624
- {
625
- public:
626
- typedef agg::gray64 color_type;
627
- typedef agg::blender_gray<color_type> blender_type;
628
- typedef agg::pixfmt_alpha_blend_gray<blender_type, agg::rendering_buffer> pixfmt_type;
629
- typedef pixfmt_type pixfmt_pre_type;
630
-
631
- template <typename A>
632
- struct span_gen_affine_type
633
- {
634
- typedef agg::span_image_resample_gray_affine<A> type;
635
- };
636
-
637
- template <typename A, typename B>
638
- struct span_gen_filter_type
639
- {
640
- typedef agg::span_image_filter_gray<A, B> type;
641
- };
642
-
643
- template <typename A, typename B>
644
- struct span_gen_nn_type
645
- {
646
- typedef agg::span_image_filter_gray_nn<A, B> type;
647
- };
648
- };
649
-
650
-
651
- template <> class type_mapping <float >
652
- {
653
- public:
654
- typedef agg::gray32 color_type;
655
- typedef agg::blender_gray<color_type> blender_type;
656
- typedef agg::pixfmt_alpha_blend_gray<blender_type, agg::rendering_buffer> pixfmt_type;
657
- typedef pixfmt_type pixfmt_pre_type;
658
-
659
- template <typename A>
660
- struct span_gen_affine_type
661
- {
662
- typedef agg::span_image_resample_gray_affine<A> type;
663
- };
664
-
665
- template <typename A, typename B>
666
- struct span_gen_filter_type
667
- {
668
- typedef agg::span_image_filter_gray<A, B> type;
669
- };
670
-
671
- template <typename A, typename B>
672
- struct span_gen_nn_type
673
- {
674
- typedef agg::span_image_filter_gray_nn<A, B> type;
675
- };
676
- };
677
-
678
-
679
- template <> class type_mapping <unsigned short >
680
- {
681
- public:
682
- typedef agg::gray16 color_type;
683
- typedef agg::blender_gray<color_type> blender_type;
684
- typedef agg::pixfmt_alpha_blend_gray<blender_type, agg::rendering_buffer> pixfmt_type;
685
- typedef pixfmt_type pixfmt_pre_type;
686
-
687
- template <typename A>
688
- struct span_gen_affine_type
689
- {
690
- typedef agg::span_image_resample_gray_affine<A> type;
691
- };
692
-
693
- template <typename A, typename B>
694
- struct span_gen_filter_type
695
- {
696
- typedef agg::span_image_filter_gray<A, B> type;
697
- };
698
-
699
- template <typename A, typename B>
700
- struct span_gen_nn_type
701
- {
702
- typedef agg::span_image_filter_gray_nn<A, B> type;
703
- };
704
- };
705
-
706
-
707
- template <> class type_mapping <unsigned char >
708
- {
709
- public:
710
- typedef agg::gray8 color_type;
711
- typedef agg::blender_gray<color_type> blender_type;
712
- typedef agg::pixfmt_alpha_blend_gray<blender_type, agg::rendering_buffer> pixfmt_type;
713
- typedef pixfmt_type pixfmt_pre_type;
714
-
715
- template <typename A>
716
- struct span_gen_affine_type
717
- {
718
- typedef agg::span_image_resample_gray_affine<A> type;
719
- };
720
-
721
- template <typename A, typename B>
722
- struct span_gen_filter_type
723
- {
724
- typedef agg::span_image_filter_gray<A, B> type;
725
- };
726
-
727
- template <typename A, typename B>
728
- struct span_gen_nn_type
729
- {
730
- typedef agg::span_image_filter_gray_nn<A, B> type;
731
- };
732
- };
733
-
734
-
735
-
736
- template <class color_type >
562
+ template <typename color_type>
737
563
class span_conv_alpha
738
564
{
739
565
public:
@@ -882,29 +708,29 @@ static void get_filter(const resample_params_t ¶ms,
882
708
}
883
709
884
710
885
- template <class T >
711
+ template <typename T>
886
712
void resample (
887
713
const T *input, int in_width, int in_height,
888
714
T *output, int out_width, int out_height,
889
715
resample_params_t ¶ms)
890
716
{
891
- typedef type_mapping<T> type_mapping_t ;
717
+ using type_mapping_t = type_mapping<T>;
892
718
893
- typedef typename type_mapping_t ::pixfmt_type input_pixfmt_t ;
894
- typedef typename type_mapping_t ::pixfmt_type output_pixfmt_t ;
719
+ using input_pixfmt_t = typename type_mapping_t ::pixfmt_type;
720
+ using output_pixfmt_t = typename type_mapping_t ::pixfmt_type;
895
721
896
- typedef agg::renderer_base<output_pixfmt_t > renderer_t ;
897
- typedef agg::rasterizer_scanline_aa<agg::rasterizer_sl_clip_dbl> rasterizer_t ;
722
+ using renderer_t = agg::renderer_base<output_pixfmt_t >;
723
+ using rasterizer_t = agg::rasterizer_scanline_aa<agg::rasterizer_sl_clip_dbl>;
898
724
899
- typedef agg::wrap_mode_reflect reflect_t ;
900
- typedef agg::image_accessor_wrap<input_pixfmt_t , reflect_t , reflect_t > image_accessor_t ;
725
+ using reflect_t = agg::wrap_mode_reflect;
726
+ using image_accessor_t = agg::image_accessor_wrap<input_pixfmt_t , reflect_t , reflect_t >;
901
727
902
- typedef agg::span_allocator<typename type_mapping_t ::color_type> span_alloc_t ;
903
- typedef span_conv_alpha<typename type_mapping_t ::color_type> span_conv_alpha_t ;
728
+ using span_alloc_t = agg::span_allocator<typename type_mapping_t ::color_type>;
729
+ using span_conv_alpha_t = span_conv_alpha<typename type_mapping_t ::color_type>;
904
730
905
- typedef agg::span_interpolator_linear<> affine_interpolator_t ;
906
- typedef agg::span_interpolator_adaptor<agg::span_interpolator_linear<>, lookup_distortion>
907
- arbitrary_interpolator_t ;
731
+ using affine_interpolator_t = agg::span_interpolator_linear<>;
732
+ using arbitrary_interpolator_t =
733
+ agg::span_interpolator_adaptor<agg::span_interpolator_linear<>, lookup_distortion> ;
908
734
909
735
if (params.interpolation != NEAREST &&
910
736
params.is_affine &&
@@ -958,20 +784,18 @@ void resample(
958
784
959
785
if (params.interpolation == NEAREST) {
960
786
if (params.is_affine ) {
961
- typedef typename type_mapping_t ::template span_gen_nn_type<image_accessor_t , affine_interpolator_t >::type span_gen_t ;
962
- typedef agg::span_converter<span_gen_t , span_conv_alpha_t > span_conv_t ;
963
- typedef agg::renderer_scanline_aa<renderer_t , span_alloc_t , span_conv_t > nn_renderer_t ;
964
-
787
+ using span_gen_t = typename type_mapping_t ::template span_gen_nn_type<image_accessor_t , affine_interpolator_t >;
788
+ using span_conv_t = agg::span_converter<span_gen_t , span_conv_alpha_t >;
789
+ using nn_renderer_t = agg::renderer_scanline_aa<renderer_t , span_alloc_t , span_conv_t >;
965
790
affine_interpolator_t interpolator (inverted);
966
791
span_gen_t span_gen (input_accessor, interpolator);
967
792
span_conv_t span_conv (span_gen, conv_alpha);
968
793
nn_renderer_t nn_renderer (renderer, span_alloc, span_conv);
969
794
agg::render_scanlines (rasterizer, scanline, nn_renderer);
970
795
} else {
971
- typedef typename type_mapping_t ::template span_gen_nn_type<image_accessor_t , arbitrary_interpolator_t >::type span_gen_t ;
972
- typedef agg::span_converter<span_gen_t , span_conv_alpha_t > span_conv_t ;
973
- typedef agg::renderer_scanline_aa<renderer_t , span_alloc_t , span_conv_t > nn_renderer_t ;
974
-
796
+ using span_gen_t = typename type_mapping_t ::template span_gen_nn_type<image_accessor_t , arbitrary_interpolator_t >;
797
+ using span_conv_t = agg::span_converter<span_gen_t , span_conv_alpha_t >;
798
+ using nn_renderer_t = agg::renderer_scanline_aa<renderer_t , span_alloc_t , span_conv_t >;
975
799
lookup_distortion dist (
976
800
params.transform_mesh , in_width, in_height, out_width, out_height);
977
801
arbitrary_interpolator_t interpolator (inverted, dist);
@@ -985,20 +809,18 @@ void resample(
985
809
get_filter (params, filter);
986
810
987
811
if (params.is_affine && params.resample ) {
988
- typedef typename type_mapping_t ::template span_gen_affine_type<image_accessor_t >::type span_gen_t ;
989
- typedef agg::span_converter<span_gen_t , span_conv_alpha_t > span_conv_t ;
990
- typedef agg::renderer_scanline_aa<renderer_t , span_alloc_t , span_conv_t > int_renderer_t ;
991
-
812
+ using span_gen_t = typename type_mapping_t ::template span_gen_affine_type<image_accessor_t >;
813
+ using span_conv_t = agg::span_converter<span_gen_t , span_conv_alpha_t >;
814
+ using int_renderer_t = agg::renderer_scanline_aa<renderer_t , span_alloc_t , span_conv_t >;
992
815
affine_interpolator_t interpolator (inverted);
993
816
span_gen_t span_gen (input_accessor, interpolator, filter);
994
817
span_conv_t span_conv (span_gen, conv_alpha);
995
818
int_renderer_t int_renderer (renderer, span_alloc, span_conv);
996
819
agg::render_scanlines (rasterizer, scanline, int_renderer);
997
820
} else {
998
- typedef typename type_mapping_t ::template span_gen_filter_type<image_accessor_t , arbitrary_interpolator_t >::type span_gen_t ;
999
- typedef agg::span_converter<span_gen_t , span_conv_alpha_t > span_conv_t ;
1000
- typedef agg::renderer_scanline_aa<renderer_t , span_alloc_t , span_conv_t > int_renderer_t ;
1001
-
821
+ using span_gen_t = typename type_mapping_t ::template span_gen_filter_type<image_accessor_t , arbitrary_interpolator_t >;
822
+ using span_conv_t = agg::span_converter<span_gen_t , span_conv_alpha_t >;
823
+ using int_renderer_t = agg::renderer_scanline_aa<renderer_t , span_alloc_t , span_conv_t >;
1002
824
lookup_distortion dist (
1003
825
params.transform_mesh , in_width, in_height, out_width, out_height);
1004
826
arbitrary_interpolator_t interpolator (inverted, dist);
0 commit comments