A 2D tile-based sandbox game.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

gfxutil.h 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include <SDL.h>
  2. #include <ostream>
  3. #include "util.h"
  4. #include "log.h"
  5. namespace Swan {
  6. inline std::ostream &operator<<(std::ostream &os, const SDL_Rect &rect) {
  7. os
  8. << "SDL_Rect(" << rect.x << ", " << rect.y << ", "
  9. << rect.w << ", " << rect.h << ")";
  10. return os;
  11. }
  12. class RenderBlendMode: NonCopyable {
  13. public:
  14. RenderBlendMode(SDL_Renderer *rnd, SDL_BlendMode mode): rnd_(rnd) {
  15. SDL_GetRenderDrawBlendMode(rnd_, &mode_);
  16. SDL_SetRenderDrawBlendMode(rnd_, mode);
  17. }
  18. ~RenderBlendMode() {
  19. SDL_SetRenderDrawBlendMode(rnd_, mode_);
  20. }
  21. private:
  22. SDL_Renderer *rnd_;
  23. SDL_BlendMode mode_;
  24. };
  25. class RenderDrawColor: NonCopyable {
  26. public:
  27. RenderDrawColor(SDL_Renderer *rnd, Uint8 r, Uint8 g, Uint8 b, Uint8 a = 255): rnd_(rnd) {
  28. SDL_GetRenderDrawColor(rnd_, &r_, &g_, &b_, &a_);
  29. SDL_SetRenderDrawColor(rnd_, r, g, b, a);
  30. }
  31. void change(Uint8 r, Uint8 g, Uint8 b, Uint8 a = 255) {
  32. SDL_SetRenderDrawColor(rnd_, r, g, b, a);
  33. }
  34. ~RenderDrawColor() {
  35. SDL_SetRenderDrawColor(rnd_, r_, g_, b_, a_);
  36. }
  37. private:
  38. SDL_Renderer *rnd_;
  39. Uint8 r_, g_, b_, a_;
  40. };
  41. class RenderClipRect: NonCopyable {
  42. public:
  43. RenderClipRect(SDL_Renderer *rnd, SDL_Rect *rect): rnd_(rnd) {
  44. enabled_ = SDL_RenderIsClipEnabled(rnd_);
  45. SDL_RenderGetClipRect(rnd_, &rect_);
  46. SDL_RenderSetClipRect(rnd_, rect);
  47. }
  48. ~RenderClipRect() {
  49. if (enabled_)
  50. SDL_RenderSetClipRect(rnd_, &rect_);
  51. else
  52. SDL_RenderSetClipRect(rnd_, nullptr);
  53. }
  54. private:
  55. SDL_Renderer *rnd_;
  56. bool enabled_;
  57. SDL_Rect rect_;
  58. };
  59. class RenderTarget: NonCopyable {
  60. public:
  61. RenderTarget(SDL_Renderer *rnd, SDL_Texture *tex): rnd_(rnd) {
  62. prevTarget_ = SDL_GetRenderTarget(rnd_);
  63. SDL_SetRenderTarget(rnd_, tex);
  64. }
  65. ~RenderTarget() {
  66. SDL_SetRenderTarget(rnd_, prevTarget_);
  67. }
  68. private:
  69. SDL_Renderer *rnd_;
  70. SDL_Texture *prevTarget_;
  71. };
  72. class TexLock: NonCopyable {
  73. public:
  74. TexLock(SDL_Texture *tex, SDL_Rect *rect = nullptr);
  75. ~TexLock() { SDL_UnlockTexture(tex_); }
  76. int blit(SDL_Rect *destrect, SDL_Surface *srcsurf, SDL_Rect *srcrect = nullptr) {
  77. return SDL_BlitSurface(srcsurf, srcrect, surf_.get(), destrect);
  78. }
  79. private:
  80. SDL_Texture *tex_;
  81. CPtr<SDL_Surface, SDL_FreeSurface> surf_;
  82. };
  83. class TexColorMod: NonCopyable {
  84. public:
  85. TexColorMod(SDL_Texture *tex, Uint8 r, Uint8 g, Uint8 b): tex_(tex) {
  86. SDL_GetTextureColorMod(tex_, &r_, &g_, &b_);
  87. SDL_SetTextureColorMod(tex_, r, g, b);
  88. }
  89. ~TexColorMod() {
  90. SDL_SetTextureColorMod(tex_, r_, g_, b_);
  91. }
  92. private:
  93. SDL_Texture *tex_;
  94. Uint8 r_, g_, b_;
  95. };
  96. class TexAlphaMod: NonCopyable {
  97. public:
  98. TexAlphaMod(SDL_Texture *tex, Uint8 alpha): tex_(tex) {
  99. SDL_GetTextureAlphaMod(tex_, &alpha_);
  100. SDL_SetTextureAlphaMod(tex_, alpha);
  101. }
  102. ~TexAlphaMod() {
  103. SDL_SetTextureAlphaMod(tex_, alpha_);
  104. }
  105. private:
  106. SDL_Texture *tex_;
  107. Uint8 alpha_;
  108. };
  109. }