#include <stdint.h>
#include <stdio.h>
uint32_t makeRGB30(float r, float g, float b)
{
const uint32_t mask = (1u << 10u) - 1u;
/* convert float -> uint */
uint32_t rU = r * mask, gU = g * mask, bU = b * mask;
/* combine and return color components */
return ((rU & mask) << 20) | ((gU & mask) << 10) | (bU & mask);
}
int main(void)
{
/* samples */
const float colors[][3] = {
{ 0.0f, 0.0f, 0.0f }, /* black */
{ 1.0f, 0.0f, 0.0f }, /* red */
{ 0.0f, 1.0f, 0.0f }, /* green */
{ 0.0f, 0.0f, 1.0f }, /* blue */
{ 1.0f, 1.0f, 0.0f }, /* yellow */
{ 1.0f, 0.0f, 1.0f }, /* magenta */
{ 0.0f, 1.0f, 1.0f }, /* cyan */
{ 1.0f, 1.0f, 1.0f } /* white */
};
const size_t n = sizeof colors / sizeof *colors;
for (size_t i = 0; i < n; ++i) {
float *color = colors[i];
uint32_t rgb = makeRGB30(color[0], color[1], color[2]);
printf("(%f, %f, %f): %08x\n", color
[0], color
[1], color
[2], rgb
); }
/* done */
return 0;
}
I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCnVpbnQzMl90IG1ha2VSR0IzMChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQp7CiAgY29uc3QgdWludDMyX3QgbWFzayA9ICgxdSA8PCAxMHUpIC0gMXU7CiAgLyogY29udmVydCBmbG9hdCAtPiB1aW50ICovCiAgdWludDMyX3QgclUgPSByICogbWFzaywgZ1UgPSBnICogbWFzaywgYlUgPSBiICogbWFzazsKICAvKiBjb21iaW5lIGFuZCByZXR1cm4gY29sb3IgY29tcG9uZW50cyAqLwogIHJldHVybiAoKHJVICYgbWFzaykgPDwgMjApIHwgKChnVSAmIG1hc2spIDw8IDEwKSB8IChiVSAmIG1hc2spOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgLyogc2FtcGxlcyAqLwogIGNvbnN0IGZsb2F0IGNvbG9yc1tdWzNdID0gewogIAl7IDAuMGYsIDAuMGYsIDAuMGYgfSwgLyogYmxhY2sgKi8KICAJeyAxLjBmLCAwLjBmLCAwLjBmIH0sIC8qIHJlZCAqLwogIAl7IDAuMGYsIDEuMGYsIDAuMGYgfSwgLyogZ3JlZW4gKi8KICAJeyAwLjBmLCAwLjBmLCAxLjBmIH0sIC8qIGJsdWUgKi8KICAJeyAxLjBmLCAxLjBmLCAwLjBmIH0sIC8qIHllbGxvdyAqLwogIAl7IDEuMGYsIDAuMGYsIDEuMGYgfSwgLyogbWFnZW50YSAqLwogIAl7IDAuMGYsIDEuMGYsIDEuMGYgfSwgLyogY3lhbiAqLwogIAl7IDEuMGYsIDEuMGYsIDEuMGYgfSAvKiB3aGl0ZSAqLwogIH07CiAgY29uc3Qgc2l6ZV90IG4gPSBzaXplb2YgY29sb3JzIC8gc2l6ZW9mICpjb2xvcnM7CiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAJZmxvYXQgKmNvbG9yID0gY29sb3JzW2ldOwogIAl1aW50MzJfdCByZ2IgPSBtYWtlUkdCMzAoY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSk7CiAgCXByaW50ZigiKCVmLCAlZiwgJWYpOiAlMDh4XG4iLCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCByZ2IpOwogIH0KICAvKiBkb25lICovCiAgcmV0dXJuIDA7Cn0K
(0.000000, 0.000000, 0.000000): 00000000
(1.000000, 0.000000, 0.000000): 3ff00000
(0.000000, 1.000000, 0.000000): 000ffc00
(0.000000, 0.000000, 1.000000): 000003ff
(1.000000, 1.000000, 0.000000): 3ffffc00
(1.000000, 0.000000, 1.000000): 3ff003ff
(0.000000, 1.000000, 1.000000): 000fffff
(1.000000, 1.000000, 1.000000): 3fffffff