From 6fd59ac07d91eb373f4269a40e688aa82a6ccc6e Mon Sep 17 00:00:00 2001 From: Doug Zongker Date: Wed, 6 Mar 2013 15:01:11 -0800 Subject: [PATCH] more font improvements and cleanup Get rid of the notion of a font's "ascent"; the reference point for drawing is the top-left corner of the character box rather than the baseline. Add some more space between the menu entries and make the highlight bar around the text. Replace the default font.png with two images; the build system will include one or the other based on the resolutions of the device. Restore the original compiled-in bitmap font, to fall back on when font.png can't be found (eg, in the charger binary). Add support for bold text (when a font.png image is used). Change-Id: I6d211a486a3636f20208502b1cd2aeae8b9f5b02 --- fonts/12x22.png | Bin 0 -> 14431 bytes fonts/18x32.png | Bin 0 -> 24437 bytes fonts/OFL.txt | 93 +++++++++++++++++++ fonts/README | 6 ++ minui/font_10x18.h | 214 ++++++++++++++++++++++++++++++++++++++++++++ minui/graphics.c | 44 ++++++--- minui/minui.h | 2 +- recovery.cpp | 1 - res/images/font.png | Bin 5198 -> 0 bytes screen_ui.cpp | 46 ++++++---- screen_ui.h | 3 +- 11 files changed, 377 insertions(+), 32 deletions(-) create mode 100644 fonts/12x22.png create mode 100644 fonts/18x32.png create mode 100644 fonts/OFL.txt create mode 100644 fonts/README create mode 100644 minui/font_10x18.h delete mode 100644 res/images/font.png diff --git a/fonts/12x22.png b/fonts/12x22.png new file mode 100644 index 0000000000000000000000000000000000000000..ae826bebea9417ed04efaf6a2df80f00dd971795 GIT binary patch literal 14431 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 aqXbCyEo@y;f&70r2ca@bAF8BGzWg7o=jG%8 literal 0 HcmV?d00001 diff --git a/fonts/18x32.png b/fonts/18x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d95408a93dac15821ebdf2f20a4dcf51cd5b966b GIT binary patch literal 24437 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 +#include "font_10x18.h" #include "minui.h" #if defined(RECOVERY_BGRA) @@ -49,7 +50,6 @@ typedef struct { GGLSurface* texture; unsigned cwidth; unsigned cheight; - unsigned ascent; } GRFont; static GRFont *gr_font = 0; @@ -223,7 +223,7 @@ void gr_font_size(int *x, int *y) *y = gr_font->cheight; } -int gr_text(int x, int y, const char *s) +int gr_text(int x, int y, const char *s, int bold) { GGLContext *gl = gr_context; GRFont *font = gr_font; @@ -231,11 +231,11 @@ int gr_text(int x, int y, const char *s) if (!font->texture) return x; + bold = bold && (font->texture->height != font->cheight); + x += overscan_offset_x; y += overscan_offset_y; - y -= font->ascent; - gl->bindTexture(gl, font->texture); gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); @@ -245,7 +245,8 @@ int gr_text(int x, int y, const char *s) while((off = *s++)) { off -= 32; if (off < 96) { - gl->texCoord2i(gl, (off * font->cwidth) - x, 0 - y); + gl->texCoord2i(gl, (off * font->cwidth) - x, + (bold ? font->cheight : 0) - y); gl->recti(gl, x, y, x + font->cwidth, y + font->cheight); } x += font->cwidth; @@ -326,18 +327,37 @@ static void gr_init_font(void) gr_font = calloc(sizeof(*gr_font), 1); int res = res_create_surface("font", (void**)&(gr_font->texture)); - if (res != 0) { + if (res == 0) { + // The font image should be a 96x2 array of character images. The + // columns are the printable ASCII characters 0x20 - 0x7f. The + // top row is regular text; the bottom row is bold. + gr_font->cwidth = gr_font->texture->width / 96; + gr_font->cheight = gr_font->texture->height / 2; + } else { printf("failed to read font: res=%d\n", res); - gr_font->texture = NULL; - return; + + // fall back to the compiled-in font. + gr_font->texture = malloc(sizeof(*gr_font->texture)); + gr_font->texture->width = font.width; + gr_font->texture->height = font.height; + gr_font->texture->stride = font.width; + + unsigned char* bits = malloc(font.width * font.height); + gr_font->texture->data = (void*) bits; + + unsigned char data; + unsigned char* in = font.rundata; + while((data = *in++)) { + memset(bits, (data & 0x80) ? 255 : 0, data & 0x7f); + bits += (data & 0x7f); + } + + gr_font->cwidth = font.cwidth; + gr_font->cheight = font.cheight; } // interpret the grayscale as alpha gr_font->texture->format = GGL_PIXEL_FORMAT_A_8; - - gr_font->cwidth = gr_font->texture->width / 96; - gr_font->cheight = gr_font->texture->height; - gr_font->ascent = gr_font->cheight - 2; } int gr_init(void) diff --git a/minui/minui.h b/minui/minui.h index bc43bb59..1b8dd059 100644 --- a/minui/minui.h +++ b/minui/minui.h @@ -37,7 +37,7 @@ void gr_fb_blank(bool blank); void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a); void gr_fill(int x1, int y1, int x2, int y2); -int gr_text(int x, int y, const char *s); +int gr_text(int x, int y, const char *s, int bold); void gr_texticon(int x, int y, gr_surface icon); int gr_measure(const char *s); void gr_font_size(int *x, int *y); diff --git a/recovery.cpp b/recovery.cpp index 92aa5037..7002cb8a 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -704,7 +704,6 @@ prompt_and_wait(Device* device, int status) { break; case Device::WIPE_CACHE: - ui->ShowText(false); ui->Print("\n-- Wiping cache...\n"); erase_volume("/cache"); ui->Print("Cache wipe complete.\n"); diff --git a/res/images/font.png b/res/images/font.png deleted file mode 100644 index 14a15fbaafe04d70e1cd2e9a4bfef61c5a2d9f16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5198 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 IM6N<$f;LtIrT_o{ diff --git a/screen_ui.cpp b/screen_ui.cpp index 12af082c..222de00e 100644 --- a/screen_ui.cpp +++ b/screen_ui.cpp @@ -192,11 +192,9 @@ void ScreenRecoveryUI::draw_progress_locked() } } -void ScreenRecoveryUI::draw_text_line(int row, const char* t) { - if (t[0] != '\0') { - gr_text(0, (row+1)*char_height-1, t); - } -} +#define C_HEADER 247,0,6 +#define C_MENU 0,106,157 +#define C_LOG 249,194,0 // Redraw everything on the screen. Does not flip pages. // Should only be called with updateMutex locked. @@ -209,30 +207,46 @@ void ScreenRecoveryUI::draw_screen_locked() gr_color(0, 0, 0, 160); gr_fill(0, 0, gr_fb_width(), gr_fb_height()); + int y = 0; 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); + gr_color(C_HEADER, 255); for (; i < menu_top + menu_items; ++i) { + if (i == menu_top) gr_color(C_MENU, 255); + if (i == menu_top + menu_sel) { + // draw the highlight bar + gr_fill(0, y-2, gr_fb_width(), y+char_height+2); + // white text of selected item gr_color(255, 255, 255, 255); - draw_text_line(i, menu[i]); - gr_color(64, 96, 255, 255); + if (menu[i][0]) gr_text(4, y, menu[i], 1); + gr_color(C_MENU, 255); } else { - draw_text_line(i, menu[i]); + if (menu[i][0]) gr_text(4, y, menu[i], i < menu_top); } + y += char_height+4; } - gr_fill(0, i*char_height+char_height/2-1, - gr_fb_width(), i*char_height+char_height/2+1); + gr_color(C_MENU, 255); + y += 4; + gr_fill(0, y, gr_fb_width(), y+2); + y += 4; ++i; } - gr_color(255, 255, 0, 255); + gr_color(C_LOG, 255); - for (; i < text_rows; ++i) { - draw_text_line(i, text[(i+text_top) % text_rows]); + // display from the bottom up, until we hit the top of the + // screen, the bottom of the menu, or we've displayed the + // entire text buffer. + int ty; + int row = (text_top+text_rows-1) % text_rows; + for (int ty = gr_fb_height() - char_height, count = 0; + ty > y+2 && count < text_rows; + ty -= char_height, ++count) { + gr_text(4, ty, text[row], 0); + --row; + if (row < 0) row = text_rows-1; } } } diff --git a/screen_ui.h b/screen_ui.h index 80051724..fe0de46e 100644 --- a/screen_ui.h +++ b/screen_ui.h @@ -76,7 +76,7 @@ class ScreenRecoveryUI : public RecoveryUI { bool pagesIdentical; static const int kMaxCols = 96; - static const int kMaxRows = 32; + static const int kMaxRows = 96; // Log text overlay, displayed when a magic key is pressed char text[kMaxRows][kMaxCols]; @@ -100,7 +100,6 @@ class ScreenRecoveryUI : public RecoveryUI { void draw_install_overlay_locked(int frame); void draw_background_locked(Icon icon); void draw_progress_locked(); - void draw_text_line(int row, const char* t); void draw_screen_locked(); void update_screen_locked(); void update_progress_locked();