texture.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include <cassert>
  2. #include "common_def.h"
  3. #include "simple/support/enum.hpp"
  4. #include "simple/sdlcore/utils.hpp"
  5. #include "texture.h"
  6. using namespace simple::graphical;
  7. using simple::support::to_integer;
  8. std::tuple<bool, texture::access, int2, pixel_format::type> texture::info() const noexcept
  9. {
  10. uint32_t format;
  11. int acs;
  12. std::tuple<bool, access, int2, pixel_format::type> result;
  13. int2& size = std::get<int2>(result);
  14. std::get<bool>(result) = !sdlcore::utils::check_error(
  15. SDL_QueryTexture(_guts, &format, &acs, &size.x(), &size.y()));
  16. std::get<pixel_format::type>(result) = static_cast<pixel_format::type>(format);
  17. std::get<access>(result) = static_cast<access>(acs);
  18. return result;
  19. };
  20. texture::texture(SDL_Texture* guts) : _guts(guts)
  21. {}
  22. texture::texture(SDL_Renderer* rend, SDL_Surface* surface)
  23. : _guts(SDL_CreateTextureFromSurface(rend, surface))
  24. {
  25. sdlcore::utils::throw_error(_guts);
  26. }
  27. texture::texture(SDL_Renderer* rend, pixel_format::type format, int2 size, access acs)
  28. : _guts(SDL_CreateTexture(rend, to_integer(format), to_integer(acs), size.x(), size.y()))
  29. {
  30. sdlcore::utils::throw_error(_guts);
  31. }
  32. SDL_Texture* texture::guts() const
  33. {
  34. assert(_guts && "simple::graphical::texture must not be null");
  35. return _guts;
  36. }
  37. basic_texture::basic_texture(const streaming_texture & tex) noexcept : texture(tex.guts())
  38. {}
  39. basic_texture::basic_texture(const render_texture & tex) noexcept : texture(tex.guts())
  40. {}
  41. streaming_texture::streaming_texture(const basic_texture & tex) : texture(tex.guts())
  42. {
  43. const auto [success, acs, ignore, also_ignore] = tex.info();
  44. ((void)ignore, (void)also_ignore); // silence unused variable warning
  45. if(!success || acs != access::streaming)
  46. throw std::runtime_error("Invalid texture conversion");
  47. }
  48. render_texture::render_texture(const basic_texture & tex) : texture(tex.guts())
  49. {
  50. const auto [success, acs, ignore, also_ignore] = tex.info();
  51. ((void)ignore, (void)also_ignore); // silence unused variable warning
  52. if(!success || acs != access::render_target)
  53. throw std::runtime_error("Invalid texture conversion");
  54. }
  55. texture_view::texture_view(basic_texture tex, range2D region, int2 pivot, texture::flip_direction flip)
  56. : texture(tex), region(region), pivot(pivot), flip(flip)
  57. {}
  58. texture_view::texture_view(basic_texture tex, int2 pivot, texture::flip_direction flip)
  59. : texture_view(tex, {int2::zero(), std::get<int2>(tex.info())}, pivot, flip)
  60. {}