From e0311c85cf6c178849344f572aaad0428df1137c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20G=C3=BCndo=C4=9Fan?= Date: Sat, 13 Feb 2016 23:00:05 +0100 Subject: [PATCH] color: add hex2color, color2hex, str2rgb, rgb2str --- sys/color/color.c | 50 ++++++++++++++++++++++++++++++++++++++++++++- sys/include/color.h | 44 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/sys/color/color.c b/sys/color/color.c index ddd273def..f6a57b412 100644 --- a/sys/color/color.c +++ b/sys/color/color.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 Freie Universität Berlin + * Copyright (C) 2014 - 2016 Freie Universität Berlin * * This file is subject to the terms and conditions of the GNU Lesser General * Public License v2.1. See the file LICENSE in the top level directory for more @@ -14,12 +14,15 @@ * @brief Implementation of color module * * @author Hauke Petersen + * @author Cenk Gündoğan * * @} */ #include "color.h" +#define ENABLE_DEBUG (0) +#include "debug.h" void color_rgb2hsv(color_rgb_t *rgb, color_hsv_t *hsv) { @@ -127,3 +130,48 @@ void color_hsv2rgb(color_hsv_t *hsv, color_rgb_t *rgb) break; } } + +void color_hex2rgb(const uint32_t hex, color_rgb_t *rgb) +{ + rgb->r = ((hex >> 16UL) & 0xFF); + rgb->g = ((hex >> 8UL) & 0xFF); + rgb->b = (hex & 0xFF); +} + +void color_rgb2hex(const color_rgb_t *rgb, uint32_t *hex) +{ + *hex = (((uint32_t) rgb->r) << 16UL) | (rgb->g << 8UL) | (rgb->b); +} + +void color_str2rgb(const char* str, color_rgb_t *rgb) +{ + rgb->r = (((str[0] > '9') ? (str[0] &~ 0x20) - 'A' + 10 : (str[0] - '0')) << 4) | /* R */ + (((str[1] > '9') ? (str[1] &~ 0x20) - 'A' + 10 : (str[1] - '0')) << 0) ; /* R */ + rgb->g = (((str[2] > '9') ? (str[2] &~ 0x20) - 'A' + 10 : (str[2] - '0')) << 4) | /* G */ + (((str[3] > '9') ? (str[3] &~ 0x20) - 'A' + 10 : (str[3] - '0')) << 0) ; /* G */ + rgb->b = (((str[4] > '9') ? (str[4] &~ 0x20) - 'A' + 10 : (str[4] - '0')) << 4) | /* B */ + (((str[5] > '9') ? (str[5] &~ 0x20) - 'A' + 10 : (str[5] - '0')) << 0) ; /* B */ +} + +void color_rgb2str(const color_rgb_t *rgb, char* str) +{ + uint8_t tmp; + + /* RR */ + tmp = rgb->r >> 4; + str[0] = (tmp > 9) ? ('A' - 10 + tmp) : ('0' + tmp); + tmp = rgb->r & 0x0F; + str[1] = (tmp > 9) ? ('A' - 10 + tmp) : ('0' + tmp); + + /* GG */ + tmp = rgb->g >> 4; + str[2] = (tmp > 9) ? ('A' - 10 + tmp) : ('0' + tmp); + tmp = rgb->g & 0x0F; + str[3] = (tmp > 9) ? ('A' - 10 + tmp) : ('0' + tmp); + + /* BB */ + tmp = rgb->b >> 4; + str[4] = (tmp > 9) ? ('A' - 10 + tmp) : ('0' + tmp); + tmp = rgb->b & 0x0F; + str[5] = (tmp > 9) ? ('A' - 10 + tmp) : ('0' + tmp); +} diff --git a/sys/include/color.h b/sys/include/color.h index 4188b150d..b20e03d16 100644 --- a/sys/include/color.h +++ b/sys/include/color.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 Freie Universität Berlin + * Copyright (C) 2014 - 2016 Freie Universität Berlin * * This file is subject to the terms and conditions of the GNU Lesser General * Public License v2.1. See the file LICENSE in the top level directory for more @@ -16,6 +16,7 @@ * @brief Headers for the color handling module * * @author Hauke Petersen + * @author Cenk Gündoğan */ #ifndef __COLOR_H @@ -62,6 +63,47 @@ void color_rgb2hsv(color_rgb_t *rgb, color_hsv_t *hsv); */ void color_hsv2rgb(color_hsv_t *hsv, color_rgb_t *rgb); +/** + * @brief Convert a @p hex value of the form 0x00RRGGBB to an RGB color struct + * + * @note the two most significant bytes of @p hex will be ignored + * + * @param[in] hex Input color encoded in hex + * @param[out] rgb Output color encoded in RGB space + */ +void color_hex2rgb(const uint32_t hex, color_rgb_t *rgb); + +/** + * @brief Convert a @p rgb struct to a @p hex value of the form 0x00RRGGBB + * + * @note the two most significant bytes of @p hex will be 0 + * + * @param[in] rgb Input color encoded in RGB space + * @param[out] hex Output color encoded in hex + */ +void color_rgb2hex(const color_rgb_t *rgb, uint32_t *hex); + +/** + * @brief Convert a hex color string of the form 'RRGGBB' to a color_rgb_t struct + * + * @note @p str MUST contain only hexadecimal digits. + * Expect unexpected behaviour, otherwise. + * + * @param[in] str Input color encoded as string of the form 'RRGGBB' + * @param[out] rgb Output color encoded in RGB space + */ +void color_str2rgb(const char *str, color_rgb_t *color); + +/** + * @brief Convert a color_rgb_t struct to a hex color string of the form 'RRGGBB' + * + * @note @p str MUST be big enough to hold 6 characters + * + * @param[in] rgb Input color encoded in RGB space + * @param[out] str Output color encoded as string of the form 'RRGGBB' + */ +void color_rgb2str(const color_rgb_t *rgb, char *str); + #ifdef __cplusplus } #endif