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