diff --git a/esphome/components/display/display_color_utils.h b/esphome/components/display/display_color_utils.h index 202de912de..7f29586932 100644 --- a/esphome/components/display/display_color_utils.h +++ b/esphome/components/display/display_color_utils.h @@ -66,6 +66,9 @@ class ColorUtil { } return color_return; } + static inline Color rgb332_to_color(uint8_t rgb332_color) { + return to_color((uint32_t) rgb332_color, COLOR_ORDER_RGB, COLOR_BITNESS_332); + } static uint8_t color_to_332(Color color, ColorOrder color_order = ColorOrder::COLOR_ORDER_RGB) { uint16_t red_color, green_color, blue_color; @@ -100,7 +103,6 @@ class ColorUtil { } return 0; } - static uint32_t color_to_grayscale4(Color color) { uint32_t gs4 = esp_scale8(color.white, 15); return gs4; diff --git a/esphome/components/ili9341/ili9341_display.cpp b/esphome/components/ili9341/ili9341_display.cpp index a24f0bbb64..09524ba787 100644 --- a/esphome/components/ili9341/ili9341_display.cpp +++ b/esphome/components/ili9341/ili9341_display.cpp @@ -112,29 +112,9 @@ void ILI9341Display::display_() { this->y_high_ = 0; } -uint16_t ILI9341Display::convert_to_16bit_color_(uint8_t color_8bit) { - int r = color_8bit >> 5; - int g = (color_8bit >> 2) & 0x07; - int b = color_8bit & 0x03; - uint16_t color = (r * 0x04) << 11; - color |= (g * 0x09) << 5; - color |= (b * 0x0A); - - return color; -} - -uint8_t ILI9341Display::convert_to_8bit_color_(uint16_t color_16bit) { - // convert 16bit color to 8 bit buffer - uint8_t r = color_16bit >> 11; - uint8_t g = (color_16bit >> 5) & 0x3F; - uint8_t b = color_16bit & 0x1F; - - return ((b / 0x0A) | ((g / 0x09) << 2) | ((r / 0x04) << 5)); -} - void ILI9341Display::fill(Color color) { - auto color565 = display::ColorUtil::color_to_565(color); - memset(this->buffer_, convert_to_8bit_color_(color565), this->get_buffer_length_()); + uint8_t color332 = display::ColorUtil::color_to_332(color, display::ColorOrder::COLOR_ORDER_RGB); + memset(this->buffer_, color332, this->get_buffer_length_()); this->x_low_ = 0; this->y_low_ = 0; this->x_high_ = this->get_width_internal() - 1; @@ -181,8 +161,8 @@ void HOT ILI9341Display::draw_absolute_pixel_internal(int x, int y, Color color) this->y_high_ = (y > this->y_high_) ? y : this->y_high_; uint32_t pos = (y * width_) + x; - auto color565 = display::ColorUtil::color_to_565(color); - buffer_[pos] = convert_to_8bit_color_(color565); + uint8_t color332 = display::ColorUtil::color_to_332(color, display::ColorOrder::COLOR_ORDER_RGB); + buffer_[pos] = color332; } // should return the total size: return this->get_width_internal() * this->get_height_internal() * 2 // 16bit color @@ -247,7 +227,7 @@ uint32_t ILI9341Display::buffer_to_transfer_(uint32_t pos, uint32_t sz) { } for (uint32_t i = 0; i < sz; ++i) { - uint16_t color = convert_to_16bit_color_(*src++); + uint16_t color = display::ColorUtil::color_to_565(display::ColorUtil::rgb332_to_color(*src++)); *dst++ = (uint8_t)(color >> 8); *dst++ = (uint8_t) color; } diff --git a/esphome/components/ili9341/ili9341_display.h b/esphome/components/ili9341/ili9341_display.h index d8c90c9d33..eeff688f4f 100644 --- a/esphome/components/ili9341/ili9341_display.h +++ b/esphome/components/ili9341/ili9341_display.h @@ -51,8 +51,6 @@ class ILI9341Display : public PollingComponent, void reset_(); void fill_internal_(Color color); void display_(); - uint16_t convert_to_16bit_color_(uint8_t color_8bit); - uint8_t convert_to_8bit_color_(uint16_t color_16bit); ILI9341Model model_; int16_t width_{320}; ///< Display width as modified by current rotation