diff --git a/05_sdl_alapok/main.cpp b/05_sdl_alapok/main.cpp index 14be5d2..6ec8798 100644 --- a/05_sdl_alapok/main.cpp +++ b/05_sdl_alapok/main.cpp @@ -53,7 +53,7 @@ int main(int argv, char **args) { 0, 0, 0 // Black }; - SDL_Rect colorBar; + Rect2 colorBar; colorBar.x = 0; colorBar.y = 0; colorBar.w = 90; diff --git a/05_sdl_alapok/renderer.cpp b/05_sdl_alapok/renderer.cpp index 57b6974..d838ee3 100644 --- a/05_sdl_alapok/renderer.cpp +++ b/05_sdl_alapok/renderer.cpp @@ -20,12 +20,39 @@ void Renderer::clear() { SDL_RenderClear(_renderer); } -void Renderer::draw_rect(const SDL_Rect &rect) { - SDL_RenderFillRect(_renderer, &rect); +SDL_BlendMode Renderer::get_blend_mode() const { + SDL_BlendMode mode; + SDL_GetRenderDrawBlendMode(_renderer, &mode); + + return mode; } +void Renderer::set_blend_mode(const SDL_BlendMode mode) { + SDL_SetRenderDrawBlendMode(_renderer, mode); +} + +void Renderer::draw_point(const int x, const int y) { + SDL_RenderDrawPoint(_renderer, x, y); +} +void Renderer::draw_point(const float x, const float y) { + SDL_RenderDrawPointF(_renderer, x, y); +} + +void Renderer::draw_line(const int x1, const int x2, const int y1, const int y2) { + SDL_RenderDrawLine(_renderer, x1, x2, y1, y2); +} +void Renderer::draw_line(const float x1, const float x2, const float y1, const float y2) { + SDL_RenderDrawLineF(_renderer, x1, x2, y1, y2); +} + void Renderer::draw_rect(const Rect2 &rect) { SDL_Rect r = rect.as_rect(); + SDL_RenderDrawRect(_renderer, &r); +} + +void Renderer::draw_fill_rect(const Rect2 &rect) { + SDL_Rect r = rect.as_rect(); + SDL_RenderFillRect(_renderer, &r); } @@ -99,7 +126,7 @@ int Renderer::get_dpi() const { return 1; } -int Renderer::get_size_w() const { +int Renderer::get_window_size_w() const { int w; int h; @@ -108,7 +135,7 @@ int Renderer::get_size_w() const { return w; } -int Renderer::get_size_h() const { +int Renderer::get_window_size_h() const { int w; int h; @@ -117,8 +144,111 @@ int Renderer::get_size_h() const { return h; } +int Renderer::get_size_w() const { + int w; + int h; + + SDL_RenderGetLogicalSize(_renderer, &w, &h); + + return w; +} + +int Renderer::get_size_h() const { + int w; + int h; + + SDL_RenderGetLogicalSize(_renderer, &w, &h); + + return h; +} + void Renderer::get_size(int *w, int *h) const { - SDL_GetWindowSize(_window, w, h); + SDL_RenderGetLogicalSize(_renderer, w, h); +} + +void Renderer::set_size(const int w, const int h) const { + SDL_RenderSetLogicalSize(_renderer, w, h); +} + +float Renderer::get_scale_w() const { + float w; + float h; + + SDL_RenderGetScale(_renderer, &w, &h); + + return w; +} +float Renderer::get_scale_h() const { + float w; + float h; + + SDL_RenderGetScale(_renderer, &w, &h); + + return h; +} +void Renderer::set_scale(const float w, const float h) const { + SDL_RenderSetScale(_renderer, w, h); +} +void Renderer::get_scale(float *w, float *h) const { + SDL_RenderGetScale(_renderer, w, h); +} + +bool Renderer::get_integer_scaling() const { + return SDL_RenderGetIntegerScale(_renderer); +} +void Renderer::set_integer_scaling(const bool enable) { + if (enable) + SDL_RenderSetIntegerScale(_renderer, SDL_TRUE); + else + SDL_RenderSetIntegerScale(_renderer, SDL_FALSE); +} + +Rect2 Renderer::get_viewport() const { + SDL_Rect r; + + SDL_RenderGetViewport(_renderer, &r); + + return Rect2(r.x, r.y, r.w, r.h); +} +void Renderer::set_viewport(const Rect2 &rect) const { + SDL_Rect r = rect.as_rect(); + + SDL_RenderSetViewport(_renderer, &r); +} + +Rect2 Renderer::get_clip_rect() const { + SDL_Rect r; + + SDL_RenderGetClipRect(_renderer, &r); + + return Rect2(r.x, r.y, r.w, r.h); +} +void Renderer::set_clip_rect(Rect2 *rect) const { + if (rect) { + SDL_Rect r = rect->as_rect(); + + SDL_RenderSetClipRect(_renderer, &r); + } else { + SDL_RenderSetClipRect(_renderer, nullptr); + } +} +bool Renderer::clip_rect_enabled() const { + return SDL_RenderIsClipEnabled(_renderer); +} + +bool Renderer::render_target_supported() { + return SDL_RenderTargetSupported(_renderer); +} + +SDL_Texture *Renderer::get_render_target() { + return SDL_GetRenderTarget(_renderer); +} +void Renderer::set_render_target(Texture *texture) { + if (texture) { + SDL_SetRenderTarget(_renderer, texture->get_texture()); + } else { + SDL_SetRenderTarget(_renderer, nullptr); + } } void Renderer::initialize() { diff --git a/05_sdl_alapok/renderer.h b/05_sdl_alapok/renderer.h index ac13961..5992903 100644 --- a/05_sdl_alapok/renderer.h +++ b/05_sdl_alapok/renderer.h @@ -3,8 +3,8 @@ #include "color.h" #include "rect2.h" -#include "texture.h" #include "sprite.h" +#include "texture.h" #include @@ -15,9 +15,19 @@ public: void set_draw_color(const Color &color); void clear(); - void draw_rect(const SDL_Rect &rect); + SDL_BlendMode get_blend_mode() const; + void set_blend_mode(const SDL_BlendMode mode); + + void draw_point(const int x, const int y); + void draw_point(const float x, const float y); + + void draw_line(const int x1, const int x2, const int y1, const int y2); + void draw_line(const float x1, const float x2, const float y1, const float y2); + void draw_rect(const Rect2 &rect); + void draw_fill_rect(const Rect2 &rect); + void draw_texture(const Texture &texture, const Rect2 &dst_rect); void draw_texture(const Texture &texture, const Rect2 &src_rect, const Rect2 &dst_rect); void draw_texture(const Texture &texture, const Rect2 &src_rect, const Rect2 &dst_rect, const double angle, const float cx = 0, const float cy = 0, const SDL_RendererFlip flip = SDL_FLIP_NONE); @@ -25,10 +35,33 @@ public: void draw_sprite(const Sprite &sprite); int get_dpi() const; + int get_window_size_w() const; + int get_window_size_h() const; int get_size_w() const; int get_size_h() const; + void set_size(const int w, const int h) const; void get_size(int *w, int *h) const; + float get_scale_w() const; + float get_scale_h() const; + void set_scale(const float w, const float h) const; + void get_scale(float *w, float *h) const; + + bool get_integer_scaling() const; + void set_integer_scaling(const bool enable); + + Rect2 get_viewport() const; + void set_viewport(const Rect2 &rect) const; + + Rect2 get_clip_rect() const; + void set_clip_rect(Rect2 *rect) const; + bool clip_rect_enabled() const; + + bool render_target_supported(); + + SDL_Texture *get_render_target(); + void set_render_target(Texture *texture); + void initialize(); void destroy(); diff --git a/05_sdl_alapok/texture.cpp b/05_sdl_alapok/texture.cpp index 08ad096..c2203dc 100644 --- a/05_sdl_alapok/texture.cpp +++ b/05_sdl_alapok/texture.cpp @@ -141,6 +141,14 @@ SDL_Texture *Texture::get_texture() const { return _texture; } +bool Texture::is_render_target() { + if (_texture == Renderer::get_singleton()->get_render_target()) { + return true; + } + + return false; +} + Texture::Texture() { _image = nullptr; _texture = nullptr; diff --git a/05_sdl_alapok/texture.h b/05_sdl_alapok/texture.h index 75ee116..1f94253 100644 --- a/05_sdl_alapok/texture.h +++ b/05_sdl_alapok/texture.h @@ -30,6 +30,8 @@ public: SDL_Texture *get_texture(); SDL_Texture *get_texture() const; + bool is_render_target(); + Texture(); Texture(Image *image); virtual ~Texture();