From 83e836fc797ce9ce8998a5d9b1fde6a172480bf2 Mon Sep 17 00:00:00 2001 From: RogueMaster Date: Tue, 16 May 2023 23:42:31 -0400 Subject: [PATCH] Dark Mode & Wii Menu --- .../main/archive/views/archive_browser_view.c | 4 +- applications/main/subghz/views/receiver.c | 4 +- applications/services/gui/canvas.c | 33 +- applications/services/gui/elements.c | 42 +-- applications/services/gui/elements.h | 13 +- .../services/gui/modules/byte_input.c | 14 +- .../services/gui/modules/byte_input.h | 2 +- .../services/gui/modules/file_browser.c | 4 +- applications/services/gui/modules/menu.c | 287 +++++++++++++++--- firmware/targets/f7/api_symbols.csv | 5 +- lib/u8g2/u8g2.h | 1 + lib/u8g2/u8g2_buffer.c | 8 + 12 files changed, 315 insertions(+), 102 deletions(-) diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 2cde1330866b..efd8293a3a07 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -327,7 +327,9 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { ((scrollbar ? MAX_LEN_PX - 6 : MAX_LEN_PX) - x_offset), str_buf, scroll_counter, - (model->item_idx != idx)); + (model->item_idx != idx), + false + ); furi_string_free(str_buf); } diff --git a/applications/main/subghz/views/receiver.c b/applications/main/subghz/views/receiver.c index 6f272b6a6a6e..0e5bfca6a8cf 100644 --- a/applications/main/subghz/views/receiver.c +++ b/applications/main/subghz/views/receiver.c @@ -269,7 +269,9 @@ void subghz_view_receiver_draw(Canvas* canvas, SubGhzViewReceiverModel* model) { (scrollbar ? MAX_LEN_PX - 6 : MAX_LEN_PX), str_buff, scroll_counter, - (model->idx != idx)); + (model->idx != idx), + false + ); furi_string_reset(str_buff); } if(scrollbar) { diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index 057bd3e95c4e..99ef7e44eee3 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -7,6 +7,7 @@ #include #include #include +#include const CanvasFontParameters canvas_font_params[FontTotalNumber] = { [FontPrimary] = {.leading_default = 12, .leading_min = 11, .height = 8, .descender = 2}, @@ -108,11 +109,22 @@ const CanvasFontParameters* canvas_get_font_params(const Canvas* canvas, Font fo void canvas_clear(Canvas* canvas) { furi_assert(canvas); - u8g2_ClearBuffer(&canvas->fb); + if(CFW_SETTINGS()->dark_mode) { + u8g2_FillBuffer(&canvas->fb); + } else { + u8g2_ClearBuffer(&canvas->fb); + } } void canvas_set_color(Canvas* canvas, Color color) { furi_assert(canvas); + if(CFW_SETTINGS()->dark_mode) { + if(color == ColorBlack) { + color = ColorWhite; + } else if(color == ColorWhite) { + color = ColorBlack; + } + } u8g2_SetDrawColor(&canvas->fb, color); } @@ -128,18 +140,25 @@ void canvas_invert_color(Canvas* canvas) { void canvas_set_font(Canvas* canvas, Font font) { furi_assert(canvas); u8g2_SetFontMode(&canvas->fb, 1); - if(font == FontPrimary) { + switch(font) { + case FontPrimary: u8g2_SetFont(&canvas->fb, u8g2_font_helvB08_tr); - } else if(font == FontSecondary) { + break; + case FontSecondary: u8g2_SetFont(&canvas->fb, u8g2_font_haxrcorp4089_tr); - } else if(font == FontKeyboard) { + break; + case FontKeyboard: u8g2_SetFont(&canvas->fb, u8g2_font_profont11_mr); - } else if(font == FontBigNumbers) { + break; + case FontBigNumbers: u8g2_SetFont(&canvas->fb, u8g2_font_profont22_tn); - } else if(font == FontBatteryPercent) { + break; + case FontBatteryPercent: u8g2_SetFont(&canvas->fb, u8g2_font_5x7_tf); //u8g2_font_micro_tr); - } else { + break; + default: furi_crash(NULL); + break; } } diff --git a/applications/services/gui/elements.c b/applications/services/gui/elements.c index 4d990c14ea1f..fc5609a364c4 100644 --- a/applications/services/gui/elements.c +++ b/applications/services/gui/elements.c @@ -638,44 +638,10 @@ void elements_scrollable_text_line( uint8_t width, FuriString* string, size_t scroll, - bool ellipsis) { - FuriString* line = furi_string_alloc_set(string); - - size_t len_px = canvas_string_width(canvas, furi_string_get_cstr(line)); - if(len_px > width) { - if(ellipsis) { - width -= canvas_string_width(canvas, "..."); - } - - // Calculate scroll size - size_t scroll_size = furi_string_size(line); - size_t right_width = 0; - for(size_t i = scroll_size; i > 0; i--) { - right_width += canvas_glyph_width(canvas, furi_string_get_char(line, i)); - if(right_width > width) break; - scroll_size--; - if(!scroll_size) break; - } - // Ensure that we have something to scroll - if(scroll_size) { - scroll_size += 3; - scroll = scroll % scroll_size; - furi_string_right(line, scroll); - } - - len_px = canvas_string_width(canvas, furi_string_get_cstr(line)); - while(len_px > width) { - furi_string_left(line, furi_string_size(line) - 1); - len_px = canvas_string_width(canvas, furi_string_get_cstr(line)); - } - - if(ellipsis) { - furi_string_cat(line, "..."); - } - } - - canvas_draw_str(canvas, x, y, furi_string_get_cstr(line)); - furi_string_free(line); + bool ellipsis, + bool centered) { + elements_scrollable_text_line_str( + canvas, x, y, width, furi_string_get_cstr(string), scroll, ellipsis, centered); } void elements_text_box( diff --git a/applications/services/gui/elements.h b/applications/services/gui/elements.h index bdc43d09a403..7cab3a67f760 100644 --- a/applications/services/gui/elements.h +++ b/applications/services/gui/elements.h @@ -218,22 +218,23 @@ void elements_string_fit_width(Canvas* canvas, FuriString* string, uint8_t width * @param string The string * @param[in] scroll The scroll counter: 0 - no scroll, any other number - scroll. Just count up, everything else will be calculated on the inside. * @param[in] ellipsis The ellipsis flag: true to add ellipse + * @param[in] centered The centered flag: true to center text on x and y */ -void elements_scrollable_text_line( +void elements_scrollable_text_line_str( Canvas* canvas, uint8_t x, uint8_t y, uint8_t width, - FuriString* string, + const char* string, size_t scroll, - bool ellipsis); - -void elements_scrollable_text_line_str( + bool ellipsis, + bool centered); +void elements_scrollable_text_line( Canvas* canvas, uint8_t x, uint8_t y, uint8_t width, - const char* string, + FuriString* string, size_t scroll, bool ellipsis, bool centered); diff --git a/applications/services/gui/modules/byte_input.c b/applications/services/gui/modules/byte_input.c index f1edf9de837a..b2d21f7ae39a 100644 --- a/applications/services/gui/modules/byte_input.c +++ b/applications/services/gui/modules/byte_input.c @@ -17,17 +17,17 @@ typedef struct { typedef struct { const char* header; uint8_t* bytes; - uint16_t bytes_count; + uint8_t bytes_count; ByteInputCallback input_callback; ByteChangedCallback changed_callback; void* callback_context; bool selected_high_nibble; - uint16_t selected_byte; + uint8_t selected_byte; int8_t selected_row; // row -1 - input, row 0 & 1 - keyboard uint8_t selected_column; - uint16_t first_visible_byte; + uint8_t first_visible_byte; } ByteInputModel; static const uint8_t keyboard_origin_x = 7; @@ -164,7 +164,7 @@ static void byte_input_draw_input(Canvas* canvas, ByteInputModel* model) { canvas_draw_icon(canvas, 2, 19, &I_ButtonLeftSmall_3x5); canvas_draw_icon(canvas, 123, 19, &I_ButtonRightSmall_3x5); - for(uint16_t i = model->first_visible_byte; + for(uint8_t i = model->first_visible_byte; i < model->first_visible_byte + MIN(model->bytes_count, max_drawable_bytes); i++) { uint8_t byte_position = i - model->first_visible_byte; @@ -253,7 +253,7 @@ static void byte_input_draw_input_selected(Canvas* canvas, ByteInputModel* model canvas_draw_icon(canvas, 2, 19, &I_ButtonLeftSmall_3x5); canvas_draw_icon(canvas, 122, 19, &I_ButtonRightSmall_3x5); - for(uint16_t i = model->first_visible_byte; + for(uint8_t i = model->first_visible_byte; i < model->first_visible_byte + MIN(model->bytes_count, max_drawable_bytes); i++) { uint8_t byte_position = i - model->first_visible_byte; @@ -305,7 +305,7 @@ static void byte_input_draw_input_selected(Canvas* canvas, ByteInputModel* model * @param value char value * @param high_nibble set high nibble */ -static void byte_input_set_nibble(uint8_t* data, uint16_t position, char value, bool high_nibble) { +static void byte_input_set_nibble(uint8_t* data, uint8_t position, char value, bool high_nibble) { switch(value) { case '0': case '1': @@ -750,7 +750,7 @@ void byte_input_set_result_callback( ByteChangedCallback changed_callback, void* callback_context, uint8_t* bytes, - uint16_t bytes_count) { + uint8_t bytes_count) { with_view_model( byte_input->view, ByteInputModel * model, diff --git a/applications/services/gui/modules/byte_input.h b/applications/services/gui/modules/byte_input.h index b8a4d4455f1c..42c4b5d65f90 100644 --- a/applications/services/gui/modules/byte_input.h +++ b/applications/services/gui/modules/byte_input.h @@ -55,7 +55,7 @@ void byte_input_set_result_callback( ByteChangedCallback changed_callback, void* callback_context, uint8_t* bytes, - uint16_t bytes_count); + uint8_t bytes_count); /** Set byte input header text * diff --git a/applications/services/gui/modules/file_browser.c b/applications/services/gui/modules/file_browser.c index 67fb6184681b..4a802a089cfc 100644 --- a/applications/services/gui/modules/file_browser.c +++ b/applications/services/gui/modules/file_browser.c @@ -600,7 +600,9 @@ static void browser_draw_list(Canvas* canvas, FileBrowserModel* model) { (show_scrollbar ? MAX_LEN_PX - 6 : MAX_LEN_PX), filename, scroll_counter, - (model->item_idx != idx)); + (model->item_idx != idx), + false + ); } if(show_scrollbar) { diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index afae8b8fa24e..86871c83c8dd 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -2,11 +2,16 @@ #include #include +#include +#include #include #include +#include +#include struct Menu { View* view; + FuriTimer* scroll_timer; }; typedef struct { @@ -24,10 +29,13 @@ ARRAY_DEF(MenuItemArray, MenuItem, M_POD_OPLIST); typedef struct { MenuItemArray_t items; size_t position; + size_t scroll_counter; } MenuModel; static void menu_process_up(Menu* menu); static void menu_process_down(Menu* menu); +static void menu_process_left(Menu* menu); +static void menu_process_right(Menu* menu); static void menu_process_ok(Menu* menu); static void menu_draw_callback(Canvas* canvas, void* _model) { @@ -40,33 +48,106 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { if(items_count) { MenuItem* item; size_t shift_position; - // First line - canvas_set_font(canvas, FontSecondary); - shift_position = (0 + position + items_count - 1) % items_count; - item = MenuItemArray_get(model->items, shift_position); - if(item->icon) { - canvas_draw_icon_animation(canvas, 4, 3, item->icon); - } - canvas_draw_str(canvas, 22, 14, item->label); - // Second line main - canvas_set_font(canvas, FontPrimary); - shift_position = (1 + position + items_count - 1) % items_count; - item = MenuItemArray_get(model->items, shift_position); - if(item->icon) { - canvas_draw_icon_animation(canvas, 4, 25, item->icon); - } - canvas_draw_str(canvas, 22, 36, item->label); - // Third line - canvas_set_font(canvas, FontSecondary); - shift_position = (2 + position + items_count - 1) % items_count; - item = MenuItemArray_get(model->items, shift_position); - if(item->icon) { - canvas_draw_icon_animation(canvas, 4, 47, item->icon); + if(CFW_SETTINGS()->wii_menu) { + FuriString* name = furi_string_alloc(); + if(position < 2) { + shift_position = 0; + } else if(position >= items_count - 2 + (items_count % 2)) { + shift_position = position - (position % 2) - 4; + } else { + shift_position = position - (position % 2) - 2; + } + canvas_set_font(canvas, FontSecondary); + size_t item_i; + size_t x_off, y_off; + for(int i = 0; i < 6; i++) { + item_i = shift_position + i; + if(item_i >= items_count) continue; + x_off = (i / 2) * 43 + 1; + y_off = (i % 2) * 32; + size_t scroll_counter = 0; + if(item_i == position) { + elements_slightly_rounded_box(canvas, 0 + x_off, 0 + y_off, 40, 30); + canvas_set_color(canvas, ColorWhite); + scroll_counter = model->scroll_counter; + if(scroll_counter < 1) { + scroll_counter = 0; + } else { + scroll_counter -= 1; + } + } + item = MenuItemArray_get(model->items, item_i); + if(item->icon) { + canvas_draw_icon_animation( + canvas, + (40 - item->icon->icon->width) / 2 + x_off, + (20 - item->icon->icon->height) / 2 + y_off, + item->icon); + } + furi_string_set(name, item->label); + if(furi_string_start_with_str(name, "[")) { + size_t trim = furi_string_search_str(name, "] ", 1); + if(trim != STRING_FAILURE) { + furi_string_right(name, trim + 2); + } + } + elements_scrollable_text_line( + canvas, 20 + x_off, 26 + y_off, 36, name, scroll_counter, false, true); + if(item_i == position) { + canvas_set_color(canvas, ColorBlack); + } else { + elements_frame(canvas, 0 + x_off, 0 + y_off, 40, 30); + } + } + furi_string_free(name); + } else { + // First line + canvas_set_font(canvas, FontSecondary); + shift_position = (0 + position + items_count - 1) % items_count; + item = MenuItemArray_get(model->items, shift_position); + if(item->icon) { + canvas_draw_icon_animation( + canvas, + 4 + (14 - item->icon->icon->width) / 2, + 3 + (14 - item->icon->icon->height) / 2, + item->icon); + } + canvas_draw_str(canvas, 22, 14, item->label); + // Second line main + canvas_set_font(canvas, FontPrimary); + shift_position = (1 + position + items_count - 1) % items_count; + item = MenuItemArray_get(model->items, shift_position); + if(item->icon) { + canvas_draw_icon_animation( + canvas, + 4 + (14 - item->icon->icon->width) / 2, + 25 + (14 - item->icon->icon->height) / 2, + item->icon); + } + size_t scroll_counter = model->scroll_counter; + if(scroll_counter < 1) { + scroll_counter = 0; + } else { + scroll_counter -= 1; + } + elements_scrollable_text_line_str( + canvas, 22, 36, 98, item->label, scroll_counter, false, false); + // Third line + canvas_set_font(canvas, FontSecondary); + shift_position = (2 + position + items_count - 1) % items_count; + item = MenuItemArray_get(model->items, shift_position); + if(item->icon) { + canvas_draw_icon_animation( + canvas, + 4 + (14 - item->icon->icon->width) / 2, + 47 + (14 - item->icon->icon->height) / 2, + item->icon); + } + canvas_draw_str(canvas, 22, 58, item->label); + // Frame and scrollbar + elements_frame(canvas, 0, 21, 128 - 5, 21); + elements_scrollbar(canvas, position, items_count); } - canvas_draw_str(canvas, 22, 58, item->label); - // Frame and scrollbar - elements_frame(canvas, 0, 21, 128 - 5, 21); - elements_scrollbar(canvas, position, items_count); } else { canvas_draw_str(canvas, 2, 32, "Empty"); elements_scrollbar(canvas, 0, 0); @@ -78,29 +159,62 @@ static bool menu_input_callback(InputEvent* event, void* context) { bool consumed = false; if(event->type == InputTypeShort) { - if(event->key == InputKeyUp) { + switch(event->key) { + case InputKeyUp: consumed = true; menu_process_up(menu); - } else if(event->key == InputKeyDown) { + break; + case InputKeyDown: consumed = true; menu_process_down(menu); - } else if(event->key == InputKeyOk) { + break; + case InputKeyLeft: + consumed = true; + menu_process_left(menu); + break; + case InputKeyRight: + consumed = true; + menu_process_right(menu); + break; + case InputKeyOk: consumed = true; menu_process_ok(menu); + break; + default: + break; } } else if(event->type == InputTypeRepeat) { - if(event->key == InputKeyUp) { + switch(event->key) { + case InputKeyUp: consumed = true; menu_process_up(menu); - } else if(event->key == InputKeyDown) { + break; + case InputKeyDown: consumed = true; menu_process_down(menu); + break; + case InputKeyLeft: + consumed = true; + menu_process_left(menu); + break; + case InputKeyRight: + consumed = true; + menu_process_right(menu); + break; + default: + break; } } return consumed; } +static void menu_scroll_timer_callback(void* context) { + Menu* menu = context; + with_view_model( + menu->view, MenuModel * model, { model->scroll_counter++; }, true); +} + static void menu_enter(void* context) { Menu* menu = context; with_view_model( @@ -111,8 +225,10 @@ static void menu_enter(void* context) { if(item && item->icon) { icon_animation_start(item->icon); } + model->scroll_counter = 0; }, - false); + true); + furi_timer_start(menu->scroll_timer, 333); } static void menu_exit(void* context) { @@ -127,6 +243,7 @@ static void menu_exit(void* context) { } }, false); + furi_timer_stop(menu->scroll_timer); } Menu* menu_alloc() { @@ -139,6 +256,8 @@ Menu* menu_alloc() { view_set_enter_callback(menu->view, menu_enter); view_set_exit_callback(menu->view, menu_exit); + menu->scroll_timer = furi_timer_alloc(menu_scroll_timer_callback, FuriTimerTypePeriodic, menu); + with_view_model( menu->view, MenuModel * model, @@ -157,6 +276,7 @@ void menu_free(Menu* menu) { with_view_model( menu->view, MenuModel * model, { MenuItemArray_clear(model->items); }, false); view_free(menu->view); + furi_timer_free(menu->scroll_timer); free(menu); } @@ -226,15 +346,27 @@ static void menu_process_up(Menu* menu) { menu->view, MenuModel * model, { + size_t count = MenuItemArray_size(model->items); MenuItem* item = MenuItemArray_get(model->items, model->position); if(item && item->icon) { icon_animation_stop(item->icon); } - if(model->position > 0) { - model->position--; + if(CFW_SETTINGS()->wii_menu) { + if(!(model->position == count - 1 && count % 2)) { + if(model->position % 2) { + model->position--; + } else { + model->position++; + } + model->scroll_counter = 0; + } } else { - model->position = MenuItemArray_size(model->items) - 1; + if(model->position > 0) { + model->position--; + } else { + model->position = count - 1; + } } item = MenuItemArray_get(model->items, model->position); @@ -246,6 +378,74 @@ static void menu_process_up(Menu* menu) { } static void menu_process_down(Menu* menu) { + with_view_model( + menu->view, + MenuModel * model, + { + size_t count = MenuItemArray_size(model->items); + MenuItem* item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_stop(item->icon); + } + + if(CFW_SETTINGS()->wii_menu) { + if(!(model->position == count - 1 && count % 2)) { + if(model->position % 2) { + model->position--; + } else { + model->position++; + } + model->scroll_counter = 0; + } + } else { + if(model->position < count - 1) { + model->position++; + } else { + model->position = 0; + } + } + + item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_start(item->icon); + } + }, + true); +} + +static void menu_process_left(Menu* menu) { + if(!CFW_SETTINGS()->wii_menu) return; + with_view_model( + menu->view, + MenuModel * model, + { + MenuItem* item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_stop(item->icon); + } + + size_t count = MenuItemArray_size(model->items); + if(model->position < 2) { + if(count % 2) { + model->position = count - 1; + } else { + model->position = count - 2 + model->position % 2; + } + } else { + model->position -= 2; + } + model->scroll_counter = 0; + + item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_start(item->icon); + } + }, + true); +} + +static void menu_process_right(Menu* menu) { + if(!CFW_SETTINGS()->wii_menu) return; with_view_model( menu->view, MenuModel * model, @@ -255,11 +455,22 @@ static void menu_process_down(Menu* menu) { icon_animation_stop(item->icon); } - if(model->position < MenuItemArray_size(model->items) - 1) { - model->position++; + size_t count = MenuItemArray_size(model->items); + if(count % 2) { + if(model->position == count - 1) { + model->position = 0; + } else if(model->position == count - 2) { + model->position = count - 1; + } else { + model->position += 2; + } } else { - model->position = 0; + model->position += 2; + if(model->position >= count) { + model->position = model->position % 2; + } } + model->scroll_counter = 0; item = MenuItemArray_get(model->items, model->position); if(item && item->icon) { diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 9059a0b39968..708658b85659 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -640,7 +640,7 @@ Function,+,byte_input_alloc,ByteInput*, Function,+,byte_input_free,void,ByteInput* Function,+,byte_input_get_view,View*,ByteInput* Function,+,byte_input_set_header_text,void,"ByteInput*, const char*" -Function,+,byte_input_set_result_callback,void,"ByteInput*, ByteInputCallback, ByteChangedCallback, void*, uint8_t*, uint16_t" +Function,+,byte_input_set_result_callback,void,"ByteInput*, ByteInputCallback, ByteChangedCallback, void*, uint8_t*, uint8_t" Function,-,bzero,void,"void*, size_t" Function,-,calloc,void*,"size_t, size_t" Function,+,canvas_clear,void,Canvas* @@ -875,7 +875,7 @@ Function,+,elements_multiline_text_aligned,void,"Canvas*, uint8_t, uint8_t, Alig Function,+,elements_multiline_text_framed,void,"Canvas*, uint8_t, uint8_t, const char*" Function,+,elements_progress_bar,void,"Canvas*, uint8_t, uint8_t, uint8_t, float" Function,+,elements_progress_bar_with_text,void,"Canvas*, uint8_t, uint8_t, uint8_t, float, const char*" -Function,+,elements_scrollable_text_line,void,"Canvas*, uint8_t, uint8_t, uint8_t, FuriString*, size_t, _Bool" +Function,+,elements_scrollable_text_line,void,"Canvas*, uint8_t, uint8_t, uint8_t, FuriString*, size_t, _Bool, _Bool" Function,+,elements_scrollable_text_line_str,void,"Canvas*, uint8_t, uint8_t, uint8_t, const char*, size_t, _Bool, _Bool" Function,+,elements_scrollbar,void,"Canvas*, uint16_t, uint16_t" Function,+,elements_scrollbar_pos,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint16_t, uint16_t" @@ -3586,6 +3586,7 @@ Function,-,u8g2_DrawUTF8Lines,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8 Function,-,u8g2_DrawVLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" Function,-,u8g2_DrawXBM,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" Function,-,u8g2_DrawXBMP,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" +Function,-,u8g2_FillBuffer,void,u8g2_t* Function,-,u8g2_FirstPage,void,u8g2_t* Function,-,u8g2_GetFontSize,size_t,const uint8_t* Function,-,u8g2_GetGlyphWidth,int8_t,"u8g2_t*, uint16_t" diff --git a/lib/u8g2/u8g2.h b/lib/u8g2/u8g2.h index 68611d482777..0068ea61d36b 100644 --- a/lib/u8g2/u8g2.h +++ b/lib/u8g2/u8g2.h @@ -3548,6 +3548,7 @@ void u8g2_Setup_a2printer_384x240_f( void u8g2_SendBuffer(u8g2_t* u8g2); void u8g2_ClearBuffer(u8g2_t* u8g2); +void u8g2_FillBuffer(u8g2_t* u8g2); void u8g2_SetBufferCurrTileRow(u8g2_t* u8g2, uint8_t row) U8G2_NOINLINE; diff --git a/lib/u8g2/u8g2_buffer.c b/lib/u8g2/u8g2_buffer.c index 45855bd5d389..06686b79b51f 100644 --- a/lib/u8g2/u8g2_buffer.c +++ b/lib/u8g2/u8g2_buffer.c @@ -45,6 +45,14 @@ void u8g2_ClearBuffer(u8g2_t* u8g2) { memset(u8g2->tile_buf_ptr, 0, cnt); } +void u8g2_FillBuffer(u8g2_t* u8g2) { + size_t cnt; + cnt = u8g2_GetU8x8(u8g2)->display_info->tile_width; + cnt *= u8g2->tile_buf_height; + cnt *= 8; + memset(u8g2->tile_buf_ptr, 255, cnt); +} + /*============================================*/ static void u8g2_send_tile_row(u8g2_t* u8g2, uint8_t src_tile_row, uint8_t dest_tile_row) {