diff options
-rw-r--r-- | minui/graphics.cpp | 32 | ||||
-rw-r--r-- | minui/minui.h | 3 | ||||
-rw-r--r-- | screen_ui.cpp | 40 | ||||
-rw-r--r-- | screen_ui.h | 5 |
4 files changed, 76 insertions, 4 deletions
diff --git a/minui/graphics.cpp b/minui/graphics.cpp index c0eea9e..43c28ce 100644 --- a/minui/graphics.cpp +++ b/minui/graphics.cpp @@ -103,6 +103,36 @@ static void text_blend(unsigned char* src_p, int src_row_bytes, } } +static int rainbow_index = 0; +static int rainbow_enabled = 0; +static int rainbow_colors[] = { 255, 0, 0, // red + 255, 127, 0, // orange + 255, 255, 0, // yellow + 0, 255, 0, // green + 60, 80, 255, // blue + 143, 0, 255 }; // violet +static int num_rb_colors = + (sizeof(rainbow_colors)/sizeof(rainbow_colors[0])) / 3; + +static void rainbow(int col) { + int rainbow_color = ((rainbow_index + col) % num_rb_colors) * 3; + gr_color(rainbow_colors[rainbow_color], rainbow_colors[rainbow_color+1], + rainbow_colors[rainbow_color+2], 255); +} + +void set_rainbow_mode(int enabled) { + rainbow_enabled = enabled; +} + +void move_rainbow(int x) { + rainbow_index += x; + if (rainbow_index < 0) { + rainbow_index = num_rb_colors - 1; + } else if (rainbow_index >= num_rb_colors) { + rainbow_index = 0; + } +} + void gr_text(int x, int y, const char *s, bool bold) { GRFont* font = gr_font; @@ -116,6 +146,8 @@ void gr_text(int x, int y, const char *s, bool bold) unsigned char ch; while ((ch = *s++)) { + if (rainbow_enabled) rainbow(x / font->cwidth); + if (outside(x, y) || outside(x+font->cwidth-1, y+font->cheight-1)) break; if (ch < ' ' || ch > '~') { diff --git a/minui/minui.h b/minui/minui.h index bdde083..d714632 100644 --- a/minui/minui.h +++ b/minui/minui.h @@ -120,4 +120,7 @@ int res_create_localized_alpha_surface(const char* name, const char* locale, // functions. void res_free_surface(GRSurface* surface); +void set_rainbow_mode(int enabled); +void move_rainbow(int x); + #endif diff --git a/screen_ui.cpp b/screen_ui.cpp index f2fda2f..f23affa 100644 --- a/screen_ui.cpp +++ b/screen_ui.cpp @@ -76,7 +76,9 @@ ScreenRecoveryUI::ScreenRecoveryUI() : animation_fps(20), installing_frames(-1), stage(-1), - max_stage(-1) { + max_stage(-1), + rainbow(false), + wrap_count(0) { for (int i = 0; i < 5; i++) { backgroundIcon[i] = nullptr; @@ -321,6 +323,12 @@ void* ScreenRecoveryUI::ProgressThreadStartRoutine(void* data) { return nullptr; } +void ScreenRecoveryUI::OMGRainbows() +{ + rainbow = rainbow ? false : true; + set_rainbow_mode(rainbow); +} + void ScreenRecoveryUI::ProgressThreadLoop() { double interval = 1.0 / animation_fps; while (true) { @@ -664,16 +672,40 @@ void ScreenRecoveryUI::StartMenu(const char* const * headers, const char* const } int ScreenRecoveryUI::SelectMenu(int sel) { + int wrapped = 0; pthread_mutex_lock(&updateMutex); if (show_menu) { int old_sel = menu_sel; menu_sel = sel; // Wrap at top and bottom. - if (menu_sel < 0) menu_sel = menu_items - 1; - if (menu_sel >= menu_items) menu_sel = 0; - + if (rainbow) { + if (menu_sel > old_sel) { + move_rainbow(1); + } else if (menu_sel < old_sel) { + move_rainbow(-1); + } + } + if (menu_sel < 0) { + wrapped = -1; + menu_sel = menu_items - 1; + } + if (menu_sel >= menu_items) { + wrapped = 1; + menu_sel = 0; + } sel = menu_sel; + if (wrapped != 0) { + if (wrap_count / wrapped > 0) { + wrap_count += wrapped; + } else { + wrap_count = wrapped; + } + if (wrap_count / wrapped >= 5) { + wrap_count = 0; + OMGRainbows(); + } + } if (menu_sel != old_sel) update_screen_locked(); } pthread_mutex_unlock(&updateMutex); diff --git a/screen_ui.h b/screen_ui.h index 8e18864..2ec5f5d 100644 --- a/screen_ui.h +++ b/screen_ui.h @@ -116,6 +116,9 @@ class ScreenRecoveryUI : public RecoveryUI { int stage, max_stage; + bool rainbow; + int wrap_count; + void draw_background_locked(Icon icon); void draw_progress_locked(); void draw_screen_locked(); @@ -137,6 +140,8 @@ class ScreenRecoveryUI : public RecoveryUI { void LoadBitmap(const char* filename, GRSurface** surface); void LoadBitmapArray(const char* filename, int* frames, GRSurface*** surface); void LoadLocalizedBitmap(const char* filename, GRSurface** surface); + + void OMGRainbows(); }; #endif // RECOVERY_UI_H |