Initial commit
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
*.o.*
|
||||||
|
*.d.*
|
||||||
|
*.a.*
|
||||||
|
.*.swp
|
||||||
|
.AppleDouble
|
||||||
|
lib
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "Makefiles"]
|
||||||
|
path = Makefiles
|
||||||
|
url = https://gogs.dierkse.nl/JDierkse/Makefiles.git
|
||||||
+338
@@ -0,0 +1,338 @@
|
|||||||
|
#include "Color.h"
|
||||||
|
#include <StringAlgorithm.h>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Color {
|
||||||
|
|
||||||
|
Color::Color(const Color::HSL& hsl) :
|
||||||
|
m_hsl(hsl)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Color::Color(const Color::RGB& rgb) :
|
||||||
|
m_hsl(rgbToHSL(rgb))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Color Color::FromHSL(int hue, int saturation, int luminance)
|
||||||
|
{
|
||||||
|
return Color(HSL{Conversion::Hue(hue), Conversion::Saturation(saturation), Conversion::Luminance(luminance)});
|
||||||
|
}
|
||||||
|
|
||||||
|
Color Color::FromHSLString(const std::string& hslString)
|
||||||
|
{
|
||||||
|
std::vector<std::string> tokens = StringAlgorithm::split(hslString, '-');
|
||||||
|
return Color(HSL{Conversion::Hue(Conversion::Hue(tokens[0])), Conversion::Saturation(Conversion::Saturation(tokens[1])), Conversion::Luminance(Conversion::Luminance(tokens[2]))});
|
||||||
|
}
|
||||||
|
|
||||||
|
Color Color::FromRGB(int red, int green, int blue)
|
||||||
|
{
|
||||||
|
return Color(RGB{Conversion::Red(red), Conversion::Green(green), Conversion::Blue(blue)});
|
||||||
|
}
|
||||||
|
|
||||||
|
Color Color::FromRGBString(const std::string& rgbString)
|
||||||
|
{
|
||||||
|
std::vector<std::string> tokens = StringAlgorithm::split(rgbString, '-');
|
||||||
|
return Color(RGB{Conversion::Red(Conversion::Red(tokens[0])), Conversion::Green(Conversion::Green(tokens[1])), Conversion::Blue(Conversion::Blue(tokens[2]))});
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Hue() const
|
||||||
|
{
|
||||||
|
return Conversion::Hue(m_hsl.hue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Hue(int hue)
|
||||||
|
{
|
||||||
|
Hue(Conversion::Hue(hue));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Hue(double hue)
|
||||||
|
{
|
||||||
|
m_hsl.hue = hue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Saturation() const
|
||||||
|
{
|
||||||
|
return Conversion::Saturation(m_hsl.saturation);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Saturation(int saturation)
|
||||||
|
{
|
||||||
|
Saturation(Conversion::Saturation(saturation));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Saturation(double saturation)
|
||||||
|
{
|
||||||
|
m_hsl.saturation = saturation;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Luminance() const
|
||||||
|
{
|
||||||
|
return Conversion::Luminance(m_hsl.luminance);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Luminance(int luminance)
|
||||||
|
{
|
||||||
|
Luminance(Conversion::Luminance(luminance));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Luminance(double luminance)
|
||||||
|
{
|
||||||
|
m_hsl.luminance = luminance;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Color::HSLString() const
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << std::setw(3) << std::setfill('0') << Hue();
|
||||||
|
ss << "-";
|
||||||
|
ss << std::setw(3) << std::setfill('0') << Saturation();
|
||||||
|
ss << "-";
|
||||||
|
ss << std::setw(3) << std::setfill('0') << Luminance();
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Red() const
|
||||||
|
{
|
||||||
|
RGB rgb = hslToRGB(m_hsl);
|
||||||
|
return Conversion::Red(rgb.red);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Red(int red)
|
||||||
|
{
|
||||||
|
RGB rgb = hslToRGB(m_hsl);
|
||||||
|
rgb.red = Conversion::Red(red);
|
||||||
|
m_hsl = rgbToHSL(rgb);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Red(double red)
|
||||||
|
{
|
||||||
|
RGB rgb = hslToRGB(m_hsl);
|
||||||
|
rgb.red = red;
|
||||||
|
m_hsl = rgbToHSL(rgb);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Green() const
|
||||||
|
{
|
||||||
|
RGB rgb = hslToRGB(m_hsl);
|
||||||
|
return Conversion::Green(rgb.green);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Green(int green)
|
||||||
|
{
|
||||||
|
RGB rgb = hslToRGB(m_hsl);
|
||||||
|
rgb.green = Conversion::Green(green);
|
||||||
|
m_hsl = rgbToHSL(rgb);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Green(double green)
|
||||||
|
{
|
||||||
|
RGB rgb = hslToRGB(m_hsl);
|
||||||
|
rgb.green = green;
|
||||||
|
m_hsl = rgbToHSL(rgb);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Blue() const
|
||||||
|
{
|
||||||
|
RGB rgb = hslToRGB(m_hsl);
|
||||||
|
return Conversion::Blue(rgb.blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Blue(int blue)
|
||||||
|
{
|
||||||
|
RGB rgb = hslToRGB(m_hsl);
|
||||||
|
rgb.blue = Conversion::Blue(blue);
|
||||||
|
m_hsl = rgbToHSL(rgb);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Color::Blue(double blue)
|
||||||
|
{
|
||||||
|
RGB rgb = hslToRGB(m_hsl);
|
||||||
|
rgb.blue = blue;
|
||||||
|
m_hsl = rgbToHSL(rgb);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Color::RGBString() const
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << std::setw(3) << std::setfill('0') << Red();
|
||||||
|
ss << "-";
|
||||||
|
ss << std::setw(3) << std::setfill('0') << Green();
|
||||||
|
ss << "-";
|
||||||
|
ss << std::setw(3) << std::setfill('0') << Blue();
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
double Color::Conversion::Hue(int hue)
|
||||||
|
{
|
||||||
|
return static_cast<double>(hue) / m_hueFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Hue(double hue)
|
||||||
|
{
|
||||||
|
return static_cast<int>(hue * m_hueFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Hue(const std::string& hue)
|
||||||
|
{
|
||||||
|
return std::stoi(hue);
|
||||||
|
}
|
||||||
|
|
||||||
|
double Color::Conversion::Saturation(int saturation)
|
||||||
|
{
|
||||||
|
return static_cast<double>(saturation) / m_saturationFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Saturation(double saturation)
|
||||||
|
{
|
||||||
|
return static_cast<int>(saturation * m_saturationFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Saturation(const std::string& saturation)
|
||||||
|
{
|
||||||
|
return std::stoi(saturation);
|
||||||
|
}
|
||||||
|
|
||||||
|
double Color::Conversion::Luminance(int luminance)
|
||||||
|
{
|
||||||
|
return static_cast<double>(luminance) / m_luminanceFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Luminance(double luminance)
|
||||||
|
{
|
||||||
|
return static_cast<int>(luminance * m_luminanceFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Luminance(const std::string& luminance)
|
||||||
|
{
|
||||||
|
return std::stoi(luminance);
|
||||||
|
}
|
||||||
|
|
||||||
|
double Color::Conversion::Red(int red)
|
||||||
|
{
|
||||||
|
return static_cast<double>(red) / m_redFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Red(double red)
|
||||||
|
{
|
||||||
|
return static_cast<int>(red * m_redFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Red(const std::string& red)
|
||||||
|
{
|
||||||
|
return std::stoi(red);
|
||||||
|
}
|
||||||
|
|
||||||
|
double Color::Conversion::Green(int green)
|
||||||
|
{
|
||||||
|
return static_cast<double>(green) / m_greenFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Green(double green)
|
||||||
|
{
|
||||||
|
return static_cast<int>(green * m_greenFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Green(const std::string& green)
|
||||||
|
{
|
||||||
|
return std::stoi(green);
|
||||||
|
}
|
||||||
|
|
||||||
|
double Color::Conversion::Blue(int blue)
|
||||||
|
{
|
||||||
|
return static_cast<double>(blue) / m_blueFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Blue(double blue)
|
||||||
|
{
|
||||||
|
return static_cast<int>(blue * m_blueFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Color::Conversion::Blue(const std::string& blue)
|
||||||
|
{
|
||||||
|
return std::stoi(blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
Color::HSL Color::rgbToHSL(const Color::RGB& rgb)
|
||||||
|
{
|
||||||
|
double min = rgb.red < rgb.green? rgb.red: rgb.green;
|
||||||
|
min = min < rgb.blue? min: rgb.blue;
|
||||||
|
|
||||||
|
double max = rgb.red > rgb.green? rgb.red: rgb.green;
|
||||||
|
max = max > rgb.blue? max: rgb.blue;
|
||||||
|
|
||||||
|
double luminance = max;
|
||||||
|
double delta = max - min;
|
||||||
|
if (delta < 0.00001)
|
||||||
|
return HSL{0, 0, 0};
|
||||||
|
|
||||||
|
if (max <= 0.0)
|
||||||
|
return HSL{0, 0, 0};
|
||||||
|
|
||||||
|
double saturation = (delta / max);
|
||||||
|
double hue;
|
||||||
|
|
||||||
|
if (rgb.red >= max)
|
||||||
|
{
|
||||||
|
hue = (rgb.green - rgb.blue) / delta;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (rgb.green >= max)
|
||||||
|
hue = 2.0 + (rgb.blue - rgb.red) / delta;
|
||||||
|
else
|
||||||
|
hue = 4.0 + (rgb.red - rgb.green) / delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
hue *= 60.0;
|
||||||
|
|
||||||
|
if (hue < 0.0)
|
||||||
|
hue += 360.0;
|
||||||
|
|
||||||
|
hue /= 360;
|
||||||
|
|
||||||
|
return Color::HSL{hue, saturation, luminance};
|
||||||
|
}
|
||||||
|
|
||||||
|
Color::RGB Color::hslToRGB(const Color::HSL& hsl)
|
||||||
|
{
|
||||||
|
double red, green, blue;
|
||||||
|
|
||||||
|
if (hsl.saturation <= 0.0)
|
||||||
|
return Color::RGB{hsl.luminance, hsl.luminance, hsl.luminance};
|
||||||
|
|
||||||
|
double hue = hsl.hue * 360;
|
||||||
|
if (hue >= 360.0)
|
||||||
|
hue = 0.0;
|
||||||
|
|
||||||
|
hue /= 60.0;
|
||||||
|
|
||||||
|
long i = static_cast<long>(hue);
|
||||||
|
double ff = hue - i;
|
||||||
|
double p = hsl.luminance * (1.0 - hsl.saturation);
|
||||||
|
double q = hsl.luminance * (1.0 - (hsl.saturation * ff));
|
||||||
|
double t = hsl.luminance * (1.0 - (hsl.saturation * (1.0 - ff)));
|
||||||
|
|
||||||
|
switch(i)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return Color::RGB{hsl.luminance, t, p};
|
||||||
|
case 1:
|
||||||
|
return Color::RGB{q, hsl.luminance, p};
|
||||||
|
case 2:
|
||||||
|
return Color::RGB{p, hsl.luminance, t};
|
||||||
|
case 3:
|
||||||
|
return Color::RGB{p, q, hsl.luminance};
|
||||||
|
case 4:
|
||||||
|
return Color::RGB{t, p, hsl.luminance};
|
||||||
|
case 5:
|
||||||
|
default:
|
||||||
|
return Color::RGB{hsl.luminance, p, q};
|
||||||
|
}
|
||||||
|
|
||||||
|
return Color::RGB{0, 0, 0};
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Color
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../Makefile
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../../Utilities
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#
|
||||||
|
# Makefile.conf
|
||||||
|
#
|
||||||
|
|
||||||
|
LFLAGS += -lUtilities
|
||||||
|
LFLAGS += -L$(ROOTPATH)/Libraries/Utilities/lib/$(ARCH)
|
||||||
|
CFLAGS += -I$(ROOTPATH)/Libraries/Utilities/include
|
||||||
|
|
||||||
|
LFLAGS += -lColor
|
||||||
|
LFLAGS += -L$(ROOTPATH)/lib/$(ARCH)
|
||||||
|
CFLAGS += -I$(ROOTPATH) -I$(ROOTPATH)/include
|
||||||
|
|
||||||
|
DEBUGDIR := .debug
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#
|
||||||
|
# Makefile.target
|
||||||
|
#
|
||||||
|
|
||||||
|
Color.a.$(ARCH) : $(OBJECTS)
|
||||||
|
$(call build_target_library_arch,$@,$^)
|
||||||
|
|
||||||
|
Color.a:
|
||||||
|
$(call build_target,$@)
|
||||||
|
|
||||||
|
.DEFAULT_GOAL := Color.a
|
||||||
|
|
||||||
|
TARGETS += Color.a
|
||||||
Submodule
+1
Submodule Makefiles added at cd9ef1a1b0
+108
@@ -0,0 +1,108 @@
|
|||||||
|
#ifndef COLOR_H
|
||||||
|
#define COLOR_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Color {
|
||||||
|
|
||||||
|
class Color
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Color() = default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static Color FromHSL(int hue, int saturation, int luminance);
|
||||||
|
static Color FromHSLString(const std::string& hslString);
|
||||||
|
static Color FromRGB(int red, int green, int blue);
|
||||||
|
static Color FromRGBString(const std::string& rgbString);
|
||||||
|
|
||||||
|
public:
|
||||||
|
int Hue() const;
|
||||||
|
void Hue(int hue);
|
||||||
|
void Hue(double hue);
|
||||||
|
int Saturation() const;
|
||||||
|
void Saturation(int saturation);
|
||||||
|
void Saturation(double saturation);
|
||||||
|
int Luminance() const;
|
||||||
|
void Luminance(int luminance);
|
||||||
|
void Luminance(double luminance);
|
||||||
|
std::string HSLString() const;
|
||||||
|
|
||||||
|
int Red() const;
|
||||||
|
void Red(int red);
|
||||||
|
void Red(double red);
|
||||||
|
int Green() const;
|
||||||
|
void Green(int green);
|
||||||
|
void Green(double green);
|
||||||
|
int Blue() const;
|
||||||
|
void Blue(int blue);
|
||||||
|
void Blue(double blue);
|
||||||
|
std::string RGBString() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct HSL
|
||||||
|
{
|
||||||
|
double hue;
|
||||||
|
double saturation;
|
||||||
|
double luminance;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RGB
|
||||||
|
{
|
||||||
|
double red;
|
||||||
|
double green;
|
||||||
|
double blue;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Conversion
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Conversion() = delete;
|
||||||
|
~Conversion() = delete;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static double Hue(int hue);
|
||||||
|
static int Hue(double hue);
|
||||||
|
static int Hue(const std::string& hue);
|
||||||
|
static double Saturation(int saturation);
|
||||||
|
static int Saturation(double saturation);
|
||||||
|
static int Saturation(const std::string& saturation);
|
||||||
|
static double Luminance(int luminance);
|
||||||
|
static int Luminance(double luminance);
|
||||||
|
static int Luminance(const std::string& luminance);
|
||||||
|
|
||||||
|
static double Red(int red);
|
||||||
|
static int Red(double red);
|
||||||
|
static int Red(const std::string& red);
|
||||||
|
static double Green(int green);
|
||||||
|
static int Green(double green);
|
||||||
|
static int Green(const std::string& green);
|
||||||
|
static double Blue(int blue);
|
||||||
|
static int Blue(double blue);
|
||||||
|
static int Blue(const std::string& blue);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static const int m_hueFactor = 255;
|
||||||
|
static const int m_saturationFactor = 255;
|
||||||
|
static const int m_luminanceFactor = 255;
|
||||||
|
static const int m_redFactor = 255;
|
||||||
|
static const int m_greenFactor = 255;
|
||||||
|
static const int m_blueFactor = 255;
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
Color(const Color::HSL& hsl);
|
||||||
|
Color(const Color::RGB& rgb);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static Color::HSL rgbToHSL(const Color::RGB& rgb);
|
||||||
|
static Color::RGB hslToRGB(const Color::HSL& hsl);
|
||||||
|
|
||||||
|
private:
|
||||||
|
HSL m_hsl;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Color
|
||||||
|
|
||||||
|
#endif // COLOR_H
|
||||||
Reference in New Issue
Block a user