Mercurial > malikania
changeset 213:61580ff3138a
client: add stack based painter
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 27 Feb 2019 13:39:12 +0100 |
parents | e50f51702df4 |
children | e2574aa8301d |
files | libmlk-client/malikania/client/painter.cpp libmlk-client/malikania/client/painter.hpp mlk-client/main.cpp |
diffstat | 3 files changed, 51 insertions(+), 71 deletions(-) [+] |
line wrap: on
line diff
--- a/libmlk-client/malikania/client/painter.cpp Fri Jan 04 18:26:04 2019 +0100 +++ b/libmlk-client/malikania/client/painter.cpp Wed Feb 27 13:39:12 2019 +0100 @@ -29,17 +29,24 @@ namespace mlk::client { painter::painter(window& win) noexcept - : renderer_(win.get_renderer()) + : previous_(SDL_GetRenderTarget(win.get_renderer())) + , renderer_(win.get_renderer()) { SDL_SetRenderTarget(renderer_, nullptr); } painter::painter(window& win, texture& texture) noexcept - : renderer_(win.get_renderer()) + : previous_(SDL_GetRenderTarget(win.get_renderer())) + , renderer_(win.get_renderer()) { SDL_SetRenderTarget(renderer_, texture.get_texture()); } +painter::~painter() noexcept +{ + SDL_SetRenderTarget(renderer_, previous_); +} + void painter::use(window& win) noexcept { SDL_SetRenderTarget(win.get_renderer(), nullptr);
--- a/libmlk-client/malikania/client/painter.hpp Fri Jan 04 18:26:04 2019 +0100 +++ b/libmlk-client/malikania/client/painter.hpp Wed Feb 27 13:39:12 2019 +0100 @@ -44,6 +44,7 @@ */ class painter { private: + SDL_Texture* previous_{nullptr}; SDL_Renderer* renderer_{nullptr}; public: @@ -55,6 +56,11 @@ painter(window& win) noexcept; /** + * Reset the painter target to the previous texture. + */ + ~painter() noexcept; + + /** * Start painting on the texture. * * \param win the window
--- a/mlk-client/main.cpp Fri Jan 04 18:26:04 2019 +0100 +++ b/mlk-client/main.cpp Wed Feb 27 13:39:12 2019 +0100 @@ -24,85 +24,52 @@ #include <malikania/client/button.hpp> #include <malikania/client/window.hpp> #include <malikania/client/painter.hpp> +#include <malikania/client/texture.hpp> +#include <malikania/rectangle.hpp> using namespace std::chrono_literals; int main(int argc, char** argv) { - mlk::client::window win(1920/2, 1080/2); - mlk::client::painter painter(win); - mlk::client::button button("click me"); + mlk::client::window win{500, 500}; + mlk::client::painter painter{win}; + + // global window painter + painter.set_drawing_color({255, 255, 255, 255}); + painter.clear(); + + mlk::client::texture red{painter, 100, 100}; + mlk::client::texture blue{painter, 50, 50}; + mlk::client::texture green{painter, 25, 25}; + + { + mlk::client::painter pred{win, red}; - button.set_size({200, 64}); - button.set_position({50, 50}); - button.set_on_press([] { - std::cout << "je suis clické" << std::endl; - }); + pred.set_drawing_color({255, 0, 0, 255}); + pred.clear(); + + { + mlk::client::painter pblue{win, blue}; + + pblue.set_drawing_color({0, 0, 255, 255}); + pblue.clear(); - for (;;) { - while (auto ev = win.poll()) { - if (std::get_if<mlk::client::quit_event>(&ev)) - goto end; - else - button.handle_event(ev); + { + mlk::client::painter pgreen{win, green}; + + pgreen.set_drawing_color({0, 255, 0, 255}); + pgreen.clear(); + + } + + green.draw(pblue, {25/2, 25/2}); } - painter.set_drawing_color(mlk::client::color::from_hex(0xffffffff)); - painter.clear(); - button.draw(painter); - painter.present(); - - std::this_thread::sleep_for(50ms); + blue.draw(pred, {25, 25}); } -end: - return 0; -} - -#if 0 - -#include <cerrno> -#include <cstring> -#include <fstream> -#include <iostream> -#include <iterator> - -#include <malikania/client/js/context.hpp> - -// Simple javascript startup file. Don't delete. - -int main(int argc, char** argv) -{ - -- argc; - ++ argv; - - if (argc == 0) { - std::cerr << "usage: mlk-client main.js" << std::endl; - return 1; - } + red.draw(painter, {200, 200}); + painter.present(); - try { - mlk::client::js::context ctx; - std::ifstream input(argv[0]); - std::string script( - std::istreambuf_iterator<char>(input.rdbuf()), - std::istreambuf_iterator<char>() - ); - - if (!input) - throw std::runtime_error(std::strerror(errno)); - if (duk_peval_string(ctx, script.c_str())) - throw mlk::js::duk::get_stack(ctx, -1); - } catch (const mlk::js::duk::stack_info& ex) { - std::cerr << argv[0] << ":" << ex.get_line_number() << ": " << ex.what() << std::endl; - std::cerr << ex.get_stack() << std::endl; - return 1; - } catch (const std::exception& ex) { - std::cerr << "abort: " << ex.what() << std::endl; - return 1; - } - - return 0; + std::this_thread::sleep_for(5s); } - -#endif