Fix overflow in ESPColorCorrection object (#7268)

This commit is contained in:
Gábor Kiss 2024-08-16 00:35:00 +02:00 committed by GitHub
parent abb2669f0f
commit 9001d1c0d4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -41,29 +41,29 @@ class ESPColorCorrection {
if (this->max_brightness_.red == 0 || this->local_brightness_ == 0) if (this->max_brightness_.red == 0 || this->local_brightness_ == 0)
return 0; return 0;
uint16_t uncorrected = this->gamma_reverse_table_[red] * 255UL; uint16_t uncorrected = this->gamma_reverse_table_[red] * 255UL;
uint8_t res = ((uncorrected / this->max_brightness_.red) * 255UL) / this->local_brightness_; uint16_t res = ((uncorrected / this->max_brightness_.red) * 255UL) / this->local_brightness_;
return res; return (uint8_t) std::min(res, uint16_t(255));
} }
inline uint8_t color_uncorrect_green(uint8_t green) const ESPHOME_ALWAYS_INLINE { inline uint8_t color_uncorrect_green(uint8_t green) const ESPHOME_ALWAYS_INLINE {
if (this->max_brightness_.green == 0 || this->local_brightness_ == 0) if (this->max_brightness_.green == 0 || this->local_brightness_ == 0)
return 0; return 0;
uint16_t uncorrected = this->gamma_reverse_table_[green] * 255UL; uint16_t uncorrected = this->gamma_reverse_table_[green] * 255UL;
uint8_t res = ((uncorrected / this->max_brightness_.green) * 255UL) / this->local_brightness_; uint16_t res = ((uncorrected / this->max_brightness_.green) * 255UL) / this->local_brightness_;
return res; return (uint8_t) std::min(res, uint16_t(255));
} }
inline uint8_t color_uncorrect_blue(uint8_t blue) const ESPHOME_ALWAYS_INLINE { inline uint8_t color_uncorrect_blue(uint8_t blue) const ESPHOME_ALWAYS_INLINE {
if (this->max_brightness_.blue == 0 || this->local_brightness_ == 0) if (this->max_brightness_.blue == 0 || this->local_brightness_ == 0)
return 0; return 0;
uint16_t uncorrected = this->gamma_reverse_table_[blue] * 255UL; uint16_t uncorrected = this->gamma_reverse_table_[blue] * 255UL;
uint8_t res = ((uncorrected / this->max_brightness_.blue) * 255UL) / this->local_brightness_; uint16_t res = ((uncorrected / this->max_brightness_.blue) * 255UL) / this->local_brightness_;
return res; return (uint8_t) std::min(res, uint16_t(255));
} }
inline uint8_t color_uncorrect_white(uint8_t white) const ESPHOME_ALWAYS_INLINE { inline uint8_t color_uncorrect_white(uint8_t white) const ESPHOME_ALWAYS_INLINE {
if (this->max_brightness_.white == 0 || this->local_brightness_ == 0) if (this->max_brightness_.white == 0 || this->local_brightness_ == 0)
return 0; return 0;
uint16_t uncorrected = this->gamma_reverse_table_[white] * 255UL; uint16_t uncorrected = this->gamma_reverse_table_[white] * 255UL;
uint8_t res = ((uncorrected / this->max_brightness_.white) * 255UL) / this->local_brightness_; uint16_t res = ((uncorrected / this->max_brightness_.white) * 255UL) / this->local_brightness_;
return res; return (uint8_t) std::min(res, uint16_t(255));
} }
protected: protected: