A 2D tile-based sandbox game.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

gfxutil.h 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include <SDL2/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. ~RenderDrawColor() {
  32. SDL_SetRenderDrawColor(rnd_, r_, g_, b_, a_);
  33. }
  34. private:
  35. SDL_Renderer *rnd_;
  36. Uint8 r_, g_, b_, a_;
  37. };
  38. class RenderClipRect: NonCopyable {
  39. public:
  40. RenderClipRect(SDL_Renderer *rnd, SDL_Rect *rect): rnd_(rnd) {
  41. enabled_ = SDL_RenderIsClipEnabled(rnd_);
  42. SDL_RenderGetClipRect(rnd_, &rect_);
  43. SDL_RenderSetClipRect(rnd_, rect);
  44. }
  45. ~RenderClipRect() {
  46. if (enabled_)
  47. SDL_RenderSetClipRect(rnd_, &rect_);
  48. else
  49. SDL_RenderSetClipRect(rnd_, nullptr);
  50. }
  51. private:
  52. SDL_Renderer *rnd_;
  53. bool enabled_;
  54. SDL_Rect rect_;
  55. };
  56. class RenderTarget: NonCopyable {
  57. public:
  58. RenderTarget(SDL_Renderer *rnd, SDL_Texture *tex): rnd_(rnd) {
  59. prev_target_ = SDL_GetRenderTarget(rnd_);
  60. SDL_SetRenderTarget(rnd_, tex);
  61. }
  62. ~RenderTarget() {
  63. SDL_SetRenderTarget(rnd_, prev_target_);
  64. }
  65. private:
  66. SDL_Renderer *rnd_;
  67. SDL_Texture *prev_target_;
  68. };
  69. class TexLock: NonCopyable {
  70. public:
  71. TexLock(SDL_Texture *tex, SDL_Rect *rect = nullptr);
  72. ~TexLock() { SDL_UnlockTexture(tex_); }
  73. int blit(SDL_Rect *destrect, SDL_Surface *srcsurf, SDL_Rect *srcrect = nullptr) {
  74. return SDL_BlitSurface(srcsurf, srcrect, surf_.get(), destrect);
  75. }
  76. private:
  77. SDL_Texture *tex_;
  78. CPtr<SDL_Surface, SDL_FreeSurface> surf_;
  79. };
  80. class TexColorMod: NonCopyable {
  81. public:
  82. TexColorMod(SDL_Texture *tex, Uint8 r, Uint8 g, Uint8 b): tex_(tex) {
  83. SDL_GetTextureColorMod(tex_, &r_, &g_, &b_);
  84. SDL_SetTextureColorMod(tex_, r, g, b);
  85. }
  86. ~TexColorMod() {
  87. SDL_SetTextureColorMod(tex_, r_, g_, b_);
  88. }
  89. private:
  90. SDL_Texture *tex_;
  91. Uint8 r_, g_, b_;
  92. };
  93. class TexAlphaMod: NonCopyable {
  94. public:
  95. TexAlphaMod(SDL_Texture *tex, Uint8 alpha): tex_(tex) {
  96. SDL_GetTextureAlphaMod(tex_, &alpha_);
  97. SDL_SetTextureAlphaMod(tex_, alpha);
  98. }
  99. ~TexAlphaMod() {
  100. SDL_SetTextureAlphaMod(tex_, alpha_);
  101. }
  102. private:
  103. SDL_Texture *tex_;
  104. Uint8 alpha_;
  105. };
  106. }