diff options
Diffstat (limited to 'minui')
-rw-r--r-- | minui/Android.mk | 3 | ||||
-rw-r--r-- | minui/font_10x18.h | 8 | ||||
-rw-r--r-- | minui/graphics.cpp | 152 | ||||
-rw-r--r-- | minui/minui.h | 26 | ||||
-rw-r--r-- | minui/roboto_10x18.h | 8 | ||||
-rw-r--r-- | minui/roboto_15x24.h | 8 | ||||
-rw-r--r-- | minui/roboto_23x41.h | 8 |
7 files changed, 166 insertions, 47 deletions
diff --git a/minui/Android.mk b/minui/Android.mk index 09409a45f..34bf5f5bb 100644 --- a/minui/Android.mk +++ b/minui/Android.mk @@ -79,6 +79,9 @@ endif ifneq ($(BOARD_USE_CUSTOM_RECOVERY_FONT),) LOCAL_CFLAGS += -DBOARD_USE_CUSTOM_RECOVERY_FONT=$(BOARD_USE_CUSTOM_RECOVERY_FONT) endif +ifneq ($(wildcard system/core/healthd/animation.h),) + LOCAL_CFLAGS += -DTW_USE_MINUI_CUSTOM_FONTS +endif include $(BUILD_STATIC_LIBRARY) # Used by OEMs for factory test images. diff --git a/minui/font_10x18.h b/minui/font_10x18.h index 29d705344..30dfb9c56 100644 --- a/minui/font_10x18.h +++ b/minui/font_10x18.h @@ -1,14 +1,14 @@ struct { unsigned width; unsigned height; - unsigned cwidth; - unsigned cheight; + unsigned char_width; + unsigned char_height; unsigned char rundata[2973]; } font = { .width = 960, .height = 18, - .cwidth = 10, - .cheight = 18, + .char_width = 10, + .char_height = 18, .rundata = { 0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x55,0x82,0x06,0x82,0x02,0x82,0x10,0x82, 0x11,0x83,0x08,0x82,0x0a,0x82,0x04,0x82,0x46,0x82,0x08,0x82,0x07,0x84,0x06, diff --git a/minui/graphics.cpp b/minui/graphics.cpp index 244db3c5d..3d847b573 100644 --- a/minui/graphics.cpp +++ b/minui/graphics.cpp @@ -40,12 +40,6 @@ #include "minui.h" #include "graphics.h" -struct GRFont { - GRSurface* texture; - int cwidth; - int cheight; -}; - static GRFont* gr_font = NULL; static minui_backend* gr_backend = NULL; @@ -68,18 +62,36 @@ static bool outside(int x, int y) { return x < 0 || x >= gr_draw->width || y < 0 || y >= gr_draw->height; } - +//#define TW_USE_MINUI_CUSTOM_FONTS 1 +#ifndef TW_USE_MINUI_CUSTOM_FONTS int gr_measure(const char *s) { - return gr_font->cwidth * strlen(s); + return gr_font->char_width * strlen(s); } void gr_font_size(int *x, int *y) { - *x = gr_font->cwidth; - *y = gr_font->cheight; + *x = gr_font->char_width; + *y = gr_font->char_height; +} +#else // TW_USE_MINUI_CUSTOM_FONTS +const GRFont* gr_sys_font() +{ + return gr_font; } +int gr_measure(const GRFont* font, const char *s) +{ + return font->char_width * strlen(s); +} + +void gr_font_size(const GRFont* font, int *x, int *y) +{ + *x = font->char_width; + *y = font->char_height; +} +#endif // TW_USE_MINUI_CUSTOM_FONTS + void blend_16bpp(unsigned char* px, unsigned r5, unsigned g5, unsigned b5, unsigned char a) { unsigned char orig[2]; @@ -146,36 +158,67 @@ static void text_blend(unsigned char* src_p, int src_row_bytes, } } +#ifndef TW_USE_MINUI_CUSTOM_FONTS void gr_text(int x, int y, const char *s, bool bold) { GRFont* font = gr_font; if (!font->texture || gr_current_a == 0) return; - bold = bold && (font->texture->height != font->cheight); + bold = bold && (font->texture->height != font->char_height); + + x += overscan_offset_x; + y += overscan_offset_y; + + unsigned char ch; + while ((ch = *s++)) { + if (outside(x, y) || outside(x+font->char_width-1, y+font->char_height-1)) break; + + if (ch < ' ' || ch > '~') { + ch = '?'; + } + + unsigned char* src_p = font->texture->data + ((ch - ' ') * font->char_width) + + (bold ? font->char_height * font->texture->row_bytes : 0); + unsigned char* dst_p = gr_draw->data + y*gr_draw->row_bytes + x*gr_draw->pixel_bytes; + + text_blend(src_p, font->texture->row_bytes, + dst_p, gr_draw->row_bytes, + font->char_width, font->char_height); + + x += font->char_width; + } +} +#else //TW_USE_MINUI_CUSTOM_FONTS +void gr_text(const GRFont* font, int x, int y, const char *s, bool bold) +{ + if (!font->texture || gr_current_a == 0) return; + + bold = bold && (font->texture->height != font->char_height); x += overscan_offset_x; y += overscan_offset_y; unsigned char ch; while ((ch = *s++)) { - if (outside(x, y) || outside(x+font->cwidth-1, y+font->cheight-1)) break; + if (outside(x, y) || outside(x+font->char_width-1, y+font->char_height-1)) break; if (ch < ' ' || ch > '~') { ch = '?'; } - unsigned char* src_p = font->texture->data + ((ch - ' ') * font->cwidth) + - (bold ? font->cheight * font->texture->row_bytes : 0); + unsigned char* src_p = font->texture->data + ((ch - ' ') * font->char_width) + + (bold ? font->char_height * font->texture->row_bytes : 0); unsigned char* dst_p = gr_draw->data + y*gr_draw->row_bytes + x*gr_draw->pixel_bytes; text_blend(src_p, font->texture->row_bytes, dst_p, gr_draw->row_bytes, - font->cwidth, font->cheight); + font->char_width, font->char_height); - x += font->cwidth; + x += font->char_width; } } +#endif //TW_USE_MINUI_CUSTOM_FONTS void gr_texticon(int x, int y, GRSurface* icon) { if (icon == NULL) return; @@ -383,6 +426,7 @@ unsigned int gr_get_height(GRSurface* surface) { return surface->height; } +#ifndef TW_USE_MINUI_CUSTOM_FONTS static void gr_init_font(void) { gr_font = reinterpret_cast<GRFont*>(calloc(sizeof(*gr_font), 1)); @@ -392,8 +436,8 @@ static void gr_init_font(void) // 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; + gr_font->char_width = gr_font->texture->width / 96; + gr_font->char_height = gr_font->texture->height / 2; } else { printf("failed to read font: res=%d\n", res); @@ -414,11 +458,73 @@ static void gr_init_font(void) bits += (data & 0x7f); } - gr_font->cwidth = font.cwidth; - gr_font->cheight = font.cheight; + gr_font->char_width = font.char_width; + gr_font->char_height = font.char_height; } } +void gr_set_font(__attribute__ ((unused))const char* name) { + //this cm function is made to change font. Don't care, just init the font: + gr_init_font(); + return; +} +#else +int gr_init_font(const char* name, GRFont** dest) { + GRFont* font = reinterpret_cast<GRFont*>(calloc(1, sizeof(*gr_font))); + if (font == nullptr) { + return -1; + } + + int res = res_create_alpha_surface(name, &(font->texture)); + if (res < 0) { + free(font); + return res; + } + + // 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. + font->char_width = font->texture->width / 96; + font->char_height = font->texture->height / 2; + + *dest = font; + + return 0; +} + +static void gr_init_font(void) +{ + int res = gr_init_font("font", &gr_font); + if (res == 0) { + return; + } + + printf("failed to read font: res=%d\n", res); + + + // fall back to the compiled-in font. + gr_font = reinterpret_cast<GRFont*>(calloc(1, sizeof(*gr_font))); + gr_font->texture = reinterpret_cast<GRSurface*>(malloc(sizeof(*gr_font->texture))); + gr_font->texture->width = font.width; + gr_font->texture->height = font.height; + gr_font->texture->row_bytes = font.width; + gr_font->texture->pixel_bytes = 1; + + unsigned char* bits = reinterpret_cast<unsigned char*>(malloc(font.width * font.height)); + gr_font->texture->data = reinterpret_cast<unsigned char*>(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->char_width = font.char_width; + gr_font->char_height = font.char_height; +} +#endif + #if 0 // Exercises many of the gr_*() functions; useful for testing. static void gr_test() { @@ -547,9 +653,3 @@ void gr_fb_blank(bool blank) { gr_backend->blank(gr_backend, blank); } - -void gr_set_font(__attribute__ ((unused))const char* name) { - //this cm function is made to change font. Don't care, just init the font: - gr_init_font(); - return; -} diff --git a/minui/minui.h b/minui/minui.h index dee46411e..abef036e4 100644 --- a/minui/minui.h +++ b/minui/minui.h @@ -17,7 +17,7 @@ #ifndef _MINUI_H_ #define _MINUI_H_ -#ifndef TW_USE_OLD_MINUI_H +#ifndef TW_USE_MINUI_21 #include <sys/types.h> @@ -35,6 +35,12 @@ struct GRSurface { unsigned char* data; }; +struct GRFont { + GRSurface* texture; + int char_width; + int char_height; +}; + int gr_init(); void gr_exit(); @@ -47,11 +53,21 @@ void gr_fb_blank(bool blank); void gr_clear(); // clear entire surface to current color 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); -void gr_text(int x, int y, const char *s, bool bold); + void gr_texticon(int x, int y, GRSurface* icon); +#ifndef TW_USE_MINUI_CUSTOM_FONTS +void gr_text(int x, int y, const char *s, bool bold); int gr_measure(const char *s); void gr_font_size(int *x, int *y); void gr_set_font(__attribute__ ((unused))const char* name); +#else + +const GRFont* gr_sys_font(); +int gr_init_font(const char* name, GRFont** dest); +void gr_text(const GRFont* font, int x, int y, const char *s, bool bold); +int gr_measure(const GRFont* font, const char *s); +void gr_font_size(const GRFont* font, int *x, int *y); +#endif void gr_blit(GRSurface* source, int sx, int sy, int w, int h, int dx, int dy); unsigned int gr_get_width(GRSurface* surface); @@ -127,9 +143,9 @@ int res_create_localized_alpha_surface(const char* name, const char* locale, // functions. void res_free_surface(GRSurface* surface); -#else //ifndef TW_USE_OLD_MINUI_H +#else //ifndef TW_USE_MINUI_21 -// This the old minui.old/minui.h for compatibility with building TWRP +// This the old minui21/minui.h for compatibility with building TWRP // in pre 6.0 trees. #include <stdbool.h> @@ -217,5 +233,5 @@ void gr_clear(); } #endif -#endif // ifndef TW_USE_OLD_MINUI_H +#endif // ifndef TW_USE_MINUI_21 #endif // ifndef _MINUI_H_ diff --git a/minui/roboto_10x18.h b/minui/roboto_10x18.h index 0d118ba7a..2d1535b49 100644 --- a/minui/roboto_10x18.h +++ b/minui/roboto_10x18.h @@ -1,14 +1,14 @@ struct { unsigned width; unsigned height; - unsigned cwidth; - unsigned cheight; + unsigned char_width; + unsigned char_height; unsigned char rundata[2718]; } font = { .width = 960, .height = 18, - .cwidth = 10, - .cheight = 18, + .char_width = 10, + .char_height = 18, .rundata = { 0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, 0x3b,0x81,0x29,0x81,0x06,0x81,0x3f,0x81,0x7f,0x7f,0x7f,0x37,0x83,0x05,0x81, diff --git a/minui/roboto_15x24.h b/minui/roboto_15x24.h index 7857c59ef..aea1cbfbb 100644 --- a/minui/roboto_15x24.h +++ b/minui/roboto_15x24.h @@ -1,14 +1,14 @@ struct { unsigned width; unsigned height; - unsigned cwidth; - unsigned cheight; + unsigned char_width; + unsigned char_height; unsigned char rundata[3979]; } font = { .width = 1440, .height = 24, - .cwidth = 15, - .cheight = 24, + .char_width = 15, + .char_height = 24, .rundata = { 0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x6e,0x81,0x3e,0x81, 0x07,0x81,0x7f,0x7f,0x7f,0x7f,0x7f,0x76,0x84,0x17,0x84,0x7f,0x7f,0x7f,0x7f, diff --git a/minui/roboto_23x41.h b/minui/roboto_23x41.h index 6af2abc38..793f78466 100644 --- a/minui/roboto_23x41.h +++ b/minui/roboto_23x41.h @@ -1,14 +1,14 @@ struct { unsigned width; unsigned height; - unsigned cwidth; - unsigned cheight; + unsigned char_width; + unsigned char_height; unsigned char rundata[6679]; } font = { .width = 2208, .height = 41, - .cwidth = 23, - .cheight = 41, + .char_width = 23, + .char_height = 41, .rundata = { 0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, 0x7f,0x7f,0x7f,0x17,0x83,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, |