added base class for screen savers

This commit is contained in:
Bob Polis 2020-10-26 23:02:47 +01:00
parent 5af3fd5b53
commit 751d079225
2 changed files with 95 additions and 0 deletions

56
ScreensaverPlugin.cpp Normal file
View File

@ -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);
}

39
ScreensaverPlugin.hpp Normal file
View File

@ -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 <cairo/cairo.h>
#include <random>
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_