moved all sources into src directory
This commit is contained in:
83
src/Color.cpp
Normal file
83
src/Color.cpp
Normal 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
36
src/Color.hpp
Normal 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
64
src/ScreensaverPlugin.cpp
Normal 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
38
src/ScreensaverPlugin.hpp
Normal 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_
|
Reference in New Issue
Block a user