From aa0d6afb61f4cf928e87c7a21bcb59fc973f15a0 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Wed, 8 Apr 2015 12:42:50 -0700 Subject: [PATCH] Remove the fixed screen size assumptions. Dynamically allocate the text and menu arrays instead. Change-Id: Idbfc3fe4e4b50db4fee62ac2b6a7323cad369749 --- screen_ui.cpp | 56 ++++++++++++++++++++++++++++++--------------------- screen_ui.h | 13 ++++-------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/screen_ui.cpp b/screen_ui.cpp index edc41abc..a0df455c 100644 --- a/screen_ui.cpp +++ b/screen_ui.cpp @@ -40,25 +40,26 @@ static int char_height; // There's only (at most) one of these objects, and global callbacks // (for pthread_create, and the input event system) need to find it, // so use a global variable. -static ScreenRecoveryUI* self = NULL; +static ScreenRecoveryUI* self = nullptr; // Return the current time as a double (including fractions of a second). static double now() { struct timeval tv; - gettimeofday(&tv, NULL); + gettimeofday(&tv, nullptr); return tv.tv_sec + tv.tv_usec / 1000000.0; } ScreenRecoveryUI::ScreenRecoveryUI() : currentIcon(NONE), installingFrame(0), - locale(NULL), + locale(nullptr), rtl_locale(false), progressBarType(EMPTY), progressScopeStart(0), progressScopeSize(0), progress(0), pagesIdentical(false), + text(nullptr), text_cols(0), text_rows(0), text_col(0), @@ -66,6 +67,7 @@ ScreenRecoveryUI::ScreenRecoveryUI() : text_top(0), show_text(false), show_text_ever(false), + menu(nullptr), show_menu(false), menu_top(0), menu_items(0), @@ -75,12 +77,10 @@ ScreenRecoveryUI::ScreenRecoveryUI() : stage(-1), max_stage(-1) { - for (int i = 0; i < 5; i++) - backgroundIcon[i] = NULL; - - memset(text, 0, sizeof(text)); - - pthread_mutex_init(&updateMutex, NULL); + for (int i = 0; i < 5; i++) { + backgroundIcon[i] = nullptr; + } + pthread_mutex_init(&updateMutex, nullptr); self = this; } @@ -247,7 +247,8 @@ void ScreenRecoveryUI::draw_screen_locked() // screen, the bottom of the menu, or we've displayed the // entire text buffer. int row = (text_top+text_rows-1) % text_rows; - for (int ty = gr_fb_height() - char_height, count = 0; + size_t count = 0; + for (int ty = gr_fb_height() - char_height; ty > y+2 && count < text_rows; ty -= char_height, ++count) { gr_text(0, ty, text[row], 0); @@ -281,7 +282,7 @@ void ScreenRecoveryUI::update_progress_locked() // Keeps the progress bar updated, even when the process is otherwise busy. void* ScreenRecoveryUI::progress_thread(void *cookie) { self->progress_loop(); - return NULL; + return nullptr; } void ScreenRecoveryUI::progress_loop() { @@ -344,23 +345,32 @@ void ScreenRecoveryUI::LoadLocalizedBitmap(const char* filename, gr_surface* sur } } +static char** Alloc2d(size_t rows, size_t cols) { + char** result = new char*[rows]; + for (size_t i = 0; i < rows; ++i) { + result[i] = new char[cols]; + memset(result[i], 0, cols); + } + return result; +} + void ScreenRecoveryUI::Init() { gr_init(); gr_font_size(&char_width, &char_height); + text_rows = gr_fb_height() / char_height; + text_cols = gr_fb_width() / char_width; + + text = Alloc2d(text_rows, text_cols + 1); + menu = Alloc2d(text_rows, text_cols + 1); text_col = text_row = 0; - text_rows = gr_fb_height() / char_height; - if (text_rows > kMaxRows) text_rows = kMaxRows; text_top = 1; - text_cols = gr_fb_width() / char_width; - if (text_cols > kMaxCols - 1) text_cols = kMaxCols - 1; - - backgroundIcon[NONE] = NULL; + backgroundIcon[NONE] = nullptr; LoadBitmapArray("icon_installing", &installing_frames, &installation); - backgroundIcon[INSTALLING_UPDATE] = installing_frames ? installation[0] : NULL; + backgroundIcon[INSTALLING_UPDATE] = installing_frames ? installation[0] : nullptr; backgroundIcon[ERASING] = backgroundIcon[INSTALLING_UPDATE]; LoadBitmap("icon_error", &backgroundIcon[ERROR]); backgroundIcon[NO_COMMAND] = backgroundIcon[ERROR]; @@ -375,7 +385,7 @@ void ScreenRecoveryUI::Init() LoadLocalizedBitmap("no_command_text", &backgroundText[NO_COMMAND]); LoadLocalizedBitmap("error_text", &backgroundText[ERROR]); - pthread_create(&progress_t, NULL, progress_thread, NULL); + pthread_create(&progress_t, nullptr, progress_thread, nullptr); RecoveryUI::Init(); } @@ -402,7 +412,7 @@ void ScreenRecoveryUI::SetLocale(const char* new_locale) { } free(lang); } else { - new_locale = NULL; + new_locale = nullptr; } } @@ -496,17 +506,17 @@ void ScreenRecoveryUI::Print(const char *fmt, ...) void ScreenRecoveryUI::StartMenu(const char* const * headers, const char* const * items, int initial_selection) { - int i; pthread_mutex_lock(&updateMutex); if (text_rows > 0 && text_cols > 0) { + size_t i; for (i = 0; i < text_rows; ++i) { - if (headers[i] == NULL) break; + if (headers[i] == nullptr) break; strncpy(menu[i], headers[i], text_cols-1); menu[i][text_cols-1] = '\0'; } menu_top = i; for (; i < text_rows; ++i) { - if (items[i-menu_top] == NULL) break; + if (items[i-menu_top] == nullptr) break; strncpy(menu[i], items[i-menu_top], text_cols-1); menu[i][text_cols-1] = '\0'; } diff --git a/screen_ui.h b/screen_ui.h index 01a33bfe..210fd3e1 100644 --- a/screen_ui.h +++ b/screen_ui.h @@ -84,17 +84,14 @@ class ScreenRecoveryUI : public RecoveryUI { // progress bar) bool pagesIdentical; - static const int kMaxCols = 96; - static const int kMaxRows = 96; - // Log text overlay, displayed when a magic key is pressed - char text[kMaxRows][kMaxCols]; - int text_cols, text_rows; - int text_col, text_row, text_top; + char** text; + size_t text_cols, text_rows; + size_t text_col, text_row, text_top; bool show_text; bool show_text_ever; // has show_text ever been true? - char menu[kMaxRows][kMaxCols]; + char** menu; bool show_menu; int menu_top, menu_items, menu_sel; @@ -102,8 +99,6 @@ class ScreenRecoveryUI : public RecoveryUI { int animation_fps; int installing_frames; - protected: - private: int iconX, iconY;