diff --git a/tlc5947/color.c b/tlc5947/color.c index 4619882..f20aa0c 100644 --- a/tlc5947/color.c +++ b/tlc5947/color.c @@ -119,7 +119,7 @@ rgb12 rgb8torgb12(rgb8 c){ return _c; } -rgb12 rgb12_white_balance(rgb12 c, float m[3]){ +rgb12 rgb12_white_balance(rgb12 c, const float m[3]){ rgb12 _c; _c.r = (uint16_t)(c.r * m[0]); _c.g = (uint16_t)(c.g * m[1]); @@ -127,7 +127,17 @@ rgb12 rgb12_white_balance(rgb12 c, float m[3]){ return _c; } -rgb12 rgb12_gamut(rgb12 c, float m[3][3]){ + +#define ADD_F(a, b) ((float)(((float)a)+((float)b))) +#define ADD3_F(a, b, c) ((float)(ADD_F(ADD_F(a, b), ((float)(c))))) +bool gamut_matrix_valid(const float m[3][3]){ + for(uint8_t i = 0; i < 3; ++i) + if( ADD3_F(m[i][0], m[i][1], m[i][2]) > 1.0 ) + return false; + return true; +} + +rgb12 rgb12_gamut(rgb12 c, const float m[3][3]){ rgb12 _c; _c.r = (uint16_t)((c.r * m[0][0]) + (c.g * m[0][1]) + (c.b * m[0][2])); _c.g = (uint16_t)((c.r * m[1][0]) + (c.g * m[1][1]) + (c.b * m[1][2])); diff --git a/tlc5947/color.h b/tlc5947/color.h index fdf3982..b190b78 100644 --- a/tlc5947/color.h +++ b/tlc5947/color.h @@ -32,6 +32,7 @@ #define TLC5947_COLOR_H #include +#include typedef struct{ uint16_t r:12; /*< red [0 -> 4095] */ @@ -74,9 +75,10 @@ rgb8 rgb12torgb8(rgb12 c)__attribute__ ((const)); rgb12 rgb8torgb12(rgb8 c)__attribute__ ((const)); -rgb12 rgb12_white_balance(rgb12 c, float m[3]); +rgb12 rgb12_white_balance(rgb12 c, const float m[3]); -rgb12 rgb12_gamut(rgb12 c, float m[3][3]); +bool gamut_matrix_valid(const float m[3][3]); +rgb12 rgb12_gamut(rgb12 c, const float m[3][3]); #if defined(__cplusplus) } diff --git a/tlc5947/tlc5947.c b/tlc5947/tlc5947.c index a99a933..e5cca15 100644 --- a/tlc5947/tlc5947.c +++ b/tlc5947/tlc5947.c @@ -1285,6 +1285,14 @@ STATIC mp_obj_t tlc5947_tlc5947_set_gamut(mp_obj_t self_in, mp_obj_t matrix_in){ } } } + + if(!gamut_matrix_valid(self->gamut_m)){ + memset(self->gamut_m, 0, 9 * sizeof(float)); + for(uint32_t k = 0; k < 3; k++) + self->gamut_m[k][k] = 1.0; + mp_raise_ValueError(MP_ERROR_TEXT("invalid matrix")); + } + return mp_const_none; }