Merge pull request #442 from kwagyeman/kwabena/cleanup_color

Cleanup color methods
This commit is contained in:
Ibrahim Abd Elkader 2019-02-04 22:54:42 +02:00 committed by GitHub
commit bcfb3d74a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 101 deletions

View File

@ -311,7 +311,9 @@ int8_t imlib_rgb565_to_l(uint16_t pixel)
float b_lin = xyz_table[COLOR_RGB565_TO_B8(pixel)];
float y = ((r_lin * 0.2126f) + (g_lin * 0.7152f) + (b_lin * 0.0722f)) * (1.0f / 100.000f);
y = (y>0.008856f) ? fast_cbrtf(y) : ((y * 7.787037f) + 0.137931f);
return fast_roundf(116 * y) - 16;
}
@ -336,8 +338,8 @@ int8_t imlib_rgb565_to_b(uint16_t pixel)
float g_lin = xyz_table[COLOR_RGB565_TO_G8(pixel)];
float b_lin = xyz_table[COLOR_RGB565_TO_B8(pixel)];
float y = ((r_lin * 0.2126f) + (g_lin * 0.7152f) + (b_lin * 0.0722f)) * (1.0f / 100.000f); \
float z = ((r_lin * 0.0193f) + (g_lin * 0.1192f) + (b_lin * 0.9505f)) * (1.0f / 108.883f); \
float y = ((r_lin * 0.2126f) + (g_lin * 0.7152f) + (b_lin * 0.0722f)) * (1.0f / 100.000f);
float z = ((r_lin * 0.0193f) + (g_lin * 0.1192f) + (b_lin * 0.9505f)) * (1.0f / 108.883f);
y = (y>0.008856f) ? fast_cbrtf(y) : ((y * 7.787037f) + 0.137931f);
z = (z>0.008856f) ? fast_cbrtf(z) : ((z * 7.787037f) + 0.137931f);
@ -350,6 +352,7 @@ int8_t imlib_rgb565_to_y(uint16_t pixel)
int r = COLOR_RGB565_TO_R8(pixel);
int g = COLOR_RGB565_TO_G8(pixel);
int b = COLOR_RGB565_TO_B8(pixel);
return fast_floorf((r * +0.299000f) + (g * +0.587000f) + (b * +0.114000f)) - 128;
}
@ -358,6 +361,7 @@ int8_t imlib_rgb565_to_u(uint16_t pixel)
int r = COLOR_RGB565_TO_R8(pixel);
int g = COLOR_RGB565_TO_G8(pixel);
int b = COLOR_RGB565_TO_B8(pixel);
return fast_floorf((r * -0.168736f) + (g * -0.331264f) + (b * +0.500000f));
}
@ -366,43 +370,21 @@ int8_t imlib_rgb565_to_v(uint16_t pixel)
int r = COLOR_RGB565_TO_R8(pixel);
int g = COLOR_RGB565_TO_G8(pixel);
int b = COLOR_RGB565_TO_B8(pixel);
return fast_floorf((r * +0.500000f) + (g * -0.418688f) + (b * -0.081312f));
}
void imlib_rgb_to_lab(simple_color_t *rgb, simple_color_t *lab)
// https://en.wikipedia.org/wiki/Lab_color_space -> CIELAB-CIEXYZ conversions
// https://en.wikipedia.org/wiki/SRGB -> Specification of the transformation
uint16_t imlib_lab_to_rgb(uint8_t l, int8_t a, int8_t b)
{
// https://en.wikipedia.org/wiki/SRGB -> Specification of the transformation
// https://en.wikipedia.org/wiki/Lab_color_space -> CIELAB-CIEXYZ conversions
float x = ((l + 16) * 0.008621f) + (a * 0.002f);
float y = ((l + 16) * 0.008621f);
float z = ((l + 16) * 0.008621f) - (b * 0.005f);
float r_lin = xyz_table[rgb->red];
float g_lin = xyz_table[rgb->green];
float b_lin = xyz_table[rgb->blue];
float x = ((r_lin * 0.4124f) + (g_lin * 0.3576f) + (b_lin * 0.1805f)) / 095.047f;
float y = ((r_lin * 0.2126f) + (g_lin * 0.7152f) + (b_lin * 0.0722f)) / 100.000f;
float z = ((r_lin * 0.0193f) + (g_lin * 0.1192f) + (b_lin * 0.9505f)) / 108.883f;
x = (x>0.008856f) ? fast_cbrtf(x) : ((x * 7.787037f) + 0.137931f);
y = (y>0.008856f) ? fast_cbrtf(y) : ((y * 7.787037f) + 0.137931f);
z = (z>0.008856f) ? fast_cbrtf(z) : ((z * 7.787037f) + 0.137931f);
lab->L = ((int8_t) fast_roundf(116 * y)) - 16;
lab->A = ((int8_t) fast_roundf(500 * (x-y)));
lab->B = ((int8_t) fast_roundf(200 * (y-z)));
}
void imlib_lab_to_rgb(simple_color_t *lab, simple_color_t *rgb)
{
// https://en.wikipedia.org/wiki/Lab_color_space -> CIELAB-CIEXYZ conversions
// https://en.wikipedia.org/wiki/SRGB -> Specification of the transformation
float x = ((lab->L + 16) * 0.008621f) + (lab->A * 0.002f);
float y = ((lab->L + 16) * 0.008621f);
float z = ((lab->L + 16) * 0.008621f) - (lab->B * 0.005f);
x = ((x>0.206897f) ? (x*x*x) : ((0.128419f * x) - 0.017713f)) * 095.047f;
y = ((y>0.206897f) ? (y*y*y) : ((0.128419f * y) - 0.017713f)) * 100.000f;
z = ((z>0.206897f) ? (z*z*z) : ((0.128419f * z) - 0.017713f)) * 108.883f;
x = ((x > 0.206897f) ? (x*x*x) : ((0.128419f * x) - 0.017713f)) * 095.047f;
y = ((y > 0.206897f) ? (y*y*y) : ((0.128419f * y) - 0.017713f)) * 100.000f;
z = ((z > 0.206897f) ? (z*z*z) : ((0.128419f * z) - 0.017713f)) * 108.883f;
float r_lin = ((x * +3.2406f) + (y * -1.5372f) + (z * -0.4986f)) / 100.0f;
float g_lin = ((x * -0.9689f) + (y * +1.8758f) + (z * +0.0415f)) / 100.0f;
@ -412,35 +394,21 @@ void imlib_lab_to_rgb(simple_color_t *lab, simple_color_t *rgb)
g_lin = (g_lin>0.0031308f) ? ((1.055f*powf(g_lin, 0.416666f))-0.055f) : (g_lin*12.92f);
b_lin = (b_lin>0.0031308f) ? ((1.055f*powf(b_lin, 0.416666f))-0.055f) : (b_lin*12.92f);
rgb->red = IM_MAX(IM_MIN(fast_roundf(r_lin * 255), 255), 0);
rgb->green = IM_MAX(IM_MIN(fast_roundf(g_lin * 255), 255), 0);
rgb->blue = IM_MAX(IM_MIN(fast_roundf(b_lin * 255), 255), 0);
uint32_t red = IM_MAX(IM_MIN(fast_roundf(r_lin * COLOR_R8_MAX), COLOR_R8_MAX), COLOR_R8_MIN);
uint32_t green = IM_MAX(IM_MIN(fast_roundf(g_lin * COLOR_G8_MAX), COLOR_G8_MAX), COLOR_G8_MIN);
uint32_t blue = IM_MAX(IM_MIN(fast_roundf(b_lin * COLOR_B8_MAX), COLOR_B8_MAX), COLOR_B8_MIN);
return COLOR_R8_G8_B8_TO_RGB565(red, green, blue);
}
void imlib_rgb_to_grayscale(simple_color_t *rgb, simple_color_t *grayscale)
// https://en.wikipedia.org/wiki/YCbCr -> JPEG Conversion
uint16_t imlib_yuv_to_rgb(uint8_t y, int8_t u, int8_t v)
{
float r_lin = xyz_table[rgb->red];
float g_lin = xyz_table[rgb->green];
float b_lin = xyz_table[rgb->blue];
float y = ((r_lin * 0.2126f) + (g_lin * 0.7152f) + (b_lin * 0.0722f)) / 100.0f;
y = (y>0.0031308f) ? ((1.055f*powf(y, 0.416666f))-0.055f) : (y*12.92f);
grayscale->G = IM_MAX(IM_MIN(fast_roundf(y * 255), 255), 0);
}
uint32_t r = IM_MAX(IM_MIN(y + ((91881 * v) >> 16), COLOR_R8_MAX), COLOR_R8_MIN);
uint32_t g = IM_MAX(IM_MIN(y - (((22554 * u) + (46802 * v)) >> 16), COLOR_G8_MAX), COLOR_G8_MIN);
uint32_t b = IM_MAX(IM_MIN(y + ((116130 * u) >> 16), COLOR_B8_MAX), COLOR_B8_MIN);
// Just copy settings back.
void imlib_grayscale_to_rgb(simple_color_t *grayscale, simple_color_t *rgb)
{
rgb->red = grayscale->G;
rgb->green = grayscale->G;
rgb->blue = grayscale->G;
}
ALWAYS_INLINE uint16_t imlib_yuv_to_rgb(uint8_t y, int8_t u, int8_t v)
{
uint32_t r = IM_MAX(IM_MIN(y + ((91881*v)>>16), 255), 0);
uint32_t g = IM_MAX(IM_MIN(y - (((22554*u)+(46802*v))>>16), 255), 0);
uint32_t b = IM_MAX(IM_MIN(y + ((116130*u)>>16), 255), 0);
return IM_RGB565(IM_R825(r), IM_G826(g), IM_B825(b));
return COLOR_R8_G8_B8_TO_RGB565(r, g, b);
}
void imlib_bayer_to_rgb565(image_t *img, int w, int h, int xoffs, int yoffs, uint16_t *rgbbuf)

