// Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. static void draw_screen_locked(void) { draw_background_locked(gCurrentIcon); if (show_text) { gr_color(0, 0, 0, 160); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); int i = 0, j = 0; int k = menu_top + 1; //counter for bottom horizontal text line location if (show_menu) { //menu line item selection highlight draws gr_color(255, 255, 255, 255); gr_fill(0, (menu_top + menu_sel - menu_show_start+1) * CHAR_HEIGHT, gr_fb_width(), CHAR_HEIGHT+1); //draw semi-static headers for (i = 0; i < menu_top; ++i) { gr_color(200, 200, 200, 200); draw_text_line(i, menu[i]); //LOGI("Semi-static headers internal counter i: %i\n", i); } //adjust counter for current position of selection and menu display starting point if (menu_items - menu_show_start + menu_top >= text_rows){ j = text_rows - menu_top; //LOGI("j = text_rows - mneu_top and j = %i\n", j); } else { j = menu_items - menu_show_start; //LOGI("j = mneu_items - menu_show_start and j = %i\n", j); } //LOGI("outside draw menu items for loop and i goes until limit. limit-menu_show_start + menu_top + j = %i\n", menu_show_start + menu_top + j); //draw menu items dynamically based on current menu starting position, menu selection point and headers for (i = menu_show_start + menu_top; i < (menu_show_start + menu_top + j); ++i) { //LOGI("inside draw menu items for loop and i = %i\n", i); if (i == menu_top + menu_sel) { gr_color(200, 200, 200, 200); //LOGI("draw_text_line -menu_item_when_highlighted_color- at i + 1= %i\n", i+1); draw_text_line(i - menu_show_start +1, menu[i]); } else { gr_color(200, 200, 200, 200); //LOGI("draw_text_line -menu_item_color- at i + 1= %i\n", i+1); draw_text_line(i - menu_show_start +1, menu[i]); } //LOGI("inside draw menu items for loop and k = %i\n", k); k++; } } k++; //keep ui_print below menu items display gr_color(200, 200, 200, 200); //called by at least ui_print for (; k < text_rows; ++k) { draw_text_line(k, text[(k+text_top) % text_rows]); } } }
// Redraw everything on the screen. Does not flip pages. // Should only be called with updateMutex locked. void ScreenRecoveryUI::draw_screen_locked() { draw_background_locked(currentIcon); draw_progress_locked(); if (show_text) { gr_color(0, 0, 0, 160); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); int i = 0; if (show_menu) { #ifndef VENDOR_EDIT //[email protected], 2012/06/11, Modify for recovery font color gr_color(64, 96, 255, 255); #else /* VENDOR_EDIT */ gr_color(41, 198, 255, 255); #endif /* VENDOR_EDIT */ gr_fill(0, (menu_top+menu_sel) * CHAR_HEIGHT, gr_fb_width(), (menu_top+menu_sel+1)*CHAR_HEIGHT+1); for (; i < menu_top + menu_items; ++i) { if (i == menu_top + menu_sel) { #ifndef VENDOR_EDIT //[email protected], 2012/06/11, Modify for recovery font color gr_color(255, 140, 0, 255); draw_text_line(i, menu[i]); gr_color(64, 96, 255, 255); #else /* VENDOR_EDIT */ gr_color(255, 255, 255, 255); draw_focus_text_line(i, menu[i]); gr_color(255, 255, 60, 255); #endif /* VENDOR_EDIT */ } else { #ifndef VENDOR_EDIT //[email protected], 2012/06/11, Modify for recovery font color gr_color(255, 140, 0, 255); #else /* VENDOR_EDIT */ gr_color(255, 230, 120, 255); #endif /* VENDOR_EDIT */ draw_text_line(i, menu[i]); } } gr_fill(0, i*CHAR_HEIGHT+CHAR_HEIGHT/2-1, gr_fb_width(), i*CHAR_HEIGHT+CHAR_HEIGHT/2+1); ++i; } gr_color(240, 255, 240, 255); //wschen 2012-07-11 for (; i < text_rows; ++i) { draw_text_line(i, text[(i+text_top) % text_rows]); } } }
// Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. static void draw_screen_locked(void) { if (!ui_has_initialized) return; draw_background_locked(gCurrentIcon); draw_progress_locked(); if (show_text) { gr_color(0, 0, 0, 160); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); int i = 0; int j = 0; int row = 0; // current row that we are drawing on if (show_menu) { gr_color(MENU_TEXT_COLOR); gr_fill(0, (menu_top + menu_sel - menu_show_start) * CHAR_HEIGHT, gr_fb_width(), (menu_top + menu_sel - menu_show_start + 1)*CHAR_HEIGHT+1); gr_color(HEADER_TEXT_COLOR); for (i = 0; i < menu_top; ++i) { draw_text_line(i, menu[i]); row++; } if (menu_items - menu_show_start + menu_top >= MAX_ROWS) j = MAX_ROWS - menu_top; else j = menu_items - menu_show_start; gr_color(MENU_TEXT_COLOR); for (i = menu_show_start + menu_top; i < (menu_show_start + menu_top + j); ++i) { if (i == menu_top + menu_sel) { gr_color(255, 255, 255, 255); draw_text_line(i - menu_show_start , menu[i]); gr_color(MENU_TEXT_COLOR); } else { gr_color(MENU_TEXT_COLOR); draw_text_line(i - menu_show_start, menu[i]); } row++; } gr_fill(0, row*CHAR_HEIGHT+CHAR_HEIGHT/2-1, gr_fb_width(), row*CHAR_HEIGHT+CHAR_HEIGHT/2+1); } gr_color(NORMAL_TEXT_COLOR); for (; row < text_rows; ++row) { draw_text_line(row, text[(row+text_top) % text_rows]); } } }
static void draw_string (DiaRenderer *object, const gchar *text, Point *pos, Alignment alignment, Color *color) { TextLine *text_line = text_line_new(text, object->font, object->font_height); draw_text_line(object, text_line, pos, alignment, color); text_line_destroy(text_line); }
/* Draw a text into a given rectangle We wrap the text at white space boundaries If the variable cnt is TRUE, we do NOT draw the text, but simply count the height in pixels that we would draw. If lftadj is <>0, the text is not centered horizontally, but left adjusted */ int draw_text_space (char *s, int start_row, int start_col, int width, int height, int fg_col, int bg_col, int cnt, int lftadj){ int r=0; int cnt_wid = 0; char *s2; int offset; if (font_height > height) return 0; // No vertical space to draw anything while (*s ){ /* count how many pixels we will draw on the current line and remember start of line break */ s2 = draw_text_line(s, start_row + r, start_col, width, fg_col, bg_col, &cnt_wid); /* Shall we really draw ? */ if (0 == cnt){ /* If this is less than the line width, center the text horizontally */ if ( (cnt_wid <= width) && !lftadj) offset = (width - cnt_wid) / 2; else offset = 0; /* And now draw for real (and maybe centered) */ draw_text_line(s, start_row + r, start_col + offset, width - offset, fg_col, bg_col, NULL); }; /* Go to the beginning of next line */ s = s2; if (*s) s++; // this is white space, skip it. r += font_height; /* We have drawn a line font_height pixels high */ cnt_wid = 0; /* We have not drawn anything on this line */ /* is there enough room vertically for another line */ if ((r + 2 + font_height) > height) break; r += 2; /* inter line space */ }; if (cnt_wid > 0) r += font_height; return r; };
static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, Color *colour) { TextLine *text_line = text_line_new(text, self->font, self->font_height); draw_text_line(self, text_line, pos, alignment, colour); text_line_destroy(text_line); }
static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, Color *color) { DiaPsFt2Renderer *renderer = DIA_PS_FT2_RENDERER(self); TextLine *text_line = text_line_new(text, renderer->current_font, renderer->current_height); draw_text_line(self, text_line, pos, alignment, color); text_line_destroy(text_line); }
// Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. static void draw_screen_locked(void) { int cRv = 54; int cGv = 74; int cBv = 255; draw_background_locked(gCurrentIcon); draw_progress_locked(); if (show_text) { gr_color(0, 0, 0, 160); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); int i = 0; if (show_menu) { gr_color(cRv,cGv,cBv,255); gr_fill(0, (menu_top+menu_sel) * CHAR_HEIGHT, gr_fb_width(), (menu_top+menu_sel+1)*CHAR_HEIGHT+1); for (; i < menu_top + menu_items; ++i) { if (i == menu_top + menu_sel) { gr_color(255, 255, 255, 255); draw_text_line(i, menu[i]); gr_color(cRv,cGv,cBv,255); } else { draw_text_line(i, menu[i]); } } gr_fill(0, i*CHAR_HEIGHT+CHAR_HEIGHT/2-1, gr_fb_width(), i*CHAR_HEIGHT+CHAR_HEIGHT/2+1); ++i; } TEXTCOLOR for (; i < text_rows; ++i) { draw_text_line(i, text[(i+text_top) % text_rows]); } } }
static void draw_text(duc_graph *g, double _x, double _y, double size, char *text) { struct opengl_backend_data *bd = g->backend_data; double x = _x - g->cx; double y = _y - g->cy - size * bd->font_scale * STB_SOMEFONT_LINE_SPACING; glDisableVertexAttribArray(bd->loc_color); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); char *p1 = text; char *p2 = text; while(*p2) { while(*p2 && *p2 != '\n' && *p2 != '\r') { p2++; } glVertexAttrib4f(bd->loc_color, 1, 1, 1, 0); draw_text_line(g, x-1, y+0, size, p1, p2-p1); draw_text_line(g, x+1, y-0, size, p1, p2-p1); draw_text_line(g, x-0, y+1, size, p1, p2-p1); draw_text_line(g, x+0, y-1, size, p1, p2-p1); glVertexAttrib4f(bd->loc_color, 0, 0, 0, 0); draw_text_line(g, x+0, y, size, p1, p2-p1); if(!*p2) break; y += size * bd->font_scale * STB_SOMEFONT_LINE_SPACING * 1.5; x = _x - g->cx; p2 ++; p1 = p2; } glBlendFunc(GL_ONE, GL_ZERO); }
// Redraw everything on the screen. Does not flip pages. // Should only be called with updateMutex locked. void ScreenRecoveryUI::draw_screen_locked() { draw_background_locked(currentIcon); draw_progress_locked(); if (show_text) { gr_color(0, 0, 0, 160); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); int i = 0; if (show_menu) { gr_color(64, 96, 255, 255); gr_fill(0, (menu_top+menu_sel) * CHAR_HEIGHT, gr_fb_width(), (menu_top+menu_sel+1)*CHAR_HEIGHT+1); for (; i < menu_top + menu_items; ++i) { if (i == menu_top + menu_sel) { gr_color(255, 255, 255, 255); draw_text_line(i, menu[i]); gr_color(64, 96, 255, 255); } else { draw_text_line(i, menu[i]); } } gr_fill(0, i*CHAR_HEIGHT+CHAR_HEIGHT/2-1, gr_fb_width(), i*CHAR_HEIGHT+CHAR_HEIGHT/2+1); ++i; } gr_color(255, 255, 0, 255); for (; i < text_rows; ++i) { draw_text_line(i, text[(i+text_top) % text_rows]); } } }
SDL_Rect draw_text(surface dst, const SDL_Rect& area, int size, const SDL_Color& color, const std::string& txt, int x, int y, bool use_tooltips, int style) { // Make sure there's always at least a space, // so we can ensure that we can return a rectangle for height static const std::string blank_text(" "); const std::string& text = txt.empty() ? blank_text : txt; SDL_Rect res; res.x = x; res.y = y; res.w = 0; res.h = 0; std::string::const_iterator i1 = text.begin(); std::string::const_iterator i2 = std::find(i1,text.end(),'\n'); for(;;) { SDL_Color col = color; int sz = size; int text_style = style; i1 = parse_markup(i1,i2,&sz,&col,&text_style); if(i1 != i2) { std::string new_string = utils::unescape(std::string(i1, i2)); const SDL_Rect rect = draw_text_line(dst, area, sz, col, new_string, x, y, use_tooltips, text_style); if(rect.w > res.w) { res.w = rect.w; } res.h += rect.h; y += rect.h; } if(i2 == text.end()) { break; } i1 = i2+1; i2 = std::find(i1,text.end(),'\n'); } return res; }
// Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. static void draw_screen_locked(void) { if (!ui_has_initialized) return; draw_background_locked(gCurrentIcon); draw_progress_locked(); if (show_text) { int total_rows = (gr_fb_height() - virtualkey_h) / CHAR_HEIGHT; int i = 0; int j = 0; int row = 0; // current row that we are drawing on if (show_menu) { int batt_level = 0; char batt_text[40]; batt_level = get_batt_stats(); /*struct tm *current; time_t now; now = time(NULL); // add 2 hours current = localtime(&now); sprintf(batt_text, "[%d%% %02D:%02D]", batt_level, current->tm_hour, current->tm_min); if (now == NULL)*/ sprintf(batt_text, " [%d%%]", batt_level); gr_color(menuTextColor[0], menuTextColor[1], menuTextColor[2], menuTextColor[3]); //gr_color(0, 255, 0, 255); if (batt_level < 21) gr_color(255, 0, 0, 255); draw_text_line(0, batt_text, RIGHT_ALIGN); gr_color(menuTextColor[0], menuTextColor[1], menuTextColor[2], menuTextColor[3]); gr_fill(0, (menu_top + menu_sel - menu_show_start) * CHAR_HEIGHT, gr_fb_width(), (menu_top + menu_sel - menu_show_start + 1)*CHAR_HEIGHT+1); gr_color(HEADER_TEXT_COLOR); for (i = 0; i < menu_top; ++i) { draw_text_line(i, menu[i], LEFT_ALIGN); row++; } if (menu_items - menu_show_start + menu_top >= max_menu_rows) j = max_menu_rows - menu_top; else j = menu_items - menu_show_start; gr_color(menuTextColor[0], menuTextColor[1], menuTextColor[2], menuTextColor[3]); for (i = menu_show_start + menu_top; i < (menu_show_start + menu_top + j); ++i) { if (i == menu_top + menu_sel) { gr_color(255, 255, 255, 255); draw_text_line(i - menu_show_start , menu[i], LEFT_ALIGN); gr_color(menuTextColor[0], menuTextColor[1], menuTextColor[2], menuTextColor[3]); } else { gr_color(menuTextColor[0], menuTextColor[1], menuTextColor[2], menuTextColor[3]); draw_text_line(i - menu_show_start, menu[i], LEFT_ALIGN); } row++; if (row >= max_menu_rows) break; } gr_fill(0, row*CHAR_HEIGHT+CHAR_HEIGHT/2-1, gr_fb_width(), row*CHAR_HEIGHT+CHAR_HEIGHT/2+1); } gr_color(NORMAL_TEXT_COLOR); int cur_row = text_row; int available_rows = total_rows - row - 1; int start_row = row + 1; if (available_rows < MAX_ROWS) cur_row = (cur_row + (MAX_ROWS - available_rows)) % MAX_ROWS; else start_row = total_rows - MAX_ROWS; int r; for (r = 0; r < (available_rows < MAX_ROWS ? available_rows : MAX_ROWS); r++) { draw_text_line(start_row + r, text[(cur_row + r) % MAX_ROWS], LEFT_ALIGN); } } #ifdef USE_VIRTUAL_KEY draw_virtualkeys_locked(); #endif }
// Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. static void draw_screen_locked(void) { if (!ui_has_initialized) return; draw_background_locked(gCurrentIcon); draw_progress_locked(); if (show_text) { // don't "disable" the background anymore with this... // gr_color(0, 0, 0, 160); // gr_fill(0, 0, gr_fb_width(), gr_fb_height()); int total_rows = gr_fb_height() / CHAR_HEIGHT; int i = 0; int j = 0; int row = 0; // current row that we are drawing on if (show_menu) { #ifndef BOARD_TOUCH_RECOVERY gr_color(MENU_TEXT_COLOR); gr_fill(0, (menu_top + menu_sel - menu_show_start) * CHAR_HEIGHT, gr_fb_width(), (menu_top + menu_sel - menu_show_start + 1)*CHAR_HEIGHT+1); gr_color(HEADER_TEXT_COLOR); for (i = 0; i < menu_top; ++i) { draw_text_line(i, menu[i]); row++; } if (menu_items - menu_show_start + menu_top >= max_menu_rows) j = max_menu_rows - menu_top; else j = menu_items - menu_show_start; gr_color(MENU_TEXT_COLOR); for (i = menu_show_start + menu_top; i < (menu_show_start + menu_top + j); ++i) { if (i == menu_top + menu_sel) { gr_color(255, 255, 255, 255); draw_text_line(i - menu_show_start , menu[i]); gr_color(MENU_TEXT_COLOR); } else { gr_color(MENU_TEXT_COLOR); draw_text_line(i - menu_show_start, menu[i]); } row++; if (row >= max_menu_rows) break; } gr_fill(0, row*CHAR_HEIGHT+CHAR_HEIGHT/2-1, gr_fb_width(), row*CHAR_HEIGHT+CHAR_HEIGHT/2+1); #else row = draw_touch_menu(menu, menu_items, menu_top, menu_sel, menu_show_start); #endif } gr_color(NORMAL_TEXT_COLOR); int cur_row = text_row; int available_rows = total_rows - row - 1; int start_row = row + 1; if (available_rows < MAX_ROWS) cur_row = (cur_row + (MAX_ROWS - available_rows)) % MAX_ROWS; else start_row = total_rows - MAX_ROWS; int r; for (r = 0; r < (available_rows < MAX_ROWS ? available_rows : MAX_ROWS); r++) { draw_text_line(start_row + r, text[(cur_row + r) % MAX_ROWS]); } } }
// Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. static void draw_screen_locked(void) { if (!ui_has_initialized) return; //In this case MENU_SELECT icon has maximum possible height. int menu_max_height = gr_get_height(gMenuIcon[MENU_SELECT]); struct { int x; int y; } MENU_ICON[] = { { gr_fb_width() - menu_max_height, 7*gr_fb_height()/8 }, { gr_fb_width() - menu_max_height, 5*gr_fb_height()/8 }, { gr_fb_width() - menu_max_height, 3*gr_fb_height()/8 }, { gr_fb_width() - menu_max_height, 1*gr_fb_height()/8 }, }; draw_background_locked(gCurrentIcon); draw_progress_locked(); if (show_text) { gr_color(0, 0, 0, 160); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); int i = 0; int j = 0; int row = 0; // current row that we are drawing on if (show_menu) { draw_icon_locked(gMenuIcon[MENU_BACK], MENU_ICON[MENU_BACK].x, MENU_ICON[MENU_BACK].y ); draw_icon_locked(gMenuIcon[MENU_DOWN], MENU_ICON[MENU_DOWN].x, MENU_ICON[MENU_DOWN].y); draw_icon_locked(gMenuIcon[MENU_UP], MENU_ICON[MENU_UP].x, MENU_ICON[MENU_UP].y ); draw_icon_locked(gMenuIcon[MENU_SELECT], MENU_ICON[MENU_SELECT].x, MENU_ICON[MENU_SELECT].y ); gr_color(MENU_TEXT_COLOR); gr_fill(0, (menu_top + menu_sel - menu_show_start) * CHAR_HEIGHT, gr_fb_width()-menu_max_height*2, (menu_top + menu_sel - menu_show_start + 1)*CHAR_HEIGHT+1); gr_color(HEADER_TEXT_COLOR); for (i = 0; i < menu_top; ++i) { draw_text_line(i, menu[i]); row++; } if (menu_items - menu_show_start + menu_top >= MAX_ROWS) j = MAX_ROWS - menu_top; else j = menu_items - menu_show_start; gr_color(MENU_TEXT_COLOR); for (i = menu_show_start + menu_top; i < (menu_show_start + menu_top + j); ++i) { if (i == menu_top + menu_sel) { gr_color(255, 255, 255, 255); draw_text_line(i - menu_show_start , menu[i]); gr_color(MENU_TEXT_COLOR); } else { gr_color(MENU_TEXT_COLOR); draw_text_line(i - menu_show_start, menu[i]); } row++; } gr_fill(0, row*CHAR_HEIGHT+CHAR_HEIGHT/2-1, gr_fb_width()-menu_max_height*2, row*CHAR_HEIGHT+CHAR_HEIGHT/2+1); } gr_color(NORMAL_TEXT_COLOR); for (; row < text_rows; ++row) { draw_text_line(row, text[(row+text_top) % text_rows]); } } }
// Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. static void draw_screen_locked(void) { if (!ui_has_initialized) return; draw_background_locked(gCurrentIcon); draw_progress_locked(); if (show_text) { // don't "disable" the background anymore with this... // gr_color(0, 0, 0, 160); // gr_fill(0, 0, gr_fb_width(), gr_fb_height()); int total_rows = gr_fb_height() / CHAR_HEIGHT; int i = 0; int j = 0; int row = 0; // current row that we are drawing on if (show_menu) { #ifndef BOARD_TOUCH_RECOVERY gr_color(MENU_TEXT_COLOR); int batt_level = 0; batt_level = get_batt_stats(); if(batt_level < 20) { gr_color(255, 0, 0, 255); } struct tm *current; time_t now; now = time(NULL) + (3600 * 8); // add 8 hours current = localtime(&now); char batt_text[40]; sprintf(batt_text, "[%d%% %02D:%02D]", batt_level, current->tm_hour, current->tm_min); if (now == NULL) { // just in case sprintf(batt_text, "[%d%%]", batt_level); } gr_color(MENU_TEXT_COLOR); draw_text_line(0, batt_text, RIGHT_ALIGN); gr_fill(0, (menu_top + menu_sel - menu_show_start) * CHAR_HEIGHT, gr_fb_width(), (menu_top + menu_sel - menu_show_start + 1)*CHAR_HEIGHT+1); gr_color(HEADER_TEXT_COLOR); for (i = 0; i < menu_top; ++i) { // draw_text_line(i, menu[i]); draw_text_line(i, menu[i], LEFT_ALIGN); row++; } if (menu_items - menu_show_start + menu_top >= max_menu_rows) j = max_menu_rows - menu_top; else j = menu_items - menu_show_start; gr_color(MENU_TEXT_COLOR); for (i = menu_show_start + menu_top; i < (menu_show_start + menu_top + j); ++i) { if (i == menu_top + menu_sel) { gr_color(255, 255, 255, 255); // draw_text_line(i - menu_show_start , menu[i]); draw_text_line(i - menu_show_start , menu[i], LEFT_ALIGN); gr_color(MENU_TEXT_COLOR); } else { gr_color(MENU_TEXT_COLOR); // draw_text_line(i - menu_show_start, menu[i]); draw_text_line(i - menu_show_start, menu[i], LEFT_ALIGN); } row++; if (row >= max_menu_rows) break; } gr_fill(0, row*CHAR_HEIGHT+CHAR_HEIGHT/2-1, gr_fb_width(), row*CHAR_HEIGHT+CHAR_HEIGHT/2+1); #else row = draw_touch_menu(menu, menu_items, menu_top, menu_sel, menu_show_start); #endif } gr_color(NORMAL_TEXT_COLOR); int cur_row = text_row; int available_rows = total_rows - row - 1; int start_row = row + 1; if (available_rows < MAX_ROWS) cur_row = (cur_row + (MAX_ROWS - available_rows)) % MAX_ROWS; else start_row = total_rows - MAX_ROWS; int r; for (r = 0; r < (available_rows < MAX_ROWS ? available_rows : MAX_ROWS); r++) { // draw_text_line(start_row + r, text[(cur_row + r) % MAX_ROWS]); draw_text_line(start_row + r, text[(cur_row + r) % MAX_ROWS], LEFT_ALIGN); } } }
// Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. static void draw_screen_locked(void) { if (!ui_has_initialized) return; draw_background_locked(gCurrentIcon); draw_progress_locked(); if (show_text) { // don't "disable" the background anymore with this... // gr_color(0, 0, 0, 160); // gr_fill(0, 0, gr_fb_width(), gr_fb_height()); gr_surface surface = gVirtualKeys; int total_rows = (gr_fb_height() / CHAR_HEIGHT) - (gr_get_height(surface) / CHAR_HEIGHT) - 1; int i = 0; int j = 0; int offset = 0; // offset of separating bar under menus int row = 0; // current row that we are drawing on if (show_menu) { gr_color(MENU_TEXT_COLOR); int batt_level = 0; batt_level = get_batt_stats(); if (batt_level < 21) { gr_color(255, 0, 0, 255); } char batt_text[40]; sprintf(batt_text, "[%d%%]", batt_level); draw_text_line(0, batt_text, RIGHT_ALIGN); gr_color(MENU_TEXT_COLOR); gr_fill(0, (menu_top + menu_sel - menu_show_start) * CHAR_HEIGHT, gr_fb_width(), (menu_top + menu_sel - menu_show_start + 1)*CHAR_HEIGHT+1); gr_color(HEADER_TEXT_COLOR); for (i = 0; i < menu_top; ++i) { draw_text_line(i, menu[i], LEFT_ALIGN); row++; } if (menu_items - menu_show_start + menu_top >= max_menu_rows) j = max_menu_rows - menu_top; else j = menu_items - menu_show_start; gr_color(MENU_TEXT_COLOR); for (i = menu_show_start + menu_top; i < (menu_show_start + menu_top + j); ++i) { if (i == menu_top + menu_sel) { gr_color(255, 255, 255, 255); draw_text_line(i - menu_show_start , menu[i], LEFT_ALIGN); gr_color(MENU_TEXT_COLOR); } else { gr_color(MENU_TEXT_COLOR); draw_text_line(i - menu_show_start, menu[i], LEFT_ALIGN); } row++; if (row >= max_menu_rows) break; } if (menu_items <= max_menu_rows) offset = 0; gr_fill(0, (row-offset)*CHAR_HEIGHT+CHAR_HEIGHT/2-1, gr_fb_width(), (row-offset)*CHAR_HEIGHT+CHAR_HEIGHT/2+1); } gr_color(NORMAL_TEXT_COLOR); int cur_row = text_row; int available_rows = total_rows - row - 1; int start_row = row + 1; if (available_rows < MAX_ROWS) cur_row = (cur_row + (MAX_ROWS - available_rows)) % MAX_ROWS; else start_row = total_rows - MAX_ROWS; int r; for (r = 0; r < (available_rows < MAX_ROWS ? available_rows : MAX_ROWS); r++) { draw_text_line(start_row + r, text[(cur_row + r) % MAX_ROWS], LEFT_ALIGN); } } draw_virtualkeys_locked(); //added to draw the virtual keys }
// Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. void draw_screen_locked(void) { if (!ui_has_initialized) return; #ifdef BUILD_IN_LANDSCAPE //In this case MENU_SELECT icon has maximum possible height. int menu_max_height = gr_get_height(gMenuIcon[MENU_SELECT]); struct { int x; int y; } MENU_ICON[] = { { gr_fb_width() - menu_max_height, 7*gr_fb_height()/8 }, { gr_fb_width() - menu_max_height, 5*gr_fb_height()/8 }, { gr_fb_width() - menu_max_height, 3*gr_fb_height()/8 }, { gr_fb_width() - menu_max_height, 1*gr_fb_height()/8 }, #else //ToDo: Following structure should be global struct { int x; int y; int xL; int xR; } MENU_ICON[] = { { get_menu_icon_info(MENU_BACK,MENU_ICON_X), get_menu_icon_info(MENU_BACK,MENU_ICON_Y), get_menu_icon_info(MENU_BACK,MENU_ICON_XL), get_menu_icon_info(MENU_BACK,MENU_ICON_XR) }, { get_menu_icon_info(MENU_DOWN,MENU_ICON_X), get_menu_icon_info(MENU_DOWN,MENU_ICON_Y), get_menu_icon_info(MENU_DOWN,MENU_ICON_XL), get_menu_icon_info(MENU_DOWN,MENU_ICON_XR) }, { get_menu_icon_info(MENU_UP,MENU_ICON_X), get_menu_icon_info(MENU_UP,MENU_ICON_Y), get_menu_icon_info(MENU_UP,MENU_ICON_XL), get_menu_icon_info(MENU_UP,MENU_ICON_XR) }, { get_menu_icon_info(MENU_SELECT,MENU_ICON_X), get_menu_icon_info(MENU_SELECT,MENU_ICON_Y), get_menu_icon_info(MENU_SELECT,MENU_ICON_XL), get_menu_icon_info(MENU_SELECT,MENU_ICON_XR) }, #endif }; draw_background_locked(gCurrentIcon); draw_progress_locked(); if (show_text) { gr_color(0, 0, 0, 160); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); int total_rows = gr_fb_height() / CHAR_HEIGHT+1; int i = 0; int j = 0; int row = 0; // current row that we are drawing on if (show_menu) { draw_icon_locked(gMenuIcon[MENU_BACK], MENU_ICON[MENU_BACK].x, MENU_ICON[MENU_BACK].y ); draw_icon_locked(gMenuIcon[MENU_DOWN], MENU_ICON[MENU_DOWN].x, MENU_ICON[MENU_DOWN].y); draw_icon_locked(gMenuIcon[MENU_UP], MENU_ICON[MENU_UP].x, MENU_ICON[MENU_UP].y ); draw_icon_locked(gMenuIcon[MENU_SELECT], MENU_ICON[MENU_SELECT].x, MENU_ICON[MENU_SELECT].y ); // Setup our text colors gr_color(UICOLOR0, UICOLOR1, UICOLOR2, 255); gr_color(UICOLOR0, UICOLOR1, UICOLOR2, 255); gr_fill(0, (menu_top + menu_sel - menu_show_start) * CHAR_HEIGHT, #ifdef BUILD_IN_LANDSCAPE gr_fb_width()-menu_max_height*2, (menu_top + menu_sel - menu_show_start + 1)*CHAR_HEIGHT+1); #else gr_fb_width(), (menu_top + menu_sel - menu_show_start + 1)*CHAR_HEIGHT+1); #endif gr_color(HEADER_TEXT_COLOR); for (i = 0; i < menu_top; ++i) { draw_text_line(i, menu[i], LEFT_ALIGN); row++; } if (menu_items - menu_show_start + menu_top >= MAX_ROWS) j = MAX_ROWS - menu_top; else j = menu_items - menu_show_start; gr_color(UICOLOR0, UICOLOR1, UICOLOR2, 255); for (i = menu_show_start + menu_top; i < (menu_show_start + menu_top + j); ++i) { if (i == menu_top + menu_sel) { gr_color(255, 255, 255, 255); draw_text_line(i - menu_show_start , menu[i], LEFT_ALIGN); gr_color(UICOLOR0, UICOLOR1, UICOLOR2, 255); } else { gr_color(UICOLOR0, UICOLOR1, UICOLOR2, 255); draw_text_line(i - menu_show_start, menu[i], LEFT_ALIGN); } row++; if (row >= max_menu_rows) break; } gr_fill(0, row*CHAR_HEIGHT+CHAR_HEIGHT/2-1, #ifdef BUILD_IN_LANDSCAPE gr_fb_width()-menu_max_height*2, row*CHAR_HEIGHT+CHAR_HEIGHT/2+1); #else gr_fb_width(), row*CHAR_HEIGHT+CHAR_HEIGHT/2+1); #endif } gr_color(NORMAL_TEXT_COLOR); for (; row < text_rows; ++row) { draw_text_line(row + 1, text[(row+text_top) % text_rows], LEFT_ALIGN); } } }
// Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. static void draw_screen_locked(void) { if (!ui_has_initialized) return; draw_background_locked(gCurrentIcon); draw_progress_locked(); if (show_text) { gr_color(0, 0, 0, 160); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); int total_rows = gr_fb_height() / CHAR_HEIGHT; int i = 0; int j = 0; int offset = 0; // offset of separating bar under menus int row = 0; // current row that we are drawing on if (show_menu) { gr_color(MENU_TEXT_COLOR); gr_fill(0, (menu_top + menu_sel - menu_show_start) * CHAR_HEIGHT, gr_fb_width(), (menu_top + menu_sel - menu_show_start + 1)*CHAR_HEIGHT+1); gr_color(HEADER_TEXT_COLOR); for (i = 0; i < menu_top; ++i) { draw_text_line(i, menu[i]); row++; } if (menu_items - menu_show_start + menu_top >= max_menu_rows) j = max_menu_rows - menu_top; else j = menu_items - menu_show_start; gr_color(MENU_TEXT_COLOR); for (i = menu_show_start + menu_top; i < (menu_show_start + menu_top + j); ++i) { if (i == menu_top + menu_sel) { gr_color(255, 255, 255, 255); draw_text_line(i - menu_show_start , menu[i]); gr_color(MENU_TEXT_COLOR); } else { gr_color(MENU_TEXT_COLOR); draw_text_line(i - menu_show_start, menu[i]); } row++; if (row >= max_menu_rows) break; } if (menu_items <= max_menu_rows) offset = 1; gr_fill(0, (row-offset)*CHAR_HEIGHT+CHAR_HEIGHT/2-1, gr_fb_width(), (row-offset)*CHAR_HEIGHT+CHAR_HEIGHT/2+1); } gr_color(NORMAL_TEXT_COLOR); int cur_row = text_row; int available_rows = total_rows - row - 1; int start_row = row + 1; if (available_rows < MAX_ROWS) cur_row = (cur_row + (MAX_ROWS - available_rows)) % MAX_ROWS; else start_row = total_rows - MAX_ROWS; int r; for (r = 0; r < (available_rows < MAX_ROWS ? available_rows : MAX_ROWS); r++) { draw_text_line(start_row + r, text[(cur_row + r) % MAX_ROWS]); } } }