mirror of
https://github.com/esphome/esphome.git
synced 2024-11-29 18:24:13 +01:00
Fix for #6614- use background_color, improve anti-aliasing (#6618)
This commit is contained in:
parent
2fa5846893
commit
0662c5e0fb
2 changed files with 18 additions and 14 deletions
|
@ -129,7 +129,13 @@ void Font::print(int x_start, int y_start, display::Display *display, Color colo
|
||||||
|
|
||||||
uint8_t bitmask = 0;
|
uint8_t bitmask = 0;
|
||||||
uint8_t pixel_data = 0;
|
uint8_t pixel_data = 0;
|
||||||
float bpp_max = (1 << this->bpp_) - 1;
|
uint8_t bpp_max = (1 << this->bpp_) - 1;
|
||||||
|
auto diff_r = (float) color.r - (float) background.r;
|
||||||
|
auto diff_g = (float) color.g - (float) background.g;
|
||||||
|
auto diff_b = (float) color.b - (float) background.b;
|
||||||
|
auto b_r = (float) background.r;
|
||||||
|
auto b_g = (float) background.g;
|
||||||
|
auto b_b = (float) background.g;
|
||||||
for (int glyph_y = y_start + scan_y1; glyph_y != max_y; glyph_y++) {
|
for (int glyph_y = y_start + scan_y1; glyph_y != max_y; glyph_y++) {
|
||||||
for (int glyph_x = x_at + scan_x1; glyph_x != max_x; glyph_x++) {
|
for (int glyph_x = x_at + scan_x1; glyph_x != max_x; glyph_x++) {
|
||||||
uint8_t pixel = 0;
|
uint8_t pixel = 0;
|
||||||
|
@ -146,12 +152,9 @@ void Font::print(int x_start, int y_start, display::Display *display, Color colo
|
||||||
if (pixel == bpp_max) {
|
if (pixel == bpp_max) {
|
||||||
display->draw_pixel_at(glyph_x, glyph_y, color);
|
display->draw_pixel_at(glyph_x, glyph_y, color);
|
||||||
} else if (pixel != 0) {
|
} else if (pixel != 0) {
|
||||||
float on = (float) pixel / bpp_max;
|
auto on = (float) pixel / (float) bpp_max;
|
||||||
float off = 1.0 - on;
|
auto blended =
|
||||||
Color blended;
|
Color((uint8_t) (diff_r * on + b_r), (uint8_t) (diff_g * on + b_g), (uint8_t) (diff_b * on + b_b));
|
||||||
blended.r = color.r * on + background.r * off;
|
|
||||||
blended.g = color.r * on + background.g * off;
|
|
||||||
blended.b = color.r * on + background.b * off;
|
|
||||||
display->draw_pixel_at(glyph_x, glyph_y, blended);
|
display->draw_pixel_at(glyph_x, glyph_y, blended);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,8 @@ void GraphicalDisplayMenu::draw(display::Display *display, const display::Rect *
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicalDisplayMenu::draw_menu_internal_(display::Display *display, const display::Rect *bounds) {
|
void GraphicalDisplayMenu::draw_menu_internal_(display::Display *display, const display::Rect *bounds) {
|
||||||
int total_height = 0;
|
int16_t total_height = 0;
|
||||||
|
int16_t max_width = 0;
|
||||||
int y_padding = 2;
|
int y_padding = 2;
|
||||||
bool scroll_menu_items = false;
|
bool scroll_menu_items = false;
|
||||||
std::vector<display::Rect> menu_dimensions;
|
std::vector<display::Rect> menu_dimensions;
|
||||||
|
@ -118,6 +119,7 @@ void GraphicalDisplayMenu::draw_menu_internal_(display::Display *display, const
|
||||||
|
|
||||||
menu_dimensions.push_back(item_dimensions);
|
menu_dimensions.push_back(item_dimensions);
|
||||||
total_height += item_dimensions.h + (i == 0 ? 0 : y_padding);
|
total_height += item_dimensions.h + (i == 0 ? 0 : y_padding);
|
||||||
|
max_width = std::max(max_width, item_dimensions.w);
|
||||||
|
|
||||||
if (total_height <= bounds->h) {
|
if (total_height <= bounds->h) {
|
||||||
number_items_fit_to_screen++;
|
number_items_fit_to_screen++;
|
||||||
|
@ -166,7 +168,8 @@ void GraphicalDisplayMenu::draw_menu_internal_(display::Display *display, const
|
||||||
// Render the items into the view port
|
// Render the items into the view port
|
||||||
display->start_clipping(*bounds);
|
display->start_clipping(*bounds);
|
||||||
|
|
||||||
int y_offset = bounds->y;
|
display->filled_rectangle(bounds->x, bounds->y, max_width, total_height, this->background_color_);
|
||||||
|
auto y_offset = bounds->y;
|
||||||
for (size_t i = first_item_index; i <= last_item_index; i++) {
|
for (size_t i = first_item_index; i <= last_item_index; i++) {
|
||||||
const auto *item = this->displayed_item_->get_item(i);
|
const auto *item = this->displayed_item_->get_item(i);
|
||||||
const bool selected = i == this->cursor_index_;
|
const bool selected = i == this->cursor_index_;
|
||||||
|
@ -176,7 +179,7 @@ void GraphicalDisplayMenu::draw_menu_internal_(display::Display *display, const
|
||||||
dimensions.x = bounds->x;
|
dimensions.x = bounds->x;
|
||||||
this->draw_item(display, item, &dimensions, selected);
|
this->draw_item(display, item, &dimensions, selected);
|
||||||
|
|
||||||
y_offset = dimensions.y + dimensions.h + y_padding;
|
y_offset += dimensions.h + y_padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
display->end_clipping();
|
display->end_clipping();
|
||||||
|
@ -219,9 +222,7 @@ inline void GraphicalDisplayMenu::draw_item(display::Display *display, const dis
|
||||||
// int background_width = std::max(bounds->width, available_width);
|
// int background_width = std::max(bounds->width, available_width);
|
||||||
int background_width = bounds->w;
|
int background_width = bounds->w;
|
||||||
|
|
||||||
if (selected) {
|
display->filled_rectangle(bounds->x, bounds->y, background_width, bounds->h, background_color);
|
||||||
display->filled_rectangle(bounds->x, bounds->y, background_width, bounds->h, background_color);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string label = item->get_text();
|
std::string label = item->get_text();
|
||||||
if (item->has_value()) {
|
if (item->has_value()) {
|
||||||
|
@ -230,7 +231,7 @@ inline void GraphicalDisplayMenu::draw_item(display::Display *display, const dis
|
||||||
}
|
}
|
||||||
|
|
||||||
display->print(bounds->x, bounds->y, this->font_, foreground_color, display::TextAlign::TOP_LEFT, label.c_str(),
|
display->print(bounds->x, bounds->y, this->font_, foreground_color, display::TextAlign::TOP_LEFT, label.c_str(),
|
||||||
~foreground_color);
|
background_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicalDisplayMenu::draw_item(const display_menu_base::MenuItem *item, const uint8_t row, const bool selected) {
|
void GraphicalDisplayMenu::draw_item(const display_menu_base::MenuItem *item, const uint8_t row, const bool selected) {
|
||||||
|
|
Loading…
Reference in a new issue