From 751d079225dbbb29a6c1f0fdb4c1c8068260a950 Mon Sep 17 00:00:00 2001 From: Bob Polis Date: Mon, 26 Oct 2020 23:02:47 +0100 Subject: [PATCH] added base class for screen savers --- ScreensaverPlugin.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++ ScreensaverPlugin.hpp | 39 ++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 ScreensaverPlugin.cpp create mode 100644 ScreensaverPlugin.hpp diff --git a/ScreensaverPlugin.cpp b/ScreensaverPlugin.cpp new file mode 100644 index 0000000..c80a4a4 --- /dev/null +++ b/ScreensaverPlugin.cpp @@ -0,0 +1,56 @@ +// +// ScreensaverPlugin.cpp +// tmp +// +// Created by Bob Polis at 2020-10-26 +// Copyright (c) 2020 SwiftCoder. All rights reserved. +// + +#include "ScreensaverPlugin.hpp" + +ScreensaverPlugin::ScreensaverPlugin(cairo_t* context, const cairo_rectangle_t& rect) + : _c {context}, _r {rect}, _x_dist {rect.x, rect.width}, _y_dist {rect.y, rect.height} { + +} + +void ScreensaverPlugin::make_black() { + cairo_set_source_rgb(_c, 0, 0, 0); + cairo_rectangle(_c, 0, 0, _r.width, _r.height); + cairo_fill(_c); +} + +cairo_rectangle_t ScreensaverPlugin::random_rect() { + cairo_rectangle_t rect; + double v1, v2; + v1 = random_x(); + v2 = random_x(); + if (v1 < v2) { + rect.x = v1; + rect.width = v2 - v1; + } else { + rect.x = v2; + rect.width = v1 - v2; + } + v1 = random_y(); + v2 = random_y(); + if (v1 < v2) { + rect.y = v1; + rect.height = v2 - v1; + } else { + rect.y = v2; + rect.height = v1 - v2; + } + return rect; +} + +double ScreensaverPlugin::random_x() { + return _x_dist(_eng); +} + +double ScreensaverPlugin::random_y() { + return _y_dist(_eng); +} + +double ScreensaverPlugin::random01() { + return _01_dist(_eng); +} diff --git a/ScreensaverPlugin.hpp b/ScreensaverPlugin.hpp new file mode 100644 index 0000000..22a505f --- /dev/null +++ b/ScreensaverPlugin.hpp @@ -0,0 +1,39 @@ +// +// ScreensaverPlugin.hpp +// screensaver +// +// Created by Bob Polis at 2020-10-26 +// Copyright (c) 2020 SwiftCoder. All rights reserved. +// + +#ifndef _ScreensaverPlugin_H_ +#define _ScreensaverPlugin_H_ + +#include +#include + +class ScreensaverPlugin { + public: + ScreensaverPlugin(cairo_t* context, const cairo_rectangle_t& rect); + virtual ~ScreensaverPlugin() = default; + + virtual void draw_frame() = 0; + virtual int fps() const = 0; + + protected: + cairo_t* _c; + cairo_rectangle_t _r; + std::random_device _dev; + std::default_random_engine _eng {_dev()}; + std::uniform_real_distribution<> _01_dist {}; + std::uniform_real_distribution<> _x_dist; + std::uniform_real_distribution<> _y_dist; + + void make_black(); + cairo_rectangle_t random_rect(); + double random_x(); + double random_y(); + double random01(); +}; + +#endif // _ScreensaverPlugin_H_