moved all sources into src directory

This commit is contained in:
Bob Polis
2020-11-10 21:32:59 +01:00
parent 9804b09fb1
commit a85eb6b01b
4 changed files with 0 additions and 0 deletions

83
src/Color.cpp Normal file
View File

@ -0,0 +1,83 @@
//
// Color.cpp
// screensaver
//
// Created by Bob Polis at 2020-10-27
// Copyright (c) 2020 SwiftCoder. All rights reserved.
//
#include "Color.hpp"
#include <algorithm>
#include <cmath>
Color::Color(const RGB& rgb) : _rgb {rgb} {}
Color::Color(const HSB& hsb) {
if (hsb.s <= 0) {
_rgb.r = _rgb.g = _rgb.b = hsb.b;
} else {
double hi = hsb.h / 60;
int i = static_cast<int>(hi);
double f = hi - i;
double p = hsb.b * (1.0 - hsb.s);
double q = hsb.b * (1.0 - (hsb.s * f));
double t = hsb.b * (1.0 - (hsb.s * (1.0 -f)));
switch (i) {
case 0:
_rgb.r = hsb.b;
_rgb.g = t;
_rgb.b = p;
break;
case 1:
_rgb.r = q;
_rgb.g = hsb.b;
_rgb.b = p;
break;
case 2:
_rgb.r = p;
_rgb.g = hsb.b;
_rgb.b = t;
break;
case 3:
_rgb.r = p;
_rgb.g = q;
_rgb.b = hsb.b;
break;
case 4:
_rgb.r = t;
_rgb.g = p;
_rgb.b = hsb.b;
break;
case 5:
default:
_rgb.r = hsb.b;
_rgb.g = p;
_rgb.b = q;
break;
}
}
}
Color::operator HSB() const {
HSB hsb;
double rgb_max = std::max<double>({_rgb.r, _rgb.g, _rgb.b});
double rgb_min = std::min<double>({_rgb.r, _rgb.g, _rgb.b});
double delta = rgb_max - rgb_min;
if (delta < 0.00001) {
hsb.h = 0;
hsb.s = 0;
hsb.b = rgb_max;
return hsb;
}
if (_rgb.r >= rgb_max) { // between yellow and magenta
hsb.h = (_rgb.g - _rgb.b) / delta;
} else if (_rgb.g >= rgb_max) { // between cyan and yellow
hsb.h = 2.0 + (_rgb.b - _rgb.r) / delta;
} else { // between magenta and cyan
hsb.h = 4.0 + (_rgb.r - _rgb.g) / delta;
}
hsb.h *= 60;
hsb.s = rgb_max > 0.0 ? delta / rgb_max : 0;
hsb.b = rgb_max;
return hsb;
}

36
src/Color.hpp Normal file
View File

@ -0,0 +1,36 @@
//
// Color.hpp
// screensaver
//
// Created by Bob Polis at 2020-10-27
// Copyright (c) 2020 SwiftCoder. All rights reserved.
//
#ifndef _Color_H_
#define _Color_H_
struct RGB {
double r;
double g;
double b;
};
struct HSB {
double h;
double s;
double b;
};
class Color {
public:
Color(const RGB& rgb);
Color(const HSB& hsb);
operator RGB() const { return _rgb; }
operator HSB() const;
private:
RGB _rgb;
};
#endif // _Color_H_

64
src/ScreensaverPlugin.cpp Normal file
View File

@ -0,0 +1,64 @@
//
// ScreensaverPlugin.cpp
// tmp
//
// Created by Bob Polis at 2020-10-26
// Copyright (c) 2020 SwiftCoder. All rights reserved.
//
#include "ScreensaverPlugin.hpp"
void ScreensaverPlugin::setup(cairo_t* context, const cairo_rectangle_t& rect) {
_c = context;
_r = rect;
make_black();
}
int ScreensaverPlugin::fps() const {
return 30;
}
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() {
std::uniform_real_distribution<double> dist {0, _r.width};
return dist(_eng);
}
double ScreensaverPlugin::random_y() {
std::uniform_real_distribution<double> dist {0, _r.height};
return dist(_eng);
}
double ScreensaverPlugin::random01() {
std::uniform_real_distribution<double> dist {};
return dist(_eng);
}

38
src/ScreensaverPlugin.hpp Normal file
View File

@ -0,0 +1,38 @@
//
// 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() = default;
virtual ~ScreensaverPlugin() = default;
virtual void setup(cairo_t* context, const cairo_rectangle_t& rect);
virtual int fps() const;
virtual void draw_frame() = 0;
protected:
cairo_t* _c {nullptr};
cairo_rectangle_t _r {};
std::random_device _dev {};
std::default_random_engine _eng {_dev()};
void make_black();
cairo_rectangle_t random_rect();
double random_x();
double random_y();
double random01();
};
#endif // _ScreensaverPlugin_H_