Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8988f89

Browse files
committed
Dedupe some C++ templates.
1 parent 768f263 commit 8988f89

File tree

1 file changed

+79
-257
lines changed

1 file changed

+79
-257
lines changed

src/_image_resample.h

Lines changed: 79 additions & 257 deletions
Original file line numberDiff line numberDiff line change
@@ -500,240 +500,66 @@ typedef enum {
500500
} interpolation_e;
501501

502502

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; };
505508

506509

507-
template <> class type_mapping<agg::rgba8>
510+
template<typename T>
511+
struct type_mapping
508512
{
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;
533559
};
534560

535561

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>
737563
class span_conv_alpha
738564
{
739565
public:
@@ -882,29 +708,29 @@ static void get_filter(const resample_params_t &params,
882708
}
883709

884710

885-
template<class T>
711+
template<typename T>
886712
void resample(
887713
const T *input, int in_width, int in_height,
888714
T *output, int out_width, int out_height,
889715
resample_params_t &params)
890716
{
891-
typedef type_mapping<T> type_mapping_t;
717+
using type_mapping_t = type_mapping<T>;
892718

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;
895721

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>;
898724

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>;
901727

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>;
904730

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>;
908734

909735
if (params.interpolation != NEAREST &&
910736
params.is_affine &&
@@ -958,20 +784,18 @@ void resample(
958784

959785
if (params.interpolation == NEAREST) {
960786
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>;
965790
affine_interpolator_t interpolator(inverted);
966791
span_gen_t span_gen(input_accessor, interpolator);
967792
span_conv_t span_conv(span_gen, conv_alpha);
968793
nn_renderer_t nn_renderer(renderer, span_alloc, span_conv);
969794
agg::render_scanlines(rasterizer, scanline, nn_renderer);
970795
} 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>;
975799
lookup_distortion dist(
976800
params.transform_mesh, in_width, in_height, out_width, out_height);
977801
arbitrary_interpolator_t interpolator(inverted, dist);
@@ -985,20 +809,18 @@ void resample(
985809
get_filter(params, filter);
986810

987811
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>;
992815
affine_interpolator_t interpolator(inverted);
993816
span_gen_t span_gen(input_accessor, interpolator, filter);
994817
span_conv_t span_conv(span_gen, conv_alpha);
995818
int_renderer_t int_renderer(renderer, span_alloc, span_conv);
996819
agg::render_scanlines(rasterizer, scanline, int_renderer);
997820
} 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>;
1002824
lookup_distortion dist(
1003825
params.transform_mesh, in_width, in_height, out_width, out_height);
1004826
arbitrary_interpolator_t interpolator(inverted, dist);

0 commit comments

Comments
 (0)