make_dynamic_image_reader.hpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. //
  2. // Copyright 2012 Christian Henning
  3. //
  4. // Distributed under the Boost Software License, Version 1.0
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. //
  8. #ifndef BOOST_GIL_IO_MAKE_DYNAMIC_IMAGE_READER_HPP
  9. #define BOOST_GIL_IO_MAKE_DYNAMIC_IMAGE_READER_HPP
  10. #include <boost/gil/detail/mp11.hpp>
  11. #include <boost/gil/io/get_reader.hpp>
  12. #include <type_traits>
  13. namespace boost { namespace gil {
  14. template <typename String, typename FormatTag>
  15. inline
  16. auto make_dynamic_image_reader(
  17. String const& file_name, image_read_settings<FormatTag> const& settings,
  18. typename std::enable_if
  19. <
  20. mp11::mp_and
  21. <
  22. detail::is_supported_path_spec<String>,
  23. is_format_tag<FormatTag>
  24. >::value
  25. >::type* /*dummy*/ = nullptr)
  26. -> typename get_dynamic_image_reader<String, FormatTag>::type
  27. {
  28. using device_t = typename get_read_device<String, FormatTag>::type;
  29. device_t device(
  30. detail::convert_to_native_string(file_name),
  31. typename detail::file_stream_device<FormatTag>::read_tag());
  32. return typename get_dynamic_image_reader<String, FormatTag>::type(device, settings);
  33. }
  34. template <typename FormatTag>
  35. inline
  36. auto make_dynamic_image_reader(
  37. std::wstring const& file_name, image_read_settings<FormatTag> const& settings)
  38. -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
  39. {
  40. char const* str = detail::convert_to_native_string(file_name);
  41. using device_t = typename get_read_device<std::wstring, FormatTag>::type;
  42. device_t device(str, typename detail::file_stream_device<FormatTag>::read_tag());
  43. delete[] str; // TODO: RAII
  44. return
  45. typename get_dynamic_image_reader<std::wstring, FormatTag>::type(device, settings);
  46. }
  47. #ifdef BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
  48. template <typename FormatTag>
  49. inline
  50. auto make_dynamic_image_reader(
  51. filesystem::path const& path, image_read_settings<FormatTag> const& settings)
  52. -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
  53. {
  54. return make_dynamic_image_reader(path.wstring(), settings);
  55. }
  56. #endif // BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
  57. template <typename Device, typename FormatTag>
  58. inline
  59. auto make_dynamic_image_reader(
  60. Device& file, image_read_settings<FormatTag> const& settings,
  61. typename std::enable_if
  62. <
  63. mp11::mp_and
  64. <
  65. detail::is_adaptable_input_device<FormatTag, Device>,
  66. is_format_tag<FormatTag>
  67. >::value
  68. >::type* /*dummy*/ = nullptr)
  69. -> typename get_dynamic_image_reader<Device, FormatTag>::type
  70. {
  71. typename get_read_device<Device, FormatTag>::type device(file);
  72. return typename get_dynamic_image_reader<Device, FormatTag>::type(device, settings);
  73. }
  74. // without image_read_settings
  75. template <typename String, typename FormatTag>
  76. inline
  77. auto make_dynamic_image_reader(String const& file_name, FormatTag const&,
  78. typename std::enable_if
  79. <
  80. mp11::mp_and
  81. <
  82. detail::is_supported_path_spec<String>,
  83. is_format_tag<FormatTag>
  84. >::value
  85. >::type* /*dummy*/ = nullptr)
  86. -> typename get_dynamic_image_reader<String, FormatTag>::type
  87. {
  88. return make_dynamic_image_reader(file_name, image_read_settings<FormatTag>());
  89. }
  90. template <typename FormatTag>
  91. inline
  92. auto make_dynamic_image_reader(std::wstring const& file_name, FormatTag const&)
  93. -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
  94. {
  95. return make_dynamic_image_reader(file_name, image_read_settings<FormatTag>());
  96. }
  97. #ifdef BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
  98. template <typename FormatTag>
  99. inline
  100. auto make_dynamic_image_reader(filesystem::path const& path, FormatTag const&)
  101. -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
  102. {
  103. return make_dynamic_image_reader(path.wstring(), image_read_settings<FormatTag>());
  104. }
  105. #endif // BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
  106. template <typename Device, typename FormatTag>
  107. inline
  108. auto make_dynamic_image_reader(Device& file, FormatTag const&,
  109. typename std::enable_if
  110. <
  111. mp11::mp_and
  112. <
  113. detail::is_adaptable_input_device<FormatTag, Device>,
  114. is_format_tag<FormatTag>
  115. >::value
  116. >::type* /*dummy*/ = nullptr)
  117. -> typename get_dynamic_image_reader<Device, FormatTag>::type
  118. {
  119. return make_dynamic_image_reader(file, image_read_settings<FormatTag>());
  120. }
  121. }} // namespace boost::gil
  122. #endif