-
Notifications
You must be signed in to change notification settings - Fork 3
/
HSVColorHelper.cpp
99 lines (83 loc) · 2.33 KB
/
HSVColorHelper.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "pch.h"
#include "HSVColorHelper.h"
#include <winrt/Windows.UI.h>
#include <winrt/Microsoft.UI.h>
#include <deps/gsl/include/gsl/gsl>
#include <directxmath.h>
#include "Log.h"
// Adapted from https://www.cs.rit.edu/~ncs/color/t_convert.html#RGB%20to%20XYZ%20&%20XYZ%20to%20RGB
[[nodiscard]] winrt::Windows::UI::Color HSVColorHelper::HSVtoColor(float h, float s, float v)
{
if (h > 360.0f)
{
return winrt::Windows::UI::Colors::Black();
}
if (s == 0)
{
return winrt::Windows::UI::Colors::Black();
}
//ML_TRACE("HSV color is: {}, {}, {}", h, s, v);
const DirectX::XMFLOAT4 hsv{h / 360.0f, s, v, 0.0f };
const DirectX::XMVECTOR hsvv {DirectX::XMLoadFloat4(&hsv)};
const DirectX::XMVECTOR rgbv {DirectX::XMColorHSVToRGB(hsvv)};
DirectX::XMFLOAT4A rgb;
DirectX::XMStoreFloat4A(&rgb, rgbv);
rgb.x = rgb.x * 255.0f;
rgb.y = rgb.y * 255.0f;
rgb.z = rgb.z * 255.0f;
winrt::Windows::UI::Color colorDX = winrt::Microsoft::UI::ColorHelper::FromArgb(255, (uint8_t)std::lround(rgb.x), (uint8_t)std::lround(rgb.y), (uint8_t)std::lround(rgb.z));
//ML_TRACE("DX color is: {}, {}, {}", rgb.x, rgb.y, rgb.z);
return colorDX;
/*h /= 60;
const int i{ gsl::narrow_cast<int>(std::floor(h)) };
const float f{ h - i };
const float p{ v * (1 - s) };
const float q{ v * (1 - s * f) };
const float t{ v * (1 - s * (1 - f)) };
float dr{ 0.0f };
float dg{ 0.0f };
float db{ 0.0f };
switch (i)
{
case 0:
dr = v;
dg = t;
db = p;
break;
case 1:
dr = q;
dg = v;
db = p;
break;
case 2:
dr = p;
dg = v;
db = t;
break;
case 3:
dr = p;
dg = q;
db = v;
break;
case 4:
dr = t;
dg = p;
db = v;
break;
case 5:
dr = v;
dg = p;
db = q;
break;
default:
dr = v;
dg = v;
db = v;
break;
}
const uint8_t r{ gsl::narrow_cast<uint8_t>(dr * 255) };
const uint8_t g{ gsl::narrow_cast<uint8_t>(dg * 255) };
const uint8_t b{ gsl::narrow_cast<uint8_t>(db * 255) };
winrt::Windows::UI::Color colorMe = winrt::Microsoft::UI::ColorHelper::FromArgb(255, r, g, b);
ML_TRACE("My color is: {}, {}, {}", r, g, b);*/
}