make_dynamic_image_reader.hpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. template <typename FormatTag>
  48. inline
  49. auto make_dynamic_image_reader(
  50. detail::filesystem::path const& path, image_read_settings<FormatTag> const& settings)
  51. -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
  52. {
  53. return make_dynamic_image_reader(path.wstring(), settings);
  54. }
  55. template <typename Device, typename FormatTag>
  56. inline
  57. auto make_dynamic_image_reader(
  58. Device& file, image_read_settings<FormatTag> const& settings,
  59. typename std::enable_if
  60. <
  61. mp11::mp_and
  62. <
  63. detail::is_adaptable_input_device<FormatTag, Device>,
  64. is_format_tag<FormatTag>
  65. >::value
  66. >::type* /*dummy*/ = nullptr)
  67. -> typename get_dynamic_image_reader<Device, FormatTag>::type
  68. {
  69. typename get_read_device<Device, FormatTag>::type device(file);
  70. return typename get_dynamic_image_reader<Device, FormatTag>::type(device, settings);
  71. }
  72. // without image_read_settings
  73. template <typename String, typename FormatTag>
  74. inline
  75. auto make_dynamic_image_reader(String const& file_name, FormatTag const&,
  76. typename std::enable_if
  77. <
  78. mp11::mp_and
  79. <
  80. detail::is_supported_path_spec<String>,
  81. is_format_tag<FormatTag>
  82. >::value
  83. >::type* /*dummy*/ = nullptr)
  84. -> typename get_dynamic_image_reader<String, FormatTag>::type
  85. {
  86. return make_dynamic_image_reader(file_name, image_read_settings<FormatTag>());
  87. }
  88. template <typename FormatTag>
  89. inline
  90. auto make_dynamic_image_reader(std::wstring const& file_name, FormatTag const&)
  91. -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
  92. {
  93. return make_dynamic_image_reader(file_name, image_read_settings<FormatTag>());
  94. }
  95. template <typename FormatTag>
  96. inline
  97. auto make_dynamic_image_reader(detail::filesystem::path const& path, FormatTag const&)
  98. -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
  99. {
  100. return make_dynamic_image_reader(path.wstring(), image_read_settings<FormatTag>());
  101. }
  102. template <typename Device, typename FormatTag>
  103. inline
  104. auto make_dynamic_image_reader(Device& file, FormatTag const&,
  105. typename std::enable_if
  106. <
  107. mp11::mp_and
  108. <
  109. detail::is_adaptable_input_device<FormatTag, Device>,
  110. is_format_tag<FormatTag>
  111. >::value
  112. >::type* /*dummy*/ = nullptr)
  113. -> typename get_dynamic_image_reader<Device, FormatTag>::type
  114. {
  115. return make_dynamic_image_reader(file, image_read_settings<FormatTag>());
  116. }
  117. }} // namespace boost::gil
  118. #endif