@@ -17,6 +17,11 @@ static const luaL_Reg ui_lib[] = {
1717 { " add_obj" , ui_add_obj },
1818 { " update" , ui_update_obj },
1919 { " info" , ui_info },
20+ { " paint" , ui_paint },
21+ { " set_timer" , ui_set_timer },
22+ { " kill_timer" , ui_kill_timer },
23+ { " hsb2rgb" , ui_helper_hsl2rgb },
24+ { " rgb2hsb" , ui_helper_rgb2hsl },
2025 { nullptr , nullptr }
2126};
2227
@@ -28,4 +33,107 @@ static int luaopen_UI(lua_State *L) {
2833void lua_ext_register_UI (lua_State *L)
2934{
3035 luaL_requiref (L, " UIExt" , luaopen_UI, 1 );
31- }
36+ }
37+
38+ #define HSLMAX 240
39+ #define RGBMAX 255
40+ #define UNDEFINED (HSLMAX*2 /3 )
41+
42+ static int hue2rgb (short n1, short n2, short hue)
43+ {
44+ if (hue < 0 )
45+ hue += HSLMAX;
46+ if (hue > HSLMAX)
47+ hue -= HSLMAX;
48+
49+ if (hue < (HSLMAX / 6 ))
50+ return (n1 + (((n2 - n1)*hue + (HSLMAX / 12 )) / (HSLMAX / 6 )));
51+ if (hue < (HSLMAX / 2 ))
52+ return (n2);
53+ if (hue < ((HSLMAX * 2 ) / 3 ))
54+ return (n1 + (((n2 - n1)*(((HSLMAX * 2 ) / 3 ) - hue) + (HSLMAX / 12 )) / (HSLMAX / 6 )));
55+ return (n1);
56+ }
57+
58+ int ui_helper_hsl2rgb (lua_State* L)
59+ {
60+ auto h = short (luaL_checknumber (L, 1 ));
61+ auto s = short (luaL_checknumber (L, 2 ));
62+ auto l = short (luaL_checknumber (L, 3 ));
63+
64+ byte r, g, b;
65+ short Magic1, Magic2;
66+
67+ if (0 == s)
68+ {
69+ r = g = b = (l*RGBMAX) / HSLMAX;
70+ }
71+ else
72+ {
73+ if (l <= (HSLMAX / 2 ))
74+ Magic2 = (l*(HSLMAX + s) + (HSLMAX / 2 )) / HSLMAX;
75+ else
76+ Magic2 = l + s - ((l*s) + (HSLMAX / 2 )) / HSLMAX;
77+
78+ Magic1 = 2 * l - Magic2;
79+
80+ r = (hue2rgb (Magic1, Magic2, h + (HSLMAX / 3 ))*RGBMAX + (HSLMAX / 2 )) / HSLMAX;
81+ g = (hue2rgb (Magic1, Magic2, h)*RGBMAX + (HSLMAX / 2 )) / HSLMAX;
82+ b = (hue2rgb (Magic1, Magic2, h - (HSLMAX / 3 ))*RGBMAX + (HSLMAX / 2 )) / HSLMAX;
83+ }
84+
85+ CStringA str;
86+ str.AppendFormat (" #%02X%02X%02X" , (byte)(r * 255.0 ), (byte)(g * 255.0 ), (byte)(b * 255.0 ));
87+ lua_pushlstring (L, str.GetBuffer (), str.GetLength ());
88+
89+ return 1 ;
90+ }
91+
92+ int ui_helper_rgb2hsl (lua_State* L)
93+ {
94+ auto r = byte (luaL_checknumber (L, 1 ));
95+ auto g = byte (luaL_checknumber (L, 2 ));
96+ auto b = byte (luaL_checknumber (L, 3 ));
97+ auto cMax = __max (r, __max (g, b));
98+ auto cMin = __min (r, __min (g, b));
99+
100+ double h, s, l;
101+ short Rdelta, Gdelta, Bdelta;
102+
103+ l = (((cMax + cMin)*HSLMAX) + RGBMAX) / (2 * RGBMAX);
104+
105+ if (cMax == cMin)
106+ {
107+ s = 0 ;
108+ h = UNDEFINED;
109+ }
110+ else
111+ {
112+ if (l <= (HSLMAX / 2 ))
113+ s = (((cMax - cMin)*HSLMAX) + ((cMax + cMin) / 2 )) / (cMax + cMin);
114+ else
115+ s = (((cMax - cMin)*HSLMAX) + ((2 * RGBMAX - cMax - cMin) / 2 )) / (2 * RGBMAX - cMax - cMin);
116+
117+ Rdelta = (((cMax - r)*(HSLMAX / 6 )) + ((cMax - cMin) / 2 )) / (cMax - cMin);
118+ Gdelta = (((cMax - g)*(HSLMAX / 6 )) + ((cMax - cMin) / 2 )) / (cMax - cMin);
119+ Bdelta = (((cMax - b)*(HSLMAX / 6 )) + ((cMax - cMin) / 2 )) / (cMax - cMin);
120+
121+ if (r == cMax)
122+ h = Bdelta - Gdelta;
123+ else if (g == cMax)
124+ h = (HSLMAX / 3 ) + Rdelta - Bdelta;
125+ else
126+ h = ((2 * HSLMAX) / 3 ) + Gdelta - Rdelta;
127+
128+ if (h < 0 )
129+ h += HSLMAX;
130+ if (h > HSLMAX)
131+ h -= HSLMAX;
132+ }
133+
134+ lua_pushnumber (L, h);
135+ lua_pushnumber (L, s);
136+ lua_pushnumber (L, l);
137+
138+ return 3 ;
139+ }
0 commit comments