View File

@ -282,44 +282,8 @@ extern const int8_t yuv_table[196608];
#define COLOR_RGB565_TO_V(pixel) imlib_rgb565_to_v(pixel)
#endif
// https://en.wikipedia.org/wiki/Lab_color_space -> CIELAB-CIEXYZ conversions
// https://en.wikipedia.org/wiki/SRGB -> Specification of the transformation
#define COLOR_LAB_TO_RGB565(l, a, b) \
({ \
__typeof__ (l) _l = (l); \
__typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
float _x = ((_l + 16) * 0.008621f) + (_a * 0.002f); \
float _y = ((_l + 16) * 0.008621f); \
float _z = ((_l + 16) * 0.008621f) - (_b * 0.005f); \
_x = ((_x > 0.206897f) ? (_x * _x * _x) : ((0.128419f * _x) - 0.017713f)) * 095.047f; \
_y = ((_y > 0.206897f) ? (_y * _y * _y) : ((0.128419f * _y) - 0.017713f)) * 100.000f; \
_z = ((_z > 0.206897f) ? (_z * _z * _z) : ((0.128419f * _z) - 0.017713f)) * 108.883f; \
float _r_lin = ((_x * +3.2406f) + (_y * -1.5372f) + (_z * -0.4986f)) / 100.0f; \
float _g_lin = ((_x * -0.9689f) + (_y * +1.8758f) + (_z * +0.0415f)) / 100.0f; \
float _b_lin = ((_x * +0.0557f) + (_y * -0.2040f) + (_z * +1.0570f)) / 100.0f; \
_r_lin = (_r_lin > 0.0031308f) ? ((1.055f * powf(_r_lin, 0.416666f)) - 0.055f) : (_r_lin * 12.92f); \
_g_lin = (_g_lin > 0.0031308f) ? ((1.055f * powf(_g_lin, 0.416666f)) - 0.055f) : (_g_lin * 12.92f); \
_b_lin = (_b_lin > 0.0031308f) ? ((1.055f * powf(_b_lin, 0.416666f)) - 0.055f) : (_b_lin * 12.92f); \
unsigned int _rgb565_r = IM_MAX(IM_MIN(roundf(_r_lin * COLOR_R5_MAX), COLOR_R5_MAX), COLOR_R5_MIN); \
unsigned int _rgb565_g = IM_MAX(IM_MIN(roundf(_g_lin * COLOR_G6_MAX), COLOR_G6_MAX), COLOR_G6_MIN); \
unsigned int _rgb565_b = IM_MAX(IM_MIN(roundf(_b_lin * COLOR_B5_MAX), COLOR_B5_MAX), COLOR_B5_MIN); \
COLOR_R5_G6_B5_TO_RGB565(_rgb565_r, _rgb565_g, _rgb565_b); \
})
// https://en.wikipedia.org/wiki/YCbCr -> JPEG Conversion
#define COLOR_YUV_TO_RGB565(y, u, v) \
({ \
__typeof__ (y) _y = (y); \
__typeof__ (u) _u = (u); \
__typeof__ (v) _v = (v); \
unsigned int _r = IM_MAX(IM_MIN(128 + _y + ((((uint32_t) ((1.402000 * 65536) + 0.5)) * _v) >> 16), COLOR_R8_MAX), COLOR_R8_MIN); \
unsigned int _g = IM_MAX(IM_MIN(128 + _y - (((((uint32_t) ((0.344136 * 65536) + 0.5)) * _u) + (((uint32_t) ((0.714136 * 65536) + 0.5)) * _v)) >> 16), COLOR_G8_MAX), COLOR_G8_MIN); \
unsigned int _b = IM_MAX(IM_MIN(128 + _y + ((((uint32_t) ((1.772000 * 65536) + 0.5)) * _u) >> 16), COLOR_B8_MAX), COLOR_B8_MIN); \
COLOR_R8_G8_B8_TO_RGB565(_r, _g, _b); \
})
#define COLOR_LAB_TO_RGB565(l, a, b) imlib_lab_to_rgb(l, a, b)
#define COLOR_YUV_TO_RGB565(y, u, v) imlib_yuv_to_rgb(y + 128, u, v)
#define COLOR_BAYER_TO_RGB565(img, x, y, r, g, b) \
({ \
@ -1167,10 +1131,7 @@ int8_t imlib_rgb565_to_b(uint16_t pixel);
int8_t imlib_rgb565_to_y(uint16_t pixel);
int8_t imlib_rgb565_to_u(uint16_t pixel);
int8_t imlib_rgb565_to_v(uint16_t pixel);
void imlib_rgb_to_lab(simple_color_t *rgb, simple_color_t *lab);
void imlib_lab_to_rgb(simple_color_t *lab, simple_color_t *rgb);
void imlib_rgb_to_grayscale(simple_color_t *rgb, simple_color_t *grayscale);
void imlib_grayscale_to_rgb(simple_color_t *grayscale, simple_color_t *rgb);
uint16_t imlib_lab_to_rgb(uint8_t l, int8_t a, int8_t b);
uint16_t imlib_yuv_to_rgb(uint8_t y, int8_t u, int8_t v);
void imlib_bayer_to_rgb565(image_t *img, int w, int h, int xoffs, int yoffs, uint16_t *rgbbuf);