-
Notifications
You must be signed in to change notification settings - Fork 0
/
color.h
143 lines (123 loc) · 5.38 KB
/
color.h
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#pragma once
#ifndef KIGU_COLOR_H
#define KIGU_COLOR_H
#include "common.h"
#define COLORU32_RMASK 0x000000FF
#define COLORU32_GMASK 0x0000FF00
#define COLORU32_BMASK 0x00FF0000
#define COLORU32_AMASK 0xFF000000
#define COLORU32_RSHIFT 0
#define COLORU32_GSHIFT 8
#define COLORU32_BSHIFT 16
#define COLORU32_ASHIFT 24
#define PackColorU32(R,G,B,A) PackU32(A,B,G,R)
#define randcolor color(rand() % 255, rand() % 255, rand() % 255)
struct color{
union{
u32 rgba = 0;
struct{ u8 r, g, b, a; };
};
color();
color(u8 r, u8 g, u8 b, u8 a = 255);
color(u32 rgba);
void operator*=(float rhs);
bool operator==(color rhs) const;
color operator* (color rhs) const;
color operator* (float rhs) const;
color operator/ (float rhs) const;
static color FloatsToColor(f32 r, f32 g, f32 b, f32 a);
static void FillFloat3FromU32(f32* floats, u32 color);
static void FillFloat4FromU32(f32* floats, u32 color);
};
////////////////////
//// @constants ////
////////////////////
inline global color Color_NONE = color( 0, 0, 0, 0);
inline global color Color_White = color(255,255,255,255);
inline global color Color_Black = color( 0, 0, 0,255);
inline global color Color_Grey = color(128,128,128,255);
inline global color Color_Red = color(255, 0, 0,255);
inline global color Color_Green = color( 0,255, 0,255);
inline global color Color_Blue = color( 0, 0,255,255);
inline global color Color_Yellow = color(255,255, 0,255);
inline global color Color_Cyan = color( 0,255,255,255);
inline global color Color_Magenta = color(255, 0,255,255);
inline global color Color_LightGrey = color(192,192,192,255);
inline global color Color_LightRed = color(255,128,128,255);
inline global color Color_LightGreen = color(128,255,128,255);
inline global color Color_LightBlue = color(128,128,255,255);
inline global color Color_LightYellow = color(245,234, 97,255);
inline global color Color_LightCyan = color(224,255,255,255);
inline global color Color_LightMagenta = color(204,153,204,255);
inline global color Color_DarkGrey = color( 64, 64, 64,255);
inline global color Color_DarkRed = color(128, 0, 0,255);
inline global color Color_DarkGreen = color( 0,128, 0,255);
inline global color Color_DarkBlue = color( 0, 0,128,255);
inline global color Color_DarkYellow = color(128,128, 0,255);
inline global color Color_DarkCyan = color( 0,128,128,255);
inline global color Color_DarkMagenta = color(128, 0,128,255);
inline global color Color_VeryDarkGrey = color( 32, 32, 32,255);
inline global color Color_VeryDarkRed = color( 64, 0, 0,255);
inline global color Color_VeryDarkGreen = color( 0, 64, 0,255);
inline global color Color_VeryDarkBlue = color( 0, 0, 64,255);
inline global color Color_VeryDarkYellow = color( 64, 64, 0,255);
inline global color Color_VeryDarkCyan = color( 0, 64, 64,255);
inline global color Color_VeryDarkMagenta = color( 64, 0, 64,255);
inline global color Color_Clear = Color_NONE;
inline global color Color_Transparent = Color_NONE;
inline global color Color_Blank = Color_NONE;
inline global color Color_Gray = Color_Grey;
inline global color Color_LightGray = Color_LightGrey;
inline global color Color_DarkGray = Color_DarkGrey;
inline global color Color_VeryDarkGray = Color_VeryDarkGrey;
///////////////////////
//// @constructors ////
///////////////////////
inline color::color(){DPZoneScoped;
r = 0; g = 0; b = 0; a = 0;
};
inline color::color(u8 _r, u8 _g, u8 _b, u8 _a){DPZoneScoped;
r = _r; g = _g; b = _b; a = _a;
}
inline color::color(u32 _rgba){DPZoneScoped;
rgba = ByteSwap32(_rgba);
}
////////////////////
//// @operators ////
////////////////////
inline void color::operator*=(float rhs){DPZoneScoped;
r = u8((f32)r * rhs); g = u8((f32)g * rhs); b = u8((f32)b * rhs);
}
inline color color::operator* (color rhs) const{DPZoneScoped;
return color(r*rhs.r, g*rhs.g, b*rhs.b, a);
}
inline bool color::operator==(color rhs) const{DPZoneScoped;
return rgba == rhs.rgba;
}
inline color color::operator* (float rhs) const{DPZoneScoped;
return color(u8((f32)r * rhs), u8((f32)g * rhs), u8((f32)b * rhs), a);
}
inline color color::operator/ (float rhs) const{DPZoneScoped;
return color(u8((f32)r / rhs), u8((f32)g / rhs), u8((f32)b / rhs), a);
}
///////////////////////////
//// @static functions ////
///////////////////////////
inline color color::FloatsToColor(f32 r, f32 g, f32 b, f32 a){DPZoneScoped;
return color((u8)(r * 255.0f),
(u8)(g * 255.0f),
(u8)(b * 255.0f),
(u8)(a * 255.0f));
}
inline void color::FillFloat3FromU32(f32* floats, u32 color){DPZoneScoped;
*(floats+0) = (f32)((color >> COLORU32_RSHIFT) & 0xFF) / 255.0f;
*(floats+1) = (f32)((color >> COLORU32_GSHIFT) & 0xFF) / 255.0f;
*(floats+2) = (f32)((color >> COLORU32_BSHIFT) & 0xFF) / 255.0f;
}
inline void color::FillFloat4FromU32(f32* floats, u32 color){DPZoneScoped;
*(floats+0) = (f32)((color >> COLORU32_RSHIFT) & 0xFF) / 255.0f;
*(floats+1) = (f32)((color >> COLORU32_GSHIFT) & 0xFF) / 255.0f;
*(floats+2) = (f32)((color >> COLORU32_BSHIFT) & 0xFF) / 255.0f;
*(floats+3) = (f32)((color >> COLORU32_ASHIFT) & 0xFF) / 255.0f;
}
#endif //KIGU_COLOR_H